유대선

진행 중 · 2026년 6월 10일

Ki Clash

한국 학교 운동장 손게임 '기싸움'을 실시간 1v1 PvP로 옮긴 게임 — 상대 수를 읽고, 기를 모으고, 타이밍에 친다. Python(FastAPI)과 Go 두 런타임이 같은 Redis 게임 상태를 공유. Next.js 16 PWA, 방 기반 PvP, 6 캐릭터 필살기, AI 생성 스프라이트.

Python + Go 듀얼 런타임 · Redis 상태 공유 · 164 테스트 · 136 커밋 · 필살기 6 · 스프라이트 36

역할
Solo (Claude Code 페어 프로그래밍)
스택
Python 3.11 · FastAPI · Go 1.23 · Next.js 16 · React 19 · PostgreSQL · asyncpg · Redis · Caddy · Tailwind v4
Ki Clash

학교 운동장 손게임 기싸움을 실시간 1v1로 옮긴 게임. 제품은 작은 게임이고, 핵심은 엔지니어링 — 두 서버 런타임(Python·Go)이 같은 Redis 게임 상태를 공유, 방 기반 PvP, AI 스프라이트 파이프라인.

무엇을 하나

짚을 만한 엔지니어링

아직 안 되는 것

프로젝트 로그

이 프로젝트를 만들면서 남긴 트러블슈팅 · 회고 · 업데이트의 시간순 기록.

33 로그됨
마지막 업데이트: 2026년 6월 10일
필터
2026년 6월 8일 주1 · 1 기술 회고
  1. Load testing (k6) + CI pipeline (GitHub Actions)

    기술 회고

    2026년 6월 10일 · 4

    Added a k6 load/perf suite (smoke, ramping REST, and concurrent WebSocket capacity scripts) against the live JJAN backend, plus a GitHub Actions CI pipeline whose python/go/web jobs gate every push and PR to main — the test gate the Vercel auto-deploy flow was missing.

