woodstar runbook: D3 complete at e7406bb — atproto-did parity proven, edge-hop WS 101, precedence verified
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 file changed,
+25
−5
docs/superpowers/plans/2026-08-16-woodstar-cutover-runbook.md+25 −5
diff --git a/docs/superpowers/plans/2026-08-16-woodstar-cutover-runbook.md b/docs/superpowers/plans/2026-08-16-woodstar-cutover-runbook.md| index 4b40aa7d1..63681bbb4 100644 |
| --- a/docs/superpowers/plans/2026-08-16-woodstar-cutover-runbook.md |
| +++ b/docs/superpowers/plans/2026-08-16-woodstar-cutover-runbook.md |
| @@ -256,16 +256,36 @@ build sha row: #77 removed the handler from apbridge; sha moved to |
| `e7406bb`, re-shipped + re-adopted). Rehearsal MUST re-run at |
| `e7406bb` and show atproto-did 200 before D4. |
| -- [ ] **D3.1** server-side CopyObject of the old bucket's backups into |
| +**SECOND RUN 2026-08-17 (at `e7406bb`) — ALL GREEN, D3 COMPLETE:** |
| +teardown + fresh restore 10 s, integrity `ok` × 3, freeze-to-serving |
| +12 s again. **atproto-did → 200 `did:plc:f53efijrjuwujt7ppnp5gzf3` — |
| +the IDENTICAL DID live prod serves**; www 301 URI-preserved |
| +(`/x?y=1` carried); paul 302; `/proc/<pid>/exe` confirmed |
| +`/opt/carlos/versions/e7406bb/bdm/woodstar-apbridge`. **Edge-hop |
| +probes via `rehearsal.bdm.oncarlos.com`** (route since deleted): feed |
| +200 HTML, real media file 200, search 200, SSE endpoint answering |
| +(401 auth-gate through two hops), **WebSocket `/subscribe` 101 |
| +THROUGH THE EDGE**, webfinger 200 `application/activity+json`. |
| +**Catch-all + precedence proven through the live edge**: |
| +`paul.woodstar.app --resolve` handshakes on the wildcard cert and |
| +routes to the prod relay upstream (502 until D4 starts units, as |
| +expected); Host `status.woodstar.app` returns the STATUS SITE's HTML, |
| +not the SPA — exact-host beats wildcard. Deferred to D4.5: woodstar's |
| +WebKit `console-check.mjs` (needs node+browser, devbox tooling) — |
| +covered by Paul's browser pass. Cutover window estimate from two |
| +rehearsals: **~15 s restore+start** + backup-freeze overhead (D4.1 |
| +dominates: final media pass + 30 s WAL wait). |
| + |
| +- [x] **D3.1** server-side CopyObject of the old bucket's backups into |
| `s3://carlos-data-ie-271376211898/woodstar-rehearsal/`. |
| -- [ ] **D3.2** on the flagship: `litestream restore` the three DBs from |
| +- [x] **D3.2** on the flagship: `litestream restore` the three DBs from |
| the rehearsal prefix + media sync + seed-file copy into |
| `/data/woodstar-rehearsal`; `PRAGMA integrity_check` on all three. |
| -- [ ] **D3.3** transient units (systemd-run, rehearsal ports 8461-8466, |
| +- [x] **D3.3** transient units (systemd-run, rehearsal ports 8461-8466, |
| same flags re-pathed); apbridge with `-bridgy` and `-bsky-api` |
| pointed at throwaway values so rehearsal never dials the real |
| federation; an sslip.io rehearsal route through the edge. |
| -- [ ] **D3.4 — the fan-out path check through the edge** (degraded- |
| +- [x] **D3.4 — the fan-out path check through the edge** (degraded- |
| not-broken is the named failure shape; never skip): feed renders |
| restored posts; `/media/*` images load; `/img/*` unfurl card images |
| load (the leg the spec almost lost); `/api/search` returns; |
| @@ -273,7 +293,7 @@ build sha row: #77 removed the handler from apbridge; sha moved to |
| TWO proxied hops edge→relay→notify — verified, not assumed); |
| `/unfurl` answers; webfinger + `/users/*` answer from the bridge; |
| woodstar's own WebKit `console-check.mjs` passes. |
| -- [ ] **D3.5** verify exact-host-beats-wildcard precedence with the |
| +- [x] **D3.5** verify exact-host-beats-wildcard precedence with the |
| rehearsal routes; record freeze-to-serving time (the cutover window |
| estimate); tear down units, data, routes. |