Skip to content

Commit 9439b99

Browse files
W105 — Documentation and Landing Publication Review (#455)
* W105 — Documentation and Landing Publication Review Repoint the roadmap's "Play the adventures" link from the retired in-repository /play/ route to adventures.subzerodev.com, and note on the W61-W62 chapter that the route is gone. That link was the last public surface still presenting the engine's own play route as live, and it resolved to nothing on the merged site, which serves only "/", "/roadmap/" and the protected "docs/" subtree. Two tests hold it: every kind:"site" href must match a route the merge actually serves, and the adventures link must carry ExternalLink's new-tab affordance. Both fail on the old href. Add site/src/publication.browser.test.tsx — the landing page and the roadmap rendered in a real Chromium tab at 390x844 and 1280x800, the widths this site already committed to, asserting no horizontal overflow, no clipped navigation, no overlapping controls, and every primary link laid out and reachable. jsdom performs no layout, so none of these could be asserted before. The local assertNotClipped carries its own self-test, matching the rule the W65 assertion module states for itself. Commit the eight reviewed renderings under site/screenshots/, covering those two surfaces plus the two documentation entry pages this package cannot render, with the review's findings written down beside them. Record the missing customer/alternative/monetization thesis as an explicit deferral rather than an absence: it belongs to SubZeroDev.Platform, it is the repository owner's decision and not a specification pass's, and it is revisited when Platform work starts. * Record W105's gate run in verify-report.json Fifteen discovered gates against slice/W105 at 9b9b6c7: eleven ran and passed, none failed, four could not run here. The documentation build needs the installer-generated docs.ps1, the merge gate needs that build's artifacts/docs, and both host-image smokes need the REGISTRY_TOKEN build secret. The file otherwise still held W104.5's run.
1 parent 726409b commit 9439b99

16 files changed

Lines changed: 289 additions & 33 deletions

.claude/verify-report.json

Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,87 +3,77 @@
33
{
44
"name": "Typecheck",
55
"status": "Passed",
6-
"detail": "npm --prefix src/engine run typecheck tsc --noEmit and tsc --noEmit -p tsconfig.scripts.json, no errors."
6+
"detail": "npm --prefix src/engine run typecheck -- tsc --noEmit && tsc --noEmit -p tsconfig.scripts.json, exit 0."
77
},
88
{
99
"name": "Lint",
1010
"status": "Passed",
11-
"detail": "npm --prefix src/engine run lint eslint src scripts, no findings."
11+
"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."
1212
},
1313
{
1414
"name": "Test",
1515
"status": "Passed",
16-
"detail": "npm --prefix src/engine test 97 test files, 1594 tests, all passed."
16+
"detail": "npm --prefix src/engine test -- vitest run: 97 test files passed (97), 1594 tests passed (1594), duration 9.38s."
1717
},
1818
{
1919
"name": "Pack package",
2020
"status": "Passed",
21-
"detail": "npm pack --silent in src/engine produced the-running-dev-game-engine-0.10.0.tgz with no errors."
21+
"detail": "cd src/engine; npm pack --silent produced the-running-dev-game-engine-0.10.0.tgz, exit 0."
2222
},
2323
{
2424
"name": "Inspect tarball",
2525
"status": "Passed",
26-
"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."
26+
"detail": "tar -tzf over 332 entries: no package/src/, no tsconfig*.json, no .test.* artifacts, and package/dist/ present."
2727
},
2828
{
2929
"name": "Consumer smoke",
3030
"status": "Passed",
31-
"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."
31+
"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."
3232
},
3333
{
3434
"name": "Parse-check PowerShell scripts",
3535
"status": "Passed",
36-
"detail": "Every *.ps1 in the repo parsed with [System.Management.Automation.Language.Parser]::ParseFile, zero parse errors across the tree."
36+
"detail": "Every *.ps1 outside node_modules parsed with [System.Management.Automation.Language.Parser]::ParseFile; 0 parse errors."
3737
},
3838
{
3939
"name": "Run Pester tests",
4040
"status": "Passed",
41-
"detail": "Invoke-Pester -Path tools -PassThru: Tests Passed: 324, Failed: 0, Skipped: 35, NotRun: 0."
42-
},
43-
{
44-
"name": "Validate the core/companion split",
45-
"status": "Passed",
46-
"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."
47-
},
48-
{
49-
"name": "Check the design state against the tree",
50-
"status": "DidNotRun",
51-
"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."
41+
"detail": "Invoke-Pester -Path tools -PassThru: passed=324 failed=0 skipped=35 total=359."
5242
},
5343
{
5444
"name": "Validate Markdown links, terminology, and generated files",
5545
"status": "Passed",
56-
"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).'"
46+
"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)."
5747
},
5848
{
5949
"name": "Build documentation",
6050
"status": "DidNotRun",
61-
"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."
51+
"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."
6252
},
6353
{
6454
"name": "Build and verify landing page",
6555
"status": "Passed",
66-
"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."
56+
"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."
6757
},
6858
{
6959
"name": "Merge landing page into documentation build",
7060
"status": "DidNotRun",
71-
"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."
61+
"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."
7262
},
7363
{
7464
"name": "Test the host",
7565
"status": "Passed",
76-
"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'."
66+
"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."
7767
},
7868
{
7969
"name": "Positive route and probe smoke",
8070
"status": "DidNotRun",
81-
"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."
71+
"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."
8272
},
8373
{
8474
"name": "Negative fixture -- corrupted artifact must fail to start",
8575
"status": "DidNotRun",
86-
"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)."
76+
"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."
8777
}
8878
]
8979
}

