What this is. A blocked follow-up and, more importantly, a guard against duplicating work already scoped in the companion repository. Nothing is broken; the risk is that this repository writes something SubZeroDev.GameOfLife's S7 is already committed to writing, and creates a sixth entry in the envelope-duplication ledger by doing it twice in two documents.
The gap
20-contract.md's 10-simulation-kind block carries exactly two lifecycles:
#### Opportunity Lifecycle — design/20-contract.md:2646
#### Scheduled Event Lifecycle — design/20-contract.md:2692
Both were ported from upstream §5.4.1 and §5.4.2 by the W32–W34 programme. They are the only two upstream had.
SimulationKindState names other state-bearing concepts that have no lifecycle written in either repository — nothing says what creates them and what retires them. From the companion's own derivation over GameState's 17 fields, the named set includes StatusEffect, GoalState and PlayerState; the full membership is what their S6 exists to establish, and it is not this repository's to guess at.
Why this is not ours to write
§15 of 10-simulation-kind says "nothing remains upstream as a gap in this contract's shape", and that is still true — every field has a type. Lifecycles are not shape; they are semantics, and they are exactly the class of thing §15's narrow reading carves out.
SubZeroDev.GameOfLife has two open slices on precisely this, at main @ 6d257d4:
Writing these here first would pre-empt S7, put the authored copy in the wrong repository, and give us two divergent sources for the same semantics. The dependency direction is upstream-writes, we-mirror — the same direction W32–W34 already used.
Done when
Blocked on
GameOfLife #14 (S7), which is blocked on their #13 (S6). No action here until both close. Do not start this by writing lifecycles.
Agent instructions
This issue is the specification.
- Authority: the lifecycles as S7 writes them in
docs/docs/games/04-engine-specification.md, in SubZeroDev.GameOfLife. This repository transcribes; it does not author them.
- Out of scope: writing any lifecycle here. Building the stub systems behind these concepts — that is separate work with its own slice. Deciding what a concept does.
- Stop if: S7 lands a lifecycle that contradicts built code in
src/engine/src/kinds/simulation/. That is a reconciliation with a decision to make, not a transcription — state both readings and stop.
- Stop if: the mirror would need a new public interface or a contract amendment. Ask.
- Verify by regenerating the human docs and running the documentation gate. A mirrored block that does not regenerate cleanly was pasted into the wrong place.
What this is. A blocked follow-up and, more importantly, a guard against duplicating work already scoped in the companion repository. Nothing is broken; the risk is that this repository writes something SubZeroDev.GameOfLife's S7 is already committed to writing, and creates a sixth entry in the envelope-duplication ledger by doing it twice in two documents.
The gap
20-contract.md's10-simulation-kindblock carries exactly two lifecycles:#### Opportunity Lifecycle—design/20-contract.md:2646#### Scheduled Event Lifecycle—design/20-contract.md:2692Both were ported from upstream §5.4.1 and §5.4.2 by the W32–W34 programme. They are the only two upstream had.
SimulationKindStatenames other state-bearing concepts that have no lifecycle written in either repository — nothing says what creates them and what retires them. From the companion's own derivation overGameState's 17 fields, the named set includesStatusEffect,GoalStateandPlayerState; the full membership is what their S6 exists to establish, and it is not this repository's to guess at.Why this is not ours to write
§15 of
10-simulation-kindsays "nothing remains upstream as a gap in this contract's shape", and that is still true — every field has a type. Lifecycles are not shape; they are semantics, and they are exactly the class of thing §15's narrow reading carves out.SubZeroDev.GameOfLife has two open slices on precisely this, at
main@6d257d4:GameState's 17 fields and count which concepts have no lifecycle. Deliberately split from S7 so the gap is measured before it is closed.04-engine-specification.md§5.4.1 already uses: a creation paragraph naming each path, a retirement paragraph naming each exit. S7 is the last of their brief's four completion conditions.Writing these here first would pre-empt S7, put the authored copy in the wrong repository, and give us two divergent sources for the same semantics. The dependency direction is upstream-writes, we-mirror — the same direction W32–W34 already used.
Done when
Test-SpecSet.ps1reports zeroconceptfindings.20-contract.md's10-simulation-kindblock, in the same#### <Concept> Lifecycleform as the two already there, sited alongside them../build/ConvertTo-HumanDocumentation.ps1regenerated,./build/Test-Documentation.ps1passes.GameStateenvelope,Campaign, or the registry already owns — check againstCLAUDE.md's envelope-duplication ledger, which has five entries and has itself drifted before by being incremented from memory rather than re-counted from the list.Blocked on
GameOfLife #14 (S7), which is blocked on their #13 (S6). No action here until both close. Do not start this by writing lifecycles.
Agent instructions
This issue is the specification.
docs/docs/games/04-engine-specification.md, in SubZeroDev.GameOfLife. This repository transcribes; it does not author them.src/engine/src/kinds/simulation/. That is a reconciliation with a decision to make, not a transcription — state both readings and stop.