2026년 6월 1일 주14 · 3 업데이트 · 3 트러블슈팅 · 3 기술 회고 · 5 사용성 회고
  1. Go-live night — real AWS deploy + the bugs only prod surfaced

    트러블슈팅

    2026년 6월 7일 · 4

    Go-live on AWS EC2 (t3.micro) exposed bugs no local run had: a single-player 'Game not found' from 2 uvicorn workers over in-memory state, a broken disconnect/reconnect + forfeit-stats + /health HEAD path, a pubsub listener that crashed on idle, and OOM during builds — fixed with --workers 1, a session repair, get_message polling, and 2GB swap baked into user_data.

  2. Viewport-locked single-screen mobile + installable PWA

    사용성 회고

    2026년 6월 7일 · 5

    Locks every gameplay phase to one no-scroll viewport (100svh, capped arena, compact spacing) on a single stable skeleton that never reflows, removes the growing in-match turn history, makes the web client an installable home-screen PWA, and cuts the AI reveal/round hold from 5.1s/4.5s to 3s.

  3. PixiJS v8 WebGL effects (DR-17) and the additive-overlay lesson (DR-18)

    기술 회고

    2026년 6월 7일 · 5

    A PixiJS v8 WebGL effect engine and /pixi-test harness wired into both PvP and vs-AI matches — plus the day's hard lesson: the first integration replaced the dynamic KiAuraArena and silently deleted its character motion, so it was reverted and re-done as an additive transparent overlay (DR-18: enhance = compose, not replace).

  4. AWS infra as Terraform IaC — VPC + EC2 + separated EBS + EIP

    기술 회고

    2026년 6월 4일 · 4

    One Terraform module stands up the JJAN! backend on AWS — a /16 VPC, a single t3.micro EC2 host, a lifecycle-protected EBS data volume that outlives instance replacement, and an Elastic IP — followed by four deploy fixes the first real build surfaced (Go base bump, distroless self-healthcheck, Caddy domain, Vercel build env).

  5. DR-16 — client-ready handshake + 8-dimension live verification

    트러블슈팅

    2026년 6월 4일 · 5

    Gated turn 1 behind a two-player presence check so the 5s turn clock never starts against a ghost opponent, split the room start-guard from the handoff-guard to fix a 'Match starting' hang, made CharacterAvatar render the real fighter PNG, then ran an 8-dimension live verification that surfaced 4 bugs.

  6. Vercel monorepo routing + canonical-domain redirects

    트러블슈팅

    2026년 6월 3일 · 2

    Added a root-level vercel.json so Vercel builds the web/ subdirectory in this monorepo instead of failing on a missing root package.json, then layered 301 redirects so www and the old kiclash alias both funnel to the canonical jjan.daeseon.ai.

  7. Rebrand to JJAN! · 짠 + recruiter-ready bilingual README

    업데이트

    2026년 6월 2일 · 3

    Renamed the user-visible product from "Ki Clash" to "JJAN! · 짠" across the web surfaces (metadata, lobby, shop, share-sheet) while keeping the internal ki-clash code slug untouched, and shipped a grounded bilingual EN/KO recruiter README plus a problem-indexed troubleshooting reference.

  8. Character-specific ultimate finishers + real fighter PNGs on select

    사용성 회고

    2026년 6월 2일 · 3

    Replaced the one generic match-end beam with six per-character signature ultimates, swapped the emoji placeholders on character-select for the real fighter PNGs under global-friendly names, and closed the 6×6 fighter sprite matrix with seokjin + yuri's pose sets.

  9. Phase 11 — in-house FX overhaul (Lottie-quality, no external assets)

    사용성 회고

    2026년 6월 2일 · 4

    Phase 11 rebuilds all six arena effects in-house with framer-motion + canvas-confetti + multi-layer SVG (zero external dependency), fixes white-box fighter backgrounds with local AI bg removal + pose-aware sprite transforms, and splits the Attack (POW punch) and Energy Wave (energy-beam) moves into visually disjoint FX.

  10. Deploy-night checkpoint — Phase 7G/8/10 done, Phase 9 (live deploy) pending Jason

    업데이트

    2026년 6월 1일 · 3

    Deploy-night checkpoint: Phases 1-4, 7, 8, and 10 are done and the backend is production-ready; Phase 9 (the actual AWS EC2 + Vercel deploy) is the only outstanding work and is waiting on Jason — nothing is live yet.

  11. Phases 7D-F — fighter sprites, hit/KO reactions, image-first pipeline + 6 AI idle sprites

    사용성 회고

    2026년 6월 1일 · 1

    Phases 7D-F replaced placeholder fighters with humanoid then shōnen-knockoff sprites, added hit/KO reactions and a match-end final-blow KO sequence, and moved to an image-first pipeline backed by 6 AI-generated idle sprites.

  12. Phase 10 — standalone Go WebSocket game server (scaffold → game loop → hardening)

    기술 회고

    2026년 6월 1일 · 3

    Three commits stood up the Go game-server tier from DR-1's hybrid 2-tier design: a WebSocket scaffold, a full game-loop port wired for prod, and a hardening pass adding cross-instance reconnect, metrics, Sentry, unit tests, and a load harness.

  13. Phase 7 — cinematic match-end finale + anime ki-aura arena

    사용성 회고

    2026년 6월 1일 · 2

    Phase 7 ships a cinematic match-end finale and an anime ki-aura arena in the web client, realizing decision DR-2's move from pixel art to a high-impact arcade anime aesthetic.

  14. Phase 8 — Tekken-style room PvP (create code, share, character select, ready up)

    업데이트

    2026년 6월 1일 · 1

    Phase 8 adds Tekken-style room PvP — create a room code, share it, pick a character, and ready up — with a backend rooms API plus the frontend /pvp flow, followed by a chore to auto-derive the WebSocket URL from the API URL in production.

2026년 5월 25일 주9 · 2 업데이트 · 2 트러블슈팅 · 5 기술 회고
  1. RESUME-HERE checkpoint added to the engineering log

    업데이트

    2026년 5월 28일 · 1

    Added a Part 0 'RESUME HERE' checkpoint to docs/engineering-log.md so the next session opens with a single where-are-we / what's-next handoff snapshot.

  2. Phase 6 — production stack scaffold (AWS EC2 + Vercel hybrid)

    업데이트

    2026년 5월 27일 · 2

    Scaffolded the production deployment stack as an AWS EC2 + Vercel hybrid — a single docker-compose stack (db + redis + api + caddy) on EC2 with Caddy terminating TLS and reverse-proxying the FastAPI backend, and the Next.js frontend on Vercel.

  3. Wrote the Engineering Decision Reference (DR-1..11)

    기술 회고

    2026년 5월 26일 · 2

    Added a 'Part 2 — Engineering Decision Reference' section to docs/engineering-log.md with 11 deep trade-off analyses (DR-1..DR-11), each documenting the decision, options, trade-off table, reasoning chain, meta-pattern, and interview framing.

  4. Multiplayer networking reference (Ki Clash vs LoL / Valorant)

    기술 회고

    2026년 5월 26일 · 1

    Created a standalone Korean networking reference doc that maps Ki Clash code onto real-time multiplayer concepts, doubling as Toronto game/systems interview prep.

  5. Phase 2 — test coverage + observability (JWT auto-recovery, JSON logs, Sentry, Prometheus)

    기술 회고

    2026년 5월 26일 · 4

    Phase 2 added 52 new tests (game engine, matchmaking) and the observability backbone — structured JSON logging, Sentry, and Prometheus /metrics — plus a client-side JWT 401 auto-recovery fix. Suite grew from 52 to 99 tests.

  6. Phase 3 — fixed the 4 PvP concurrency bugs

    트러블슈팅

    2026년 5월 26일 · 2

    Phase 3 fixed the 4 PvP concurrency bugs documented as xfail during Phase 2.1; the integration suite went from 6 passed / 4 xfailed to 10 passed, and the full suite to 126 passed.

  7. Phase 4 — Redis-backed stateless PvP (game store, cross-worker pub/sub, 149 tests)

    기술 회고

    2026년 5월 26일 · 4

    Phase 4 externalized all in-memory PvP state to Redis, added per-player pub/sub for cross-worker routing, and used optimistic concurrency for atomic two-player turns — landing the full suite at 149 tests passing in ~23s.

  8. PvP simulator surfaces 4 concurrency bugs (captured as xfail tests)

    트러블슈팅

    2026년 5월 26일 · 3

    Driving a real Bo3 match through a PvP simulator against the live docker stack surfaced 4 concurrency/protocol bugs, which were then locked into a permanent pytest integration harness as xfail tests.

  9. Asset pipeline + fallback components; pixel-art moved to deprecated/

    기술 회고

    2026년 5월 25일 · 2

    Scaffolded a drop-in asset pipeline with graceful emoji fallback components on web and mobile, and moved the pixel-art code into a deprecated/ folder via git mv since 12+ active screens still import it.

