Sprint 4 Dispatch Plan — KN-86
PM/SM: Agent
Source design packs: 15 in docs/sprints/2026-04-27-sprint4-*.md (Wave 1 → PR #155 merged; Wave 2 → PR #156 merged)
Branch: docs/sprint4-dispatch-plan
Status
Section titled “Status”- 15 stories enriched across PR #155 (Wave 1, 5 packs) + PR #156 (Wave 2, 10 packs).
- 41 open questions consolidated below: 3 Blockers / 27 Provisional / 11 Strategic.
- Dependency check: GWP-114 → GWP-144 — RESOLVED, NOT BLOCKED.
- The Wave 2 design pack flagged GWP-114 as “BLOCKED on GWP-144” (image builder + canonical
.kn86fwheader + C-callable surface). - Verified:
tools/kn86fw/format/kn86fw.hexists (105 lines, plain C withextern "C"guards),tools/kn86fw/src/header.rs(276 lines),tools/kn86fw/src/verify.rs(50 lines). Shipped via PR #30 (feat: add tools/kn86fw/ Phase 0 image builder). - The design pack’s recommended path (a) — direct C header reuse from the emulator — is clear to dispatch. GWP-114 moves into Wave B as not-blocked.
- Note for design pack: the GWP-114 design pack’s Open Question #11 (“GWP-144 status check”) and the Wave-2 dispatch’s “BLOCKED” flag should both be marked resolved.
- The Wave 2 design pack flagged GWP-114 as “BLOCKED on GWP-144” (image builder + canonical
Wave A — Small parallel (≤1 day each, all isolated)
Section titled “Wave A — Small parallel (≤1 day each, all isolated)”Ship in a single SM call with isolated worktrees per agent. QA gates each PR.
| GWP-N | Title | LOC est | Files touched | Notes |
|---|---|---|---|---|
| GWP-247 | lfsr-shuffle Lisp primitive | ~30–50 C + ~80–120 test | nosh_lisp_bridge.c, new tests/test_lisp_lfsr_shuffle.c, ADR-0005 amendment | Single C engineer, TDD warm-up. 0 OQs. |
| GWP-266 | display/audio/coprocessor-bridge runtime docs | ~150–300 lines × 3 docs + README touch | 3 new files in docs/software/runtime/, docs/software/runtime/README.md | Single doc agent. 1 Provisional OQ (audio path). |
| GWP-261 | orchestration.md doc sweep (post ADR-0017/0019/0001) | ~150 lines edit (delete + replace) | docs/software/runtime/orchestration.md, docs/_meta/platform-design-master-index.md | Single doc agent, ~2 hours. 0 OQs. |
| GWP-265 + GWP-236 (BUNDLED) | T9 explain telemetry + F11 polish | ~80 + ~120 + ~150 + ~30 = ~380 LOC; +25 LOC polish | t9_rank.c, debug.c, dev_overlay.c, cli.c, new tests/test_t9_explain.c, tests/test_dev_overlay.c, doc | Single C engineer, both touch dev overlay. Bundle in one branch with separate commits per task. ~1 day. 0 + 2 OQs. |
Wave A capacity: ~1.5–2 engineer-days across 4 parallel agents (3 single + 1 bundled).
Parallel safety: All 4 dispatches touch disjoint files. Wave A is safe to fan-out.
Wave B — Medium parallel (1–2 days each)
Section titled “Wave B — Medium parallel (1–2 days each)”| GWP-N | Title | LOC est | Files touched | Notes |
|---|---|---|---|---|
| GWP-246 | Display-helper stdlib (threat/progress/box) | ~120 C + ~80 bridge + ~250 test + ~10 cart migration + ~40 doc | nosh_stdlib.c/h, nosh_lisp_bridge.c, new tests/test_nosh_stdlib_helpers.c, carts/icebreaker_cart.c (sample), ui-patterns.md | Single C engineer, ~2 days. 3 Provisional OQs. |
| GWP-256 | publisher_splash hook + Zaibatsu sample | ~120 cartridge.c + ~40 bridge + ~80 sample lambda + ~200 test | cartridge.c, nosh_lisp_bridge.c, new tests/test_publisher_splash.c, carts/icebreaker.lsp, possibly ADR-0005 amendment | C engineer + Gameplay Design consult on Zaibatsu fidelity, ~1 day. 5 OQs (2 Strategic, 3 Provisional). |
| GWP-114 | Emulator --validate-fw flag (header-only per ADR-0011) | ~50 cli.c + ~80 firmware_validate.c + ~120 test | cli.c, new firmware_validate.c, new tests/test_validate_fw.c, CMakeLists.txt, ADR-0011 cross-ref | Single C engineer, ~half day. GWP-144 shipped — unblocked. 4 OQs (1 Blocker scope-realign, 3 Provisional). |
| GWP-233 | Fe arena scaling experiments + ADR amendment | ~300 bench LOC + ~80 ADR-0004 amendment + ~5 ADR-0005 cross-ref + ~10 cartridge.c | new tests/bench_fe_arena_scale.c, cartridge.c:59, ADR-0004, ADR-0005 cross-ref | Single C engineer, ~1.5 days (measurement + write-up). 3 OQs (1 Blocker target, 2 Provisional). |
Wave B capacity: ~5 engineer-days across 4 parallel agents.
Parallel safety:
- GWP-246 and GWP-256 both touch
nosh_lisp_bridge.c(additive registrations only, but the same file). Recommend serial within the bridge: dispatch GWP-246 first, then GWP-256, OR brief both agents togit pullbefore final commit and resolve any trivial register-table conflicts. - GWP-114 and GWP-233 are fully isolated (firmware_validate vs bench harness; different ADRs touched).
- Worktree isolation per memory rule
feedback_parallel_agent_worktree_isolation— passisolation: "worktree"to every Agent dispatch.
Wave C — Large sequential (2–3 days each, art-iteration variance)
Section titled “Wave C — Large sequential (2–3 days each, art-iteration variance)”| GWP-N | Title | LOC est | Files touched | Notes |
|---|---|---|---|---|
| GWP-263 | Native 12×24 font cut (ADR-0014 F1) | ~PNG asset + Python script + C atlas loader + tests | font.c, new assets/fonts/kn86_12x24.png, new tools/generate_font_atlas.py, new tests/test_font_12x24.c, types.h, CMakeLists.txt, CLAUDE.md hygiene update, ADR-0014 F1 box ticked | Single C engineer + 2 Josh art-direction checkpoints (post-cut review; post-A/B sweep sign-off). 1.5–3 days nominal; can stretch to 4–5 with art iterations. 5 OQs (1 Blocker descender, 4 Provisional). |
| GWP-264 | Attract clip pipeline + 4 launch-cart clips | ~250 Python encoder + ~50 attract.c resolver + ~150 test + ~80 doc + ~120 KB clip binaries | new tools/make_clip.py, attract.c resolver, new tests/test_attract_clip_load.c, clip-system.md quickstart, 4 new .kn86clip files in carts/<cart>/assets/ | C+Python engineer + Gameplay Design consult on storyboards, ~2 days. Light dep on GWP-263: if GWP-263 lands first, clips capture against new font; if not, against 8×8-scaled with possible recapture later. 5 OQs (5 Provisional). |
Wave C capacity: ~3.5–5 engineer-days across 2 sequential or parallel-with-art-coordination agents.
Recommended ordering: GWP-263 dispatched first; GWP-264 follows when storyboards are approved (storyboard authoring can run in parallel with GWP-263 art work, since clip storyboards are content-independent of font).
Not dispatched (deferred or non-engineering)
Section titled “Not dispatched (deferred or non-engineering)”| GWP-N | Title | Reason | Action |
|---|---|---|---|
| GWP-171 | PCM voice barks | Stays deferred. Spec built on archived YM2149-as-DAC model; needs full rewrite under ADR-0017’s I2S/MAX98357A path. Gate: Pico audio path measured + CIPHER OLED playtested + spec rewritten. | Confirm defer; leave existing pcm-voice-bark.md in place with banner. |
| GWP-173 | In-game music | Stays deferred. No spec exists yet; same audio-path gate as GWP-171 plus needs a from-scratch music spec. | Confirm defer; consider PSG-only ambient music as a separate task if Josh wants something pre-Pico. |
| GWP-163 | Post-v0.1 deferred catalog (meta) | Not dispatchable — this is a container task. Catalog audit was completed 2026-04-25; nothing has materially changed. Leave in Planning. Next audit at v0.1 ship (GWP-152 close). | Confirm leave-as-is. No PR. |
| GWP-283 | Concept library: 15 candidate cyberpunk cartridges | Strategy doc — the design pack itself is the deliverable. Nothing to dispatch unless Josh wants the post-launch expansion roadmap committed to a future sprint. | Confirm: research-archive only, OR file as future expansion-wave planning task. |
Open questions for Josh — decision-ready
Section titled “Open questions for Josh — decision-ready”Blockers (3)
Section titled “Blockers (3)”These need a Josh decision before the engineer can ship a clean PR.
- GWP-114 — scope realign confirmation. Original task body wants migration-chain simulation; ADR-0011 explicitly scopes emulator parity to header-only. Choices: (a) realign to header-only
--validate-fwper design pack [recommended], file GWP-114-B sibling for migration test harness later; (b) reframe entirely and re-file. Need answer before dispatch — without it the engineer doesn’t know what AC to satisfy. - GWP-233 — ADR amendment target. Task body says ADR-0005, design pack recommends ADR-0004 (the canonical arena-spec home). Choices: ADR-0004 amendment [recommended; correct architectural home]; ADR-0005 amendment [as filed; wrong home]; new ADR-0023 [overkill]. Affects what file the engineer touches and the ADR’s amendment-log convention.
- GWP-263 — descender behavior on lowercase Q J p q y g. Two paths produce visibly different fonts and the choice has to be made before art work commits. Choices: subtle 2-pixel descenders on lowercase [recommended; more authentic Press Start 2P revival]; stay above-baseline like 8×8 source [matches existing visual rhythm; less drift]. Engineer can’t ship the atlas until Josh picks.
Provisional (27) — defaults documented; ship per default unless Josh flips
Section titled “Provisional (27) — defaults documented; ship per default unless Josh flips”GWP-266 (1)
Section titled “GWP-266 (1)”- Pi-side ALSA path retained or all-audio-via-Pico? — Default: all-audio-via-Pico per ADR-0017. Doc author flags as known-unknown if ambiguous in practice.
GWP-246 (3)
Section titled “GWP-246 (3)”- Progress-bar unfilled glyph — Default: middle dot
·(visible texture at 0%). level > max_levelfor threat-bar — Default: silent clamp (pragmatic for animations).- Title asymmetric padding — Default: accept up to 1-char asymmetry (terminal UI convention).
GWP-236 (2)
Section titled “GWP-236 (2)”- Bundle with GWP-265? — Default: yes, single dispatch with separate commits per task. Saves review overhead on shared dev-overlay surface.
- NOKIA empty-state phrasing — Default:
(no nemacs session)(diagnostic specificity within the unified verb pattern).
GWP-114 (3, after Blocker #1 resolved)
Section titled “GWP-114 (3, after Blocker #1 resolved)”- Flag name — Default:
--validate-fw(accurate to realigned scope). - File GWP-114-B (deck-state migration test harness) now or defer? — Default: file the sibling task, defer execution until v0.1 deck-state schema starts evolving.
- Doc cross-reference home — Default: ADR-0011 Emulator Parity section (authoritative scope source).
GWP-233 (2)
Section titled “GWP-233 (2)”- Black Ledger scope decision — Default: data-driven. If measurement shows the new arena supports 4×8×50, file follow-on to scale up; if not, freeze scaled-back scope and document as official.
- New-default landing zone — Default: data-driven. Bands: 256 KB (no change), 512 KB (1 doubling), 1 MB (2 doublings). Engineer proposes per measurement; Josh confirms.
GWP-256 (3)
Section titled “GWP-256 (3)”- Sample-cart choice — Default: Zaibatsu splash for ICE Breaker (exercises full PSG + animation envelope).
- No-splash-cart behavior — Default: skip entirely (preserves “absence is meaningful” framing for Setec Astronomy contrast).
- Splash-skip key — Default: SYS (right-index resting, conventional system-control).
- Time-budget enforcement — Default: BOTH (frame count and wall clock — whichever fires first).
GWP-263 (4, after Blocker #3 resolved)
Section titled “GWP-263 (4, after Blocker #3 resolved)”- TTF cut vs custom face — Default: Press Start 2P 12×24 TTF cut for v0.1, custom face deferred as 2-3 week refinement task.
- Box-drawing stroke weight — Default: try both, pick via A/B comparison (Black Ledger tabular UI is worst-case test).
- A/B sweep granularity — Default: home + 1 gameplay × 4 carts (8 captures minimum), expand if early review flags concerns.
- Build-flag default after merge — Default: flip to native in this PR if A/B passes Josh review, otherwise land with legacy default + flip in follow-on.
GWP-264 (5)
Section titled “GWP-264 (5)”- Cart-author UX — Default: standalone
tools/make_clip.pyPython for v0.1; Lisp-side authoring primitive deferred. - Storyboard authoring ownership — Default: Gameplay Design agent authors all 4 storyboards with Josh review at storyboard stage before encoding.
- Idle-trigger duration — Default: 30 seconds (matches retro-handheld convention).
- Cart-side vs runtime-default clip resolution — Default: cart-side overrides bare-deck reel when present.
- Audio fade-out at loop point — Default: soft guideline + encoder warning if PSG calls happen in last 30 frames. Auto-fade adds complexity; hard rule restricts authoring.
GWP-256 ADR amendment (1, partially overlaps strategic)
Section titled “GWP-256 ADR amendment (1, partially overlaps strategic)”publisher-splashprimitive in ADR-0005? — Default: amend ADR-0005 with a new “Lifecycle hooks” subsection covering this + future hooks (mission-end debrief, cart-eject cleanup). Bundle into the GWP-256 PR.
GWP-171 / GWP-173 / GWP-163 deferral confirmations (3)
Section titled “GWP-171 / GWP-173 / GWP-163 deferral confirmations (3)”- GWP-171 stays deferred until ADR-0017 audio path measured + CIPHER OLED playtested +
pcm-voice-bark.mdrewritten — Default: confirm defer. - GWP-173 stays deferred until same gate plus from-scratch music spec authored — Default: confirm defer.
(Note: provisional items 26+27 also count below as Strategic deferral confirmations.)
Strategic (11) — affect future scope, not Sprint 4 PRs
Section titled “Strategic (11) — affect future scope, not Sprint 4 PRs”Deferral confirmations
Section titled “Deferral confirmations”- GWP-171 stays deferred? Confirm or override.
- GWP-171 stale-spec disposition. Leave
pcm-voice-bark.mdwith banner [recommended] vs move to_archive/. - v0.1 launch-cart bark dependency? Current bibles assume no — confirm.
- GWP-173 stays deferred? Confirm or override.
- PSG-only music as separate task? If Josh wants ambient PSG music pre-Pico, file as new work.
- v0.1 launch-cart music dependency? Current bibles assume no — confirm.
- GWP-163 stays in Planning, no dispatch? Confirm.
- GWP-163 mirror to
docs/_meta/deferred-work-catalog.md? Recommend NO until demand. - GWP-163 next audit trigger. v0.1 ship [recommended] vs sooner.
Cart expansion strategy (GWP-283)
Section titled “Cart expansion strategy (GWP-283)”- Are we sprinting expansion carts post-launch at all? If “ship 17 launch carts and stop,” GWP-283 is research-archive only. If “yes eventually,” 5-cart first-wave proposal stands.
- GARGOYLE / BLACK SUN cuts + CLONESHOP-as-infrastructure reframe + TACHIKOMA exploration session. Single bundled decision on the expansion-library posture. Not load-bearing for Sprint 4.
Capacity rough-cut
Section titled “Capacity rough-cut”Honest estimates assuming TDD discipline, isolated worktrees, and QA gating per PR.
Single engineer (sequential)
Section titled “Single engineer (sequential)”~12–14 engineer-days for all 11 dispatchables:
- Wave A: 1.5–2 days (run sequentially: each is small)
- Wave B: ~5 days (one task at a time)
- Wave C: ~5 days (sequential GWP-263 → GWP-264 with art iteration variance)
3 parallel agents (recommended posture)
Section titled “3 parallel agents (recommended posture)”~5–7 calendar days:
- Day 1–2: Wave A in parallel (4 dispatches, mostly < 1 day each).
- Day 3–5: Wave B in parallel (GWP-246 + GWP-256 serialized on bridge file, GWP-114 + GWP-233 fully parallel).
- Day 5–7: Wave C — GWP-263 dispatch + storyboard authoring for GWP-264 in parallel; GWP-264 encoder/resolver work after font lands or in parallel-with-recapture-later.
Coordination overhead realism:
- Worktree-isolation on every parallel Agent dispatch (per memory rule).
- QA gate per PR adds ~10–15 min review per task — bundled into the day estimates above.
- Art-iteration loops on GWP-263 can stretch the calendar by 1–2 days; flag to Josh.
- GWP-114’s scope realign needs Josh-touch at dispatch time (Blocker #1).
- GWP-233’s measurement run is sequential within the agent’s queue (bench → write-up).
Faster posture (5 parallel agents)
Section titled “Faster posture (5 parallel agents)”~4–5 calendar days but coordination overhead climbs (more QA passes, more bridge-file conflict risk on Wave B). Diminishing returns vs 3 agents for an 11-task sprint.
Recommended dispatch order
Section titled “Recommended dispatch order”First wave (when Josh greenlights):
- GWP-247 — Lisp primitive, additive, TDD warm-up, 0 OQs. Single C engineer.
- GWP-266 — pure docs, single doc agent.
- GWP-261 — pure docs, single doc agent. Different file from GWP-266; safe to parallel.
- GWP-265 + GWP-236 (bundled) — single C engineer, F11 dev overlay polish.
These four dispatches in one SM call with worktree isolation on each. ~2 days clear.
Second wave (after first wave green):
5. GWP-114 — single C engineer (after Blocker #1 resolved). Header-only --validate-fw.
6. GWP-233 — single C engineer, bench + ADR-0004 amendment (after Blocker #2 resolved).
7. GWP-246 — single C engineer, display helpers.
8. GWP-256 — single C engineer + Gameplay Design consult, publisher_splash. Serialize after GWP-246 lands the bridge surface to avoid trivial conflicts.
Third wave (after second wave at least mostly green): 9. GWP-263 — single C engineer + Josh art-direction checkpoints (after Blocker #3 resolved). 10. GWP-264 — Gameplay Design storyboard authoring kicks off in parallel with GWP-263; encoder/resolver work follows. ~2 day after storyboards approved.
Net new questions surfaced by prioritization
Section titled “Net new questions surfaced by prioritization”These weren’t in the design packs — they emerged during sequencing:
- Worktree-isolation on parallel SM dispatches. The memory rule
feedback_parallel_agent_worktree_isolationis non-negotiable; confirm SM is briefed to passisolation: "worktree"on every Agent call in this sprint. - GWP-246 + GWP-256 share
nosh_lisp_bridge.c. Both are additive registrations and unlikely to conflict, but if dispatched in parallel, brief both engineers togit pullbefore final commit. Easier: serialize them (GWP-246 first since it’s the simpler one, GWP-256 picks up the merged tip). - GWP-263 art-direction checkpoint cadence. Two checkpoints called out (post-cut review + post-A/B sweep). Is Josh available within ~24h for each, or does the engineer ship the cut against a default and Josh reviews end-to-end at A/B time? Latter is faster but takes more art-rework risk.
- GWP-256 ADR amendment scope creep. If Provisional #25 (“amend ADR-0005 with Lifecycle hooks subsection”) becomes “let’s design the full lifecycle-hooks taxonomy,” the PR balloons. Recommend the GWP-256 PR adds only the
publisher-splashprimitive entry under a one-line “Lifecycle hooks” header; full taxonomy is a separate ADR amendment task. - GWP-114 design pack should be updated. Design pack OQ #11 (“GWP-144 status check”) is resolved by this dispatch doc — recommend a follow-up touch-up commit to the GWP-114 design pack noting “GWP-144 verified shipped via PR #30; design-pack OQ #11 closed.”
- GWP-233 measurement reproducibility. The bench harness output has to land in the PR description verbatim per the design pack. Brief the engineer to capture stdout to a markdown table format suitable for ADR-0004 amendment-log inclusion.
Process notes
Section titled “Process notes”- Design pack canon:
docs/sprints/2026-04-27-sprint4-design.md(index) + 15 per-task packs. - This dispatch doc is the prioritization layer on top of the design packs; the packs remain the source of truth for AC.
- Notion task statuses unchanged per the brief’s hard rule. Architect/SM moves Sprint 4 dispatchables Backlog → In Progress only after Josh greenlights.
- Hard rules enforced: no source-code changes; no Notion-status changes; no auto-merge on this PR.