Hyeonjun Kil
Git-based personal harness for reproducible development operations and resume/JD curation — integrating local BGE-M3 RAG, MCP search, Git-hook quality gates, JD-custom PDF generation, Zighang external feedback loops, and safe T1/T2/T3 application gates
| Performance Metrics | Before | After |
|---|---|---|
| RAG MVP Index | manual context search | 548 files / 3,347 chunks / 20.7 MB (0.7s warm query) |
| RAG Default-On Verification | opt-in trigger | 15/15 tests across 3 harnesses (prompt >=12 chars auto-search) |
| Resume RAG Corpus | 0 indexed chunks | 109 chunks (32 tests passed) |
| Work-data Evidence Archive | manual evidence curation / 44% metric coverage | 279 incremental work items / schema v1.2 (50% metric coverage) |
| JD Feedback Loop | manual JD feedback capture | JD PDF + Zighang recruitment-roast + T1/T2/T3 triage + form-start guard (Juvis pass range / Nexon low-fit / Hanwha 82% improve-to-pass) |
Problem Solving
Tech Decisions
- •Chose local BGE-M3 + sqlite-vec over cloud vector DBs to prioritize immediate reindexing after markdown changes and cost control
- •Chose hook-first enforcement over doc-only rules to compensate for agents not reading policy documents at the moment of need
- •Chose a runtime surface compiler over manual runtime settings to reduce generated-surface drift and automate 3-harness verification
- •Chose default-on search over opt-in retrieval to reduce missed evidence during real investigation, review, and edit prompts
Highlights
- •Aligned 3 harnesses through automatic runtime-surface generation plus XML runtime contracts
- •Indexed 548 files / 3,347 chunks with local BGE-M3 RAG and reached 0.7s warm queries
- •Moved RAG to default-on search_harness calls for prompts of 12+ characters, passing 15/15 tests across 3 harnesses
- •Integrated resume/portfolio JSON into the RAG corpus, indexing 109 chunks and passing 32 tests
- •Documented browser/REPL runtime trust boundaries and fallback order, then reflected settings across 3 harnesses
- •Added schema v1.2 + outcome_metrics evidence curation, incrementally collecting 279 work items and improving metric coverage 44%→50%
- •Built JD-custom PDF + Zighang feedback loop; kept Juvis in pass range (92%→88%) and classified Nexon as 35% low-fit to avoid overfitting
- •Hardened the Zighang recruitment-roast helper with main-scope result capture, Puppeteer element clicks, and upload-form guards to avoid sidebar-history false positives
Lessons Learned
- •Learned that AI-assisted development productivity is reproducible only when runtime context, rule enforcement, evidence search, and cost observability share one operating path
- •Established that document-only rules remain reference material unless read at the moment of need, so critical rules should be enforced through hooks, tests, and compiler output
Concert seat reservation service resolving concurrency across seat locking, payments, and point charging under 10K concurrent requests — hybrid locking strategy (optimistic + Redisson distributed lock), 15x TPS improvement via Redis caching, Kafka event-driven architecture, K6 load test-driven optimization
| Performance Metrics | Before | After |
|---|---|---|
| Reservation latency | 1,678ms | 835ms (-50%) |
| Seat query TPS | 100 | 1,500 (15x) |
| DB query ratio | 100% | 6% (-94%) |
Problem Solving
Tech Decisions
- •@Version optimistic lock for seat reservation: higher throughput than pessimistic lock on single-row contention, validated with K6 10K VU
- •Redisson distributed lock (userWalletLock:{userId}) for payments: avoids infinite retry loops of optimistic lock in balance-critical transactions
- •Redis Sorted Set queue: score=Unix timestamp serves dual purpose (entry order + expiry), O(log N) vs DB-based queue
- •Transactional Outbox pattern: outbox_event row inserted within payment TX → scheduler publishes to Kafka, preventing message loss
Highlights
- •50% seat reservation response time improvement with optimistic locking (10K concurrent)
- •Hybrid locking strategy: optimistic lock for seats, Redisson for payments
- •15x TPS improvement (100 → 1,500), 94% DB query reduction via Redis caching
- •Kafka event-driven architecture eliminating inter-domain coupling
- •Performance bottleneck identification and resolution via K6 load testing
Lessons Learned
- •Understood fundamental differences in concurrency control by comparing pessimistic, optimistic, and distributed lock tradeoffs
- •Learned context-driven selection over single solutions through hybrid locking strategy design per scenario
Family/organization shared finance management app — Next.js 16 fullstack, Supabase PostgreSQL, 3-tier RBAC (OWNER/ADMIN/MEMBER), NestJS Cron recurring transaction automation, 99.45% line coverage unit tests + 300+ E2E integration tests
| Performance Metrics | Before | After |
|---|---|---|
| Vitest unit tests | - | 397건 (BE 25 + FE 31 suites) (99.45% 커버리지) |
| Playwright E2E | - | 300건+ (24 specs · 5 projects) (역할별 시나리오) |
Problem Solving
Tech Decisions
- •NestJS Docker separation: bypasses Vercel Hobby Cron limit (1/day), ensures daily 15:00 KST recurring transaction execution on Mac mini
- •Supabase Auth + app-level RBAC: 3-tier guard chain — SupabaseAuthGuard (JWT) → MembershipGuard (role) → SuperAdminGuard (admin-only)
- •Prisma + Supabase PG: leverages Prisma's type safety and migration tooling, routes through Supabase connection pooler for serverless connection management
Highlights
- •397 Vitest unit tests with 99.45% line coverage
- •300+ Playwright E2E tests, role-based scenarios
- •3-tier RBAC (OWNER/ADMIN/MEMBER) + Supabase RLS
- •NestJS Cron recurring transaction auto (Docker)
- •Full-stack integration test env (FE+BE+Supabase)
Lessons Learned
- •Learned SSR authentication state management and RLS-based data access control by combining Next.js 16 App Router with Supabase Auth, understanding auth context propagation patterns between server and client components
- •Experienced permission separation and data isolation strategies in organizational multi-tenancy by designing a 3-tier RBAC system (OWNER/ADMIN/MEMBER)
Logistics dispatch data service crawling with Cheerio, queryable via KakaoTalk chatbot skill server and Next.js mobile web — Clean Architecture + TSyringe DI, Express 5, Prisma SQLite, Traefik Blue-Green zero-downtime deployment
| Performance Metrics | Before | After |
|---|---|---|
| Crawl frequency | 수동 조회 | 일 15회 자동 (자동화) |
| Deploy downtime | 수동 재시작 | 0초 (Blue-Green) |
Problem Solving
Tech Decisions
- •Clean Architecture + TSyringe DI: layer separation for swappable external dependencies (crawler, Kakao API, DB), interface binding via DI tokens
- •SQLite: eliminates PostgreSQL operational overhead for single-server read-heavy workload, file-based volume mount ensures Docker portability
- •Traefik file provider: traffic switching via YAML rewrite without Docker socket exposure, achieving both security and simple rollback
Highlights
- •Clean Architecture + TSyringe DI layer separation design
- •Cheerio crawling + node-cron hourly auto-sync (Mon-Sat)
- •KakaoTalk chatbot skill server (route/vehicle/destination search)
- •Traefik Blue-Green zero-downtime deploy + automated deploy scripts
- •Next.js mobile web + Recharts statistics dashboard
Lessons Learned
- •Learned decoupling business logic from external dependencies (crawler, DB, Kakao API) by applying Clean Architecture layer separation with TSyringe DI container
- •Understood chatbot platform request/response protocols and scenario block integration by directly implementing Kakao i Open Builder skill server