The bread character alone from the CRUMB logo: a smiling slice of bread with a bite taken from its top right corner
Back to the hall

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.

Design and development · built with AI coding agents

  • CLILocal demo
  • Web StudioLocal demo

CRUMB vocabulary

Lens
Game Pipeline
Build
Runtime Verification
Control Plane
Repair
Evidence
  1. spec
  2. build
  3. artifact
  1. qa check
  2. ac predicate
  3. verifier
  1. routing
  2. circuit breaker
  3. budget
  4. intervention
  1. transcript
  2. anti-deception
  3. 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.

System map · drawn from code paths at public commit f5e17c0
CRUMB studio systemA person pitches and steers a game from Studio, and Studio writes commands to an inbox. The coordinator passes new events from the inbox and the transcript to the reducer in order; the pure reducer decides state and the next effects, and only the dispatcher performs side effects. The Planner’s spec, the Builder’s build and artifacts, the execution QA result and the Verifier’s judgment all become transcript events. The Verifier receives projected evidence only, and the reducer checks and corrects its score against the QA result: PASS ends the session, PARTIAL waits for a person, and anything else goes back for redesign or repair.Game pitch · steeringA person, running locallypackages/studioEvents · artifacts viewWrite inbox commandssrc/transcripttranscript.jsonl · append-onlysrc/loop/coordinator.tsEvent loop · replay · tailsrc/reducerState → next effectsVerdict routingsession doneDone · PASS or stop reasonsrc/dispatcher/live.tsRun effects · spawn actorsJudge input projectionmodel-config · presetActor → harness · modelagent actor · CLIPlanner Lead · specBuilder · writes gameartifacts/Game filesdispatcher/qa-runner.tsExecution QA · checksVerifier actorVerifier · model verdictsrc/validatorAnti-deception · score fixPeople · StudioEvent controltranscript is the source of stateWorking agents · artifactsVerification · decision1pitch · steer2user events3reduce in order4effects5actor setup6run Planner7spec8run Builder9files10build record11qa_check12what runs13qa.result1qa.result2evidence only3judge input4judge.score5score · QA evidence6corrected verdict7done1corrected verdict2PARTIAL check3redesign · repair4done5pitch · steer1new events · replay2reduce in order3read · SSE

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.

  1. Game pitch · steeringRun · judgment: pitch · steerWrite inbox commandspackages/studio

    A one-line game pitch and natural-language steering are entered in Studio, which writes commands to the inbox. Studio never edits the transcript directly.

  2. Write inbox commandspackages/studioData: user eventsEvent loop · replay · tailsrc/loop/coordinator.ts

    The coordinator reads inbox commands and records them in the transcript as user events.

  3. Event loop · replay · tailsrc/loop/coordinator.tsRun · judgment: reduce in orderState → next effectssrc/reducer

    Live events are reduced one at a time from a queue, keeping each event’s effects in order; the dispatch itself runs asynchronously.

  4. State → next effectssrc/reducerRun · judgment: effectsRun effects · spawn actorssrc/dispatcher/live.ts

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

  5. Actor → harness · modelmodel-config · presetRun · judgment: actor setupsrc/dispatcher/live.ts

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

  6. Run effects · spawn actorssrc/dispatcher/live.tsRun · judgment: run PlannerPlanner Lead · specagent actor · CLI

    The dispatcher runs the Planner with projected input. Conditional research continues through the Planner’s research plan and evidence handoff, folded away on this map.

  7. Planner Lead · specagent actor · CLIData: spectranscript.jsonl · append-onlysrc/transcript

    The Planner’s spec becomes a transcript event, and the reducer selects the Builder from it. Actors do not call one another.

  8. Run effects · spawn actorssrc/dispatcher/live.tsRun · judgment: run BuilderBuilder · writes gameagent actor · CLI

    The dispatcher runs the Builder. If the same actor keeps failing, a circuit opens and swaps the adapter, and stops if failures continue.

  9. Builder · writes gameagent actor · CLIData: filesGame filesartifacts/

    The Builder writes the entry file, sources and assets as artifacts.

  10. Builder · writes gameagent actor · CLIData: build recordtranscript.jsonl · append-onlysrc/transcript

    The build event and artifact.created are recorded in the transcript with the artifact’s identity.

  11. Run effects · spawn actorssrc/dispatcher/live.tsRun · judgment: qa_checkExecution QA · checksdispatcher/qa-runner.ts

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

  12. Game filesartifacts/Data: what runsExecution QA · checksdispatcher/qa-runner.ts

    Execution QA runs the actual artifact with code and browser checks. The 120-second default timeout is a configuration value.

  13. Execution QA · checksdispatcher/qa-runner.tsData: qa.resulttranscript.jsonl · append-onlysrc/transcript

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

  1. Execution QA · checksdispatcher/qa-runner.tsData: qa.resulttranscript.jsonl · append-onlysrc/transcript

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

  2. transcript.jsonl · append-onlysrc/transcriptData: evidence onlyJudge input projectionsrc/dispatcher/live.ts

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

  3. Judge input projectionsrc/dispatcher/live.tsData: judge inputVerifier · model verdictVerifier actor

    The dispatcher runs the Verifier with the projected input.

  4. Verifier · model verdictVerifier actorData: judge.scoretranscript.jsonl · append-onlysrc/transcript

    The Verifier’s verdict is recorded as a judge.score event. It is a model’s judgment, not a fact about execution.

  5. State → next effectssrc/reducerRun · judgment: score · QA evidenceAnti-deception · score fixsrc/validator

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

  6. Anti-deception · score fixsrc/validatorData: corrected verdictVerdict routingsrc/reducer

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

  7. Verdict routingsrc/reducerData: doneDone · PASS or stop reasonsession done

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

  1. Anti-deception · score fixsrc/validatorData: corrected verdictVerdict routingsrc/reducer

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

  2. Verdict routingsrc/reducerRun · judgment: PARTIAL checkGame pitch · steering

    PARTIAL waits for a person to check.

  3. Verdict routingsrc/reducerRun · judgment: redesign · repairsrc/dispatcher/live.ts

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

  4. Verdict routingsrc/reducerData: doneDone · PASS or stop reasonsession done

    PASS ends the session as done. Budget and circuit stops also end as done but keep their stop reason, so done is not always PASS.

  5. Game pitch · steeringRun · judgment: pitch · steerWrite inbox commandspackages/studio

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

  1. transcript.jsonl · append-onlysrc/transcriptData: new events · replayEvent loop · replay · tailsrc/loop/coordinator.ts

    The writer validates the schema, assigns a ULID and time, and appends. On replay, past events are only reduced; their effects are not run again.

  2. Event loop · replay · tailsrc/loop/coordinator.tsRun · judgment: reduce in orderState → next effectssrc/reducer

    Live events are reduced one at a time from a queue, keeping each event’s effects in order; the dispatch itself runs asynchronously.

  3. transcript.jsonl · append-onlysrc/transcriptObservation · report: read · SSEEvents · artifacts viewpackages/studio

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