docs(link): the cutover, and the counter two branches bumped at once (Phase 9b, 5 of 5) #245

Merged
whitlocktech merged 2 commits from docs/asset-bridge-p9b into main 2026-09-15 10:05:51 +00:00
Member

Step 5 of 5, and last, of the Asset Bridge edge → main cutover. Held until the code repos had
merged and the bundle had actually recomposed, so the record carries real numbers rather than
intentions.

What the cutover published

Component Release Protocol
link sidecar v2.3.0 8
servuo-plugins overlay v1.3.0 8
module-uo v1.3.0
installer v0.2.0
bundle 2026.09.15 8

edge stays standing in every repo. Merged: Module-uo#43 (the sync), link#44 +
servuo-plugins#36 together, Module-uo#44, installer#26; website#202 is the converter
deletion and affects no release.

Three things this records that were not in §16's row

1. PARSER_VERSION had to become 6, and the reason generalises. §10.4 wrote phase 7's
canonical-read-order bump as 4 → 5. main had meanwhile bumped 4 → 5 for the UniqueId fix and
released it as v1.2.2. Same number, different derivation. An install that imported under v1.2.2
stores 5, so a phase-7 build also declaring 5 is read as current by currentParser and never
re-reads — the exact failure the constant exists to prevent, arrived at through a merge instead of
through forgetting to bump. Two long-lived branches bumping one counter for different reasons is a
defect the counter cannot see; only the merge can.
Corrected in §7, §10.4, §16 and
SPAWN_ATLAS.md, with both meanings kept rather than collapsed.

2. The cutover was five repos, not four. installer's edge carried 9a's libgdiplus
doctor check, and SHARD_PREREQS.md on main had been describing that check as existing since
phase 1 — a four-repo cutover leaves an operator-facing doc naming a check in no released binary.

3. The bundle did not recompose on its own, and the re-verify is what caught it. Two compose
runs failed for two unrelated reasons that only their logs separate:

  • Run 111 was Gate 1 working. The overlay released nine minutes ahead of the sidecar, and the
    gate refused the pair in exactly the terms the design predicted: "sidecar v2.2.0 speaks 7,
    overlay v1.3.0 declares 8. Refusing to publish a bundle that would install a shard whose events
    the sidecar rejects with 409."
    That is the concrete argument for landing the pair together.
  • Run 114 was the runner, after both releases were out: Set up job 14m33s, every later
    step failing at 0s, no log blob stored. Same signature as the 2026-09-09 outage.

A failed compose is silent from outside — the bundle keeps its previous value, so operators keep
installing the previous protocol while main carries the new one, and nothing says so. Dispatching
bundle.yml recovered it within the minute. Recorded as §17.16, with the lesson stated plainly:
publishing the releases is not the last step, verifying the bundle moved is — and read
current.json through /contents/, never /raw/, which is CDN-cached for six hours.

