W105 — Documentation and Landing Publication Review - #455
Merged
Conversation
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.
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #393.
What changed
The retired
/play/route was still advertised on the public roadmap.site/src/roadmap/roadmapData.tscarried{ label: "Play the adventures", href: "/play/", kind: "site" }on the W63–W64 chapter. W74b removed that route; the merged deployment serves only/,/roadmap/and the protecteddocs/subtree (site/scripts/verify-merge.mjs), so the link resolved to nothing. It now points atadventures.subzerodev.com— the same destination, and the same label, the landing page and site header already use — and the W61–W62 chapter gains an aside saying the route is retired, so the history reads as history.The link
kindunion gains"external", andLinksnow renders anything that is not"site"throughExternalLink, which is what gives it the new-tab affordance and the visually-hidden announcement.Two regression tests hold it. One asserts every
kind: "site"href matches a route the merge actually serves; one asserts the adventures link opens in a new tab at the external URL. Both were run against the old href and both fail on it.site/src/publication.browser.test.tsxis new. The landing page and the roadmap, rendered in a real Chromium tab at 390×844 and 1280×800 — the widths this site already committed to, in the retiredviewport.browser.test.tsxandvisual-baseline.browser.test.tsxand still invitest.browser.config.ts— asserting the four failures W105.5 names: horizontal overflow, clipped navigation, an unreachable primary link, and overlap. jsdom performs no layout, so none of these were assertable before.assertNotClippedis local to that file and carries its own passing/failing self-test, matching the rulesrc/test/browser/assertions.tsstates for itself.site/screenshots/holds eight reviewed renderings — landing, roadmap,/docs/and/docs/engine/vision, each at both widths — with the review's findings written down beside them. The two documentation pages are Docusaurus routes built from a container image; nothing in this package renders them, so for those the screenshots are the whole record.The absent commercial thesis is now a recorded deferral, not an absence.
design/90-decisions.md§2 states why the brief carries no customer, alternative, or monetization thesis (that layer isSubZeroDev.Platform, itself deferred), names the repository owner as the decision's owner, and gives the condition that revisits it. Regenerated intodocs/docs/engine/OPEN-QUESTIONS.md.Criteria
ConvertTo-HumanDocumentation.ps1run twice produces no diff; 18 generated engine pages plus compatibility pointers and the guide.Test-Documentation.ps1passes across 198 Markdown files, drift check included./play/link — is fixed.0.11.0reads as a candidate everywhere (stabilize toward 0.11.0, "Close the additive 0.11 stabilization programme"); three kinds and external content ownership are stated on all four.SessionStore,CampaignCatalogand MCP-tool declarations matchsrc/engine/src/core/session/types.tsandsrc/engine/src/mcp/server.tsexactly, all thirteen operations; the only unawaitedlistCampaigns()in the corpus is the// beforeline of 04-core's own migration guide, which exists to show the removed shape; no client-side example reads registry or kind state.Test-CompatibilitySweep.ps1passes against baselinev0.10.0, packed tarball and consumer smoke included.scrollWidth == clientWidthin every case), no clipped nav, no overlap, every primary link reachable — committed undersite/screenshots/, and gated for the two surfaces this package renders by the new browser test.Verified
All fifteen
# verification: truegates in.github/workflows/*.yml, run against this branch at9b9b6c7..claude/verify-report.jsonholds the structured record andtools/Test-VerifyReport.ps1returned Valid.Ran and passed (11)
Typecheck—npm --prefix src/engine run typecheck:tsc --noEmitplustsc --noEmit -p tsconfig.scripts.json, exit 0.Lint—npm --prefix src/engine run lint:eslint src scripts, exit 0. The determinism guard (Math.random, non-bit-stableMath.*,Date.now) reported nothing.Test—npm --prefix src/engine test: 97 test files passed (97), 1594 tests passed (1594), duration 9.38s.Pack package—npm pack --silentproducedthe-running-dev-game-engine-0.10.0.tgz, exit 0.Inspect tarball—tar -tzfover 332 entries: nopackage/src/, notsconfig*.json, no.test.*artifacts, andpackage/dist/present.Consumer smoke—consumer-smoke/{node_modules,package-lock.json,dist}cleared, thennpm 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.Parse-check PowerShell scripts— every*.ps1outsidenode_modulesparsed with[System.Management.Automation.Language.Parser]::ParseFile; 0 parse errors.Run Pester tests—Invoke-Pester -Path tools -PassThru: passed=324 failed=0 skipped=35 total=359.Validate Markdown links, terminology, and generated files—./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).Build and verify landing page—npm --prefix src/engine run build(exit 0), thennpm --prefix site run check(exit 0): prettierformat:check,oxlint,tsc -b, 17 unit tests, 23 browser tests in Chromium, production build withverify-build.mjs("Both built HTML entry points contain their required static metadata, and 3 bundle(s) are free of Node-only runtime references"), andverify-merge.mjs.Test the host—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.Ran and failed (0)
Did not run (4)
Build documentation—./docs.ps1is not present in this checkout. It is generated byInvoke-SetupDocsrather than committed (CLAUDE.md, Docs Site), so the production Docusaurus build — the only gate that resolves routes and heading anchors underonBrokenLinks: 'throw'— cannot be run here. The Verify Documentation Build check on this pull request is where that answer comes from. A docs image was built directly fromdocs/Dockerfileduring this slice to capture screenshots; that is a dev-server run, not this gate.Merge landing page into documentation build—npm --prefix site run mergeexited 1 withDocumentation output '...\artifacts\docs' has no protected 'docs' subtree.—artifacts/docsdoes 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 bysite/scripts/verify-merge.mjs, which passed inside the landing-page gate.Positive route and probe smoke— the step depends on the preceding Build the image step, which restoresSubZeroDev.Platform.Hostingfrom GitHub Packages using theREGISTRY_TOKENbuild secret. That credential is not available in this environment, sosubzerodev-gameengine-host:smokewas never built and no container could be started tocurl/,/roadmap/,/docs/,/health/liveand/health/readyagainst. Thehost-imageworkflow check on this pull request is where this answer comes from.Negative fixture -- corrupted artifact must fail to start—tools/host-smoke/Dockerfile.negative-fixturebuildsFROM subzerodev-gameengine-host:smoke, the image the gate above could not build for want of theREGISTRY_TOKENbuild secret. With no base image there is nothing to corrupt, so the must-exit-non-zero assertion was never made.The eleven that ran all passed; the documentation build and its dependent merge did not run because
docs.ps1is absent, and the two host-image smokes did not run because the registry credential is not available locally. Those four are answered only by CI on this pull request.Out of slice, noted not fixed
The roadmap's now/next partition is stale.
02 / NOWis the W90–W92 chapter and03 / NEXTis W93–W108, while the ledger marks W90 through W104 all[x]. W105.3's four agreements do not cover it, and correcting it means deciding what the newnextchapter is —roadmapData.tsthrows unless exactly one chapter is"now", andfutureActswould otherwise render an empty section. That is a/slicesor roadmap-content call, not a transcription fix.vitest.browser.config.tsnames a file that no longer exists — its comment cites "the per-file CDP session emulation inviewport.browser.test.tsx", removed by W74b.