Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 11 additions & 11 deletions .claude/gates.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"manifestHash": "fe74684ae7ca549e563e429d0ce2ae9099f71b3e7dc61db78a48dd7dc7257456",
"generated": "2026-08-20",
"manifestHash": "9709a22838ae6c721e1bc8cb2777f587a7b02758ca2eabcb0c785e5effb0f108",
"generated": "2026-08-24",
"gates": [
{
"name": "Typecheck",
Expand All @@ -20,47 +20,47 @@
},
{
"name": "Inspect tarball",
"command": "tar -tzf src/engine/*.tgz; assert no src/, no tsconfig*.json, no .test.* artifacts, package/dist/ present"
"command": "tar inspect"
},
{
"name": "Consumer smoke",
"command": "rm -rf consumer-smoke/{node_modules,package-lock.json,dist}; cd consumer-smoke; npm run install:engine; npm run build; npm run smoke"
"command": "consumer-smoke install/build/smoke"
},
{
"name": "Parse-check PowerShell scripts",
"command": "pwsh: Parser::ParseFile over Get-ChildItem -Recurse -Filter *.ps1"
"command": "pwsh parse *.ps1"
},
{
"name": "Run Pester tests",
"command": "pwsh: Invoke-Pester -Path tools -Output Detailed -PassThru"
"command": "Invoke-Pester -Path tools"
},
{
"name": "Validate Markdown links, terminology, and generated files",
"command": "./build/Test-Documentation.ps1"
},
{
"name": "Build documentation",
"command": "./docs.ps1 -BuildOnly (local stand-in for /template/scripts/docs-build.ps1; needs Docker and an installed docs.ps1)"
"command": "./docs.ps1 -BuildOnly"
},
{
"name": "Build and verify landing page",
"command": "npm --prefix src/engine run build; npm --prefix site run check"
},
{
"name": "Merge landing page into documentation build",
"command": "npm --prefix site run merge (needs a prior docs build in artifacts/docs)"
"command": "npm --prefix site run merge"
},
{
"name": "Test the host",
"command": "dotnet test src/host/SubZeroDev.GameEngine.Host.Tests/SubZeroDev.GameEngine.Host.Tests.csproj (needs NUGET_GITHUB_TOKEN for the sibling-repo package feed)"
"command": "dotnet test src/host"
},
{
"name": "Positive route and probe smoke",
"command": "docker build -t subzerodev-gameengine-host:smoke .; docker run -d -p 18080:8080; curl /, /roadmap/, /docs/, /health/live, /health/ready -> 200 and an unknown route -> 404"
"command": "docker build+run+curl"
},
{
"name": "Negative fixture -- corrupted artifact must fail to start",
"command": "docker build -f tools/host-smoke/Dockerfile.negative-fixture --build-arg BASE_IMAGE=subzerodev-gameengine-host:smoke; docker run must exit non-zero"
"command": "docker build negative fixture"
}
]
}
24 changes: 12 additions & 12 deletions .claude/verify-report.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,18 @@
"gates": [
{ "name": "Typecheck", "status": "Passed", "detail": "npm --prefix src/engine run typecheck — tsc --noEmit && tsc --noEmit -p tsconfig.scripts.json — exit 0" },
{ "name": "Lint", "status": "Passed", "detail": "npm --prefix src/engine run lint — eslint src scripts — exit 0" },
{ "name": "Test", "status": "Passed", "detail": "npm --prefix src/engine test (vitest run) — Test Files 79 passed (79), Tests 1146 passed (1146)" },
{ "name": "Test", "status": "Passed", "detail": "npm --prefix src/engine test (vitest run) — Test Files 79 passed (79), Tests 1174 passed (1174), Duration 3.40s" },
{ "name": "Pack package", "status": "Passed", "detail": "cd src/engine; npm pack --silent — produced the-running-dev-game-engine-0.10.0.tgz, exit 0" },
{ "name": "Inspect tarball", "status": "Passed", "detail": "tar -tzf the-running-dev-game-engine-0.10.0.tgz: no matches for (^|/)src/, no tsconfig*.json entries, no .test.* build artifacts, package/dist/ present — INSPECT OK" },
{ "name": "Consumer smoke", "status": "Passed", "detail": "consumer-smoke: cleared node_modules/package-lock.json/dist, then npm run install:engine && npm run build && npm run smoke — all three exited 0, tsc build and smoke.js ran clean" },
{ "name": "Parse-check PowerShell scripts", "status": "Passed", "detail": "Parsed every *.ps1 (repo-wide) with [System.Management.Automation.Language.Parser]::ParseFile — 0 parse errors: 'All .ps1 files parsed cleanly.'" },
{ "name": "Run Pester tests", "status": "Passed", "detail": "Invoke-Pester -Path tools -Output Detailed -PassThru — Tests Passed: 235, Failed: 0, Skipped: 18, Inconclusive: 0, NotRun: 0" },
{ "name": "Validate Markdown links, terminology, and generated files", "status": "Passed", "detail": "./build/Test-Documentation.ps1 — 'Human-documentation drift check passed across 18 generated engine page(s), compatibility pointers, and the guide. Documentation checks passed across 123 Markdown file(s).' Previously failed in this session because design/20-contract.md's §12 event-status edit hadn't been carried through the generation workflow; ConvertTo-HumanDocumentation.ps1 and /make-human-docs were run and the guide stamped, regenerating docs/docs/engine/12-world-graph-kind.md and docs/docs/guide.md, and this re-run now passes." },
{ "name": "Build documentation", "status": "DidNotRun", "reason": "Runs inside the ghcr.io/the-running-dev/docs-template container image via /template/scripts/docs-build.ps1. docs.ps1 (the local wrapper) is absent from this checkout — CLAUDE.md states it is installer-generated (Invoke-SetupDocs), not committed — and pulling/running the container image directly was not attempted this session; the corresponding CI check ('Verify Documentation Build') on the pull request is where the answer will come from." },
{ "name": "Build and verify landing page", "status": "Passed", "detail": "npm --prefix src/engine run build (tsc -p tsconfig.build.json) exit 0, then npm --prefix site run check: format:check (prettier — all matched files use Prettier code style), lint (oxlint, clean), typecheck (tsc -b, clean), test (vitest — Test Files 2 passed (2), Tests 15 passed (15)), test:browser (vitest browser-mode via Playwright's managed Chromium — Test Files 1 passed (1), Tests 11 passed (11)), test:build (vite build succeeded, 'Both built HTML entry points contain their required static metadata, and 3 bundle(s) are free of Node-only runtime references'), test:merge ('Package-backed merge proven') — all exited 0" },
{ "name": "Merge landing page into documentation build", "status": "DidNotRun", "reason": "npm --prefix site run merge needs a completed docs build in artifacts/docs, which the 'Build documentation' gate above did not produce (docs-template container image not available locally)." },
{ "name": "Test the host", "status": "DidNotRun", "reason": "dotnet test src/host/SubZeroDev.GameEngine.Host.Tests requires NUGET_GITHUB_TOKEN to restore SubZeroDev.Platform.Hosting from the sibling repository's GitHub Packages feed; not set in this local environment. The corresponding CI check ('Build, run, and smoke the image') on the pull request is where the answer will come from." },
{ "name": "Positive route and probe smoke", "status": "DidNotRun", "reason": "Requires a built host image, which itself depends on restoring packages from the sibling-repo NuGet feed (NUGET_GITHUB_TOKEN, unavailable locally)." },
{ "name": "Negative fixture -- corrupted artifact must fail to start", "status": "DidNotRun", "reason": "Same dependency as 'Positive route and probe smoke': requires a built host image, blocked on the missing NUGET_GITHUB_TOKEN." }
{ "name": "Inspect tarball", "status": "Passed", "detail": "tar -tzf the-running-dev-game-engine-0.10.0.tgz: grep for ^package/src/|tsconfig.*\\.json|\\.test\\. found NONE; package/dist/ present (e.g. package/dist/kinds/story-graph/achievements.js) — INSPECT OK" },
{ "name": "Consumer smoke", "status": "Passed", "detail": "consumer-smoke: cleared node_modules/package-lock.json/dist, copied fresh tarball, then npm run install:engine && npm run build && npm run smoke — all three exited 0 (install:engine added 5 packages, tsc build clean, node dist/smoke.js exit 0)" },
{ "name": "Parse-check PowerShell scripts", "status": "Passed", "detail": "Parsed every *.ps1 repo-wide with [System.Management.Automation.Language.Parser]::ParseFile — 0 parse errors, printed PASSED" },
{ "name": "Run Pester tests", "status": "Failed", "detail": "Invoke-Pester -Path tools -Output Detailed -PassThru — Tests Passed: 243, Failed: 10, Skipped: 0, NotRun: 0; plus 1 BeforeAll/AfterAll failure ('CI workflow: the Run Pester tests step is authenticated (#79)'), which also fails identically on main (confirmed via a disposable worktree at 9da79de — main: 235 passed, 1 failed, same GH_TOKEN-env test). The other 9 do NOT reproduce on main and persist even with design/state/work/ removed from the tree, ruling out the mirror files as the cause; the remaining candidate is the content edited in design/30-slices.md/design/90-decisions.md, not yet isolated further. The 10 test failures: (1) 'S4.6: unit/command/track and unit/document/agents-md exist and their closures are complete' — Expected $true, got $false. (2) 'the Run Pester tests step carries a GH_TOKEN env, the same as Check the design state against the tree' — pre-existing, also fails on main. (3) 'this repository's own table and its own enumeration agree' — Expected $null or empty, got ContractListUnreadable/GlobTableNotFound: design/20-contract.md; GlobDisagreement is uncomputed, not clean. (4) 'S12.5: the check exits 0 against this repository, and names the largest closure and its size' — Expected 0, got 2; findings list dozens of [UnrecordedArtifact] entries (every .claude/commands/*.md, most tools/*.ps1, most design/*.md have no active unit record naming them as Anchor), dozens of [LogEntryUnrecorded] entries (90-decisions.md log headings with no decision record naming them as Anchor, including several from 2026-08-23 that this branch's own commit touches), [RegionMalformed] entries in design/00-brief.md, design/10-design.md, design/20-contract.md, design/30-slices.md, design/90-decisions.md (closing marker for 'human-doc' region does not match innermost open region — three of these five files this PR does not touch), plus [ContractListUnreadable], [ProjectorFailed] exited 1, and [TrackerUnavailable] for all 48 issues mirrored under design/state/work/ (could not read issue #142, #145, ... #371) despite gh auth status confirming an authenticated session and gh issue view 142 succeeding standalone when run directly — root cause not diagnosed, this command does not fix. (5) 'S7.9: the projector runs against this repository and ProjectionStale does not fire' — Expected $null or empty, got ProjectorFailed/exited 1; ProjectionStale is uncomputed, not clean. (6) 'S16.1/S16.2: this repository has one Contract record per design/20-contract.md Public-surface entry' — Expected 9, got 0. (7) 'S16.5: design/state-index.md's consumers region lists real consumers' — Cannot find path design/state-index.md, does not exist. (8) 'S17.2: every invariant row in the real Invariants section sits inside the single invariants region' — Expected actual value greater than -1, got -1. (9) 'S18.6: EnforcementUnevidenced rejects this repository's own superseded decision' — Cannot find path design/state/decisions/2026-08-03-ticking-checkbox-is-the-users.md, does not exist. (10) 'S7.2: -DryRun against the real repository writes nothing' — Expected 0, got 7 refusals (same [UnrecordedArtifact]/[LogEntryUnrecorded]/[RegionMalformed] set as #4). This looks like pre-existing design-state drift the branch's content edits expose rather than something the two-line status/decision changes themselves broke, but that is not confirmed." },
{ "name": "Validate Markdown links, terminology, and generated files", "status": "Passed", "detail": "./build/Test-Documentation.ps1 — after running build/ConvertTo-HumanDocumentation.ps1 to regenerate engine/TODO.md and engine/OPEN-QUESTIONS.md (skipped in the first commit, since fixed in a follow-up commit): 'Human-documentation drift check passed across 18 generated engine page(s), compatibility pointers, and the guide. Documentation checks passed across 173 Markdown file(s).'" },
{ "name": "Build documentation", "status": "DidNotRun", "reason": "Runs inside the ghcr.io/the-running-dev/docs-template container image via /template/scripts/docs-build.ps1. docs.ps1 (the local wrapper) is absent from this checkout — CLAUDE.md states it is installer-generated (Invoke-SetupDocs), not committed. Docker itself is running locally, but the wrapper script needed to invoke the containerized build is missing, so this was not attempted; the corresponding CI check ('Verify Documentation Build') on the pull request is where the answer will come from." },
{ "name": "Build and verify landing page", "status": "Passed", "detail": "npm --prefix src/engine run build (tsc -p tsconfig.build.json) exit 0, then npm --prefix site run check: unit tests (Test Files 2 passed, Tests 15 passed), test:browser (Test Files 1 passed, Tests 11 passed), test:build (vite build succeeded, 'Both built HTML entry points contain their required static metadata, and 3 bundle(s) are free of Node-only runtime references'), test:merge ('Package-backed merge proven: /, /roadmap/ and the protected docs/ subtree all verified, and the top-level docs/ guard rejects a bad landing build') — all exited 0" },
{ "name": "Merge landing page into documentation build", "status": "DidNotRun", "reason": "npm --prefix site run merge needs a completed docs build in artifacts/docs, which the 'Build documentation' gate above did not produce (docs-template container image not available locally without the docs.ps1 wrapper)." },
{ "name": "Test the host", "status": "Passed", "detail": "dotnet test src/host/SubZeroDev.GameEngine.Host.Tests — all projects up-to-date for restore (NuGet packages already cached locally from a prior run, so no NUGET_GITHUB_TOKEN was needed this pass) — Passed: 12, Failed: 0, Skipped: 0, Total: 12, Duration 818ms" },
{ "name": "Positive route and probe smoke", "status": "DidNotRun", "reason": "Requires building the host Docker image, which restores SubZeroDev.Platform.Hosting from a private GitHub Packages NuGet feed inside the build via a docker/build-push-action secret (nuget_github_token). REGISTRY_TOKEN is not present in this local environment, so the image build step itself cannot be reproduced locally even though Docker is running; the corresponding CI check ('Build, run, and smoke the image') on the pull request is where the answer will come from." },
{ "name": "Negative fixture -- corrupted artifact must fail to start", "status": "DidNotRun", "reason": "Same dependency as 'Positive route and probe smoke': requires the built host image, blocked on the missing REGISTRY_TOKEN for the private NuGet feed restore." }
]
}
16 changes: 8 additions & 8 deletions design/30-slices.md
Original file line number Diff line number Diff line change
Expand Up @@ -3386,7 +3386,7 @@ system is half named after.
for the drift rates, which are content and belong with Sun Trap; guest opinion changes driven
by quality, which the utility model already reads.

