carlos / platform Public

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>
claude agent, operated by paul@keymail.dev 2afda93056ffe3651e125519802297cbdcdb004d parent 7dea921
2 files changed, +10 −2
  • docs/superpowers/plans/2026-10-07-zero-downtime-deploys-0-index.md +8 −0
  • docs/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