fix(homebrew,scoop): GH-259 publish the manifests to their tap repos - #270
Open
joaodinissf wants to merge 4 commits into
Open
fix(homebrew,scoop): GH-259 publish the manifests to their tap repos#270joaodinissf wants to merge 4 commits into
joaodinissf wants to merge 4 commits into
Conversation
Neither publisher has ever proposed anything. Three things had to be true
at once and none of them were.
The task was never emitted. frontseat.yaml configured a tap but no name and
no repo, so DefaultName("", "") returned "" and no entity matched. Resolve
the name from the workspace when neither is set, and give both publishers
the name and repo explicitly.
The push had no credential. ProposeFile shells out to gh, which reads
GH_TOKEN — in CI the repo-scoped default token, which cannot write to the
tap. TAP_TOKEN was already declared and exported and simply never read.
Point gh at it through a token_env option, falling back to GH_TOKEN so a
local ship still works.
Neither would have taken effect. The pinned 0.12.0 publishers predate
cross-repo publishing entirely — no tap support, formula rendered in-tree —
so a release cut by them cannot publish, which is the deadlock
bootstrap_from_source exists for. Name the packages it builds in the
workspace rather than the template, and add both publishers.
Also: check the tap is reachable at the checksum phase, four phases before
the tag is pushed, since publishing is the last thing a release does and
nothing rolls a public release back. Fail a release that lists open pull
requests unsuccessfully instead of reporting success having opened none.
Render prereleases without proposing them, as neither channel has a
prerelease notion.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…sing ProposeFile decided whether a manifest was already current by comparing against the default branch. While a proposal is open the manifest exists only on the release branch, so that lookup 404s, the short-circuit never fires, and every retried release re-sent identical bytes — adding a second commit to a pull request already under review. Its own contract says a re-run "neither opens an empty pull request nor disturbs an open one"; it honoured the first half. Compare the branch as well, skip the write when it already carries these bytes, and report changed only when this run wrote or opened something. Found by rehearsing the publish path against a scratch tap: two runs, two identical commits thirty seconds apart. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The preflight probed the manifest repository with a read. Both taps are public, so that read succeeds with CI's repo-scoped default token — the probe passes whether or not the release credential is configured, and only the write fails, by which point the tag is pushed and the release is public. It checked the one thing that was never going to be wrong. Require the configured token env to be non-empty first. An unset repository secret renders as the empty string, which is the failure that actually occurs: TAP_TOKEN is declared in release_secrets and exported by the workflow, but is not set on the repository today. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The guard shipped without the test that was meant to accompany it, and the Scoop render path had no coverage at all — its manifest is what `scoop install` reads, so a wrong key or a missing shim is a broken install. Both prerelease tests point --push-to at a repository that does not exist, so a regressed guard fails loudly rather than passing quietly. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
joaodinissf
force-pushed
the
fix/259-publish-tap-manifests
branch
from
August 1, 2026 20:23
d7e37d8 to
183f3be
Compare
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.
Stacked on #269 — merge that first, then this retargets to
main.Neither publisher has ever proposed anything. Three things had to be true at once and none of them were.
The task was never emitted.
frontseat.yamlconfigured atapbut nonameand norepo, soDefaultName("", "")returned"",EntityRefFormatched nothing, andTasks()returned empty with no error and no log line.ResolvedNamenow falls back to the workspace name — injected for every plugin and read by nobody until now — and both publishers name their package and repo explicitly.The push had no credential.
ProposeFileshells out togh, which authenticates fromGH_TOKEN— in CI the repo-scopedsecrets.GITHUB_TOKEN, which cannot write tofrontseat-dev/homebrew-tap.TAP_TOKENwas already declared inrelease_secretsand exported onto three steps, and simply never read. Atoken_envoption pointsghat it, falling back toGH_TOKENso a localfrontseat shipstill works.Neither would have taken effect.
git tag --containsis empty for every commit in the publish work — the pinned 0.12.0 publishers predate cross-repo publishing entirely, with no tap support and the formula rendered in-tree. A release cut by them cannot publish, which is exactly the deadlockbootstrap_from_sourceexists for.bootstrap_packagesnames what it builds in the workspace rather than the template, since that template is synced into consumer repositories.Also in scope:
checksum. Publishing is the last thing a release does, andreleasehas already pushed the tag and undrafted the GitHub release by then, with no rollback and no continue-on-error. A read-onlygh api repos/<tap>four phases earlier fails the ship while that is still free. Read-only because the token this needs opens a pull request and need not carry push permission.ProposeFileno longer reports success having opened nothing. The open-PR listing discarded its error, andghreturns stderr there, which matches neither branch of the test — so an API blip skipped opening the pull request and still returnedtrue.ghwas documented as absent from the mise registry whenmise.tomlpins it — so it is now declared as a tool and resolves through mise rather than ambient PATH.Verified with
frontseat ls tasks: both publish tasks and both preflights now bind tocomponent:default/frontseat, with the token prefix and every flag present.Relates to #259This pull request was published with assistance from Claude.