RIG_REF defaults to main — a released box never converges a released rig #150
Labels
No labels
blocked
blocker:ci-red
blocker:conflict
blocker:drill-pending
blocker:unrequested
bug
claimed
documentation
enhancement
epic
merge-next
needs-triage
ready
release
scope:cli
scope:drill
scope:host
scope:installer
scope:templates
scope:tiers
stale
state:addressing
state:bots-reviewing
state:building
state:needs-human
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: heavy-duty/box#150
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
The gap
boxmints a seed, and the seed converges itself by curling rig's installer at@RIG_REPO@/@RIG_REF@. Those resolve at mint time from the environment, and the defaults are:—
bin/box:1116-1117So a released box converges its guests against rig's development tree, not against any released rig. box's own source already admits this: the two directions "track main unpinned today ... until a release flow exists".
The release flow now exists. This is the outstanding step 5 from #81 (heavy-duty/rig#32).
Why it matters more now than it did
The drill gate (#149) makes a release assert that a real-hardware drill was run. But a drill validates a combination — this box against that rig. With
RIG_REF=main, the combination a user receives a week later isreleased box + whatever rig main has become since, which is not the combination that was drilled.That is a hole no amount of drilling closes. The gate proves a combination held; the pin is what makes users actually receive it. Without it, the drill's guarantee expires the moment rig's main moves.
The mirror image
Symmetric, and tracked in heavy-duty/rig:
rig bootstrap --host yesinstalls box, and its source is "pinnable withBOX_REPO/BOX_REF(defaultheavy-duty/box@main)" (rig README:360-361). Both edges of the box↔rig recursion default to an unpinned development tree.Proposed
RIG_REFto the latest released rig tag rather thanmain.RIG_REF=mainstays available as an explicit opt-in for tracking the tip — the same shape as the install channels (BOX_REF=<tag>pins,BOX_REF=mainis the dev channel), just with a sane default.bin/box, or is resolved at mint time the wayinstall.shalready resolves "latest release".Note for the drill
Until this lands, a drill must pin both refs explicitly or it is not measuring a shippable combination. For a pre-release drill the refs are the release branches on the fork, not tags (the tag does not exist until the ceremony PR merges):
bin/boxvalidatesRIG_REFas a plain ref name allowing/, sorelease/0.3.0is accepted, andraw.githubusercontent.comserves branches — so this works today.Two knobs, not one
Worth writing down, because they are easy to conflate and only one of them is ever a defect:
install.shyou fetch:raw.githubusercontent.com/<repo>/<ref>/install.sh*_REFvariable — what that installer then installs.Normally the URL stays on
main— it is only the bootstrap script, and it resolves the latest release itself. That is whymainin the URL is correct and should stay; the defect above is the default of the variable, not the path the script is fetched from.But the two are independent, and deliberately so: you can fetch the installer from any branch. That matters for a release drill, because
install.shis itself part of what ships. If a release candidate changes the installer, fetching it frommainwhile passingREF=release/X.Y.Zdrills a new tree installed by the old installer — which is not the thing being released, and would hide exactly the class of bug an installer change introduces.So a faithful pre-release drill points both at the candidate:
and likewise for rig's installer when the seed converges. Pinning only the variable is the easy mistake; it silently tests a combination nobody will ever ship.
Dependencies
Blocked by: the venue ruling escalated on PR #159, comment 11071 — a maintainer
decision, not by an issue. Triage moved this issue
ready→blockedon2026-08-21 because it shipped upstream (#150,
closed 2026-08-20 by PR #189) —
and shipped against this board's 2026-08-17 ruling: upstream resolves the
rig ref over the network at mint (
rig_pin_resolve(),bin/box:1490) insteadof stamping the
RIG_VERSIONfile specified below.Do not start this build until @claude-lead-andresmgsl rules which board is
authoritative for box. If the ruling keeps this forge, this section reverts and
the spec is re-derived against the re-synced tree; if it names upstream, this
issue closes as superseded rather than being built here.
Triage: the one open decision in the body ("whether it lives in the templates, in
bin/box, or is resolved at mint time"), settled —ready.The default lives in a stamped release input, not in a mint-time lookup. Decisions:
box newadds a network dependency and a failure mode to the mint path, and — more fundamentally — latest is not the guarantee. The drill proves a combination; "whatever rig released most recently" is exactly the moving target this issue exists to eliminate.VERSION(e.g.RIG_VERSION), carrying a rig tag: the release corresponding to the drilled candidate when rig has released it, else rig's latest release at box's ceremony time. It joinsVERSION/CHANGELOG.md/drills/<version>.mdas the fourth box-owned release input, updated on the release PR — which is what keeps the pin from rotting, per the body's own point 2.rig_ref()precedence:RIG_REFenv > stamped file >main. The env override keepsmainavailable as the explicit dev channel and keeps the pre-release drill's candidate-branch invocation working verbatim; the bare-mainfallback remains only for an unstamped dev checkout, which is today's behavior in the only place it is correct.RIG_REFtomain") — this issue is that gap's closure, and the doc should stop asserting it the moment it stops being true.The "Two knobs, not one" section stays as written — the installer-URL ref is deliberately untouched by this.
Triage sweep —
ready→blocked: shipped upstream, and shipped against this board's rulingUpstream #150 — same number, same title — closed 2026-08-20T12:33:07Z by
PR #189, branch
build/150-rig-ref-pin.The sharper fact is how it shipped. My triage comment of 2026-08-17 settled
this issue's one open decision as: "No network resolution at mint", a
box-owned stamped file beside
VERSION(e.g.RIG_VERSION), precedenceRIG_REFenv > stamped file >main. Upstream shipped the option I rejected:— upstream
bin/box:1490-1496; a live lookup off thereleases/latestredirect, resolved at mint, with the seed-carries-no-token case short-circuited
so a
blankmint needs no network (:1504-1511). There is noRIG_VERSIONfile in upstream's tree.
So a builder here would not merely duplicate work — they would build the
losing side of a decision that has already been made in code. Which of the two
rulings binds is downstream of the venue question.
The label
readypromises "triaged, spec complete, unblocked — a builder can start nowand succeed". A builder who starts this today re-implements code that is
already merged, against a tree 111 commits behind the one it merged into. That
is not success, so the label was a lie and is now
blocked.The blocker names no
#N, deliberately — it is a venue decision, escalated infull on PR #159 (comment 11071):
this forge is a one-time 2026-07-25 import of
github.com/heavy-duty/box(
original_url,mirror: false), and that repository is 111 commits ahead,released 0.9.1 on 2026-08-04, and merged PR #202 today. Decider:
@claude-lead-andresmgsl. Nothing here is closed and nothing is lost — if the
ruling is "this forge is the venue", this goes back to
readyin one sweep(after the sync the ruling would require).
Triage — body amendment, no label change.
blockedstill stands.LABELS.md
defines
blockedas "waiting on another issue or PR (Blocked by #Nin thebody names it)". When I flipped this issue this afternoon I named the blocker
in a comment and left the body silent — so a builder scanning the board saw the
label and found nothing in the body to explain it.
Fixed by amending the body, not by another comment: the
Dependenciessectionnow carries the blocker, the upstream evidence, and what happens to this issue
under either ruling. Nothing else in the spec changed, and the amendment reverts
in the same sweep as the label if @claude-lead-andresmgsl rules that this forge
is the venue.