docs(builder): phase 8 — modules, architecture and reference #12

Merged
whitlocktech merged 1 commits from feat/phase-8-docs into main 2026-08-24 17:33:24 +00:00
Member

Twenty pages completing the tree §10 planned — Modules (8), Architecture (5), Reference (7). With phase 7's twenty, the documentation is now whole.

Stacked on #11. This branch is based on fix/quickstart-drift-and-installer-note, because phase 8 cannot go green without its platform.json bump (checkFacts fails on installer v0.1.1 otherwise). Merge #11 first and those two commits leave this diff.

The four decisions (D38–D41)

Taken before anything was written; recorded in PLAN.md §10, How phase 8 built the builder and reference docs. The count of record is now forty-one.

# Decision
D38 One PR for all twenty pages, as D34 did — the three sections cross-reference each other too heavily to split
D39 Reference enumerates the NAMES, and checks every one of them
D40 The docs link to /architecture/'s drawn diagrams rather than importing them
D41 plannedSidebar stops being a checklist and becomes a checked invariant

D39, and the line it draws

§1 forbids re-specifying a contract, and a Reference section is exactly where that rule is most tempting to break. The line: names are on the page, semantics are not. Every environment variable, config key, installer command, visibility rung and canonical document is listed with one terse line saying what it is for. Shapes, defaults that matter, interactions and every "why" stay in the canonical document.

That is only safe because the names are checked. scripts/checkReference.mjs compares six enumerations against the repositories that own them — website, link, installer, servuo-plugins, Module-uo, docs — over the Gitea API, never from a working tree, as set comparisons in both directions.

The second direction is the one that earns its keep: a reference page does not usually rot by describing something that vanished — it rots by quietly not mentioning the three things added since it was written.

The alternative on the table was strict summary-plus-link with nothing enumerated. It needs no machinery and cannot rot, but a Reference section that cannot answer "what variables are there?" without a click-through is a link farm — and the machinery turned out to be one script.

Descriptions are deliberately not checked, and the script says so. Nothing can know whether a one-line summary is still true; keeping them short enough to re-read is the mitigation, not a check.

The check went green first try, so I broke it seven times