2026년 5월 18일 주1 · 1 기술 회고
  1. Toronto rebuild kickoff — spec re-grounded, 2-tier strategy, anime pivot

    기술 회고

    2026년 5월 24일 · 3

    A strategy/planning session (no code commit) that re-grounded the Ki Clash spec, locked a 2-tier Python-now/Go-later backend, and pivoted the visuals from pixel art to a modern anime card-game aesthetic with AI-generated assets.

2026년 2월 23일 주1 · 1 트러블슈팅
  1. First deploy night — Railway + auto-migration, dynamic PORT, Dockerfile fixes, energy-beam finish

    트러블슈팅

    2026년 2월 23일 · 2

    First-deploy night on Railway — added a Dockerfile and railway.toml with auto-migration, fixed dynamic PORT binding and Dockerfile COPY order, and shipped the dramatic match-finish energy-wave beam.

2026년 2월 16일 주6 · 3 업데이트 · 3 사용성 회고
  1. 6 original Korean fighters, character select, selection timer, AI trash talk + tutorial

    사용성 회고

    2026년 2월 22일 · 2

    Added a roster of 6 original Korean fighters with a dedicated character select screen, converted the countdown into a selection timer, layered in AI trash talk and an interactive tutorial, and ported the whole set to mobile.

  2. Core game built in a day — engine, backend API, web frontend

    업데이트

    2026년 2월 22일 · 1

    Single milestone commit shipped the product-agnostic game engine, an AI opponent with difficulty tiers, a versioned FastAPI backend, and a Next.js web frontend — plus dev-workflow slash commands.

  3. Game feel — Web Audio SFX, card-flip reveal, screen shake, countdown rhythm

    사용성 회고

    2026년 2월 22일 · 1

    A game-feel pass on the web client: a 3-beat countdown between action confirm and reveal, procedural Web Audio sound effects with a mute toggle, a card-flip reveal with screen shake on outcomes, and an animated AI thinking indicator.

  4. Pixel-art fighter system (web + mobile)

    사용성 회고

    2026년 2월 22일 · 2

    Built a dedicated pixel-art rendering layer plus per-fighter frame data for 6 fighters, wired it into the live web game UI, and ported the whole system to the React Native mobile client.

  5. PvP realtime backend — WS manager, Redis matchmaking, session loop

    업데이트

    2026년 2월 22일 · 1

    Built the realtime PvP backbone for Ki Clash: a room-based WebSocket manager, a Redis-backed FIFO matchmaking service, and a WebSocket-driven game session, plus a PvP frontend with matchmaking and game UI.

  6. React Native (Expo) mobile app + full game flow

    업데이트

    2026년 2월 22일 · 1

    Scaffolded a React Native (Expo) mobile app with TypeScript and expo-router, then built the full game UI, AI/PvP flow, and ported the web 'game feel' features to native.

2026년 2월 9일 주1 · 1 업데이트
  1. Ki Clash genesis — repo init + founding philosophy

    업데이트

    2026년 2월 12일 · 2

    The repo is born with an initial README naming it Product003_KiDuelGame, followed by a CLAUDE.md founding philosophy that codifies Jason's core beliefs and build methodology.