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
24 changes: 12 additions & 12 deletions .claude/verify-report.json
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
{
"gates": [
{ "name": "Typecheck", "status": "Passed", "detail": "npm --prefix src/engine run typecheck — exit 0" },
{ "name": "Lint", "status": "Passed", "detail": "npm --prefix src/engine run lint — exit 0" },
{ "name": "Test", "status": "Passed", "detail": "npm --prefix src/engine test (vitest) — Test Files 79 passed (79), Tests 1127 passed (1127)" },
{ "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": "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 src/, no tsconfig*.json, no .test.* entries; package/dist/ present" },
{ "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" },
{ "name": "Parse-check PowerShell scripts", "status": "Passed", "detail": "Parsed every tools/*.ps1 with [System.Management.Automation.Language.Parser]::ParseFile — 0 parse errors across all files" },
{ "name": "Run Pester tests", "status": "Failed", "detail": "Invoke-Pester -Path tools -Output Detailed -PassThru: FailedCount 12, PassedCount 241, TotalCount 253. All 12 failures are in the newly kit-synced Read-DesignState.Tests.ps1/Test-DesignState.Tests.ps1/Test-CIWorkflow.Tests.ps1/Update-DesignProjection.Tests.ps1 — self-referential tests (Split-Path $PSScriptRoot -Parent) that validate the agent-kit's own dogfooded design/state/ per-unit-record mechanism and its verify.yml shape against whatever repo they are copied into. Failing tests: S4.6 (unit/command/track and unit/document/agents-md exist and their closures are complete), the 'Run Pester tests' step carries a GH_TOKEN env test, 'this repository's own table and its own enumeration agree', S5.6 (the real run names a largest closure), S5.12, S7.9, S12.5, S12.6 Describe block (BeforeAll/AfterAll failed), S16.1/S16.2, S16.5, S17.2, S18.6, and Update-DesignProjection's S7.2 real-repo DryRun test. This repository's design/ uses 00-brief/10-design/20-contract/30-slices/90-decisions, not the kit's own design/state/ per-unit-record scheme, so these fail structurally (StateSetAbsent) rather than from a regression — the same class of gap Test-DesignState.ps1 itself reports as exit code 2 when run directly against this repo." },
{ "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)." },
{ "name": "Build documentation", "status": "DidNotRun", "reason": "docs.ps1 is absent from this checkout — CLAUDE.md states it is installer-generated (Invoke-SetupDocs), not committed, and installing it was out of scope for this change. Needs Docker and an installed docs.ps1; neither precondition was set up this session." },
{ "name": "Build and verify landing page", "status": "Passed", "detail": "npm --prefix src/engine run build (tsc) exit 0, then npm --prefix site run check: format:check/lint/typecheck/test/test:browser/test:build/test:merge all passed — Test Files 1 passed (1), Tests 11 passed (11) for test:browser; 'Both built HTML entry points contain their required static metadata, and 3 bundle(s) are free of Node-only runtime references'; 'Package-backed merge proven' for test:merge" },
{ "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.ps1 absent)." },
{ "name": "Test the host", "status": "DidNotRun", "reason": "dotnet test src/host/SubZeroDev.GameEngine.Host.Tests requires NUGET_GITHUB_TOKEN for the sibling-repo NuGet feed; not set in this local environment." },
{ "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 committedand 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." }
]
Expand Down
17 changes: 9 additions & 8 deletions design/20-contract.md
Original file line number Diff line number Diff line change
Expand Up @@ -6249,18 +6249,19 @@ Namespaced `kind.world-graph.*` (05 §9), declared as `Kind.eventNames`:
| `objective.progressed` / `objective.met` | `debug` / `info` | System 17 | specified, not yet delivered |
Comment thread
The-Running-Dev marked this conversation as resolved.
| `failure.progressed` / `failure.triggered` | `debug` / `info` | System 18 | specified, not yet delivered |
| `scenario.resolved` | `info` | Win or failure, with the `outcome` ids (§8) | specified, not yet delivered |
| `achievement.unlocked` | `info` | System 19, before alert derivation | specified, not yet delivered |
| `alert.raised` / `alert.cleared` | `debug` / `trace` | System 19 active-set transition | specified, not yet delivered |
| `achievement.unlocked` | `info` | System 19, before alert derivation | delivered |
| `alert.raised` / `alert.cleared` | `debug` / `trace` | System 19 active-set transition | delivered |

> **The status column tracks emit sites, not decisions.** `Kind.eventNames` on the shipped
> `worldGraphKind` declares the delivered rows; the rest are named here because an event
> name is a published identifier a sink filters on (05 §9), so it is fixed once, ahead of the
> emit site, rather than renamed after every host has configured for it. Undelivered rows
> cluster where the pipeline itself is still incomplete — systems 12, 13 and 19 are no-op
> stubs and 14 and 16 are partial, recorded with the rest of the tick-system gaps in
> `90-decisions.md`. Same treatment as `story-graph` §8.4, and safe for the same reason:
> 05 §2 guarantees dropping every event changes nothing, so a not-yet-emitted event cannot
> be load-bearing.
> emit site, rather than renamed after every host has configured for it. As of W85, every
> tick system this table names is real — `90-decisions.md`'s tick-system register closes
> with no rows remaining — so the undelivered rows left below belong to pipeline stages
> (queue membership, guest movement, per-system diagnostics) that were never blocked on a
> stub, only not yet built. Same treatment as `story-graph` §8.4, and safe for the same
> reason: 05 §2 guarantees dropping every event changes nothing, so a not-yet-emitted event
> cannot be load-bearing.

**`guest.path.failed` earns its place.** A resort where guests silently cannot reach a
building looks identical to one where they do not want to — the failure is invisible in the
Expand Down
2 changes: 2 additions & 0 deletions design/90-decisions.md
Original file line number Diff line number Diff line change
Expand Up @@ -430,6 +430,8 @@ Reversibility: cheap — documentation only; no code or contract behaviour chang
**Amended 2026-08-20 by W81.** `construction` (system 12) is real as of this unit and leaves the list below. Re-reading systems 9 and 11 against the source while slicing W81 found the register incomplete rather than wrong: `task-generate` (system 9) and `staff-work` (system 11) were never on this list — both looked complete because every other documented task kind they touch (`clean`, `service`) was wired — but `StaffTaskType` and the `task-assign` comparator have always included `build` and `restock` as options neither system ever produced or applied. **The gap is seven systems, not five.** W81 wired the `build` half of both (a construction-site candidate in system 9, and status marking in system 11, with the effort application and completion itself living in system 12); the `restock` half is still missing and is W82's scope. `buildings` (system 13) and `alerts` (system 19) remain fully no-op; `cleanliness-wear` (14) and `incidents` (16) are unchanged from the description above.
**Amended again 2026-08-20 by W82.** The `restock` half W81 left open is wired: `task-generate` (system 9) now generates a restock candidate per below-capacity product, `staff-work` (system 11) marks a restocker's task `in_progress` on arrival — mirroring how it already treats `build` — and `buildings` (system 13) applies the assigned restocker's effort to finite inventory, clamped once at each product's capacity, and completes the task. `buildings` is real as of this unit and leaves the list below. `task-generate` and `staff-work` are now fully wired for every documented task kind (`service`, `clean`, `restock`, `build`) and leave this register entirely. **Three systems remain**: `alerts` (19) is fully no-op; `cleanliness-wear` (14) and `incidents` (16) are unchanged from the 2026-08-05 description.
**Amended again 2026-08-20 by W83.** `cleanliness-wear` (system 14) is real as of this unit for four of its five documented sources: `service` (deferred from system 4), `staff` (deferred from system 11, including cleaning's `onResolve` recovery), `policy` (deferred from system 1), and `litter` (ambient, computed here from unresolved litter-kind incidents) now compose in one sum per building/meter and clamp once, per §9's "systems 1, 4, and 11 explicitly defer building-meter deltas to system 14" rule; wear now moves and a zero-wear open or closed building becomes `broken`. The contract's third ordered slot, `incident`, has no independent mechanism the contract or the source distinguishes from `staff`'s deferred `onResolve` effect (see the `AskUserQuestion` resolution this unit's session recorded) and is left a no-op placeholder in the source's own comment — a future unit that gives it real content should also correct this entry rather than leaving both stale. **Two systems remain**: `alerts` (19) is fully no-op; `incidents` (16) is unchanged from the 2026-08-05 description.
**Amended again 2026-08-21 by W84.** `incidents` (system 16) is real as of this unit: it resolves due/condition-met occurrences as before, and now also rolls new ones by declared scope (world/zone/building), each definition's own trigger condition, roll chance, and selection weight, blocked by an active or still-cooling-down occurrence of the same definition at the same scope instance, using a per-call `tickRng("incidents")` handle so a split batch stays byte-identical to the whole one (§4.18, §5). `incidents` leaves the list below. **One system remains**: `alerts` (19), fully no-op.
**Amended again 2026-08-21 by W85, closing this entry.** `alerts` (system 19) is real as of this unit: still-locked achievements are evaluated by definition id against the post-resolution state first, with an unlock writing `unlockedAchievementIds.<id>.exists` under the core `achievement_unlocked` reason; then the three closed alert families — active incident, broken building, and scenario resolved — derive from the current tick's own source set, keyed on published ids only, raising a new alert only for a semantic key no uncleared alert already represents and marking a no-longer-active source's alert cleared. `alerts` leaves the list below. **Zero systems remain — every row this entry ever named is now real, and it needs no further amendment.**
Reversibility: cheap — documentation only.

### 2026-08-05 — Known-and-retained implementation gaps: `simulation` end-of-week systems
Expand Down
17 changes: 9 additions & 8 deletions docs/docs/engine/12-world-graph-kind.md
Original file line number Diff line number Diff line change
Expand Up @@ -1577,18 +1577,19 @@ Namespaced `kind.world-graph.*` (05 §9), declared as `Kind.eventNames`:
| `objective.progressed` / `objective.met` | `debug` / `info` | System 17 | specified, not yet delivered |
| `failure.progressed` / `failure.triggered` | `debug` / `info` | System 18 | specified, not yet delivered |
| `scenario.resolved` | `info` | Win or failure, with the `outcome` ids (§8) | specified, not yet delivered |
| `achievement.unlocked` | `info` | System 19, before alert derivation | specified, not yet delivered |
| `alert.raised` / `alert.cleared` | `debug` / `trace` | System 19 active-set transition | specified, not yet delivered |
| `achievement.unlocked` | `info` | System 19, before alert derivation | delivered |
| `alert.raised` / `alert.cleared` | `debug` / `trace` | System 19 active-set transition | delivered |

> **The status column tracks emit sites, not decisions.** `Kind.eventNames` on the shipped
> `worldGraphKind` declares the delivered rows; the rest are named here because an event
> name is a published identifier a sink filters on (05 §9), so it is fixed once, ahead of the
> emit site, rather than renamed after every host has configured for it. Undelivered rows
> cluster where the pipeline itself is still incomplete — systems 12, 13 and 19 are no-op
> stubs and 14 and 16 are partial, recorded with the rest of the tick-system gaps in
> `90-decisions.md`. Same treatment as `story-graph` §8.4, and safe for the same reason:
> 05 §2 guarantees dropping every event changes nothing, so a not-yet-emitted event cannot
> be load-bearing.
> emit site, rather than renamed after every host has configured for it. As of W85, every
> tick system this table names is real — `90-decisions.md`'s tick-system register closes
> with no rows remaining — so the undelivered rows left below belong to pipeline stages
> (queue membership, guest movement, per-system diagnostics) that were never blocked on a
> stub, only not yet built. Same treatment as `story-graph` §8.4, and safe for the same
> reason: 05 §2 guarantees dropping every event changes nothing, so a not-yet-emitted event
> cannot be load-bearing.

**`guest.path.failed` earns its place.** A resort where guests silently cannot reach a
building looks identical to one where they do not want to — the failure is invisible in the
Expand Down
Loading
Loading