Skip to content

homebrew: research builtin bottle publishing vs custom publish path#823

Draft
brandonpayton wants to merge 1 commit into
mainfrom
gascity/kd-1mr/kd-1i0u-bottle-publishing-research
Draft

homebrew: research builtin bottle publishing vs custom publish path#823
brandonpayton wants to merge 1 commit into
mainfrom
gascity/kd-1mr/kd-1i0u-bottle-publishing-research

Conversation

@brandonpayton

Copy link
Copy Markdown
Member

Purpose

Design/research artifact for kd-1i0u (blocks umbrella convoy kd-1mr, initiative homebrew-all). Before the homebrew-all fan-out multiplies the publish surface across ~73 packages, decide whether Kandelo should keep building its own bottle publishing automation, adopt Homebrew's builtin automation (brew test-bot / brew pr-pull / brew pr-upload), or converge on a hybrid.

Docs-only. No runtime, ABI, package-archive, or code change.

Deliverable

docs/plans/2026-07-01-homebrew-builtin-vs-custom-bottle-publishing-research.md

Position

Keep the custom path for orchestration, tap commit, and sidecars. Adopt one builtin — the GHCR upload layout — and only when guest brew install becomes a goal. Do not adopt brew test-bot or brew pr-pull.

  • The custom path already uses Homebrew's builtin bottle primitives (brew install --build-bottle, brew test, brew bottle --json/--merge). What it wraps around them — matrix planning with cache_key_sha skip, sidecar generation/validation, VFS/gallery gating, last-green fallback, state-locked tap commits, bottles-abi-v<N> release assets — has no Homebrew builtin equivalent and fits Kandelo's cross-compiled-Wasm + push-to-main + VFS-consumer model.
  • brew test-bot/pr-pull assume (1) the CI runner's OS/arch is the bottle target, (2) bottles are merged from PRs, (3) the only metadata is the bottle do block. Kandelo satisfies none of these; bending them costs more than it saves.
  • Key finding: the custom oras push produces a blob-addressable upload that Kandelo's VFS fetcher reads, but it is not Homebrew's native OCI layout (manifest tagged by formula version). A stock guest brew install against the same GHCR root_url cannot resolve it. brew pr-upload --upload-only produces the native layout from the same locally-built bottle bytes — the low-risk convergence point, staged behind a real guest-install trigger.

Review

Review gauntlet (6 lenses) recorded as a dated note on bead kd-1i0u.

🤖 Generated with Claude Code

Design/research artifact for kd-1i0u (blocks kd-1mr homebrew-all). Compares
Homebrew's builtin bottle automation (brew test-bot / pr-pull / pr-upload,
GHCR OCI layout) against Kandelo's as-built custom publish path.

Finding: the custom path already uses Homebrew's builtin bottle primitives
(install --build-bottle, test, bottle --json/--merge); its orchestration,
state-locked tap commit, sidecars, VFS/gallery gating, cache-key skip, and
bottles-abi-v<N> release assets have no builtin equivalent and fit Kandelo's
cross-compiled-Wasm + push-to-main + VFS-consumer model. The one divergence
worth converging is the GHCR upload layout: oras push is blob-addressable for
the VFS fetcher but not the native version-tagged OCI layout a stock guest
brew install resolves. Recommends keeping the custom path and adopting
brew pr-upload --upload-only (or emitting a version-tagged OCI index) only when
guest brew install becomes a goal; documents the latent blocker.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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