feature: pin the toolchain with varve + the drift check that would have caught meld#390 - #192
Merged
Conversation
…ould have caught meld#390 jess had NO varve pin. AFD-045 turned that from a backlog item into a demonstrated defect: jess filed meld#390 against meld 0.41.3 while 0.52.0 was latest, and nothing noticed. THE MEASURED DRIFT — three sources, all disagreeing, never compared: TOOL PATH VARVE-PIN CI-YML STATUS rivet 0.32.0 0.34.0 0.25.0 DRIFT <- three different versions spar - 0.40.0 0.24.0 DRIFT meld 0.41.3 0.52.0 0.41.3 DRIFT synth 0.49.0 0.58.0 - DRIFT loom 1.2.0 1.4.0 - DRIFT SHARPENS AFD-045's ACCOUNT: CI pins meld 0.41.3 TOO. So the local machine was not drifted from CI — BOTH were drifted from upstream, and CI would NOT have caught the bad report either. The problem is not a stale laptop; it is that nothing ever compared the pins to the world. WHAT LANDS: varve.toml realm=pulseengine, channel=rolling, layer=2026.08.4, WITH DIGEST varve-realms.toml fetched from the varve release, not pasted (rolling root is provisional) tools/varve/check-drift.sh compares PATH vs varve pin vs ci.yml env; exits 1 on disagreement THE DIGEST IS NOT OPTIONAL HERE: two entries for layer 2026.08.4 exist in this realm under different digests, and varve REFUSES to guess between them rather than silently picking one. That refusal is the feature. The pinned digest is the one `varve install` fetched and verified against the realm's trust root. VERIFIED THE NEWER TOOLCHAIN ACTUALLY WORKS before recommending it — "it installs" is not "it works": rivet 0.34.0 (vs CI's 0.25.0) `rivet validate` -> Result: PASS, rc=0 spar 0.40.0 (vs CI's 0.24.0) WIT-derivation gate -> OK, regenerates wit/ byte-identically A VACUOUS ROW IN MY OWN CHECKER, CAUGHT AND FIXED: sigil is installed nowhere, so the first version scored it "ok" — reporting agreement where NOTHING was compared. Now "absent (not checked)", and the footer says such rows are not evidence. Negative-controlled: a tool that IS present and agrees reports ok with rc=0, so a passing result is reachable and the checker is not stuck at DRIFT. HONEST CAVEAT — THE PIN IS NOT UNIFORMLY NEWER: the layer carries synth 0.58.0 while the campaign is on 0.60.0 (AFD-042). Adopting it wholesale would DOWNGRADE synth. That is why this commit adds the pin and the check but does NOT switch ci.yml over: reconciling CI's env pins with the layer is a separate, reviewable change, and it needs the synth gap resolved first. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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.
jess had no toolchain pin. That stopped being theoretical today.
AFD-045 turned the missing varve pin from a backlog item into a demonstrated defect: jess filed meld#390 against meld 0.41.3 while 0.52.0 was latest — eleven minor versions — and nothing noticed until a stray flag name in
findings.yamlgave it away. That cost a supplier's attention on a report whose version citation was wrong.The measured drift
Three sources decide which binary actually runs. None of them agreed, and nothing ever compared them:
This sharpens AFD-045's account in a way that matters: CI pins meld
0.41.3too. So the local machine wasn't drifted from CI — both were drifted from upstream, and CI would not have caught the bad report either. The problem isn't a stale laptop; it's that nothing ever compared the pins to the world.What lands
varve.tomlpulseengine, channelrolling, layer2026.08.4, with digestvarve-realms.tomltools/varve/check-drift.shci.yml; exits 1 on disagreementThe digest isn't optional here. Two entries for layer
2026.08.4exist in this realm under different digests, and varve refuses to guess between them rather than silently picking one. That refusal is the feature. The pinned digest is the onevarve installfetched and verified against the realm's trust root.Verified the newer toolchain actually works
"It installs" is not "it works", so both gates were run under the pinned binaries before recommending them:
rivet validate→Result: PASS, rc=0wit/byte-identicallyA vacuous row in my own checker, caught and fixed
The first version scored
sigilas ok — it's installed nowhere, so the check reported agreement where nothing had been compared. That's the same vacuous-metric failure this campaign keeps hitting, this time in the tool meant to prevent it. Now reported asabsent (not checked), with a footer saying such rows aren't evidence.Negative-controlled: a tool that is present and agrees reports
okwith rc=0, so a passing result is reachable and the checker isn't stuck at DRIFT unconditionally.Honest caveat — the pin is not uniformly newer
The layer carries synth 0.58.0 while the campaign is on 0.60.0 (AFD-042). Adopting it wholesale would downgrade synth.
That's why this PR adds the pin and the check but does not switch
ci.ymlover. Reconciling CI's env pins with the layer is a separate reviewable change and needs the synth gap resolved first. Until then the pin is authoritative for local work and the drift check makes the disagreement visible instead of silent — which is precisely the control that was missing.🤖 Generated with Claude Code
https://claude.ai/code/session_017EKh2onUHpWSUiAEqWxfy2