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
40 changes: 15 additions & 25 deletions .claude/verify-report.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,87 +3,77 @@
{
"name": "Typecheck",
"status": "Passed",
"detail": "npm --prefix src/engine run typecheck tsc --noEmit and tsc --noEmit -p tsconfig.scripts.json, no errors."
"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, no findings."
"detail": "npm --prefix src/engine run lint -- eslint src scripts, exit 0. The determinism guard (Math.random, non-bit-stable Math.*, Date.now) reported nothing."
},
{
"name": "Test",
"status": "Passed",
"detail": "npm --prefix src/engine test 97 test files, 1594 tests, all passed."
"detail": "npm --prefix src/engine test -- vitest run: 97 test files passed (97), 1594 tests passed (1594), duration 9.38s."
},
{
"name": "Pack package",
"status": "Passed",
"detail": "npm pack --silent in src/engine produced the-running-dev-game-engine-0.10.0.tgz with no errors."
"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 against the packed tarball: no src/ entries, no tsconfig*.json, no .test.* build artifacts, and package/dist/ is present — matches ci.yml's four assertions exactly."
"detail": "tar -tzf over 332 entries: no package/src/, no tsconfig*.json, no .test.* artifacts, and package/dist/ present."
},
{
"name": "Consumer smoke",
"status": "Passed",
"detail": "consumer-smoke/: npm ci, npm run install:engine (installed the fresh tarball), npm run build (tsc), npm run smoke (node dist/smoke.js) all completed with no error output and exit 0."
"detail": "consumer-smoke/{node_modules,package-lock.json,dist} cleared, then npm run install:engine (installed the packed tarball, added 5 packages), npm run build (tsc -p tsconfig.json), npm run smoke (node dist/smoke.js) -- all exit 0."
},
{
"name": "Parse-check PowerShell scripts",
"status": "Passed",
"detail": "Every *.ps1 in the repo parsed with [System.Management.Automation.Language.Parser]::ParseFile, zero parse errors across the tree."
"detail": "Every *.ps1 outside node_modules parsed with [System.Management.Automation.Language.Parser]::ParseFile; 0 parse errors."
},
{
"name": "Run Pester tests",
"status": "Passed",
"detail": "Invoke-Pester -Path tools -PassThru: Tests Passed: 324, Failed: 0, Skipped: 35, NotRun: 0."
},
{
"name": "Validate the core/companion split",
"status": "Passed",
"detail": "tools/Test-Companion.ps1: 'Companion split OK - 23 core(s) checked, 14 companion file(s) present, 9 core(s) with no companion.' State: Valid, exit 0."
},
{
"name": "Check the design state against the tree",
"status": "DidNotRun",
"reason": "tools/Test-DesignState.ps1 exited 2 (could-not-evaluate, not a finding): 'ContractListUnreadable: SectionNotFound: design/20-contract.md' and 'StateSetAbsent: design/state/ is missing or holds no records other than WorkRef mirrors' — this repository has not adopted design/state/ as its live state set (per CLAUDE.md this behaves per I27, reading design/ and the contract directly instead), so the script has nothing to evaluate."
"detail": "Invoke-Pester -Path tools -PassThru: passed=324 failed=0 skipped=35 total=359."
},
{
"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.' and 'Documentation checks passed across 197 Markdown file(s).'"
"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 198 Markdown file(s)."
},
{
"name": "Build documentation",
"status": "DidNotRun",
"reason": "docs.ps1 is not present in this checkout — per CLAUDE.md it is installer-generated (Invoke-SetupDocs), not committed, and this session did not run that installer. The production Docusaurus build (onBrokenLinks: 'throw') cannot be reproduced locally without it; the 'Verify Documentation Build' check on the PR is where this answer comes from."
"reason": "./docs.ps1 is not present in this checkout. It is generated by Invoke-SetupDocs rather than committed (CLAUDE.md, Docs Site), so the production Docusaurus build -- the only gate that resolves routes and heading anchors under onBrokenLinks: 'throw' -- cannot be run here. The Verify Documentation Build check on the pull request is where that answer comes from. A docs image was built directly from docs/Dockerfile during this slice to capture screenshots; that is a dev-server run, not this gate."
},
{
"name": "Build and verify landing page",
"status": "Passed",
"detail": "npm --prefix src/engine run build then npm --prefix site run check (format:check, lint, typecheck, test [15], test:browser [11], test:build, test:merge) — all passed, including the built HTML entry point's static-metadata and Node-only-import checks."
"detail": "npm --prefix src/engine run build (exit 0), then npm --prefix site run check (exit 0): prettier format:check, oxlint, tsc -b, 17 unit tests, 23 browser tests in Chromium, production build with verify-build.mjs ('Both built HTML entry points contain their required static metadata, and 3 bundle(s) are free of Node-only runtime references'), and verify-merge.mjs."
},
{
"name": "Merge landing page into documentation build",
"status": "DidNotRun",
"reason": "npm --prefix site run merge failed with 'Documentation output ...\\artifacts\\docs has no protected docs subtree' because artifacts/docs does not exist — it is only produced by the 'Build documentation' step above, which itself did not run (docs.ps1 absent). This step has no independent input; it cannot be verified without that prerequisite."
"reason": "npm --prefix site run merge exited 1 with \"Documentation output '...\\artifacts\\docs' has no protected 'docs' subtree.\" -- artifacts/docs does not exist because the Build documentation gate above could not run. This is a missing prerequisite, not a merge failure: the same merge logic is exercised against a fixture documentation output by site/scripts/verify-merge.mjs, which passed inside the landing-page gate."
},
{
"name": "Test the host",
"status": "Passed",
"detail": "dotnet test src/host/SubZeroDev.GameEngine.Host.Tests/SubZeroDev.GameEngine.Host.Tests.csproj -c Release: 'Passed! - Failed: 0, Passed: 12, Skipped: 0, Total: 12'."
"detail": "dotnet test src/host/SubZeroDev.GameEngine.Host.Tests/SubZeroDev.GameEngine.Host.Tests.csproj -c Release (net10.0): Failed 0, Passed 12, Skipped 0, Total 12. Restore resolved from cache, so the sibling-repo feed credential was not needed."
},
{
"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 feed using the CI-only REGISTRY_TOKEN secret (host-image.yml). That credential is not available in this local session; the host-image workflow's own run on the PR is where this answer comes from."
"reason": "The step depends on the preceding 'Build the image' step, which restores SubZeroDev.Platform.Hosting from GitHub Packages using the REGISTRY_TOKEN build secret. That credential is not available in this environment, so subzerodev-gameengine-host:smoke was never built and no container could be started to curl /, /roadmap/, /docs/, /health/live and /health/ready against. The host-image workflow check on the pull request is where this answer comes from."
},
{
"name": "Negative fixture -- corrupted artifact must fail to start",
"status": "DidNotRun",
"reason": "Depends on the same host image built by the 'Positive route and probe smoke' step above, which did not run for the same reason (REGISTRY_TOKEN not available locally)."
"reason": "tools/host-smoke/Dockerfile.negative-fixture builds FROM subzerodev-gameengine-host:smoke, the image the Positive route and probe smoke gate above could not build for want of the REGISTRY_TOKEN build secret. With no base image there is nothing to corrupt, so the must-exit-non-zero assertion was never made."
}
]
}
14 changes: 14 additions & 0 deletions design/90-decisions.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,20 @@ answer now lives — so a later reader finds the reasoning without re-opening th

