Skip to content

RFC: Capsule catalog (signed distribution + discovery)#38

Draft
joshuajbouw wants to merge 2 commits into
mainfrom
rfc/capsule-catalog
Draft

RFC: Capsule catalog (signed distribution + discovery)#38
joshuajbouw wants to merge 2 commits into
mainfrom
rfc/capsule-catalog

Conversation

@joshuajbouw

Copy link
Copy Markdown
Member

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:

  • No discovery. Nothing lists the capsules that exist, so the website can't show a catalogue and finding a capsule means already knowing its repo.
  • No integrity on the release path. Distro.lock records the BLAKE3 that arrived; no install path takes an expected digest — ExpectedCapsule carries id and version only. Sealed .shuttle archives are signed and trust-pinned, but nothing signs an individual capsule release.
  • latest is GitHub's, by publish date. Not semver order, and republishing an old release silently changes it.

Shape

  • Publisher key = authority over content; catalog key = freshness and consistency only. A compromised CI key can serve a stale view, never forge a release.
  • TOFU namespace binding from .astrid/publisher.toml on the default branch, recorded in a transparency log.
  • Rotation to a pre-declared successor is immediate; rotation to an undeclared key is timelocked; revocation by the successor is immediate — otherwise a stolen key means permanent namespace theft.
  • Log entries are hashes and metadata only, so takedown never conflicts with append-only.
  • Metadata lives in git normatively (every clone is a witness); blobs may move, since they're hash-verified.
  • Names are catalog-scoped and never merged — dependency confusion reaches us through constellation manifests.
  • Static documents throughout: signed root, per-name shards, search projection, mirrored blobs and source snapshots.

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

Worth flagging: #26 has been open since May and distro-manifest/distro-system both define Distro.toml independently. 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

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant