
CRUMB
Generative Game Studio · Demo
จากไอเดียเกมหนึ่งบรรทัดสู่ร่างที่เล่นได้ โดยเห็นงานของเอเจนต์และแทรกแซงได้
CRUMB คือฮาร์เนสสตูดิโอแบบหลายเอเจนต์สำหรับสร้างต้นแบบเกมแคชวล เสนอเกมในหนึ่งบรรทัด แล้วเอเจนต์ Claude Code, Codex และ Gemini CLI จะทำงานร่วมกันผ่าน Planner → Builder → QA เชิงกำหนด → Verifier ขณะที่ CRUMB Studio แสดงอีเวนต์ ความคืบหน้า และผลงาน และรับการแทรกแซงด้วยภาษาธรรมชาติ
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
เอเจนต์ที่สร้างเกม แยกจากหลักฐานที่ตัดสินมัน
เดโมสตูดิโอในเครื่องที่นำไอเดียเกมหนึ่งบรรทัดผ่าน spec บิลด์ และการตรวจการรัน ทุกขั้นลงใน transcript JSONL reducer บริสุทธิ์ตัดสินผลกระทบถัดไป และมีเพียง dispatcher ที่ทำผลข้างเคียง QA การรันและคำตัดสินของโมเดลถูกแยกกันเพื่อตัดสินระหว่างผ่าน ออกแบบใหม่ ซ่อม และการกำกับโดยคน
เดโมที่โคลนจากรีโพซิทอรีสาธารณะแล้วรันในเครื่อง
จากไอเดียสู่การเล่น
ไอเดียกลายเป็น spec บิลด์ และการรัน QA ทุกขั้นผ่าน transcript และ actor ไม่เรียกกันเอง
ไอเดียเกม · การกำกับรัน · การตัดสิน: เสนอ · กำกับเขียนคำสั่งลง inbox
packages/studioไอเดียเกมหนึ่งบรรทัดและการกำกับด้วยภาษาธรรมชาติถูกป้อนใน Studio ซึ่งเขียนคำสั่งลง inbox Studio ไม่เคยแก้ transcript โดยตรง
เขียนคำสั่งลง inbox
packages/studioข้อมูล: อีเวนต์ของผู้ใช้ลูปอีเวนต์ · replay · tailsrc/loop/coordinator.tscoordinator อ่านคำสั่งใน inbox และบันทึกลง transcript เป็นอีเวนต์ของผู้ใช้
ลูปอีเวนต์ · replay · tail
src/loop/coordinator.tsรัน · การตัดสิน: reduce ตามลำดับสถานะ → ผลกระทบถัดไปsrc/reducerอีเวนต์สดถูก reduce ทีละรายการจากคิว โดยรักษาลำดับผลกระทบของแต่ละอีเวนต์ ส่วน dispatch รันแบบอะซิงโครนัส
สถานะ → ผลกระทบถัดไป
src/reducerรัน · การตัดสิน: ผลกระทบรันผลกระทบ · spawn actorsrc/dispatcher/live.tsreducer เป็นฟังก์ชันบริสุทธิ์ที่ตัดสินเพียงสถานะและผลกระทบถัดไป: goal เลือก Planner, spec เลือก Builder, build เลือก qa_check
actor → harness · โมเดล
model-config · presetรัน · การตัดสิน: การตั้งค่า actorsrc/dispatcher/live.tsharness ผู้ให้บริการ และโมเดลที่รัน actor ถูกกำหนดตามลำดับ CLI flag > config > preset > ambient > fallback actor ไม่ใช่ผู้ให้บริการตายตัว
รันผลกระทบ · spawn actor
src/dispatcher/live.tsรัน · การตัดสิน: รัน PlannerPlanner Lead · สเปกagent actor · CLIdispatcher รัน Planner ด้วยอินพุตที่ฉายมา การค้นคว้าแบบมีเงื่อนไขดำเนินต่อผ่านแผนการค้นคว้าของ Planner และการส่งต่อหลักฐาน ซึ่งพับเก็บไว้ในแผนที่นี้
Planner Lead · สเปก
agent actor · CLIข้อมูล: spectranscript.jsonl · append-onlysrc/transcriptspec ของ Planner กลายเป็นอีเวนต์ใน transcript และ reducer เลือก Builder จาก spec นั้น actor ไม่เรียกกันเอง
รันผลกระทบ · spawn actor
src/dispatcher/live.tsรัน · การตัดสิน: รัน BuilderBuilder · เขียนเกมagent actor · CLIdispatcher รัน Builder หาก actor เดิมล้มเหลวซ้ำ ๆ circuit จะเปิดและสลับ adapter และหยุดหากยังล้มเหลวต่อ
Builder · เขียนเกม
agent actor · CLIข้อมูล: ไฟล์ไฟล์เกมartifacts/Builder เขียนไฟล์จุดเข้า ซอร์ส และแอสเซ็ตเป็นผลงาน
Builder · เขียนเกม
agent actor · CLIข้อมูล: บันทึกบิลด์transcript.jsonl · append-onlysrc/transcriptอีเวนต์ build และ artifact.created ถูกบันทึกใน transcript พร้อมตัวตนของผลงาน
รันผลกระทบ · spawn actor
src/dispatcher/live.tsรัน · การตัดสิน: qa_checkQA การรัน · การตรวจdispatcher/qa-runner.tsหลังอีเวนต์ build reducer ส่งผลกระทบ qa_check ที่มีตัวตนของผลงานและบิลด์ และเงื่อนไขการยอมรับ แล้ว dispatcher รัน
ไฟล์เกม
artifacts/ข้อมูล: สิ่งที่รันQA การรัน · การตรวจdispatcher/qa-runner.tsQA การรันรันผลงานจริงด้วยการตรวจโค้ดและเบราว์เซอร์ timeout เริ่มต้น 120 วินาทีเป็นค่าตั้ง
QA การรัน · การตรวจ
dispatcher/qa-runner.tsข้อมูล: qa.resulttranscript.jsonl · append-onlysrc/transcriptไม่ว่าสำเร็จหรือล้มเหลว ผลลัพธ์ถูกบันทึกเป็นอีเวนต์ qa.result ของระบบ แม้การตรวจจะเกิด exception ก็ยังบันทึกผลลัพธ์พร้อมฟิลด์ที่ล้มเหลว
ขอบเขตความไว้วางใจของการตรวจยืนยัน
QA การรันคือหลักฐานจากการรันผลงานจริง ส่วน Verifier คือโมเดลที่ตัดสินจากหลักฐานที่ฉายมา reducer กระทบยอดทั้งสองก่อนเลือกเส้นทางถัดไป
QA การรัน · การตรวจ
dispatcher/qa-runner.tsข้อมูล: qa.resulttranscript.jsonl · append-onlysrc/transcriptไม่ว่าสำเร็จหรือล้มเหลว ผลลัพธ์ถูกบันทึกเป็นอีเวนต์ qa.result ของระบบ แม้การตรวจจะเกิด exception ก็ยังบันทึกผลลัพธ์พร้อมฟิลด์ที่ล้มเหลว
transcript.jsonl · append-only
src/transcriptข้อมูล: หลักฐานเท่านั้นการฉายอินพุตของผู้ตัดสินsrc/dispatcher/live.tsอินพุตของ Verifier ถูกฉายจาก goal, spec, build, qa.result และ artifact.created ล่าสุด รวมกับหลักฐานการค้นคว้าที่เลือก เป็นการจำกัดบริบทให้แคบลง ไม่ได้พิสูจน์การแยกหรือการไม่รั่วไหล
การฉายอินพุตของผู้ตัดสิน
src/dispatcher/live.tsข้อมูล: อินพุตของผู้ตัดสินVerifier · คำตัดสินของโมเดลVerifier actordispatcher รัน Verifier ด้วยอินพุตที่ฉายมา
Verifier · คำตัดสินของโมเดล
Verifier actorข้อมูล: judge.scoretranscript.jsonl · append-onlysrc/transcriptคำตัดสินของ Verifier ถูกบันทึกเป็นอีเวนต์ judge.score เป็นการตัดสินของโมเดล ไม่ใช่ข้อเท็จจริงเกี่ยวกับการรัน
สถานะ → ผลกระทบถัดไป
src/reducerรัน · การตัดสิน: คะแนน · หลักฐาน QAต่อต้านการหลอกลวง · แก้คะแนนsrc/validatorเมื่อได้ judge.score reducer ส่งต่อให้การตรวจต่อต้านการหลอกลวงพร้อมผล QA ผู้ให้บริการของ Builder และแผนกับหลักฐานการค้นคว้า
ต่อต้านการหลอกลวง · แก้คะแนน
src/validatorข้อมูล: คำตัดสินที่แก้แล้วการกำหนดทางตามคำตัดสินsrc/reducerPASS ที่ไม่มีการรันสำเร็จจะกลายเป็น FAIL และคะแนนที่เกี่ยวกับการรันจะถูกแก้จาก QA เชิงกำหนด กฎอื่นเป็นการแก้แบบมีเงื่อนไข ไม่ใช่การพิสูจน์ความจริงโดยทั่วไป
การกำหนดทางตามคำตัดสิน
src/reducerข้อมูล: เสร็จเสร็จ · PASS หรือเหตุผลที่หยุดsession donePASS จบเซสชันเป็น done การหยุดจากงบและ circuit ก็จบเป็น done เช่นกันแต่เก็บเหตุผลที่หยุดไว้ done จึงไม่ใช่ PASS เสมอไป
ความล้มเหลวและการกำกับโดยคน
PARTIAL ไปหาคน Critical ไปออกแบบใหม่ Important หรือ Minor ไปซ่อม และการหยุดจากงบหรือ circuit ทิ้งเหตุผลที่หยุดไว้
ต่อต้านการหลอกลวง · แก้คะแนน
src/validatorข้อมูล: คำตัดสินที่แก้แล้วการกำหนดทางตามคำตัดสินsrc/reducerPASS ที่ไม่มีการรันสำเร็จจะกลายเป็น FAIL และคะแนนที่เกี่ยวกับการรันจะถูกแก้จาก QA เชิงกำหนด กฎอื่นเป็นการแก้แบบมีเงื่อนไข ไม่ใช่การพิสูจน์ความจริงโดยทั่วไป
การกำหนดทางตามคำตัดสิน
src/reducerรัน · การตัดสิน: การตรวจ PARTIALไอเดียเกม · การกำกับPARTIAL รอให้คนตรวจ
การกำหนดทางตามคำตัดสิน
src/reducerรัน · การตัดสิน: ออกแบบใหม่ · ซ่อมsrc/dispatcher/live.tsในบรรดา FAIL และ REJECT ระดับ Critical กลับไปที่ Planner เพื่อออกแบบใหม่ ส่วน Important หรือ Minor ไปที่ Builder เป็นข้อมูลป้อนกลับให้แก้ไข ทั้งหมดรันเป็นผลกระทบของ dispatcher
การกำหนดทางตามคำตัดสิน
src/reducerข้อมูล: เสร็จเสร็จ · PASS หรือเหตุผลที่หยุดsession donePASS จบเซสชันเป็น done การหยุดจากงบและ circuit ก็จบเป็น done เช่นกันแต่เก็บเหตุผลที่หยุดไว้ done จึงไม่ใช่ PASS เสมอไป
ไอเดียเกม · การกำกับรัน · การตัดสิน: เสนอ · กำกับเขียนคำสั่งลง inbox
packages/studioไอเดียเกมหนึ่งบรรทัดและการกำกับด้วยภาษาธรรมชาติถูกป้อนใน Studio ซึ่งเขียนคำสั่งลง inbox Studio ไม่เคยแก้ transcript โดยตรง
Replay และการสังเกต
การสร้างสถานะใหม่จาก transcript ไม่รันผลกระทบใด และ Studio อ่านบันทึกเดียวกันเพื่อแสดงผล
transcript.jsonl · append-only
src/transcriptข้อมูล: อีเวนต์ใหม่ · replayลูปอีเวนต์ · replay · tailsrc/loop/coordinator.tswriter ตรวจสคีมา กำหนด ULID และเวลา แล้วเพิ่มต่อท้าย เมื่อเล่นซ้ำ อีเวนต์ในอดีตจะถูก reduce เท่านั้น ผลกระทบของมันไม่ถูกรันอีก
ลูปอีเวนต์ · replay · tail
src/loop/coordinator.tsรัน · การตัดสิน: reduce ตามลำดับสถานะ → ผลกระทบถัดไปsrc/reducerอีเวนต์สดถูก reduce ทีละรายการจากคิว โดยรักษาลำดับผลกระทบของแต่ละอีเวนต์ ส่วน dispatch รันแบบอะซิงโครนัส
transcript.jsonl · append-only
src/transcriptการสังเกต · รายงาน: อ่าน · SSEดูอีเวนต์ · ผลงานpackages/studioStudio อ่าน transcript และผลงาน แล้วแสดงความคืบหน้า เมตริก และผลงานผ่าน SSE ไม่ใช่เทเลเมทรีที่ส่งไปยังบริการภายนอก
ทุกการเชื่อมต่อมีน้ำหนักเท่ากัน เลือกโฟลว์เพื่อไฮไลต์เฉพาะเส้นทางของโฟลว์นั้นพร้อมขั้นตอนที่มีหมายเลข
- เส้นทึบ · ทิศทางของอินพุต ผลลัพธ์ และบันทึก
- เส้นประ · รัน การตัดสิน คำขอ
- จุดยาว · การสังเกตและการรายงาน แยกจากการตัดสิน
- เส้นดำหนา · โฟลว์ที่เลือก ตัวเลขบอกลำดับ
- กล่อง · ขอบเขตของโค้ดหรือสถานะ ระบุชื่อในส่วนหัว
- ชิปด้านใน · องค์ประกอบของขอบเขตนั้น
- กล่องจุด · อยู่นอกขอบเขตนั้น
- เส้นขอบสีส้ม · จุดที่โมเดลตัดสินใจ
- ลูปอีเวนต์ · reducer · dispatcher
- บันทึก · การตั้งค่า · ผลงาน
- การตรวจเชิงกำหนด · การปรับแก้
- Studio · actor
วาดจากเส้นทางโค้ดที่คอมมิตสาธารณะ f5e17c0 actor คือบทบาทขณะรัน แยกจากเอเจนต์เขียนโค้ดที่ใช้สร้างรีโพซิทอรีนี้
- แหล่งของสถานะ
- transcript คือแหล่งของสถานะ และ reducer เป็นฟังก์ชันบริสุทธิ์ มีเพียง dispatcher ที่ทำผลข้างเคียง (รัน actor, QA, เขียนไฟล์) การเล่นซ้ำจึงสร้างสถานะขึ้นใหม่โดยไม่เกิดผลกระทบ
- ขอบเขตของการเล่นซ้ำ
- การเล่นซ้ำให้สถานะเดิม แต่ไม่ได้ทำให้การสร้างของ LLM หรือพฤติกรรมของเบราว์เซอร์และเครือข่ายเป็นเชิงกำหนด
- ขอบเขตของคำตัดสิน
- QA การรันตรวจเฉพาะรายการที่ตั้งค่าไว้ และคะแนนของ Verifier เป็นหลักฐานช่องทางหนึ่ง ทั้งสองอย่างไม่ได้วัดทุกพฤติกรรมของเกม ความสนุก หรือความพึงพอใจของผู้ใช้