design/90-decisions.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,20 @@ answer now lives — so a later reader finds the reasoning without re-opening th
5454

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

57+
- **No customer, alternative, or monetization thesis — deferred, and now recorded as deferred
58+
rather than merely absent.** The brief states what the platform is, who plays it, and what it
59+
refuses to do; it says nothing about who would buy it, what they would otherwise use, or how it
60+
would earn. That silence is deliberate, not an oversight. This repository ships a deterministic
61+
engine, its specifications, and its authoring tools; the commercial layer is a different
62+
repository —
63+
[SubZeroDev.Platform](https://github.com/The-Running-Dev/SubZeroDev.Platform), the deferred
64+
hosting / NEaaS layer. Stating a monetization thesis here would put product strategy in the
65+
document that owns *engine* scope, and every reader of the non-goals would then have to work out
66+
which of the two they bind. **Owner:** the repository owner
67+
([@The-Running-Dev](https://github.com/The-Running-Dev)); this is a product decision, and no
68+
specification pass settles it on their behalf. **Revisit when** Platform work actually starts —
69+
the first point at which a named customer, a named alternative, and a price have somewhere to
70+
live that is not this repository.
5771
- **Package visibility, decided: public.** `src/engine/package.json` carries no `"private"`
5872
field and publishes to `npm.pkg.github.com`; [Engine Package](/docs/guide/engine-package)
5973
states the choice is deliberate. `plans/39-world-graph-kind-programme.md` and

docs/docs/engine/OPEN-QUESTIONS.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,20 @@ answer now lives — so a later reader finds the reasoning without re-opening th
4444

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

47+
- **No customer, alternative, or monetization thesis — deferred, and now recorded as deferred
48+
rather than merely absent.** The brief states what the platform is, who plays it, and what it
49+
refuses to do; it says nothing about who would buy it, what they would otherwise use, or how it
50+
would earn. That silence is deliberate, not an oversight. This repository ships a deterministic
51+
engine, its specifications, and its authoring tools; the commercial layer is a different
52+
repository —
53+
[SubZeroDev.Platform](https://github.com/The-Running-Dev/SubZeroDev.Platform), the deferred
54+
hosting / NEaaS layer. Stating a monetization thesis here would put product strategy in the
55+
document that owns *engine* scope, and every reader of the non-goals would then have to work out
56+
which of the two they bind. **Owner:** the repository owner
57+
([@The-Running-Dev](https://github.com/The-Running-Dev)); this is a product decision, and no
58+
specification pass settles it on their behalf. **Revisit when** Platform work actually starts —
59+
the first point at which a named customer, a named alternative, and a price have somewhere to
60+
live that is not this repository.
4761
- **Package visibility, decided: public.** `src/engine/package.json` carries no `"private"`
4862
field and publishes to `npm.pkg.github.com`; [Engine Package](/docs/guide/engine-package)
4963
states the choice is deliberate. `plans/39-world-graph-kind-programme.md` and

site/screenshots/README.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# Publication review screenshots (W105.5)
2+
3+
Reviewed renderings of the two published entry surfaces, at the widths this site already
4+
commits to elsewhere — 390×844 (portrait phone) and 1280×800 (desktop). The retired
5+
`viewport.browser.test.tsx` and `visual-baseline.browser.test.tsx` used the same pair, and
6+
`vitest.browser.config.ts` still opens its tab at 1280×800.
7+
8+
| File | Surface | Served from |
9+
| ------------------------------------------ | --------------------- | ---------------------------- |
10+
| `landing-{phone-390,desktop-1280}.png` | `/` | this package's `dist/` |
11+
| `roadmap-{phone-390,desktop-1280}.png` | `/roadmap/` | this package's `dist/` |
12+
| `docs-index-{phone-390,desktop-1280}.png` | `/docs/` | the `docs/` Docusaurus image |
13+
| `docs-vision-{phone-390,desktop-1280}.png` | `/docs/engine/vision` | the `docs/` Docusaurus image |
14+
15+
Each was captured full-page with reduced motion emulated, so the reveal-on-scroll sections
16+
render rather than staying hidden below the first screen.
17+
18+
**What the review found:** no horizontal overflow at either width on any of the eight
19+
renderings (`documentElement.scrollWidth` equals `clientWidth` in every case), no clipped
20+
navigation, no overlapping controls, and every primary link laid out and reachable. On the
21+
phone width the documentation site collapses its sidebar behind the hamburger control and
22+
puts wide tables in their own scroll containers, so the page itself never scrolls sideways.
23+
24+
These are evidence, not a gate. The gate for the two surfaces this package _can_ render is
25+
`src/publication.browser.test.tsx`, which asserts the same four properties from real layout in
26+
a Chromium tab on every `npm run check`. Nothing here renders the Docusaurus routes — those
27+
are built from a container image — so for those two pages the screenshots are the whole record.
28+
Recapture them when either surface changes materially.
232 KB
Loading
178 KB
Loading
348 KB
Loading
274 KB
Loading
351 KB
Loading
287 KB
Loading

0 commit comments

Comments
 (0)