# CLAUDE.framework.md

Framework gap list — capabilities the framework lacks, written down so they are not forgotten.
Nothing here is scheduled: an item starts only when the game being built needs it, and is deleted
once the work ships. Role split with CLAUDE.pending.md: pending = built but not yet verified;
this file = not built at all.

## Gaps

### 1. Persistence (save data)
- Have: the async I/O pipeline (crUserData — native file + wasm IDBFS), with a placeholder
  schema only (`crUserData_UserSettings`: myInt/myFloat/myString). No game saves anything;
  Game_IdleBreakout's `Progress` resets on restart.
- Need: a real save schema — versioned from the first release, with a migration rule — and a
  save-cadence decision (explicit checkpoints vs continuous autosave). Becomes the top gap if
  the chosen game is progression-heavy.

### 2. crUi widget set
- Have: Image / ImageSliced / Label / Button / ActionButton / Polyline. MAX_WIDGET_RECTS caps
  interactive widgets at 64 per frame.
- Need: more widgets, added only when a screen calls for them — scroll list, slider (settings /
  volume), possibly text input. Follow the existing immediate-mode pattern.

### 3. Strings / localization
- Have: nothing — every user-facing string is a literal in game code.
- Need: a string-table asset + id lookup, language selection, and a per-language font-coverage
  check. Font constraints (Korean ~12px floor; MSDF if glyph scaling is ever needed) are in
  CLAUDE.md § Conventions → Assets.

### 4. Minor gaps — logged only, no work planned
- BGM crossfade: crAudio has one BGM stream, so a track change is a hard cut.
- Positional SFX helper: PlaySfx takes volume/pan only; each game hand-computes attenuation from
  listener distance.
- Real-time lockstep netcode: not planned. The determinism contract would be its foundation, but
  input sync / rollback is a project of its own. Asynchronous multiplayer (turn exchange, ghosts,
  replays over crNet HTTP/WS) needs none of it and works on the current stack.
- Game_IdleBreakout.h class comment says `primitive_inkwell.vert/.frag`; the actual files are
  `primitive_idle_breakout.*` — stale comment.
