Skip to content

Ingest, publish and promote product release candidates - #27

Merged
ChesterHsu merged 2 commits into
mainfrom
claude/runtime-distribution
Sep 24, 2026
Merged

ChesterHsu merged 2 commits into
mainfrom
claude/runtime-distribution

Conversation

@ChesterHsu

Copy link
Copy Markdown
Member

Implements Phase 3 of docs/DISTRIBUTION.md for the first product, Flyto2 Runtime.

Ingest release (.github/workflows/ingest-release.yml, workflow_dispatch: product, source_run_id, promote):

  1. Resolves the product in products/catalog.json.
  2. Reads the source run and downloads its *-candidate artifact with this repository's own token. Source repositories are public, so no cross-repository credential is needed; this was probed before relying on it.
  3. scripts/ingest_release.py verify: manifest schema, catalog identity, namespaced tag, channel vs. version, source tag → commit, run repository/id/workflow/commit/branch main/conclusion success, every digest and size, SHA256SUMS covering every file, CycloneDX SBOM, native signing evidence.
  4. gh attestation verify on each installer against the shipped provenance and SBOM bundles, pinned to the source repository, its workflow and commit, no self-hosted runners.
  5. macOS: stapler validate, spctl on the disk image and the app inside (source=Notarized Developer ID).
  6. Publishes <prefix>X.Y.Z with --latest=false so the legacy Flow /releases/latest alias does not move. An existing tag is accepted only when its manifest is byte-identical.
  7. promote rewrites the channel JSON (and for stable, the product page downloads block) and pushes it to main.

scripts/verify.py gains an ingest self-test: 1 accepted candidate, 5 tampered variants refused, promotion on a copy. The documentation workflow installs jsonschema for it.

The Runtime side (candidate bundle from flyto-runtime's macOS App workflow) lands in flytohub/flyto-runtime.

Verified locally: python3 scripts/verify.py, git diff --check, flyto-index verify . --full-scan --strict. Not yet verified: a real ingest run, which needs this on main.

🤖 Generated with Claude Code

The Distribution Hub contract had no path from a source build to a
release. The Ingest release workflow takes a registered product and the
run id of its candidate build, verifies every identity in the candidate
(catalog, source tag and commit, successful main build, digests,
SHA256SUMS, CycloneDX SBOM, provenance and SBOM attestations, macOS
notarization), publishes it under the product's namespaced tag without
moving the repository-wide latest release, and can move a channel.

Source repositories are public, so the candidate is read with this
repository's own token; no cross-repository credential exists.
scripts/verify.py now exercises the rules on a synthetic candidate.
The documentation contract has failed on main since the distribution hub
landed: 'distribution' and 'compatibility' are not supported feature
kinds. Every surface now names its verification command.
@ChesterHsu
ChesterHsu merged commit 3e1148b into main Sep 24, 2026
2 checks passed
@ChesterHsu
ChesterHsu deleted the claude/runtime-distribution branch September 24, 2026 12:53
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