docs(link): the site leg, and the nine keys no phase row could catch (Phase 9c, the last)

Phase 9c is done, and with it the Asset Bridge. §16's row 9c records what the leg
actually was, and §17.17 what it found.

The site is the only repo whose checks read the platform over the API instead of
describing it, so its starting state is a measurement rather than an opinion:

- `checkFacts` red in **ten** places — the protocol in all three independent reads,
  the bundle triple, and the three releases the cutover cut. `moduleApi` and the
  capability list did not move, which is §17.16's finding restated by a different
  mechanism.
- `checkReference` red in **nine nobody planned for** — every `Bridge.cfg` key phases
  5, 6 and 7 added, none of them ever mentioned on the public reference page. No phase
  row in this plan could have caught that: the rows name the repos a change edits, and
  this is a repo that only describes them.

Two corrections only prose could make: §17.15's "five repositories" had become a page
on the site that named `website` among them (protocol 8 touched four, and core's
absence is the interesting half), and the site said the bridge has two ways in when the
asset plane is a third — a paged bulk read on the reply path, which must not ride the
event stream for a structural reason rather than a throughput one.

The defect the phase found is a version pinned in a rig: `seedDemo.mjs` pinned protocol
**4** under a comment explaining a debt since paid. It reads `platform.json` now.

Screenshots retaken against the real shard (D42 holds): 1,095 portraits in 2.1 s,
67,496 names in 1.4 s, 313 item pictures in 0.8 s.

Site: RunicGateway/runicgateway.com#31.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
This commit is contained in:
2026-09-15 05:47:37 -05:00
parent 22a40ab0b0
commit bc5b43e1a4

View File

