Kun brødfiguren fra CRUMB-logoet: en smilende brødskive med et bid taget af det øverste højre hjørne
Tilbage til salen

CRUMB

Generative Game Studio · Demo

Fra en spilidé på én linje til et spilbart udkast, med agenternes arbejde synligt og åbent for indgreb.

CRUMB er en studio-harness med flere agenter til prototyper af casual-spil.

Design og udvikling · bygget med AI-kodeagenter

  • CLILokal demo
  • Web-StudioLokal 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

Agenterne, der bygger et spil, holdes adskilt fra det belæg, der bedømmer det.

En lokal studio-demo, der fører en spilidé på én linje gennem specifikation, build og udførelseskontroller. Hvert trin havner i en JSONL-transskription, en ren reducer bestemmer de næste effekter, og kun dispatcheren udfører sideeffekter. Udførelses-QA og modellens dom holdes adskilt for at afgøre mellem bestået, nyt design, reparation og menneskelig styring.

Et spil beskrives på én linje, og agenter i Claude Code, Codex og Gemini CLI samarbejder gennem Planner → Builder → deterministisk QA → Verifier, mens CRUMB Studio viser hændelser, fremdrift og artefakter og tager imod indgreb på naturligt sprog.

En demo, der klones fra det offentlige repository og køres lokalt.

Systemkort · tegnet ud fra kodestier i offentlig commit f5e17c0
CRUMB: studiosystemEn person foreslår og styrer et spil fra Studio, og Studio skriver kommandoer til en inbox. Koordinatoren giver nye hændelser fra inboxen og transskriptionen videre til reduceren i rækkefølge; den rene reducer bestemmer tilstand og de næste effekter, og kun dispatcheren udfører sideeffekter. Specifikationen fra Planner, build og artefakter fra Builder, resultatet af udførelses-QA og dommen fra Verifier bliver alle transskriptionshændelser. Verifier modtager kun projiceret belæg, og reduceren kontrollerer og retter dens score mod QA-resultatet: PASS afslutter sessionen, PARTIAL venter på en person, og alt andet går tilbage til nyt design eller reparation.Spilidé · styringEn person, der kører lokaltpackages/studioVisning af hændelser · artefakterSkriv kommandoer til inboxsrc/transcripttranscript.jsonl · append-onlysrc/loop/coordinator.tsHændelsesløkke · replay · tailsrc/reducerTilstand → næste effekterRouting af domsession doneFærdig · PASS eller stopårsagsrc/dispatcher/live.tsKør effekter · spawn actorsProjektion af bedømmerinputmodel-config · presetActor → harness · modelagent actor · CLIPlanner Lead · specifikationBuilder · skriver spilletartifacts/Spilfilerdispatcher/qa-runner.tsUdførelses-QA · kontrollerVerifier actorVerifier · modellens domsrc/validatorAnti-deception · scorerettelsePersoner · StudioHændelsesstyringtransskriptionen er kilden til tilstandenArbejdende agenter · artefakterVerifikation · beslutning1idé · styring2user-hændelser3reduce i rækkefølge4effekter5actor-opsætning6kør Planner7spec8kør Builder9filer10build-log11qa_check12hvad der køres13qa.result1qa.result2kun belæg3bedømmerinput4judge.score5score · QA-belæg6rettet dom7done1rettet dom2PARTIAL-kontrol3nyt design · reparation4done5idé · styring1nye hændelser · replay2reduce i rækkefølge3læsning · SSE

Fra idé til spil

