Reference
Docs
Schemas first. Every claim the line makes about a game has a field in a file you receive with the build, so the fastest way to understand what comes back from a firing is to read the fields.
What each stage emits
Every stage on the line writes a file, and the file is the contract. These are the ones a partner receives.
| Stage | Emits | Who runs it |
|---|---|---|
| Research | GDD_CONTEXT.md | ai agent |
| Want gate gate | gdds.approved_at | human |
| Prototype | scene_spec_hollow_reign_survivor_built.json | programmatic |
| Forge | FIRE_REPORT.md | ai agent |
| Fun gate gate | fun-gate-report.json | human + ai |
| Core | parts/gk_trajectory_renderer/kiln.json | ai agent |
| Balance | Data/kiln-balance.json | human + ai |
| Release | FIRE_REPORT.md | programmatic |
fun-gate-report.json
The report the fun gate writes to the prototype repo. Read the first four rows and you know everything about how this factory handles a question it cannot answer.
| Field | Type | What it means |
|---|---|---|
| verdict | "passed" | "failed" | "inconclusive" | The only three answers. Nothing else is ever written here. |
| passed | boolean | True only when verdict is passed. Never true alongside an inconclusive verdict. |
| missing | string[] | What would have to be observed for the verdict to stop being inconclusive. Empty on a passed or failed report. |
| failures | string[] | Why it failed, when it failed. Populated only on a failed verdict. |
| time_to_first_fun.seconds | number | null | Null means nobody timed it. The threshold is never substituted for a measurement. |
| time_to_first_fun.source | "observed" | "probe-autonomous" | "unmeasured" | Where the number came from. An autonomous probe proves the scene is alive by then, not that the player had fun by then. |
| feel.score | number | null | Weighted mean over the axes that were actually scored. Unscored axes are excluded, not counted as zero. |
| feel.axes_scored / axes_total | number | How much of the rubric was answered. A score over three axes is not a score over seven. |
| retention.total_count | number | Reasons to come back, split into ones derived from the parts catalogue and ones an evaluator saw. |
| evidence.scene.missing_parts | string[] | Parts the plan promised that the built scene never got. A non-empty list fails the gate. |
| evidence.aliveness | AlivenessProbe | null | Whether the scene changes on its own with nobody touching the controls. INERT is decisive and fails. |
The parts register
A part is a catalogued, reusable game component with a manifest: what it provides, what it requires, what it conflicts with, and which platforms it has been built for. Assembly resolves a game against this register, and anything the register cannot satisfy is commissioned rather than improvised.
Parts built during a line partnership stay in the register, which is why each firing starts warmer than the last.
Not written yet
The MCP surface, the scene spec schema, and the balance file formats are documented internally and not yet published here. If a pilot needs one of them before it lands, ask and we will send it.