@@ -1703,7 +1703,7 @@ disagree, so a split bump means the next bundle silently fails to compose.
| 8 | **DONE 2026-09-14.** The admin surface (§12.2): `Admin → Client Files` — one page over all three planes, because they come off one client and change on one event. The cliloc pair had had no UI since phase 2, which on a bridge install meant `curl` was the only way to import 67,496 names. §14's "activity view" is the **last import's own summary** rather than a filtered feed, which kept the phase to one repo (org lead, 2026-09-14). The walk imported **1,095 portraits in 3.5 s, warmed 313 item pictures in 0.6 s and reloaded 67,496 cliloc rows in 1.7 s** against a real shard — and found **two deletions nobody could see before a screen put the numbers together**: the body import diffing its manifest against *every* family's rows, which staged all 313 item pictures for deletion, and an approved vanish that unlinked the sprite and kept the row, so the key came back for review forever. Both fixed here; `EXTRACTOR_VERSION` and the protocol are untouched | module-uo |
| 9a | **DONE 2026-09-14.** The docs pass and the acceptance walk (§17.13). `INTEGRATION.md` carried to protocol 8 — it had stopped at **6**, contradicted itself, and documented none of this plane; the operator-facing upgrade note; the index rows; the installer's `libgdiplus` `doctor` check and the kit's chapter note, both promised by §15 and built by no phase. The walk wiped every asset row and every imported sprite and went through it as a new operator: **1,095 portraits in 3.18 s, 67,496 names in 1.42 s, 313 item pictures in 1.38 s, the atlas over the bridge in ~2.0 s, and an Update with no drift answered in 0.99 s**. Two defects (§17.14), the larger of them **not ours and released** — Events phase 12b's `unique_id` has been failing every spawn-atlas import on every upgraded install since v1.2.0, which only a walk on a rig whose tables predate it could see | docs, module-uo, installer, integration-kit, servuo-plugins |
| 9b | **DONE 2026-09-14.** The `edge → main` cutover, and it is **five repos, not four**`installer`'s `doctor` check was on `edge` too, and `SHARD_PREREQS.md` on `main` had been describing it as if it shipped (§17.15). Order: the `module-uo` sync first, then `link` + `servuo-plugins` **together** because `bundle.yml` Gate 1 refuses a protocol-mismatched pair, then `website`, `module-uo`, `installer`. The sync found the one real conflict in the whole cutover: both branches had bumped `PARSER_VERSION` **4 → 5** for different reasons and main's 5 was **released**, so keeping it would have made phase 7's re-read unreachable on every existing install — the merged value is **6** (§10.4). Core's entire share of eight phases is a **deletion**: `MODULE_API` never moved, because `ctx.uploads` was already exposed. Published: sidecar **v2.3.0**, overlay **v1.3.0**, module **v1.3.0**, installer **v0.2.0**, bundle **2026.09.15 (protocol 8)**. `edge` stays standing in every repo | link, servuo-plugins, module-uo, website, installer |
| 9c | runicgateway.com: `platform.json`'s protocol 7 → 8 and the bundle triple, and any prose the bridge changed. Must follow 9b — `checkFacts.mjs` reads the protocol from `link`'s `main` | runicgateway.com |
| 9c | **DONE 2026-09-15.** runicgateway.com, and the last phase of the workstream. `checkFacts` was red in **ten** places the moment 9b landed (the protocol in all three reads, the bundle triple, three releases) and `checkReference` in **nine nobody had planned for** the `Bridge.cfg` keys phases 5, 6 and 7 added, which that check calls *lying by omission* (§17.17). The site gained a page for **Admin → Client files**, the third way into the bridge, `libgdiplus` on the requirements table, and the failure mode a bestiary of text now is. The atlas and marketplace screenshots were **retaken against a real shard** because both now carry artwork, and the new admin screen with them. One defect found on the way: the site's own screenshot rig pinned **protocol 4** | runicgateway.com |
Phase 0 exists because §4 chose to call code that can take the shard down if it is wrong, and the
honest way to hold that choice is to try to break it on purpose — in the real host process, against
@@ -1990,3 +1990,45 @@ in the document.
the bundle actually moved is.** A green release run does not imply a recomposed bundle, and the
gap between them is invisible to everything except a direct read of `current.json` (through
`/contents/`, never `/raw/`, which is CDN-cached for six hours).
17. **What the site leg found, and the one thing that was still lying — 2026-09-15, phase 9c.**
The site is the only repo whose checks read the platform over the API rather than describing
it, so 9c is the one phase whose starting state is a measurement. It was red in two places:
- **`checkFacts`, ten failures, all expected.** Protocol 7 → 8 in three independent reads, the
bundle triple, and the three releases the cutover cut. `moduleApi` and the capability list
did not move, which is the cutover's own finding restated by a different mechanism: core's
whole share of eight phases was a deletion.
- **`checkReference`, nine failures nobody planned for.** `AssetsEnabled`, `AssetBatchBytes`,
`AssetBodyBatch`, `AssetFetchKeys`, `AssetScanMs`, `AssetPlayerDirection`,
`AssetCreatureDirection`, `TreeEnabled` and `TreeChunkBytes` reached `Bridge.cfg` across
phases 5, 6 and 7 and the public reference page never mentioned one of them. **Nothing in
this plan's own phase rows would ever have caught that** — the rows name the repos a change
edits, and this was a repo that only *describes* them. The check that catches it is the one
that compares in both directions; the direction that earned its keep here is the one asking
what the source has that the page does not.
Two corrections the checks could not make, because both are prose:
- **§17.15's "five repositories" had already become a page on the site**, which named
`website` among them and explained why core was reached. For protocol 8 the honest table has
four rows and core is absent — and the absence is the more interesting half, because what
the asset plane needed (somewhere to put a picture) core already offered every module.
- **The site said the bridge has "two ways in".** It has three. The asset plane is neither an
event nor a point-in-time read: it is a paged bulk read on the reply path, one request in
flight, and the reason it must not ride the event stream is structural rather than about
throughput — `app.rs` persists every event and broadcasts it to every client, which is right
for "a house went IDOC" and wrong for hundreds of megabytes of artwork.
**The defect the phase found is a version pinned in a rig.** `seedDemo.mjs` — the script that
stands up the deployment the screenshots are taken of — pinned **protocol 4**, under a careful
comment explaining a `module-uo` debt that phases since have paid. A literal written down with
a good reason outlives the reason, and nothing checked it because the rig is not the product.
Its default now reads `platform.json`, which `checkFacts` verifies against `link`'s `main`, so
the number cannot drift again without the build going red.
**The screenshots were retaken against the real thing** (D42 holds: no mock-ups). On the demo
deployment, against the running shard and sidecar: **1,095 portraits in 2.1 s, 67,496 names in
1.4 s, 313 item pictures in 0.8 s**, all matching the 9a walk on a different database. The
atlas shot needed its scroll offset moved 36 px, because a row with a portrait in it is taller
than a row of text — a screenshot's framing is a fact about the product, and it moved.