Skip to content

Make rolling release publication transactional or consumer-fail-closed #8

Description

@mark-e-deyoung

Problem

The current rolling publisher mutates the public channel in this order:

  1. move semper-exp-current tag to the new candidate SHA;
  2. delete every asset from the existing release;
  3. edit/create the release;
  4. upload new manifest/checksums/binaries;
  5. 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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions