plan 4 (release-side) revised: retry via promote --retry, generations-file pin provider; index: generations file contract
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2 files changed,
+10
−2
docs/superpowers/plans/2026-10-07-zero-downtime-deploys-0-index.md+8 −0docs/superpowers/plans/2026-10-07-zero-downtime-deploys-4-release-side.md+2 −2
CI cancelled — superseded by a newer push — run details
diff --git a/docs/superpowers/plans/2026-10-07-zero-downtime-deploys-0-index.md b/docs/superpowers/plans/2026-10-07-zero-downtime-deploys-0-index.md| index 26bc23255..9a168c070 100644 |
| --- a/docs/superpowers/plans/2026-10-07-zero-downtime-deploys-0-index.md |
| +++ b/docs/superpowers/plans/2026-10-07-zero-downtime-deploys-0-index.md |
| @@ -205,3 +205,11 @@ type StagedIdentity struct { |
| - the cache records the generation that served the response; |
| - claims-on provider wakes and worker generation handles belong to |
| plan 3. |
| +- **Generations file contract** (plan 4 defines it, plan 5 writes it): |
| + - the format is `{"schema":1,"hosts":{"<host>":["<version>",...]}}`, |
| + written atomically; |
| + - an **absent** file means no generations, which is the state before |
| + plan 5 ships, while an **unreadable** file means an incomplete pin |
| + set; |
| + - so plan 5's agent writes the file **before its first spawn**, and |
| + rewrites it at every change to an operation set. |
diff --git a/docs/superpowers/plans/2026-10-07-zero-downtime-deploys-4-release-side.md b/docs/superpowers/plans/2026-10-07-zero-downtime-deploys-4-release-side.md| index 790be9312..6b2c94e22 100644 |
| --- a/docs/superpowers/plans/2026-10-07-zero-downtime-deploys-4-release-side.md |
| +++ b/docs/superpowers/plans/2026-10-07-zero-downtime-deploys-4-release-side.md |
| @@ -1781,8 +1781,8 @@ In `adoptHost`, change the call at line 1087 to: |
| // manifest's digest for this platform: |
| // - a match reuses it, as before; |
| // - a mismatch restages over it only when nothing on the box refers to it |
| -// (chk.refs: live links, Version, PrevVersion, and whatever |
| -// WithPinSource adds); otherwise the version is refused with |
| +// (chk.refs: live links, Version, PrevVersion, the generations file, |
| +// and whatever WithPinSource adds); otherwise the version is refused with |
| // ErrVersionReused, so a copy under another instance's build never |
| // changes underneath it; |
| // - a canonical manifest that cannot be read keeps today's answer: the copy |