
CRUMB
Generative Game Studio · Demo
Da un’idea di gioco in una riga a una bozza giocabile, con il lavoro degli agenti in vista e aperto all’intervento.
CRUMB è un harness da studio multi-agente per la prototipazione di giochi casual.
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
Gli agenti che costruiscono un gioco, separati dalle prove che lo giudicano.
Una demo di studio locale che porta un’idea di gioco in una riga attraverso specifica, build e controlli di esecuzione. Ogni passo finisce in un transcript JSONL, un reducer puro decide gli effetti successivi, e solo il dispatcher produce effetti collaterali. La QA di esecuzione e il verdetto del modello restano separati per decidere tra superamento, riprogettazione, riparazione e intervento umano.
Si propone un gioco in una riga e gli agenti Claude Code, Codex e Gemini CLI collaborano attraverso Planner → Builder → QA deterministica → Verifier, mentre CRUMB Studio mostra eventi, avanzamento e artefatti e accetta interventi in linguaggio naturale.
Una demo da clonare dal repository pubblico ed eseguire in locale.
Dalla proposta al gioco
Una proposta diventa una specifica, una build e un’esecuzione della QA. Ogni passo passa per il transcript; gli actor non si chiamano tra loro.
Idea di gioco · interventoEsecuzione · giudizio: proposta · interventoScrittura dei comandi nella inbox
packages/studioUn’idea di gioco in una riga e gli interventi in linguaggio naturale si inseriscono in Studio, che scrive comandi nella inbox. Studio non modifica mai direttamente il transcript.
Scrittura dei comandi nella inbox
packages/studioDati: eventi userCiclo degli eventi · replay · tailsrc/loop/coordinator.tsIl coordinator legge i comandi della inbox e li registra nel transcript come eventi user.
Ciclo degli eventi · replay · tail
src/loop/coordinator.tsEsecuzione · giudizio: riduzione in ordineStato → effetti successivisrc/reducerGli eventi dal vivo vengono ridotti uno alla volta da una coda, mantenendo in ordine gli effetti di ciascun evento; il dispatch in sé gira in modo asincrono.
Stato → effetti successivi
src/reducerEsecuzione · giudizio: effettiEsecuzione degli effetti · avvio degli actorsrc/dispatcher/live.tsIl reducer è una funzione pura che decide solo lo stato e gli effetti successivi: un goal seleziona il Planner, una spec il Builder, una build un qa_check.
Actor → harness · modello
model-config · presetEsecuzione · giudizio: configurazione degli actorsrc/dispatcher/live.tsCon quale harness, provider e modello viene eseguito un actor si stabilisce nell’ordine flag della CLI > config > preset > ambient > fallback. Un actor non è un provider fisso.
Esecuzione degli effetti · avvio degli actor
src/dispatcher/live.tsEsecuzione · giudizio: esecuzione del PlannerPlanner Lead · specificaagent actor · CLIIl dispatcher esegue il Planner con l’input proiettato. La ricerca condizionale prosegue attraverso il piano di ricerca del Planner e il passaggio delle prove, ripiegati in questa mappa.
Planner Lead · specifica
agent actor · CLIDati: spectranscript.jsonl · append-onlysrc/transcriptLa specifica del Planner diventa un evento del transcript, e da essa il reducer seleziona il Builder. Gli actor non si chiamano tra loro.
Esecuzione degli effetti · avvio degli actor
src/dispatcher/live.tsEsecuzione · giudizio: esecuzione del BuilderBuilder · scrive il giocoagent actor · CLIIl dispatcher esegue il Builder. Se lo stesso actor continua a fallire, si apre un circuit che cambia l’adapter, e se i fallimenti continuano si ferma.
Builder · scrive il gioco
agent actor · CLIDati: fileFile di giocoartifacts/Il Builder scrive il file di ingresso, i sorgenti e gli asset come artefatti.
Builder · scrive il gioco
agent actor · CLIDati: registro della buildtranscript.jsonl · append-onlysrc/transcriptL’evento build e artifact.created vengono registrati nel transcript con l’identità dell’artefatto.
Esecuzione degli effetti · avvio degli actor
src/dispatcher/live.tsEsecuzione · giudizio: qa_checkQA di esecuzione · controllidispatcher/qa-runner.tsDopo un evento build, il reducer emette un effetto qa_check con l’identità di artefatto e build e le condizioni di accettazione, e il dispatcher lo esegue.
File di gioco
artifacts/Dati: cosa viene eseguitoQA di esecuzione · controllidispatcher/qa-runner.tsLa QA di esecuzione esegue l’artefatto reale con controlli di codice e del browser. Il timeout predefinito di 120 secondi è un valore di configurazione.
QA di esecuzione · controlli
dispatcher/qa-runner.tsDati: qa.resulttranscript.jsonl · append-onlysrc/transcriptSuccesso o fallimento, il risultato viene registrato come evento system qa.result. Anche se il controllo solleva un’eccezione, si registra un risultato con i campi falliti.
Confine di fiducia della verifica
La QA di esecuzione è una prova ottenuta eseguendo davvero l’artefatto; il Verifier è un modello che giudica prove proiettate. Il reducer concilia le due prima di scegliere il percorso successivo.
QA di esecuzione · controlli
dispatcher/qa-runner.tsDati: qa.resulttranscript.jsonl · append-onlysrc/transcriptSuccesso o fallimento, il risultato viene registrato come evento system qa.result. Anche se il controllo solleva un’eccezione, si registra un risultato con i campi falliti.
transcript.jsonl · append-only
src/transcriptDati: solo proveProiezione dell’input del giudicesrc/dispatcher/live.tsL’input del Verifier è proiettato dagli ultimi goal, spec, build, qa.result e artifact.created più prove di ricerca selezionate. Restringe il contesto; non dimostra isolamento né assenza di fughe.
Proiezione dell’input del giudice
src/dispatcher/live.tsDati: input del giudiceVerifier · verdetto del modelloVerifier actorIl dispatcher esegue il Verifier con l’input proiettato.
Verifier · verdetto del modello
Verifier actorDati: judge.scoretranscript.jsonl · append-onlysrc/transcriptIl verdetto del Verifier viene registrato come evento judge.score. È il giudizio di un modello, non un fatto sull’esecuzione.
Stato → effetti successivi
src/reducerEsecuzione · giudizio: punteggio · prove della QAAnti-deception · correzione del punteggiosrc/validatorAlla ricezione di judge.score, il reducer lo passa al controllo anti-deception insieme al risultato della QA, al provider del Builder e al piano e alle prove di ricerca.
Anti-deception · correzione del punteggio
src/validatorDati: verdetto correttoInstradamento del verdettosrc/reducerUn PASS senza un’esecuzione riuscita diventa FAIL, e il punteggio legato all’esecuzione viene corretto in base alla QA deterministica. Le altre regole sono correzioni condizionali, non una prova generale di veridicità.
Instradamento del verdetto
src/reducerDati: conclusoConcluso · PASS o motivo di arrestosession donePASS chiude la sessione come done. Anche gli arresti per budget e circuit terminano come done ma conservano il motivo dell’arresto, quindi done non è sempre PASS.
Fallimento e intervento umano
PARTIAL va a una persona, Critical alla riprogettazione, Important o Minor alla riparazione, e gli arresti per budget o circuit lasciano un motivo di arresto.
Anti-deception · correzione del punteggio
src/validatorDati: verdetto correttoInstradamento del verdettosrc/reducerUn PASS senza un’esecuzione riuscita diventa FAIL, e il punteggio legato all’esecuzione viene corretto in base alla QA deterministica. Le altre regole sono correzioni condizionali, non una prova generale di veridicità.
Instradamento del verdetto
src/reducerEsecuzione · giudizio: verifica PARTIALIdea di gioco · interventoPARTIAL attende la verifica di una persona.
Instradamento del verdetto
src/reducerEsecuzione · giudizio: riprogettazione · riparazionesrc/dispatcher/live.tsTra FAIL e REJECT, Critical torna al Planner per la riprogettazione e Important o Minor al Builder come feedback di correzione, tutti eseguiti come effetti del dispatcher.
Instradamento del verdetto
src/reducerDati: conclusoConcluso · PASS o motivo di arrestosession donePASS chiude la sessione come done. Anche gli arresti per budget e circuit terminano come done ma conservano il motivo dell’arresto, quindi done non è sempre PASS.
Idea di gioco · interventoEsecuzione · giudizio: proposta · interventoScrittura dei comandi nella inbox
packages/studioUn’idea di gioco in una riga e gli interventi in linguaggio naturale si inseriscono in Studio, che scrive comandi nella inbox. Studio non modifica mai direttamente il transcript.
Replay e osservazione
La ricostruzione dello stato dal transcript non esegue effetti, e Studio legge lo stesso registro per mostrarlo.
transcript.jsonl · append-only
src/transcriptDati: nuovi eventi · replayCiclo degli eventi · replay · tailsrc/loop/coordinator.tsIl writer valida lo schema, assegna un ULID e un orario e accoda. Nel replay gli eventi passati vengono solo ridotti; i loro effetti non vengono rieseguiti.
Ciclo degli eventi · replay · tail
src/loop/coordinator.tsEsecuzione · giudizio: riduzione in ordineStato → effetti successivisrc/reducerGli eventi dal vivo vengono ridotti uno alla volta da una coda, mantenendo in ordine gli effetti di ciascun evento; il dispatch in sé gira in modo asincrono.
transcript.jsonl · append-only
src/transcriptOsservazione · resoconto: lettura · SSEVista eventi · artefattipackages/studioStudio legge il transcript e gli artefatti e mostra avanzamento, metriche e artefatti via SSE. Non è telemetria inviata a un servizio remoto.
Tutte le connessioni con lo stesso peso. Scegliendo un flusso se ne evidenzia solo il percorso, con passi numerati.
- Continua · direzione di input, risultati e registri
- Tratteggiata · esecuzione, giudizio, richiesta
- Punti lunghi · osservazione e resoconto, separati dal giudizio
- Linea nera spessa · il flusso scelto; i numeri danno l’ordine
- Riquadro · confine di codice o di stato, nominato nell’intestazione
- Chip interno · un componente di quel confine
- Riquadro punteggiato · fuori da quel confine
- Contorno arancione · dove decide un modello
- Ciclo degli eventi · reducer · dispatcher
- Registri · configurazione · artefatti
- Controlli deterministici · correzione
- Studio · actor
Disegnato dai percorsi del codice al commit pubblico f5e17c0. Gli actor sono ruoli di runtime, distinti dagli agenti di programmazione usati per costruire questo repository.
- Origine dello stato
- Il transcript è l’origine dello stato e il reducer è una funzione pura. Solo il dispatcher produce effetti collaterali (esecuzione degli actor, QA, scrittura di file), quindi il replay ricostruisce lo stato senza effetti.
- Cosa copre il replay
- Il replay restituisce lo stesso stato; non rende deterministiche le generazioni dell’LLM né il comportamento del browser e della rete.
- Cosa copre un verdetto
- La QA di esecuzione verifica solo i controlli configurati, e il punteggio del Verifier è un solo filone di prove. Nessuno dei due misura ogni comportamento del gioco, il divertimento o la soddisfazione degli utenti.