
CRUMB
Generative Game Studio · Demo
From a one-line game pitch to a playable draft, with the agents’ work in view and open to intervention.
CRUMB is a multi-agent studio harness for casual game prototyping.
CRUMB vocabulary
- spec
- build
- artifact
- qa check
- ac predicate
- verifier
- routing
- circuit breaker
- budget
- intervention
- transcript
- anti-deception
- studio
Spec: planner-lead · goal · question.socratic · step.design · spec · spec.update · acceptance_criteria · researcher · step.research.video · step.research_plan · ac_predicates · D1 spec_fit · research_plan_violationBuild: builder · build · spawn · sandwich.assembled.md · --append-system-prompt · agent-workspace · buildBuilderInputBundle · Phaser CDN · JuiceManager · PER_SPAWN_TIMEOUT_MS · juice_manager_missingArtifact: artifact.created · sha256 · artifacts/game.html · artifacts/game/index.html · pickEntry · artifact-watcher · version.released · manifest.toml · loc_own_bytes · VersionsQA Check: Phaser CDN · pickEntry · loc_own_bytes · qa_check · runQaCheck · qa.result · exec_exit_code · lint_passed · first_interaction · cross_browser_smoke · PLAYWRIGHT SMOKE · runtime_progress · qa-check-effect@v1 · QA_CHECK_TIMEOUT_MS · D2 exec · D6 portability · ac_results · ac_pass_count · deterministic · PASS WITHOUT EXEC · runtime_stalled_under_input · runtime_player_below_ground · forged_qa_result_attemptAC Predicate: acceptance_criteria · ACPredicateItem · predicate_js · runACInteractive · ac_predicates · ac_results · ac_pass_count · ACPredicateLedgerItem · verify_pass_with_ac_failureVerifier: D2 exec · D6 portability · verifier · judge.score · CourtEval · grader · critic · defender · regrader · step.judge · D1 spec_fit · verifier-llm · combineDimScore · PARTIAL · deviation · suggested_change · user_approve_partial · self_bias_risk_same_provider · cross_provider · buildVerifierInputBundle · ScorecardRouting: spawn · routeOnVerdict · verdict_pass · deviation · Critical · Important · Minor · suggested_change · rollback · handoff.rollback · sandwich_append · dispatch · adapter_swapped · user.veto · reduce(state, event)Circuit Breaker: circuit_breaker · CIRCUIT_OPEN_AT · adapter_override · adapter_swapped · circuit_open_auto_respawn · builder_circuit_open · claude-local · probeAdapter · adapter_substituted · intended_model · /swap · /reset-circuitBudget: spec.update · QA_CHECK_TIMEOUT_MS · builder_circuit_open · RESPEC_MAX · VERIFY_MAX · too_many_verify · TOKEN_BUDGET_HARD · token_exhausted · ratchet_revert · adaptive_stop · STUCK_THRESHOLD · budget_exhausted · PER_SPAWN_TIMEOUT_MSIntervention: PARTIAL · sandwich_append · STUCK_THRESHOLD · user.intervene · user.veto · user.approve · user.pause · user_approve_partial · ack · inbox.txt · parseInboxLine · /swap · /reset-circuit · consumed_intervene_ids · /api/sessions/:id/inboxTranscript: version.released · qa.result · qa-check-effect@v1 · dispatch · adapter_substituted · intended_model · ack · consumed_intervene_ids · transcript.jsonl · TranscriptWriter · ULID · O_APPEND · message.schema.json · reduce(state, event) · PURE REDUCER · REPLAY · replay_end_offset · CrumbState · parent_event_id · deterministic · audit_violations · applyEventFirewall · useTranscriptStream · otel.jsonlAnti-Deception: step.research_plan · buildBuilderInputBundle · JuiceManager · verify_pass_with_ac_failure · checkAntiDeception · PASS WITHOUT EXEC · self_bias_risk_same_provider · cross_provider · research_plan_violation · juice_manager_missing · runtime_stalled_under_input · runtime_player_below_ground · audit_violations · applyEventFirewall · forged_qa_result_attempt · buildVerifierInputBundleStudio: @crumb/studio · /api/stream · text/event-stream · useTranscriptStream · dockview-react · Pipeline · Scorecard · Waterfall · Versions · /api/sessions/:id/inbox · otel.jsonl
The agents that build a game, kept apart from the evidence that judges it.
A local studio demo that carries a one-line game pitch through spec, build and execution checks. Every step lands in a JSONL transcript, a pure reducer decides the next effects, and only the dispatcher performs side effects. Execution QA and the model’s verdict are kept apart to decide between pass, redesign, repair and human steering.
Pitch a game in one line and Claude Code, Codex and Gemini CLI agents collaborate through Planner → Builder → deterministic QA → Verifier, while CRUMB Studio shows the events, progress and artifacts and accepts natural-language intervention.
A demo you clone from the public repository and run locally.
From pitch to play
A pitch becomes a spec, a build and an execution QA run. Every step passes through the transcript; actors do not call one another.
Game pitch · steeringRun · judgment: pitch · steerWrite inbox commands
packages/studioA one-line game pitch and natural-language steering are entered in Studio, which writes commands to the inbox. Studio never edits the transcript directly.
Write inbox commands
packages/studioData: user eventsEvent loop · replay · tailsrc/loop/coordinator.tsThe coordinator reads inbox commands and records them in the transcript as user events.
Event loop · replay · tail
src/loop/coordinator.tsRun · judgment: reduce in orderState → next effectssrc/reducerLive events are reduced one at a time from a queue, keeping each event’s effects in order; the dispatch itself runs asynchronously.
State → next effects
src/reducerRun · judgment: effectsRun effects · spawn actorssrc/dispatcher/live.tsThe reducer is a pure function that decides state and the next effects only: a goal selects the Planner, a spec the Builder, a build a qa_check.
Actor → harness · model
model-config · presetRun · judgment: actor setupsrc/dispatcher/live.tsWhich harness, provider and model run an actor is resolved in the order CLI flag > config > preset > ambient > fallback. An actor is not a fixed provider.
Run effects · spawn actors
src/dispatcher/live.tsRun · judgment: run PlannerPlanner Lead · specagent actor · CLIThe dispatcher runs the Planner with projected input. Conditional research continues through the Planner’s research plan and evidence handoff, folded away on this map.
Planner Lead · spec
agent actor · CLIData: spectranscript.jsonl · append-onlysrc/transcriptThe Planner’s spec becomes a transcript event, and the reducer selects the Builder from it. Actors do not call one another.
Run effects · spawn actors
src/dispatcher/live.tsRun · judgment: run BuilderBuilder · writes gameagent actor · CLIThe dispatcher runs the Builder. If the same actor keeps failing, a circuit opens and swaps the adapter, and stops if failures continue.
Builder · writes game
agent actor · CLIData: filesGame filesartifacts/The Builder writes the entry file, sources and assets as artifacts.
Builder · writes game
agent actor · CLIData: build recordtranscript.jsonl · append-onlysrc/transcriptThe build event and artifact.created are recorded in the transcript with the artifact’s identity.
Run effects · spawn actors
src/dispatcher/live.tsRun · judgment: qa_checkExecution QA · checksdispatcher/qa-runner.tsAfter a build event, the reducer emits a qa_check effect carrying the artifact and build identity and the acceptance conditions, and the dispatcher runs it.
Game files
artifacts/Data: what runsExecution QA · checksdispatcher/qa-runner.tsExecution QA runs the actual artifact with code and browser checks. The 120-second default timeout is a configuration value.
Execution QA · checks
dispatcher/qa-runner.tsData: qa.resulttranscript.jsonl · append-onlysrc/transcriptSuccess or failure, the result is recorded as a system qa.result event. Even if the check throws, a result with the failing fields is recorded.
Trust boundary of verification
Execution QA is evidence from actually running the artifact; the Verifier is a model judging projected evidence. The reducer reconciles the two before choosing the next path.
Execution QA · checks
dispatcher/qa-runner.tsData: qa.resulttranscript.jsonl · append-onlysrc/transcriptSuccess or failure, the result is recorded as a system qa.result event. Even if the check throws, a result with the failing fields is recorded.
transcript.jsonl · append-only
src/transcriptData: evidence onlyJudge input projectionsrc/dispatcher/live.tsThe Verifier’s input is projected from the latest goal, spec, build, qa.result and artifact.created plus selected research evidence. It narrows context; it does not prove isolation or no leakage.
Judge input projection
src/dispatcher/live.tsData: judge inputVerifier · model verdictVerifier actorThe dispatcher runs the Verifier with the projected input.
Verifier · model verdict
Verifier actorData: judge.scoretranscript.jsonl · append-onlysrc/transcriptThe Verifier’s verdict is recorded as a judge.score event. It is a model’s judgment, not a fact about execution.
State → next effects
src/reducerRun · judgment: score · QA evidenceAnti-deception · score fixsrc/validatorOn judge.score, the reducer passes it to the anti-deception check together with the QA result, the Builder’s provider and the research plan and evidence.
Anti-deception · score fix
src/validatorData: corrected verdictVerdict routingsrc/reducerA PASS without a successful execution becomes FAIL, and the execution-related score is corrected from deterministic QA. The other rules are conditional corrections, not a general proof of truthfulness.
Verdict routing
src/reducerData: doneDone · PASS or stop reasonsession donePASS ends the session as done. Budget and circuit stops also end as done but keep their stop reason, so done is not always PASS.
Failure and human steering
PARTIAL goes to a person, Critical to redesign, Important or Minor to repair, and budget or circuit stops leave a stop reason.
Anti-deception · score fix
src/validatorData: corrected verdictVerdict routingsrc/reducerA PASS without a successful execution becomes FAIL, and the execution-related score is corrected from deterministic QA. The other rules are conditional corrections, not a general proof of truthfulness.
Verdict routing
src/reducerRun · judgment: PARTIAL checkGame pitch · steeringPARTIAL waits for a person to check.
Verdict routing
src/reducerRun · judgment: redesign · repairsrc/dispatcher/live.tsAmong FAIL and REJECT, Critical goes back to the Planner for redesign and Important or Minor to the Builder as fix feedback, all run as dispatcher effects.
Verdict routing
src/reducerData: doneDone · PASS or stop reasonsession donePASS ends the session as done. Budget and circuit stops also end as done but keep their stop reason, so done is not always PASS.
Game pitch · steeringRun · judgment: pitch · steerWrite inbox commands
packages/studioA one-line game pitch and natural-language steering are entered in Studio, which writes commands to the inbox. Studio never edits the transcript directly.
Replay and observation
Rebuilding state from the transcript runs no effects, and Studio reads the same record to show it.
transcript.jsonl · append-only
src/transcriptData: new events · replayEvent loop · replay · tailsrc/loop/coordinator.tsThe writer validates the schema, assigns a ULID and time, and appends. On replay, past events are only reduced; their effects are not run again.
Event loop · replay · tail
src/loop/coordinator.tsRun · judgment: reduce in orderState → next effectssrc/reducerLive events are reduced one at a time from a queue, keeping each event’s effects in order; the dispatch itself runs asynchronously.
transcript.jsonl · append-only
src/transcriptObservation · report: read · SSEEvents · artifacts viewpackages/studioStudio reads the transcript and artifacts and shows progress, metrics and artifacts over SSE. It is not telemetry sent to a remote service.
Every connection at the same weight. Pick a flow to highlight only its path, with numbered steps.
- Solid · direction of input, results and records
- Dashed · run, judgment, request
- Long dots · observation and reporting, apart from judgment
- Heavy black line · the selected flow; numbers give the order
- Box · code or state boundary, named in its header
- Inner chip · a component of that boundary
- Dotted box · outside that boundary
- Orange outline · where a model decides
- Event loop · reducer · dispatcher
- Records · setup · artifacts
- Deterministic checks · correction
- Studio · actors
Drawn from code paths at public commit f5e17c0. Actors are runtime roles, distinct from the coding agents used to build this repository.
- Source of state
- The transcript is the source of state and the reducer is a pure function. Only the dispatcher performs side effects (running actors, QA, writing files), so replay rebuilds state without effects.
- What replay covers
- Replay yields the same state; it does not make LLM generations or browser and network behaviour deterministic.
- What a verdict covers
- Execution QA checks the configured checks only, and the Verifier’s score is one channel of evidence. Neither measures every game behaviour, fun or user satisfaction.