zdd-4-release-side
Zero-downtime deploys, plan 4 (release side). Spec: docs/superpowers/specs/2026-10-07-zero-downtime-deploys-design.md (rev 17) §4.2, §7.9, §8.5. Plan: docs/superpowers/plans/2026-10-07-zero-downtime-deploys-4-release-side.md.
Additive: Manifest.Swap, lossless staged siblings, CanonicalDemand, the pin set, PinSource, and the generations file (/data/zdd/generations.json, guarded by a generations.seq intent file: seq + complete, entries by version and by resolved path). Nothing reads swap until plan 5.
Behaviour changes the spec mandates: workers exec their staged build by path and recycle (crash, maxrun) onto the captured build; a recycle refused by the digest check stays refused (worker down, reported); the activator publishes each worker's build to the generations file BEFORE its exec, whatever CARLOSSWAP says, and a failed publish prevents the spawn (plan 5 extends this writer); root's restage check and the hourly version sweep both read that file and do nothing destructive on an incomplete set; pins compare fully resolved real paths; a worker's /v1/ready report no longer writes registry Version; SidecarAdoptable adopts native sidecars (stage, repoint, stamp, no restart); a reused staged copy is hashed and restaged only when nothing refers to it (the held stage never restages). Recycle-triggered converges share the sweep's converge budget and never run when a scheduler hook is set.
Review: Astra r4 ACCEPT WITH FIXES (docs/superpowers/plans/CODEX-FINDINGS-ZDD-IMPL-4*.md). N5 resolved by ruling R22: a refused publish reaches members through the existing "wake failed: " passthrough, like every internal wake error; plan 6's copy review adds a dedicated member-safe reason. Accepted costs: a full /data skips the version sweep until a publish succeeds; the root/agent check-then-mutate race needs a shared lock (pre-existing).
Known display effect: carlos sidecars ls RUNNING VERSION shows root's install stamp until plan 6 moves it to ServingVersion.
Discussions
- No discussions on this branch yet.
Tasks
- No tasks yet.
Activity
- claude agent, operated by paul@keymail.dev pushed a79c53bcb Merge remote-tracking branch 'origin/main' into zdd-4-release-side
- claude agent, operated by paul@keymail.dev pushed aef7152b6 zdd-4: Astra's fourth scoped review (ACCEPT WITH FIXES) of the third fix wave
- claude agent, operated by paul@keymail.dev pushed c0a23eab0 zdd-4 third fix wave: the R17 publication tests assert R19's publish-before-exec
- claude agent, operated by paul@keymail.dev pushed 85711f5ed zdd-4 third fix wave: a worker's build is published by version and path before its exec, or it is not spawned (F1(b)(c)(d), R19 items 2, 3)
- claude agent, operated by paul@keymail.dev pushed c5ff36696 zdd-4 third fix wave: the hourly version sweep pins what the generations file names (F1(a), R19 item 1)
- claude agent, operated by paul@keymail.dev pushed e3b4f58c9 zdd-4 third fix wave: pins and the restage check compare fully resolved real paths (N4, R19 item 5)
- claude agent, operated by paul@keymail.dev pushed 5a2d35244 zdd-4 third fix wave: the generations file is published under a sequence intent and names builds by path (R19 items 2, 4)
- claude agent, operated by paul@keymail.dev pushed d9a1f684a zdd-4: Astra's third scoped review (REJECT) of the second fix wave
- claude agent, operated by paul@keymail.dev pushed 61b4438cd zdd-4 second fix wave: a relative link hop resolves against its link's real parent, as the OS does (N3, R17)
- claude agent, operated by paul@keymail.dev pushed 7af35424c zdd-4 second fix wave: a converge by recycle spends the sweep's converge budget and defers to the scheduler (N2, R17)
- claude agent, operated by paul@keymail.dev pushed 889f68685 zdd-4 second fix wave: the activator publishes every worker's captured build in the generations file (N1, R17)
- claude agent, operated by paul@keymail.dev pushed 7ea7df015 zdd-4 second fix wave: a recycle refused for a changed copy stays refused (N1, R17 revert of R12)
- claude agent, operated by paul@keymail.dev pushed e77463df1 zdd-4: Astra's final review (REJECT) and scoped re-review (REJECT) of the implementation
- claude agent, operated by paul@keymail.dev pushed 7b239870f zdd-4 final review: recycles keep the drift clock and converge past ConvergeGrace (F2, R13)
- claude agent, operated by paul@keymail.dev pushed 74a43e4bc zdd-4 final review: a recycle refused for a changed copy drops the captured build (F1, R12)
- claude agent, operated by paul@keymail.dev pushed f2037fa45 zdd-4 final review: live link chains are followed to their end (F3, R14), ensureStaged's doc stops promising a restage (R15)
- claude agent, operated by paul@keymail.dev pushed acc6de7ae zdd-4 task 9: crash and max_run recycle the captured serving build; a worker's report is display-only
- claude agent, operated by paul@keymail.dev pushed b880fbb7b zdd-4 task 8: workers exec a staged build by path and report what they exec'd
- claude agent, operated by paul@keymail.dev pushed fdec1bf42 zdd-4 task 7: SidecarAdoptable, a second admission predicate; Adoptable not widened
- claude agent, operated by paul@keymail.dev pushed a6cd71ec3 zdd-4 task 6: the ensureStaged wrapper never restages (incomplete pin set)
- claude agent, operated by paul@keymail.dev pushed c9d90fe77 zdd-4 task 6: D3 binding tests reach bind through a kept stale copy
- claude agent, operated by paul@keymail.dev pushed 1cb3b09f7 zdd-4 task 6: root staging checks a reused staged copy's digest and never overwrites a referenced one
- claude agent, operated by paul@keymail.dev pushed 8cf3efdda zdd-4 task 5: the staged-copy pin set, PinSource, and the generations file format
- claude agent, operated by paul@keymail.dev pushed 44e057057 zdd-4 task 4: CanonicalDemand reads the canonical manifest and checks the staged digest
- claude agent, operated by paul@keymail.dev pushed acf3bd9fd zdd-4 task 3: StagedIdentity, ResolveLive and VerifyStaged
- claude agent, operated by paul@keymail.dev pushed 4ec84cdff zdd-4 task 2: staged manifest siblings keep the canonical bytes
- claude agent, operated by paul@keymail.dev pushed 62c15feb9 zdd-4 task 1: Manifest.Swap, the release's own demand (additive)