En idé bliver til en specifikation, et build og en kørsel af udførelses-QA. Hvert trin går gennem transskriptionen; actors kalder ikke hinanden.

  1. Spilidé · styringKørsel · vurdering: idé · styringSkriv kommandoer til inboxpackages/studio

    En spilidé på én linje og styring på naturligt sprog indtastes i Studio, som skriver kommandoer til inboxen. Studio redigerer aldrig transskriptionen direkte.

  2. Skriv kommandoer til inboxpackages/studioData: user-hændelserHændelsesløkke · replay · tailsrc/loop/coordinator.ts

    Koordinatoren læser kommandoer fra inboxen og registrerer dem i transskriptionen som user-hændelser.

  3. Hændelsesløkke · replay · tailsrc/loop/coordinator.tsKørsel · vurdering: reduce i rækkefølgeTilstand → næste effektersrc/reducer

    Live-hændelser reduceres én ad gangen fra en kø, så hver hændelses effekter holdes i rækkefølge; selve dispatchen kører asynkront.

  4. Tilstand → næste effektersrc/reducerKørsel · vurdering: effekterKør effekter · spawn actorssrc/dispatcher/live.ts

    Reduceren er en ren funktion, der kun bestemmer tilstand og de næste effekter: et goal vælger Planner, en spec Builder, et build en qa_check.

  5. Actor → harness · modelmodel-config · presetKørsel · vurdering: actor-opsætningsrc/dispatcher/live.ts

    Hvilken harness, udbyder og model der kører en actor, afgøres i rækkefølgen CLI-flag > config > preset > ambient > fallback. En actor er ikke en fast udbyder.

  6. Kør effekter · spawn actorssrc/dispatcher/live.tsKørsel · vurdering: kør PlannerPlanner Lead · specifikationagent actor · CLI

    Dispatcheren kører Planner med projiceret input. Betinget research fortsætter gennem Planners researchplan og overdragelse af belæg, der er foldet sammen på dette kort.

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

    Specifikationen fra Planner bliver en transskriptionshændelse, og reduceren vælger Builder ud fra den. Actors kalder ikke hinanden.

  8. Kør effekter · spawn actorssrc/dispatcher/live.tsKørsel · vurdering: kør BuilderBuilder · skriver spilletagent actor · CLI

    Dispatcheren kører Builder. Hvis samme actor bliver ved med at fejle, åbnes et circuit, der skifter adapteren, og kørslen stopper, hvis fejlene fortsætter.

  9. Builder · skriver spilletagent actor · CLIData: filerSpilfilerartifacts/

    Builder skriver indgangsfilen, kilder og assets som artefakter.

  10. Builder · skriver spilletagent actor · CLIData: build-logtranscript.jsonl · append-onlysrc/transcript

    Build-hændelsen og artifact.created registreres i transskriptionen med artefaktets identitet.

  11. Kør effekter · spawn actorssrc/dispatcher/live.tsKørsel · vurdering: qa_checkUdførelses-QA · kontrollerdispatcher/qa-runner.ts

    Efter en build-hændelse udsender reduceren en qa_check-effekt, der bærer artefaktets og buildets identitet og acceptbetingelserne, og dispatcheren kører den.

  12. Spilfilerartifacts/Data: hvad der køresUdførelses-QA · kontrollerdispatcher/qa-runner.ts

    Udførelses-QA kører det faktiske artefakt med kode- og browserkontroller. Standardtimeouten på 120 sekunder er en konfigurationsværdi.

  13. Udførelses-QA · kontrollerdispatcher/qa-runner.tsData: qa.resulttranscript.jsonl · append-onlysrc/transcript

    Uanset succes eller fejl registreres resultatet som en system-hændelse qa.result. Selv hvis kontrollen kaster en undtagelse, registreres et resultat med de fejlende felter.

Verifikationens tillidsgrænse

Udførelses-QA er belæg fra faktisk at køre artefaktet; Verifier er en model, der bedømmer projiceret belæg. Reduceren afstemmer de to, før den vælger den næste vej.

  1. Udførelses-QA · kontrollerdispatcher/qa-runner.tsData: qa.resulttranscript.jsonl · append-onlysrc/transcript

    Uanset succes eller fejl registreres resultatet som en system-hændelse qa.result. Selv hvis kontrollen kaster en undtagelse, registreres et resultat med de fejlende felter.

  2. transcript.jsonl · append-onlysrc/transcriptData: kun belægProjektion af bedømmerinputsrc/dispatcher/live.ts

    Verifiers input projiceres fra de seneste goal, spec, build, qa.result og artifact.created plus udvalgt research-belæg. Det indsnævrer konteksten; det beviser ikke isolation eller fravær af lækage.

  3. Projektion af bedømmerinputsrc/dispatcher/live.tsData: bedømmerinputVerifier · modellens domVerifier actor

    Dispatcheren kører Verifier med det projicerede input.

  4. Verifier · modellens domVerifier actorData: judge.scoretranscript.jsonl · append-onlysrc/transcript

    Verifiers dom registreres som en judge.score-hændelse. Det er en models vurdering, ikke et faktum om udførelsen.

  5. Tilstand → næste effektersrc/reducerKørsel · vurdering: score · QA-belægAnti-deception · scorerettelsesrc/validator

    Ved judge.score giver reduceren den videre til anti-deception-kontrollen sammen med QA-resultatet, Builders udbyder samt researchplanen og belægget.

  6. Anti-deception · scorerettelsesrc/validatorData: rettet domRouting af domsrc/reducer

    Et PASS uden en vellykket udførelse bliver FAIL, og den udførelsesrelaterede score rettes ud fra deterministisk QA. De øvrige regler er betingede rettelser, ikke et generelt bevis for sandfærdighed.

  7. Routing af domsrc/reducerData: doneFærdig · PASS eller stopårsagsession done

    PASS afslutter sessionen som done. Stop på grund af budget eller circuit ender også som done, men beholder deres stopårsag, så done er ikke altid PASS.

