carlos / platform Public

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>
Paul Campbell 0ad4e9fa3edda6cb7ad7b96cc0021244b12d162f parent 9382ee9
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.