Refs #16448
Context
Sub of #16448, from D#16304's OQ2 resolution (@neo-kimi-phoebe, row-M owner): M splits into availability and selection, with J as the phase boundary. This ticket owns the availability half only.
The empirical anchor: #16224 bounded a lane-starvation backoff, merged as d8d8e66a7f, and git tag --contains returns empty. A deployment on the tag channel had no artifact-selection path to it at all — not a delayed one, an absent one.
The Problem
A cohort's existence is currently a function of whether someone declared it release-worthy. There is no retained, addressable candidate for an ordinary merge, so "can this plane receive commit X" has no answer independent of the release decision. That conflates two questions the graduation separated: does the artifact exist and may this target take it.
The Architectural Reality
ai/deploy/Dockerfile builds from a git ref at image-build time; nothing retains an addressable per-cohort artifact.
buildScripts/release/publish.mjs owns the release line — the selection side, and out of scope here.
- D#15758 owns the apply transaction; this ticket produces the candidate it later activates, and never mutates anything.
The Fix
Every admitted cohort produces a retained immutable candidate addressable by an exact digest, carrying a stageReceiptId, under a stated retention/expiry/GC rule. Availability is decoupled from release-worthiness: staging admits, selection decides.
Contract Ledger Matrix
| Target Surface |
Source of Authority |
Proposed Behavior |
Fallback / Error Semantics |
Docs |
Evidence |
| candidate identity |
this ticket |
Exact digest + stageReceiptId, stable across reads |
Unresolvable digest fails loudly; never silently re-resolves |
staging docs |
a candidate is addressable by digest after the producing run exits |
| retention / GC |
this ticket |
Stated expiry + revocation rule; bounded storage |
GC must never remove a candidate an open selection window may still bind |
staging docs |
spec: a candidate inside the window survives a GC pass |
Decision Record impact
none — implements the graduated shape; no ADR authority touched.
Acceptance Criteria
Out of Scope
- Selection / activation policy — the sibling sub owns which candidate a target takes and when.
- The apply transaction — D#15758's activation kernel.
- Release-line semantics (
publish.mjs), unchanged.
Avoided Traps
- Tying candidate existence to a tag. That is the adversely-selected channel the graduation rejected: fixes whose value is invisible until someone is suffering never read as release-worthy at cut time.
- Re-resolving at read time. A candidate that re-resolves is not immutable, and activation binding it would not be reproducible.
Related
- #16448 (parent) · D#16304 (source) · D#15758 (activation kernel) ·
#16224 (the fixture).
Origin Session ID: 9f05cd72-5457-4ec2-926c-ef1406041f19
Retrieval Hint: query_raw_memories("availability retained immutable candidate stageReceiptId retention GC channel")
Refs #16448
Context
Sub of #16448, from D#16304's OQ2 resolution (@neo-kimi-phoebe, row-M owner): M splits into availability and selection, with J as the phase boundary. This ticket owns the availability half only.
The empirical anchor:
#16224bounded a lane-starvation backoff, merged asd8d8e66a7f, andgit tag --containsreturns empty. A deployment on the tag channel had no artifact-selection path to it at all — not a delayed one, an absent one.The Problem
A cohort's existence is currently a function of whether someone declared it release-worthy. There is no retained, addressable candidate for an ordinary merge, so "can this plane receive commit X" has no answer independent of the release decision. That conflates two questions the graduation separated: does the artifact exist and may this target take it.
The Architectural Reality
ai/deploy/Dockerfilebuilds from a git ref at image-build time; nothing retains an addressable per-cohort artifact.buildScripts/release/publish.mjsowns the release line — the selection side, and out of scope here.The Fix
Every admitted cohort produces a retained immutable candidate addressable by an exact digest, carrying a
stageReceiptId, under a stated retention/expiry/GC rule. Availability is decoupled from release-worthiness: staging admits, selection decides.Contract Ledger Matrix
stageReceiptId, stable across readsDecision Record impact
none— implements the graduated shape; no ADR authority touched.Acceptance Criteria
#16224fixture.stageReceiptIdthat a later activation can bind.Out of Scope
publish.mjs), unchanged.Avoided Traps
Related
#16224(the fixture).Origin Session ID: 9f05cd72-5457-4ec2-926c-ef1406041f19
Retrieval Hint:
query_raw_memories("availability retained immutable candidate stageReceiptId retention GC channel")