Fejl og menneskelig styring

PARTIAL går til en person, Critical til nyt design, Important eller Minor til reparation, og stop på grund af budget eller circuit efterlader en stopårsag.

  1. Anti-deception · scorerettelsesrc/validatorData: rettet domRouting af domsrc/reducer

    Et PASS uden en vellykket udførelse bliver FAIL, og den udførelsesrelaterede score rettes ud fra deterministisk QA. De øvrige regler er betingede rettelser, ikke et generelt bevis for sandfærdighed.

  2. Routing af domsrc/reducerKørsel · vurdering: PARTIAL-kontrolSpilidé · styring

    PARTIAL venter på, at en person kontrollerer.

  3. Routing af domsrc/reducerKørsel · vurdering: nyt design · reparationsrc/dispatcher/live.ts

    Blandt FAIL og REJECT går Critical tilbage til Planner for nyt design, og Important eller Minor går til Builder som feedback til rettelse, alt kørt som dispatcher-effekter.

  4. Routing af domsrc/reducerData: doneFærdig · PASS eller stopårsagsession done

    PASS afslutter sessionen som done. Stop på grund af budget eller circuit ender også som done, men beholder deres stopårsag, så done er ikke altid PASS.

  5. Spilidé · styringKørsel · vurdering: idé · styringSkriv kommandoer til inboxpackages/studio

    En spilidé på én linje og styring på naturligt sprog indtastes i Studio, som skriver kommandoer til inboxen. Studio redigerer aldrig transskriptionen direkte.

Genafspilning og observation

Genopbygning af tilstanden fra transskriptionen kører ingen effekter, og Studio læser den samme log for at vise den.

  1. transcript.jsonl · append-onlysrc/transcriptData: nye hændelser · replayHændelsesløkke · replay · tailsrc/loop/coordinator.ts

    Writeren validerer skemaet, tildeler et ULID og et tidspunkt og skriver append-only. Ved replay køres tidligere hændelser kun gennem reduceren; deres effekter køres ikke igen.

  2. Hændelsesløkke · replay · tailsrc/loop/coordinator.tsKørsel · vurdering: reduce i rækkefølgeTilstand → næste effektersrc/reducer

    Live-hændelser reduceres én ad gangen fra en kø, så hver hændelses effekter holdes i rækkefølge; selve dispatchen kører asynkront.

  3. transcript.jsonl · append-onlysrc/transcriptObservation · rapport: læsning · SSEVisning af hændelser · artefakterpackages/studio

    Studio læser transskriptionen og artefakterne og viser fremdrift, metrikker og artefakter over SSE. Det er ikke telemetri sendt til en ekstern tjeneste.

Alle forbindelser med samme tykkelse. Vælg et flow for kun at fremhæve dets vej med nummererede trin.

  • Fuldt optrukket · retning for input, resultater og logs
  • Stiplet · kørsel, vurdering, anmodning
  • Lange prikker · observation og rapportering, adskilt fra vurdering
  • Kraftig sort linje · det valgte flow; tal angiver rækkefølgen
  • Boks · kode- eller tilstandsgrænse, navngivet i overskriften
  • Indre chip · en komponent inden for grænsen
  • Prikket boks · uden for grænsen
  • Orange kontur · hvor en model træffer beslutninger
  • Hændelsesløkke · reducer · dispatcher
  • Logs · opsætning · artefakter
  • Deterministiske kontroller · rettelse
  • Studio · actors

Tegnet ud fra kodestier i offentlig commit f5e17c0. Actors er roller under kørsel, adskilt fra de kodeagenter, der blev brugt til at bygge dette repository.

Kilden til tilstand
Transskriptionen er kilden til tilstanden, og reduceren er en ren funktion. Kun dispatcheren udfører sideeffekter (kørsel af actors, QA, skrivning af filer), så genafspilning genopbygger tilstanden uden effekter.
Hvad genafspilning dækker
Genafspilning giver den samme tilstand; den gør ikke LLM-genereringer eller browser- og netværksadfærd deterministisk.
Hvad en dom dækker
Udførelses-QA kontrollerer kun de konfigurerede kontroller, og Verifiers score er én kanal af belæg. Ingen af dem måler al adfærd i spillet, om det er sjovt, eller brugertilfredshed.