### [ ] W84 — Incidents That Happen On Their Own {#w84}
### [x] W84 — Incidents That Happen On Their Own {#w84}

**Delivers:** Things go wrong in the resort without the player causing them — a breakdown, a
spill, a security problem — and the player has to deal with them. Today the only incident that can
Expand All @@ -3407,7 +3407,7 @@ it succeeds, and a rejected candidate consuming nothing.
a new fixture pair under `src/engine/fixtures/replay/`.
- **Depends on:** [W83](#w83), so a rolled incident has meters to act on and a resolution path that
is not litter-only.
- **Status:** Not started.
- **Status:** Done — [PR #360](https://github.com/The-Running-Dev/SubZeroDev.GameEngine/pull/360).
- **Done when:**
- W84.1 An eligible definition rolls against its declared chance from the tick's incidents
handle, and a successful roll allocates an occurrence with its start effects applied
Expand Down Expand Up @@ -3440,7 +3440,7 @@ it succeeds, and a rejected candidate consuming nothing.
narrative around an incident, which is a client concern; alerts raised for an active
incident, which is [W85](#w85); balance values for chances and cooldowns, which are content.

### [ ] W85 — The Resort Tells You What Needs Attention {#w85}
### [x] W85 — The Resort Tells You What Needs Attention {#w85}

**Delivers:** A player is told when something needs them — a building has broken, an incident is
running, the scenario has resolved — instead of having to notice it in the numbers; and the
Expand All @@ -3467,7 +3467,7 @@ core behaviour this kind has never exercised.
can reach zero. [W84](#w84) is not required, since guest litter already raises incidents,
but is sequenced ahead so the incident family is proved against an incident the player did
not cause.
- **Status:** Not started.
- **Status:** Done — [PR #361](https://github.com/The-Running-Dev/SubZeroDev.GameEngine/pull/361).
- **Done when:**
- W85.1 Still-locked achievements are evaluated by definition id against post-resolution state,
an unlock writes the achievement's existence row with the core `achievement_unlocked`
Expand Down Expand Up @@ -3518,7 +3518,7 @@ core behaviour this kind has never exercised.
> the emit sites are named, and adding one is declaring it and emitting it. These two units are
> that, and nothing else.

### [ ] W86 — The Story-Graph Kind Says Why {#w86}
### [x] W86 — The Story-Graph Kind Says Why {#w86}

**Delivers:** A campaign author can find out why a choice was refused or greyed out, and a
developer can find out why a replay diverged, without adding logging to the engine by hand. Today
Expand All @@ -3537,7 +3537,7 @@ audiences the channel exists to serve.
`src/engine/src/kinds/story-graph/kind.ts`.
`src/engine/src/core/observability/` is **read, not modified**.
- **Depends on:** nothing.
- **Status:** Not started.
- **Status:** Done — [PR #362](https://github.com/The-Running-Dev/SubZeroDev.GameEngine/pull/362).
- **Done when:**
- W86.1 All six remaining rows are emitted at the step the table names, with exactly the `data`
fields it lists and no others, and all ten are declared in `Kind.eventNames`. A test
Expand Down Expand Up @@ -3566,7 +3566,7 @@ audiences the channel exists to serve.
event names; changing any severity the table fixes; the sink implementations, which already
ship.

### [ ] W87 — The World-Graph Kind Says What Its Ticks Did {#w87}
### [x] W87 — The World-Graph Kind Says What Its Ticks Did {#w87}

**Delivers:** Someone diagnosing a resort that behaves oddly can watch what happened inside a tick
— which guests could not reach a building, which tasks were assigned and cancelled, what each
Expand All @@ -3585,7 +3585,7 @@ difference is invisible in the projection and obvious in the stream.
`src/engine/src/kinds/world-graph/kind.ts`.
- **Depends on:** [W81](#w81)–[W85](#w85), which each deliver the rows their own system owns. This
unit takes what is left rather than duplicating them.
- **Status:** Not started.
- **Status:** Done — [PR #363](https://github.com/The-Running-Dev/SubZeroDev.GameEngine/pull/363).
- **Done when:**
- W87.1 Every row in [12 §12](12-world-graph-kind.md#12-events)'s table is emitted at the system
it names and declared in `Kind.eventNames`; the status column has no remaining *specified,
Expand Down
Loading
Loading