Skip to content

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


  • 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 .kn86fw header + C-callable surface).
    • Verified: tools/kn86fw/format/kn86fw.h exists (105 lines, plain C with extern "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.

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-NTitleLOC estFiles touchedNotes
GWP-247lfsr-shuffle Lisp primitive~30–50 C + ~80–120 testnosh_lisp_bridge.c, new tests/test_lisp_lfsr_shuffle.c, ADR-0005 amendmentSingle C engineer, TDD warm-up. 0 OQs.
GWP-266display/audio/coprocessor-bridge runtime docs~150–300 lines × 3 docs + README touch3 new files in docs/software/runtime/, docs/software/runtime/README.mdSingle doc agent. 1 Provisional OQ (audio path).
GWP-261orchestration.md doc sweep (post ADR-0017/0019/0001)~150 lines edit (delete + replace)docs/software/runtime/orchestration.md, docs/_meta/platform-design-master-index.mdSingle doc agent, ~2 hours. 0 OQs.
GWP-265 + GWP-236 (BUNDLED)T9 explain telemetry + F11 polish~80 + ~120 + ~150 + ~30 = ~380 LOC; +25 LOC polisht9_rank.c, debug.c, dev_overlay.c, cli.c, new tests/test_t9_explain.c, tests/test_dev_overlay.c, docSingle 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-NTitleLOC estFiles touchedNotes
GWP-246Display-helper stdlib (threat/progress/box)~120 C + ~80 bridge + ~250 test + ~10 cart migration + ~40 docnosh_stdlib.c/h, nosh_lisp_bridge.c, new tests/test_nosh_stdlib_helpers.c, carts/icebreaker_cart.c (sample), ui-patterns.mdSingle C engineer, ~2 days. 3 Provisional OQs.
GWP-256publisher_splash hook + Zaibatsu sample~120 cartridge.c + ~40 bridge + ~80 sample lambda + ~200 testcartridge.c, nosh_lisp_bridge.c, new tests/test_publisher_splash.c, carts/icebreaker.lsp, possibly ADR-0005 amendmentC engineer + Gameplay Design consult on Zaibatsu fidelity, ~1 day. 5 OQs (2 Strategic, 3 Provisional).
GWP-114Emulator --validate-fw flag (header-only per ADR-0011)~50 cli.c + ~80 firmware_validate.c + ~120 testcli.c, new firmware_validate.c, new tests/test_validate_fw.c, CMakeLists.txt, ADR-0011 cross-refSingle C engineer, ~half day. GWP-144 shipped — unblocked. 4 OQs (1 Blocker scope-realign, 3 Provisional).
GWP-233Fe arena scaling experiments + ADR amendment~300 bench LOC + ~80 ADR-0004 amendment + ~5 ADR-0005 cross-ref + ~10 cartridge.cnew tests/bench_fe_arena_scale.c, cartridge.c:59, ADR-0004, ADR-0005 cross-refSingle 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 to git pull before 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 — pass isolation: "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-NTitleLOC estFiles touchedNotes
GWP-263Native 12×24 font cut (ADR-0014 F1)~PNG asset + Python script + C atlas loader + testsfont.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 tickedSingle 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-264Attract clip pipeline + 4 launch-cart clips~250 Python encoder + ~50 attract.c resolver + ~150 test + ~80 doc + ~120 KB clip binariesnew 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-NTitleReasonAction
GWP-171PCM voice barksStays 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-173In-game musicStays 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-163Post-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-283Concept library: 15 candidate cyberpunk cartridgesStrategy 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”

These need a Josh decision before the engineer can ship a clean PR.

  1. 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-fw per 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.
  2. 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.
  3. 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”
  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.
  1. Progress-bar unfilled glyph — Default: middle dot · (visible texture at 0%).
  2. level > max_level for threat-bar — Default: silent clamp (pragmatic for animations).
  3. Title asymmetric padding — Default: accept up to 1-char asymmetry (terminal UI convention).
  1. Bundle with GWP-265? — Default: yes, single dispatch with separate commits per task. Saves review overhead on shared dev-overlay surface.
  2. NOKIA empty-state phrasing — Default: (no nemacs session) (diagnostic specificity within the unified verb pattern).
  1. Flag name — Default: --validate-fw (accurate to realigned scope).
  2. 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.
  3. Doc cross-reference home — Default: ADR-0011 Emulator Parity section (authoritative scope source).
  1. 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.
  2. 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.
  1. Sample-cart choice — Default: Zaibatsu splash for ICE Breaker (exercises full PSG + animation envelope).
  2. No-splash-cart behavior — Default: skip entirely (preserves “absence is meaningful” framing for Setec Astronomy contrast).
  3. Splash-skip key — Default: SYS (right-index resting, conventional system-control).
  4. Time-budget enforcement — Default: BOTH (frame count and wall clock — whichever fires first).
  1. 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.
  2. Box-drawing stroke weight — Default: try both, pick via A/B comparison (Black Ledger tabular UI is worst-case test).
  3. A/B sweep granularity — Default: home + 1 gameplay × 4 carts (8 captures minimum), expand if early review flags concerns.
  4. 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.
  1. Cart-author UX — Default: standalone tools/make_clip.py Python for v0.1; Lisp-side authoring primitive deferred.
  2. Storyboard authoring ownership — Default: Gameplay Design agent authors all 4 storyboards with Josh review at storyboard stage before encoding.
  3. Idle-trigger duration — Default: 30 seconds (matches retro-handheld convention).
  4. Cart-side vs runtime-default clip resolution — Default: cart-side overrides bare-deck reel when present.
  5. 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)”
  1. publisher-splash primitive 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)”
  1. GWP-171 stays deferred until ADR-0017 audio path measured + CIPHER OLED playtested + pcm-voice-bark.md rewritten — Default: confirm defer.
  2. 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”
  1. GWP-171 stays deferred? Confirm or override.
  2. GWP-171 stale-spec disposition. Leave pcm-voice-bark.md with banner [recommended] vs move to _archive/.
  3. v0.1 launch-cart bark dependency? Current bibles assume no — confirm.
  4. GWP-173 stays deferred? Confirm or override.
  5. PSG-only music as separate task? If Josh wants ambient PSG music pre-Pico, file as new work.
  6. v0.1 launch-cart music dependency? Current bibles assume no — confirm.
  7. GWP-163 stays in Planning, no dispatch? Confirm.
  8. GWP-163 mirror to docs/_meta/deferred-work-catalog.md? Recommend NO until demand.
  9. GWP-163 next audit trigger. v0.1 ship [recommended] vs sooner.
  1. 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.
  2. 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.

Honest estimates assuming TDD discipline, isolated worktrees, and QA gating per PR.

~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)

~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).

~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.


First wave (when Josh greenlights):

  1. GWP-247 — Lisp primitive, additive, TDD warm-up, 0 OQs. Single C engineer.
  2. GWP-266 — pure docs, single doc agent.
  3. GWP-261 — pure docs, single doc agent. Different file from GWP-266; safe to parallel.
  4. 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:

  1. Worktree-isolation on parallel SM dispatches. The memory rule feedback_parallel_agent_worktree_isolation is non-negotiable; confirm SM is briefed to pass isolation: "worktree" on every Agent call in this sprint.
  2. 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 to git pull before final commit. Easier: serialize them (GWP-246 first since it’s the simpler one, GWP-256 picks up the merged tip).
  3. 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.
  4. 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-splash primitive entry under a one-line “Lifecycle hooks” header; full taxonomy is a separate ADR amendment task.
  5. 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.”
  6. 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.

  • 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.