When the game design document lists what the player tracks and the engine specification
defines the same thing, a mismatch between them is caught by a command instead of by
someone happening to read both in one sitting. Adding a field in one place and
forgetting the other is a defect this project has already shipped.
Done when
Agent instructions
Run /slice S3.
- Scope and criteria:
design/30-slices.md § S3 @ 394505aae8cdd82a2375a4956fc7ba93090db469
- Touches:
tools/Read-SpecSet.ps1 (marked-region extraction), tools/Test-SpecSet.ps1 (Invoke-SpecSetCheck, the mirror check, Write-SpecSetReport), both test files, docs/docs/games/03-game-design.md §3.1, design/20-contract.md (the tools/Test-SpecSet.ps1 scaffold block)
- Depends on: S1, S2
- Out of scope here: obligating anything beyond the two sites named above. §12.1 and §13.3 cannot discharge an obligation as the contract defines one — see
design/30-slices.md § Contract questions 2 — and finding more obligation sites is a reading of 03, which design/10-design.md assigns to the full-audit path, not to this machinery. Do not delete prose from 03 under Alternative 4's reduction; that is a reviewed pass with its own scope decision, not a side effect of wiring a check.
Note: this is the largest slice in the set — if it does not fit one session without compaction, that is a design/30-slices.md defect; say so rather than pressing on.
Stop conditions and procedure: .claude/commands/slice.md. Not restated here.
When the game design document lists what the player tracks and the engine specification
defines the same thing, a mismatch between them is caught by a command instead of by
someone happening to read both in one sitting. Adding a field in one place and
forgetting the other is a defect this project has already shipped.
Done when
03-game-design.md§3.1 carries amirror-NeedStateregion around the sentence listing the needs and amirror-AttributeStateregion around the sentence listing the attributes. Both are held against04-engine-specification.mdas it stands, and the run exits 0.wisdomfrom §3.1's attribute sentence, with04unchanged, produces exactly onemirrorfinding namingAttributeState.wisdomand exits 1; restoring it returns exit 0. The test asserts both directions.Detailnames the member and both document paths and states only that they disagree; a test assertsSpecFindingdeclares no field able to record which side is stale.mirror-PlayerState.skillsregion — an open declaration — produces amirrorfinding rather than being ignored, and so does a region naming a declaration that does not exist.03§3.5's twelve skills produce no finding of any kind.MalformedRegionand exit 2; two regions sharing an id yieldDuplicateRegionIdand exit 2; a document with no regions is valid input yielding zero obligations and exit 0.03-game-design.mdand04-engine-specification.mdare consistent; a test asserts the wording inWrite-SpecSetReport.03are HTML comments carrying nothing outside the comment delimiters, and./docs.ps1 -BuildOnlysucceeds with §3.1 still rendering as one list. This step needs Docker; if Docker cannot run, the criterion is not met and must be reported as not met rather than assumed.design/20-contract.mdscaffold block fortools/Test-SpecSet.ps1is replaced by a pointer to that file, in the same commit.Agent instructions
Run
/slice S3.design/30-slices.md§ S3 @394505aae8cdd82a2375a4956fc7ba93090db469tools/Read-SpecSet.ps1(marked-region extraction),tools/Test-SpecSet.ps1(Invoke-SpecSetCheck, the mirror check,Write-SpecSetReport), both test files,docs/docs/games/03-game-design.md§3.1,design/20-contract.md(thetools/Test-SpecSet.ps1scaffold block)design/30-slices.md§ Contract questions 2 — and finding more obligation sites is a reading of03, whichdesign/10-design.mdassigns to the full-audit path, not to this machinery. Do not delete prose from03under Alternative 4's reduction; that is a reviewed pass with its own scope decision, not a side effect of wiring a check.Note: this is the largest slice in the set — if it does not fit one session without compaction, that is a
design/30-slices.mddefect; say so rather than pressing on.Stop conditions and procedure:
.claude/commands/slice.md. Not restated here.