That is the least trustworthy possible outcome, and this repo has been bitten by it twice already (the load-vs-transform guard; phase 7's mark). Every mutation was caught:

caught      env var renamed (stale name listed)
caught      env var omitted (lying by omission)
caught      Bridge.cfg key renamed
caught      sidecar.toml key renamed
caught      installer command renamed
caught      visibility ladder REORDERED (same members)
caught      canonical document moved

The ladder case is the one worth keeping. It is a security boundary, and a set comparison alone would have passed a reordering — so it is compared as an ordered sequence. A reader reasoning about "staff and above" depends on the rungs being in the right order.

What the phase found before any page shipped

  1. plannedSidebar had already drifted. Phase 7 added the Content page under D37 and never updated the planned list. Nothing failed, because nothing read it — which is the entire argument for D41. Reproduced by deleting the entry again and watching the new check catch it.
  2. PLAN.md's page count was wrong, and had been since §10 was written: "roughly 38 pages — 37 planned", for a tree that is forty (7 + 13 + 8 + 5 + 7).
  3. module.json's mounts and the SPA's paths are different mechanisms, and no single document said so plainly. module-uo declares admin: ["/shard", "/uo-link"] while its screen lives at /admin/uo/linkAPI routes are deliberately not namespaced; SPA routes are. That is exactly the distinction the installer got wrong in v0.1.0, and it now has a named home on The module system, with the "it redirects to the dashboard so it looks like it worked" failure mode spelled out.

D40, briefly

/architecture/'s three diagrams are Astro components carrying marketing chrome and depending on src/styles/diagram.css, which Starlight does not load. Importing them would couple the two layouts for one page's benefit. The docs use text diagrams in code blocks — which also paste into an issue — and link out to the drawn versions.

Verification

npm run verify green end to end:

  • 40 pages across 5 groups agree with plannedSidebar
  • 2,390 internal links resolve (was 890), 123 repository links point at a branch
  • 19 facts agree with their authorities
  • 59 quickstart checks against website main
  • 22 reference enumerations against their sources
  • astro check 0 errors / 0 warnings, 36 tests pass

check:sidebar runs early in CI (no token, no build, fails fast); check:reference runs at the end with the other networked checks, using the same REGISTRY_TOKEN mapping.

Note

Everything in these twenty pages is a summary that links out, and Canonical documents says so in as many words: where this site and docs disagree, docs is right and this site has a bug. If you spot one, it means a check is missing.


AI-assisted: written with Claude Code (Opus 5).

🤖 Generated with Claude Code

Twenty pages completing the tree §10 planned — **Modules (8)**, **Architecture (5)**, **Reference (7)**. With phase 7's twenty, the documentation is now whole. > **Stacked on #11.** This branch is based on `fix/quickstart-drift-and-installer-note`, because phase 8 cannot go green without its `platform.json` bump (`checkFacts` fails on installer v0.1.1 otherwise). **Merge #11 first** and those two commits leave this diff. ## The four decisions (D38–D41) Taken before anything was written; recorded in PLAN.md §10, *How phase 8 built the builder and reference docs*. The count of record is now **forty-one**. | # | Decision | |---|---| | **D38** | One PR for all twenty pages, as D34 did — the three sections cross-reference each other too heavily to split | | **D39** | **Reference enumerates the NAMES, and checks every one of them** | | **D40** | The docs **link to** `/architecture/`'s drawn diagrams rather than importing them | | **D41** | `plannedSidebar` stops being a checklist and becomes a **checked invariant** | ## D39, and the line it draws §1 forbids re-specifying a contract, and a Reference section is exactly where that rule is most tempting to break. The line: **names are on the page, semantics are not.** Every environment variable, config key, installer command, visibility rung and canonical document is listed with one terse line saying what it is *for*. Shapes, defaults that matter, interactions and every "why" stay in the canonical document. That is only safe because the names are checked. `scripts/checkReference.mjs` compares six enumerations against the repositories that own them — `website`, `link`, `installer`, `servuo-plugins`, `Module-uo`, `docs` — over the Gitea API, never from a working tree, as **set comparisons in both directions**. The second direction is the one that earns its keep: *a reference page does not usually rot by describing something that vanished — it rots by quietly not mentioning the three things added since it was written.* The alternative on the table was strict summary-plus-link with nothing enumerated. It needs no machinery and cannot rot, but a Reference section that cannot answer "what variables are there?" without a click-through is a link farm — and the machinery turned out to be one script. **Descriptions are deliberately not checked**, and the script says so. Nothing can know whether a one-line summary is still true; keeping them short enough to re-read is the mitigation, not a check. ## The check went green first try, so I broke it seven times That is the least trustworthy possible outcome, and this repo has been bitten by it twice already (the `load`-vs-`transform` guard; phase 7's `mark`). Every mutation was caught: ``` caught env var renamed (stale name listed) caught env var omitted (lying by omission) caught Bridge.cfg key renamed caught sidecar.toml key renamed caught installer command renamed caught visibility ladder REORDERED (same members) caught canonical document moved ``` **The ladder case is the one worth keeping.** It is a security boundary, and a set comparison alone would have passed a reordering — so it is compared as an ordered sequence. A reader reasoning about "staff and above" depends on the rungs being in the right order. ## What the phase found before any page shipped 1. **`plannedSidebar` had already drifted.** Phase 7 added the *Content* page under D37 and never updated the planned list. **Nothing failed, because nothing read it** — which is the entire argument for D41. Reproduced by deleting the entry again and watching the new check catch it. 2. **PLAN.md's page count was wrong**, and had been since §10 was written: "roughly 38 pages — 37 planned", for a tree that is **forty** (7 + 13 + 8 + 5 + 7). 3. **`module.json`'s `mounts` and the SPA's paths are different mechanisms**, and no single document said so plainly. `module-uo` declares `admin: ["/shard", "/uo-link"]` while its screen lives at `/admin/uo/link` — **API routes are deliberately not namespaced; SPA routes are.** That is exactly the distinction the installer got wrong in v0.1.0, and it now has a named home on *The module system*, with the "it redirects to the dashboard so it looks like it worked" failure mode spelled out. ## D40, briefly `/architecture/`'s three diagrams are Astro components carrying marketing chrome and depending on `src/styles/diagram.css`, which Starlight does not load. Importing them would couple the two layouts for one page's benefit. The docs use text diagrams in code blocks — which also paste into an issue — and link out to the drawn versions. ## Verification `npm run verify` green end to end: - **40 pages across 5 groups** agree with `plannedSidebar` - **2,390** internal links resolve (was 890), **123** repository links point at a branch - **19** facts agree with their authorities - **59** quickstart checks against `website main` - **22** reference enumerations against their sources - `astro check` 0 errors / 0 warnings, **36** tests pass `check:sidebar` runs early in CI (no token, no build, fails fast); `check:reference` runs at the end with the other networked checks, using the same `REGISTRY_TOKEN` mapping. ## Note Everything in these twenty pages is a summary that links out, and *Canonical documents* says so in as many words: **where this site and `docs` disagree, `docs` is right and this site has a bug.** If you spot one, it means a check is missing. --- AI-assisted: written with Claude Code (Opus 5). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
wtclaude added 3 commits 2026-08-24 17:18:10 +00:00
fix(docs): clear the quickstart drift the upstream fixes caused
All checks were successful
PR checks / checks (pull_request) Successful in 1m1s
a993b872ac
The three defects phase 7 found are fixed and merged: website#163
(SECRET_ENC_KEY missing from the root .env.example, plus BOT_INTERNAL_KEY in
the README's "set at least" list) and installer#22 + docs#174 (the handoff
printing /admin/shard).

website#163 turned checkQuickstart red here, which is precisely what the
declaration was built to do -- it fails the moment a declared key appears
upstream, so the note describing the omission cannot outlive the defect. The
SECRET_ENC_KEY entry is deleted and notInUpstreamEnvExample is now empty; the
export stays so the next divergence gets an entry rather than passing quietly.

The stale-path Aside on Connect a game server is pinned to v0.1.0 rather than
calling the installer permanently wrong, and now says WHY the old path is worse
than a 404: the SPA has no route for it, so it redirects to the dashboard and
the link looks like it worked.

v0.1.0 is still the current download, and not only because releases lag. The
release run for installer#22 built every artifact and pushed tag v0.1.1, then
took a 500 creating the release -- so the tag is orphaned and no binaries were
published. Raised on installer; nothing is worked around here.

This also recovers 084ee0b, which was pushed to feat/phase-7-docs after PR #10
had already merged f499f2b, and so never reached main.

Co-Authored-By: Claude <noreply@anthropic.com>
fix(facts): installer v0.1.1 is released, so the note names a version
All checks were successful
PR checks / checks (pull_request) Successful in 9m22s
e8cb6061fe
Recovering installer's orphan tag published v0.1.1, which moved the platform
under this branch and turned checkFacts red -- the check working exactly as it
should, since a version this site quotes had changed.

  FAIL  release installer
        platform.json says : v0.1.0
        installer releases/latest says : v0.1.1

The 500 that orphaned the tag was a race with the tag push one second earlier,
not a structural failure: re-running the workflow took the built-in orphan-tag
recovery path and published all four assets unchanged.

So the stale-path Aside stops saying "v0.1.0 is still the current download",
which is no longer true, and says the durable thing instead -- v0.1.0 prints
the old path, v0.1.1 prints the real one -- which stays correct however many
releases follow. platform.json and the PLAN.md version table move to v0.1.1,
and the phase 7 findings record the pipeline defect as a fourth finding.

Co-Authored-By: Claude <noreply@anthropic.com>
docs(builder): phase 8 — modules, architecture and reference
All checks were successful
PR checks / checks (pull_request) Successful in 1m13s
d89ce06bb8
Twenty pages completing the tree section 10 planned: Modules (8), Architecture
(5) and Reference (7). Four decisions, D38-D41, recorded in PLAN.md section 10.

D39 is the one that shaped the phase. Section 1 forbids re-specifying a
contract, and a Reference section is exactly where that rule is most tempting to
break, so the line is drawn at names: every environment variable, config key,
installer command, visibility rung and canonical document is listed with one
terse line saying what it is FOR, while shapes, semantics and every "why" stay
in the canonical document.

That is only safe because the names are checked. checkReference.mjs compares six
enumerations against the repositories that own them, over the Gitea API, as set
comparisons in BOTH directions -- and the second direction is the one that earns
its keep, because a reference page does not usually rot by describing something
that vanished, it rots by quietly not mentioning what was added since.

The check went green on its first run, which is the least trustworthy possible
outcome, so it was verified by breaking it: seven mutations, all caught. The one
worth keeping is the visibility ladder REORDERED with its membership unchanged
-- it is a security boundary, and a set comparison alone would have passed it.

D41 turns plannedSidebar from a checklist into a checked invariant, and finding
out why was the phase's first defect: it had already drifted, because phase 7
added the Content page under D37 and never updated the list. Nothing failed,
because nothing read it. checkSidebar.mjs now asserts the two trees agree on
groups, labels and order -- order because the order of Getting started IS the
installation path.

Two more things the writing found. PLAN.md's page count was wrong and had been
since section 10 was written ("roughly 38, 37 planned" for a tree of forty).
And module.json's `mounts` and the SPA's paths are different mechanisms that no
single document stated plainly -- module-uo declares admin: ["/shard",
"/uo-link"] while its screen lives at /admin/uo/link, because API routes are
deliberately NOT namespaced while SPA routes are. That is precisely the
distinction the installer got wrong in v0.1.0, and it now has a named home.

D40: the docs link to /architecture/'s drawn diagrams rather than importing
them. Those components carry marketing chrome and depend on diagram.css, which
Starlight does not load; the docs use text diagrams, which paste into an issue.

npm run verify green: 40 pages across 5 groups agree with plannedSidebar, 2390
internal links resolve, 123 repository links point at a branch, 19 facts, 59
quickstart checks, 22 reference enumerations, astro check 0 errors, 36 tests.

Co-Authored-By: Claude <noreply@anthropic.com>
whitlocktech approved these changes 2026-08-24 17:33:15 +00:00
whitlocktech merged commit 31d914ba44 into main 2026-08-24 17:33:24 +00:00
whitlocktech deleted branch feat/phase-8-docs 2026-08-24 17:33:25 +00:00
Sign in to join this conversation.
No description provided.