Changes

  • link/v8.md — §7 and §10.4's PARSER_VERSION; §16's 9b row marked DONE with the releases;
    §17.15 (the cutover's four org-lead decisions) and §17.16 (what it published, and the bundle)
  • website/SPAWN_ATLAS.md — the parser version is 6, and why the renumber was the mechanism
    working rather than bookkeeping

What remains

9c — runicgateway.com's platform.json: protocol 7 → 8 and the bundle triple. It is unblocked
now: checkFacts.mjs reads the protocol from link's main, which carries 8 as of this cutover,
so the site is currently red by construction.

AI disclosure

Authored with Claude Code (Claude Opus 5). Commits carry the Co-Authored-By trailer.

🤖 Generated with Claude Code

https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4

Step **5 of 5**, and last, of the Asset Bridge `edge → main` cutover. Held until the code repos had merged and the bundle had actually recomposed, so the record carries real numbers rather than intentions. ## What the cutover published | Component | Release | Protocol | |---|---|---| | `link` sidecar | **v2.3.0** | 8 | | `servuo-plugins` overlay | **v1.3.0** | 8 | | `module-uo` | **v1.3.0** | — | | `installer` | **v0.2.0** | — | | bundle | **2026.09.15** | 8 | `edge` stays standing in every repo. Merged: `Module-uo#43` (the sync), `link#44` + `servuo-plugins#36` together, `Module-uo#44`, `installer#26`; `website#202` is the converter deletion and affects no release. ## Three things this records that were not in §16's row **1. `PARSER_VERSION` had to become 6, and the reason generalises.** §10.4 wrote phase 7's canonical-read-order bump as 4 → 5. `main` had meanwhile bumped 4 → 5 for the `UniqueId` fix and **released it as v1.2.2**. Same number, different derivation. An install that imported under v1.2.2 stores 5, so a phase-7 build also declaring 5 is read as current by `currentParser` and never re-reads — the exact failure the constant exists to prevent, arrived at through a merge instead of through forgetting to bump. **Two long-lived branches bumping one counter for different reasons is a defect the counter cannot see; only the merge can.** Corrected in §7, §10.4, §16 and `SPAWN_ATLAS.md`, with both meanings kept rather than collapsed. **2. The cutover was five repos, not four.** `installer`'s `edge` carried 9a's `libgdiplus` `doctor` check, and `SHARD_PREREQS.md` on `main` had been describing that check as existing since phase 1 — a four-repo cutover leaves an operator-facing doc naming a check in no released binary. **3. The bundle did not recompose on its own**, and the re-verify is what caught it. Two compose runs failed for two unrelated reasons that only their logs separate: - **Run 111 was Gate 1 working.** The overlay released nine minutes ahead of the sidecar, and the gate refused the pair in exactly the terms the design predicted: *"sidecar v2.2.0 speaks 7, overlay v1.3.0 declares 8. Refusing to publish a bundle that would install a shard whose events the sidecar rejects with 409."* That is the concrete argument for landing the pair together. - **Run 114 was the runner**, after both releases were out: `Set up job` **14m33s**, every later step failing at **0s**, no log blob stored. Same signature as the 2026-09-09 outage. A failed compose is **silent from outside** — the bundle keeps its previous value, so operators keep installing the previous protocol while `main` carries the new one, and nothing says so. Dispatching `bundle.yml` recovered it within the minute. Recorded as §17.16, with the lesson stated plainly: publishing the releases is not the last step, verifying the bundle moved is — and read `current.json` through `/contents/`, never `/raw/`, which is CDN-cached for six hours. ## Changes - `link/v8.md` — §7 and §10.4's `PARSER_VERSION`; §16's 9b row marked DONE with the releases; §17.15 (the cutover's four org-lead decisions) and §17.16 (what it published, and the bundle) - `website/SPAWN_ATLAS.md` — the parser version is **6**, and why the renumber was the mechanism working rather than bookkeeping ## What remains **9c** — runicgateway.com's `platform.json`: protocol 7 → 8 and the bundle triple. It is unblocked now: `checkFacts.mjs` reads the protocol from `link`'s `main`, which carries 8 as of this cutover, so the site is currently red by construction. ## AI disclosure Authored with Claude Code (Claude Opus 5). Commits carry the `Co-Authored-By` trailer. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
wtclaude added 2 commits 2026-09-15 00:14:35 +00:00
Records the Asset Bridge `edge -> main` cutover: §16's 9b row, §17.15's four
org-lead decisions, and the `PARSER_VERSION` correction those forced through
§7, §10.4 and `SPAWN_ATLAS.md`.

## The number had to move, and the reason generalises

§10.4 wrote phase 7's canonical-read-order bump as `PARSER_VERSION` 4 -> 5.
`main` had meanwhile bumped 4 -> 5 for the `UniqueId` fix and RELEASED it as
v1.2.2. Same number, different derivation. An install that imported under
v1.2.2 stores 5, so a phase-7 build also declaring 5 is read as current by
`currentParser` and never re-reads -- the exact failure the constant exists to
prevent, reached through a merge instead of through forgetting to bump.

Two long-lived branches bumping one counter for different reasons is a defect
the counter cannot see; only the merge can. The docs now carry both meanings --
5 as main's released one, 6 as phase 7's -- rather than collapsing them.

## The cutover is five repos

`installer`'s `edge` carried 9a's `libgdiplus` `doctor` check, and
`SHARD_PREREQS.md` on `main` had been describing that check as existing since
phase 1. §16's 9b row named four repos and would have left an operator-facing
doc naming a check in no released binary.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
Adds §17.16 — what the five-repo cutover published, and the one step that
needed a hand.

sidecar v2.3.0, overlay v1.3.0, module-uo v1.3.0, installer v0.2.0, bundle
2026.09.15, all at protocol 8. `edge` stays standing everywhere.

## The bundle did not recompose on its own

Two compose runs failed for two unrelated reasons and only their logs separate
them. Run 111 was **Gate 1 working**, refusing `sidecar v2.2.0 speaks 7,
overlay v1.3.0 declares 8` in the nine-minute window between the two releases --
the concrete case for landing the pair together. Run 114 was the **runner**:
`Set up job` 14m33s, every later step failing at 0s, no log blob stored.

A failed compose is silent from outside. The bundle keeps its previous value,
so operators keep installing the previous protocol while `main` carries the new
one, and nothing says so. Dispatching bundle.yml recovered it within a minute.

The lesson recorded for the next cutover: publishing the releases is not the
last step, verifying the bundle moved is -- and read `current.json` through
`/contents/`, never `/raw/`, which is CDN-cached for six hours.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
whitlocktech merged commit 22a40ab0b0 into main 2026-09-15 10:05:51 +00:00
whitlocktech deleted branch docs/asset-bridge-p9b 2026-09-15 10:05:52 +00:00
Sign in to join this conversation.
No description provided.