RFC: Capsule catalog (signed distribution + discovery)#38
Draft
joshuajbouw wants to merge 2 commits into
Draft
Conversation
Specifies the capsule catalog: a signed, statically-served index mapping capsule names to verified releases, plus the client-side resolution and verification rules that consume it. Publishers sign releases in their own repositories; a catalog is a derived materialization of many publishers. Astrid defines the formats and ships the verifier, and operates no index. Depends on rfcs#26 for manifest shape; supersedes its unsigned-index sketch. Splits v1-normative requirements from reserved ones so the document formats accommodate deferred behaviour without a break. Claude-Session: https://claude.ai/code/session_01LGoBGfwiZnv6xnTyrMN1er
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Specifies the capsule catalog: a signed, statically-served index mapping capsule names to verified releases, and the client-side resolution and verification rules that consume it.
Publishers stay on their own infrastructure — a release is a signed tag in your own repo — and a catalog is a derived, signed materialization of many publishers' releases. Astrid defines the document formats and ships the verifier; it operates no index. Anyone can run a catalog, clients can configure several. The first instance is expected to be AOS's; nothing here privileges it.
Opening as a draft for discussion, not to merge.
What motivates it
Three gaps in what we have today:
Distro.lockrecords the BLAKE3 that arrived; no install path takes an expected digest —ExpectedCapsulecarries id and version only. Sealed.shuttlearchives are signed and trust-pinned, but nothing signs an individual capsule release.latestis GitHub's, by publish date. Not semver order, and republishing an old release silently changes it.Shape
.astrid/publisher.tomlon the default branch, recorded in a transparency log.Section 10 splits v1-normative from reserved, so the formats carry their fields from serial 1 but implementations can defer consistency proofs, quarantine, advisories, and reproducibility without a breaking change later. The full design is deliberately heavier than 30 capsules in two orgs warrants; the tiering is how it ships.
Relationship to other RFCs
cargo_like_manifest) for manifest shape and WIT refs, and addscategories/keywordsthere.unicity-astrid/registry. This replaces it with a signed one, and drops the org coupling, since the spec should be neutral and the index is a product.Worth flagging: #26 has been open since May and
distro-manifest/distro-systemboth defineDistro.tomlindependently. This RFC's dependency is a moving target until some of that lands.Open questions
Delay constants (14d rotation, 7d quarantine) are placeholders. Alias expiry, catalog-identity attestation for non-default catalogs, and the both-keys-lost recovery bar are all undecided. Whether catalog config reuses #26's
[[registry]]block or supersedes it needs a call.https://claude.ai/code/session_01LGoBGfwiZnv6xnTyrMN1er