fix(bundle): publish to a bundles branch, and unbreak the stale check #13
Reference in New Issue
Block a user
No description provided.
Delete Branch "ci/bundle-require-aarch64"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What & why
Three things, all surfaced by the first compose run that ever had a bundle to write (task 542).
1.
mainis protected, so the bundle could never landBoth attempts — the retry rebases and pushes to the same protected branch. Everything upstream of it was fine: credentials present, all four assets checksum-verified, both gates green, bundle composed. It was then thrown away.
Bundles now publish to a
bundlesbranch of their own, at its root. That needs no protection exception and keeps everything the original choice was for: a reviewable diff, a git history of the compat matrix, plain anonymous raw URLs, no credentials on the shard host. The header's claim that this push "needs no new branch-protection exception" was simply false — it assumed release.yml already pushed tomain, which it never has (see #3 below and the release.yml PR).The published bundles are materialized into a worktree at
published/, so the.2suffix scan and the idempotence check read what is actually published rather than a stale copy onmain. The branch is created from an empty-tree root commit on first use, so it carries no history that has nothing to do with the compat matrix.It is already seeded with
bundle-2026.08.04.json+current.json, because every bundle is kept forever so--bundle <tag>stays reproducible, and the move must not lose the one that exists. Verified anonymously readable at the new URL.2. A
${{ }}in a comment had silently disabled the stale checkThe runner scans a step's script for template expressions before running it, fails to parse the empty one written in a comment, and then skips the step without failing the job. So the dispatch that fires a component's release workflow when it has unreleased work has never run once. Reworded, with a warning not to write that token in a comment again.
link/release.ymland this repo'srelease.ymlcarry the identical bug in their bump-and-tag step — which is whylink'sCargo.tomlstill says0.1.0after six releases. Handled in their own PRs, because fixing the comment makes those steps start pushing to a protectedmain.3.
linux-aarch64is now a required keyStep 3 of PLAN.md §5.2, which was waiting on link publishing one.
v1.1.1does, so from here a dropped target reddens this job instead of vanishing from every bundle.bundles/*.jsonis deleted frommain: it is now a stale copy of data that lives elsewhere, and a wrong "current" is worse than none. The README stays and documents the branch.How it was tested
The whole job was extracted and run in a container against a bare repo standing in for the remote, so the push is real (only the auth-URL rewrite is stubbed, as there is no server):
bundles branch does not exist yet→composed bundle 2026.08.05→* [new branch] bundles -> bundles→ both files publishedbundles branch: 2 published bundle(s)→identical to the published current.json — nothing to publishFinal state: one publish commit on top of the root commit,
bundle-2026.08.05.json+current.json, andlink.assetscarrying all three keys (linux-aarch64,linux-x86_64,windows-x86_64). The stale check now runs, reporting both components as having nothing releasable.One re-entrancy fix came out of that:
rm -rf publishedleaves the worktree registered, soworktree addrefuses the path on a second run in the same checkout. CI checks out fresh, butgit worktree prunemakes driving the job by hand — which is how it is tested — work.After this merges
A dispatch or the nightly cron publishes
2026.08.05(linkv1.1.1+ overlayv0.2.0, protocol 3). The installer's ownBUNDLE_BASEstill points atraw/branch/main/bundles/and is updated onedgein a companion PR; nothing is released fromedge, so there is no window where a shipped binary reads the wrong URL.Checklist
AI-assisted contributions (required)
Claude Code (Opus 5). I have reviewed and understand every change, and take responsibility for it. AI-authored commits are marked with aCo-Authored-Bytrailer.License
Three things, all found by the first compose run that ever had a bundle to write. 1. `main` is protected, so the push was declined by the pre-receive hook -- twice, since the retry rebases and pushes to the same place. Every bundle since v1.1.1 has been composed correctly and thrown away. Bundles now go to a `bundles` branch of their own, at its root, which needs no protection exception and keeps everything the original choice was for: a reviewable diff, a git history of the compat matrix, plain anonymous raw URLs, no credentials on the shard host. The header's claim that this push "needs no new branch-protection exception" was simply false. 2. A `${{ }}` written literally in a shell comment silently disabled the entire stale-component check. The runner scans a step's script for template expressions before running it, fails to parse the empty one, and skips the step WITHOUT failing the job -- so the dispatch that is supposed to fire a component's release workflow has never run once. Reworded, with a warning not to write that token in a comment again. (link/release.yml and this repo's release.yml carry the same bug in their bump-and-tag step; handled separately.) 3. linux-aarch64 is now a REQUIRED platform key, which was step 3 of PLAN.md §5.2 and was waiting on link publishing one. v1.1.1 does, so from here a dropped target reddens this job instead of vanishing from every bundle. The published bundles are materialized into a worktree at `published/`, so the ".2 suffix" scan and the idempotence check read what is actually published rather than a stale copy on main. The branch is created from an empty-tree root commit on first use, so it carries no history that has nothing to do with the compat matrix; it has been seeded already with bundle 2026.08.04, because every bundle is kept forever and the move must not lose the one that exists. bundles/*.json is deleted from main -- it is now a stale copy of data that lives elsewhere, and a wrong "current" is worse than none. The README stays and documents the branch. Verified by running the whole job in a container against a bare repo standing in for the remote: first run creates the branch and publishes both files with all three asset keys, second and third runs report "identical to the published current.json -- nothing to publish" and push nothing, and the stale check now runs and reports both components as having nothing releasable. Co-Authored-By: Claude <noreply@anthropic.com>View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.