Settled as out of MVP scope. Listed so they resurface deliberately, not by accident.

- **No customer, alternative, or monetization thesis — deferred, and now recorded as deferred
rather than merely absent.** The brief states what the platform is, who plays it, and what it
refuses to do; it says nothing about who would buy it, what they would otherwise use, or how it
would earn. That silence is deliberate, not an oversight. This repository ships a deterministic
engine, its specifications, and its authoring tools; the commercial layer is a different
repository —
[SubZeroDev.Platform](https://github.com/The-Running-Dev/SubZeroDev.Platform), the deferred
hosting / NEaaS layer. Stating a monetization thesis here would put product strategy in the
document that owns *engine* scope, and every reader of the non-goals would then have to work out
which of the two they bind. **Owner:** the repository owner
([@The-Running-Dev](https://github.com/The-Running-Dev)); this is a product decision, and no
specification pass settles it on their behalf. **Revisit when** Platform work actually starts —
the first point at which a named customer, a named alternative, and a price have somewhere to
live that is not this repository.
- **Package visibility, decided: public.** `src/engine/package.json` carries no `"private"`
field and publishes to `npm.pkg.github.com`; [Engine Package](/docs/guide/engine-package)
states the choice is deliberate. `plans/39-world-graph-kind-programme.md` and
Expand Down
14 changes: 14 additions & 0 deletions docs/docs/engine/OPEN-QUESTIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,20 @@ answer now lives — so a later reader finds the reasoning without re-opening th

Settled as out of MVP scope. Listed so they resurface deliberately, not by accident.

- **No customer, alternative, or monetization thesis — deferred, and now recorded as deferred
rather than merely absent.** The brief states what the platform is, who plays it, and what it
refuses to do; it says nothing about who would buy it, what they would otherwise use, or how it
would earn. That silence is deliberate, not an oversight. This repository ships a deterministic
engine, its specifications, and its authoring tools; the commercial layer is a different
repository —
[SubZeroDev.Platform](https://github.com/The-Running-Dev/SubZeroDev.Platform), the deferred
hosting / NEaaS layer. Stating a monetization thesis here would put product strategy in the
document that owns *engine* scope, and every reader of the non-goals would then have to work out
which of the two they bind. **Owner:** the repository owner
([@The-Running-Dev](https://github.com/The-Running-Dev)); this is a product decision, and no
specification pass settles it on their behalf. **Revisit when** Platform work actually starts —
the first point at which a named customer, a named alternative, and a price have somewhere to
live that is not this repository.
- **Package visibility, decided: public.** `src/engine/package.json` carries no `"private"`
field and publishes to `npm.pkg.github.com`; [Engine Package](/docs/guide/engine-package)
states the choice is deliberate. `plans/39-world-graph-kind-programme.md` and
Expand Down
28 changes: 28 additions & 0 deletions site/screenshots/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Publication review screenshots (W105.5)

Reviewed renderings of the two published entry surfaces, at the widths this site already
commits to elsewhere — 390×844 (portrait phone) and 1280×800 (desktop). The retired
`viewport.browser.test.tsx` and `visual-baseline.browser.test.tsx` used the same pair, and
`vitest.browser.config.ts` still opens its tab at 1280×800.

| File | Surface | Served from |
| ------------------------------------------ | --------------------- | ---------------------------- |
| `landing-{phone-390,desktop-1280}.png` | `/` | this package's `dist/` |
| `roadmap-{phone-390,desktop-1280}.png` | `/roadmap/` | this package's `dist/` |
| `docs-index-{phone-390,desktop-1280}.png` | `/docs/` | the `docs/` Docusaurus image |
| `docs-vision-{phone-390,desktop-1280}.png` | `/docs/engine/vision` | the `docs/` Docusaurus image |

Each was captured full-page with reduced motion emulated, so the reveal-on-scroll sections
render rather than staying hidden below the first screen.

**What the review found:** no horizontal overflow at either width on any of the eight
renderings (`documentElement.scrollWidth` equals `clientWidth` in every case), no clipped
navigation, no overlapping controls, and every primary link laid out and reachable. On the
phone width the documentation site collapses its sidebar behind the hamburger control and
puts wide tables in their own scroll containers, so the page itself never scrolls sideways.

These are evidence, not a gate. The gate for the two surfaces this package _can_ render is
`src/publication.browser.test.tsx`, which asserts the same four properties from real layout in
a Chromium tab on every `npm run check`. Nothing here renders the Docusaurus routes — those
are built from a container image — so for those two pages the screenshots are the whole record.
Recapture them when either surface changes materially.
Binary file added site/screenshots/docs-index-desktop-1280.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added site/screenshots/docs-index-phone-390.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added site/screenshots/docs-vision-desktop-1280.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added site/screenshots/docs-vision-phone-390.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added site/screenshots/landing-desktop-1280.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added site/screenshots/landing-phone-390.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added site/screenshots/roadmap-desktop-1280.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added site/screenshots/roadmap-phone-390.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading