Problem
The current rolling publisher mutates the public channel in this order:
- move
semper-exp-current tag to the new candidate SHA;
- delete every asset from the existing release;
- edit/create the release;
- upload new manifest/checksums/binaries;
- run the credential-free verifier.
This produces an externally visible mixed-state window even on a successful run. After step 1 the tag identifies the new candidate while release assets can still represent the prior candidate. During steps 2–4 the rolling release can expose zero or only a subset of the required assets. If publication fails part-way, the verifier detects failure only after the public channel has already been mutated.
Goal
A consumer resolving the rolling channel should either see a complete internally consistent candidate or fail closed. It should not be able to accept a manifest/binary/tag combination assembled across candidates.
Required design decision
Choose the smallest robust publication protocol. Evaluate approaches such as:
- stage the complete candidate under an immutable candidate-specific tag/release, verify it, then promote a lightweight rolling pointer;
- publish a candidate-specific immutable manifest/assets first and make the rolling channel only reference that verified immutable candidate;
- if GitHub Release mechanics prevent an atomic pointer swap, explicitly define the rolling endpoint as eventually consistent and make every consumer verify one immutable candidate identity before downloading artifacts, with retries/fail-closed behavior during transitions.
Do not claim the current delete/upload sequence is transactional.
Acceptance
- no consumer can successfully accept a manifest whose source SHA differs from the artifact identity it downloads;
- the rolling tag/ref, manifest source SHA, binary names/hashes, and source snapshot resolve to one candidate;
- a publisher failure at each mutation stage has a documented/reproducible recovery path;
- failure does not silently leave the prior candidate mislabeled as the new one;
- consumer tooling detects transition/incomplete state and retries or fails closed rather than executing an ambiguous artifact;
- rollback to the prior verified candidate is explicit and reproducible;
- no private validation material is involved.
Related
This issue addresses atomicity/consistency of the public publication transaction itself.
Problem
The current rolling publisher mutates the public channel in this order:
semper-exp-currenttag to the new candidate SHA;This produces an externally visible mixed-state window even on a successful run. After step 1 the tag identifies the new candidate while release assets can still represent the prior candidate. During steps 2–4 the rolling release can expose zero or only a subset of the required assets. If publication fails part-way, the verifier detects failure only after the public channel has already been mutated.
Goal
A consumer resolving the rolling channel should either see a complete internally consistent candidate or fail closed. It should not be able to accept a manifest/binary/tag combination assembled across candidates.
Required design decision
Choose the smallest robust publication protocol. Evaluate approaches such as:
Do not claim the current delete/upload sequence is transactional.
Acceptance
Related
This issue addresses atomicity/consistency of the public publication transaction itself.