# prep — GameCrafter-Data-v10 → `data/gc25d_v10/` (SPEC §1–§5) Status 2026-10-22: code done and tested. MINI dataset built, verified and marked READY (`data/gc25d_v10_mini/READY`). **The full prep has not been run yet**; its command is below. **Open decision before stage 3: `ext_look_change`.** 42 % of the DMD pool has a semantic-map pop at cell 21. See *Notes for consumers*. Review-fix pass (same day; MINI outputs unchanged, no rebuild needed): * Source ids.png values are now asserted ⊆ {0..6,10,11}, in prep and in the verify spot check. * Killing the main process no longer leaves orphan ranks: there is a SIGTERM handler, and ranks and workers set PDEATHSIG. * A torn last row in `rows_rank*.jsonl` no longer breaks the merge on resume. * The `ext_look_change` note has been corrected (it is a real pop), and verify prints the counts. Smoke logs are in `outputs/_smoke/prep/fixer/`. ## What | file | role | |---|---| | `code/gc25d/prep_v10.py` | the prep CLI: one spawned process per GPU; DataLoader workers do the CPU work; the main thread runs the VAE; atomic writes; resume; merge | | `code/gc25d/verify_prep.py` | checks index, files and shapes on every clip, then GPU spot checks (VAE PSNR, bit-exact re-encode, cell 0, label_parts, capsule re-render IoU) | | `code/gc25d/tests/test_prep.py` | 26 CPU tests (~10 s): block/prompt alignment, ext validity, split/drop, atomic write / resume / merge, torn-row resume, raw ids check, PDEATHSIG, VAE input LUT, one real clip (no VAE) | The output layout follows SPEC §5 exactly. Additions beyond SPEC: * `index/clips.jsonl` also has `look`, `max_frame_offset_cm`, `ext_look_change`, `mirrored_world`, `player_px_mean`, `boss_visible_frac`, `player_hidden_frac` (non-dead frames with 0 player px). `drop_reason` is `"buried_player"` or `null`. * `meta/*.npz` also has `bot_mode` (str [F]) and `frames` (int32 [F], absolute frame index). * `index/` also holds `rows_rank.jsonl` (per-rank rows used for resume), `prep_args.json`, `prep_stats_