
CRUMB
Generative Game Studio · Demo
D’un pitch de jeu en une ligne à une ébauche jouable, avec le travail des agents visible et ouvert à l’intervention.
CRUMB est un harnais de studio multi-agents pour le prototypage de jeux 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
Les agents qui construisent un jeu, tenus à l’écart des preuves qui le jugent.
Une démo de studio local qui fait passer un pitch de jeu en une ligne par la spécification, le build et les contrôles d’exécution. Chaque étape est consignée dans une transcription JSONL, un reducer pur décide des effets suivants, et seul le dispatcher produit des effets de bord. La QA d’exécution et le verdict du modèle sont tenus séparés pour trancher entre réussite, refonte, réparation et pilotage humain.
On propose un jeu en une ligne et des agents Claude Code, Codex et Gemini CLI collaborent selon Planner → Builder → QA déterministe → Verifier, tandis que CRUMB Studio affiche les événements, l’avancement et les artefacts et accepte des interventions en langage naturel.
Une démo qu’on clone depuis le dépôt public et qu’on exécute en local.
Du pitch au jeu
Un pitch devient une spécification, un build et une exécution de QA. Chaque étape passe par la transcription ; les acteurs ne s’appellent pas entre eux.
Pitch de jeu · pilotageExécution · jugement: pitch · pilotageÉcrire des commandes dans l’inbox
packages/studioUn pitch de jeu en une ligne et un pilotage en langage naturel sont saisis dans Studio, qui écrit des commandes dans l’inbox. Studio ne modifie jamais directement la transcription.
Écrire des commandes dans l’inbox
packages/studioDonnées: événements userBoucle d’événements · rejeu · tailsrc/loop/coordinator.tsLe coordinateur lit les commandes de l’inbox et les consigne dans la transcription comme événements user.
Boucle d’événements · rejeu · tail
src/loop/coordinator.tsExécution · jugement: réduire dans l’ordreÉtat → effets suivantssrc/reducerLes événements en direct passent un par un d’une file au reducer, ce qui garde l’ordre des effets de chaque événement ; le dispatch lui-même s’exécute de façon asynchrone.
État → effets suivants
src/reducerExécution · jugement: effetsExécuter les effets · lancer les acteurssrc/dispatcher/live.tsLe reducer est une fonction pure qui ne décide que de l’état et des effets suivants : un goal sélectionne le Planner, une spec le Builder, un build un qa_check.
Acteur → harnais · modèle
model-config · presetExécution · jugement: configuration des acteurssrc/dispatcher/live.tsLe harnais, le fournisseur et le modèle qui exécutent un acteur sont résolus dans l’ordre flag CLI > config > preset > ambient > fallback. Un acteur n’est pas un fournisseur fixe.
Exécuter les effets · lancer les acteurs
src/dispatcher/live.tsExécution · jugement: lancer le PlannerPlanner Lead · spécificationagent actor · CLILe dispatcher lance le Planner avec une entrée projetée. La recherche conditionnelle se poursuit par le plan de recherche du Planner et la passation des preuves, repliés sur cette carte.
Planner Lead · spécification
agent actor · CLIDonnées: spectranscript.jsonl · append-onlysrc/transcriptLa spécification du Planner devient un événement de transcription, et le reducer en déduit le Builder. Les acteurs ne s’appellent pas entre eux.
Exécuter les effets · lancer les acteurs
src/dispatcher/live.tsExécution · jugement: lancer le BuilderBuilder · écrit le jeuagent actor · CLILe dispatcher lance le Builder. Si le même acteur échoue à répétition, un circuit s’ouvre et change d’adaptateur, puis s’arrête si les échecs continuent.
Builder · écrit le jeu
agent actor · CLIDonnées: fichiersFichiers du jeuartifacts/Le Builder écrit le fichier d’entrée, les sources et les assets comme artefacts.
Builder · écrit le jeu
agent actor · CLIDonnées: enregistrement du buildtranscript.jsonl · append-onlysrc/transcriptL’événement build et artifact.created sont consignés dans la transcription avec l’identité de l’artefact.
Exécuter les effets · lancer les acteurs
src/dispatcher/live.tsExécution · jugement: qa_checkQA d’exécution · contrôlesdispatcher/qa-runner.tsAprès un événement build, le reducer émet un effet qa_check portant l’identité de l’artefact et du build ainsi que les conditions d’acceptation, et le dispatcher l’exécute.
Fichiers du jeu
artifacts/Données: ce qui s’exécuteQA d’exécution · contrôlesdispatcher/qa-runner.tsLa QA d’exécution lance l’artefact réel avec des contrôles par code et dans le navigateur. Le délai par défaut de 120 secondes est une valeur de configuration.
QA d’exécution · contrôles
dispatcher/qa-runner.tsDonnées: qa.resulttranscript.jsonl · append-onlysrc/transcriptSuccès ou échec, le résultat est consigné comme événement système qa.result. Même si le contrôle lève une exception, un résultat avec les champs en échec est consigné.
Frontière de confiance de la vérification
La QA d’exécution est une preuve issue de l’exécution réelle de l’artefact ; le Verifier est un modèle qui juge des preuves projetées. Le reducer concilie les deux avant de choisir la suite.
QA d’exécution · contrôles
dispatcher/qa-runner.tsDonnées: qa.resulttranscript.jsonl · append-onlysrc/transcriptSuccès ou échec, le résultat est consigné comme événement système qa.result. Même si le contrôle lève une exception, un résultat avec les champs en échec est consigné.
transcript.jsonl · append-only
src/transcriptDonnées: preuves seulementProjection de l’entrée du jugesrc/dispatcher/live.tsL’entrée du Verifier est projetée à partir des derniers goal, spec, build, qa.result et artifact.created, plus une sélection de preuves de recherche. Cela restreint le contexte ; cela ne prouve ni l’isolation ni l’absence de fuite.
Projection de l’entrée du juge
src/dispatcher/live.tsDonnées: entrée du jugeVerifier · verdict du modèleVerifier actorLe dispatcher lance le Verifier avec l’entrée projetée.
Verifier · verdict du modèle
Verifier actorDonnées: judge.scoretranscript.jsonl · append-onlysrc/transcriptLe verdict du Verifier est consigné comme événement judge.score. C’est le jugement d’un modèle, pas un fait d’exécution.
État → effets suivants
src/reducerExécution · jugement: score · preuves de QAAnti-tromperie · correction du scoresrc/validatorSur judge.score, le reducer le transmet au contrôle anti-tromperie avec le résultat de la QA, le fournisseur du Builder et le plan et les preuves de recherche.
Anti-tromperie · correction du score
src/validatorDonnées: verdict corrigéRoutage du verdictsrc/reducerUn PASS sans exécution réussie devient FAIL, et le score lié à l’exécution est corrigé d’après la QA déterministe. Les autres règles sont des corrections conditionnelles, pas une preuve générale de véracité.
Routage du verdict
src/reducerDonnées: terminéTerminé · PASS ou raison d’arrêtsession donePASS termine la session comme done. Les arrêts sur budget ou sur circuit se terminent aussi en done mais gardent leur raison d’arrêt ; done n’est donc pas toujours PASS.
Échec et pilotage humain
PARTIAL va à une personne, Critical à la refonte, Important ou Minor à la réparation, et les arrêts sur budget ou circuit laissent une raison d’arrêt.
Anti-tromperie · correction du score
src/validatorDonnées: verdict corrigéRoutage du verdictsrc/reducerUn PASS sans exécution réussie devient FAIL, et le score lié à l’exécution est corrigé d’après la QA déterministe. Les autres règles sont des corrections conditionnelles, pas une preuve générale de véracité.
Routage du verdict
src/reducerExécution · jugement: contrôle PARTIALPitch de jeu · pilotagePARTIAL attend qu’une personne vérifie.
Routage du verdict
src/reducerExécution · jugement: refonte · réparationsrc/dispatcher/live.tsParmi FAIL et REJECT, Critical repart vers le Planner pour une refonte, et Important ou Minor vers le Builder comme retour de correction, tous exécutés comme effets du dispatcher.
Routage du verdict
src/reducerDonnées: terminéTerminé · PASS ou raison d’arrêtsession donePASS termine la session comme done. Les arrêts sur budget ou sur circuit se terminent aussi en done mais gardent leur raison d’arrêt ; done n’est donc pas toujours PASS.
Pitch de jeu · pilotageExécution · jugement: pitch · pilotageÉcrire des commandes dans l’inbox
packages/studioUn pitch de jeu en une ligne et un pilotage en langage naturel sont saisis dans Studio, qui écrit des commandes dans l’inbox. Studio ne modifie jamais directement la transcription.
Rejeu et observation
Reconstruire l’état à partir de la transcription n’exécute aucun effet, et Studio lit le même enregistrement pour l’afficher.
transcript.jsonl · append-only
src/transcriptDonnées: nouveaux événements · rejeuBoucle d’événements · rejeu · tailsrc/loop/coordinator.tsLe writer valide le schéma, attribue un ULID et un horodatage, puis ajoute à la suite. Au rejeu, les événements passés ne font que passer par le reducer ; leurs effets ne sont pas réexécutés.
Boucle d’événements · rejeu · tail
src/loop/coordinator.tsExécution · jugement: réduire dans l’ordreÉtat → effets suivantssrc/reducerLes événements en direct passent un par un d’une file au reducer, ce qui garde l’ordre des effets de chaque événement ; le dispatch lui-même s’exécute de façon asynchrone.
transcript.jsonl · append-only
src/transcriptObservation · rapport: lecture · SSEVue des événements · artefactspackages/studioStudio lit la transcription et les artefacts et affiche l’avancement, les métriques et les artefacts via SSE. Ce n’est pas de la télémétrie envoyée à un service distant.
Toutes les connexions avec la même épaisseur. Choisissez un flux pour ne mettre en évidence que son chemin, avec des étapes numérotées.
- Trait plein · sens des entrées, résultats et enregistrements
- Tirets · exécution, jugement, requête
- Pointillés longs · observation et rapport, hors jugement
- Trait noir épais · le flux sélectionné ; les numéros donnent l’ordre
- Cadre · frontière de code ou d’état, nommée dans l’en-tête
- Pastille intérieure · composant de cette frontière
- Cadre pointillé · hors de cette frontière
- Contour orange · là où un modèle décide
- Boucle d’événements · reducer · dispatcher
- Enregistrements · configuration · artefacts
- Contrôles déterministes · correction
- Studio · acteurs
Tracé d’après les chemins de code du commit public f5e17c0. Les acteurs sont des rôles d’exécution, distincts des agents de code qui ont servi à construire ce dépôt.
- Source de l’état
- La transcription est la source de l’état et le reducer est une fonction pure. Seul le dispatcher produit des effets de bord (lancer les acteurs, la QA, écrire des fichiers) ; le rejeu reconstruit donc l’état sans effets.
- Ce que couvre le rejeu
- Le rejeu donne le même état ; il ne rend déterministes ni les générations du LLM ni le comportement du navigateur et du réseau.
- Ce que couvre un verdict
- La QA d’exécution ne vérifie que les contrôles configurés, et le score du Verifier n’est qu’un canal de preuve parmi d’autres. Aucun des deux ne mesure tous les comportements du jeu, son intérêt ou la satisfaction des utilisateurs.