Skip to content

feature: pin the toolchain with varve + the drift check that would have caught meld#390 - #192

Merged
avrabe merged 2 commits into
mainfrom
feature/varve-pin
Aug 27, 2026
Merged

feature: pin the toolchain with varve + the drift check that would have caught meld#390#192
avrabe merged 2 commits into
mainfrom
feature/varve-pin

Conversation

@avrabe

@avrabe avrabe commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

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.yaml gave 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:

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

This sharpens AFD-045's account in a way that matters: CI pins meld 0.41.3 too. 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

file
varve.toml realm pulseengine, channel rolling, layer 2026.08.4, with digest
varve-realms.toml fetched from the varve release, not pasted — the rolling root is provisional and rotates at v1.0
tools/varve/check-drift.sh compares PATH vs varve pin vs ci.yml; exits 1 on disagreement

The digest isn't 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

"It installs" is not "it works", so both gates were run under the pinned binaries before recommending them:

  • rivet 0.34.0 (vs CI's 0.25.0) → rivet validateResult: 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

The first version scored sigil as 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 as absent (not checked), with a footer saying such rows aren't evidence.

Negative-controlled: a tool that is present and agrees reports ok with 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.yml over. 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

avrabe and others added 2 commits August 27, 2026 23:48
…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>
@avrabe
avrabe merged commit 8f24448 into main Aug 27, 2026
5 checks passed
@avrabe
avrabe deleted the feature/varve-pin branch August 27, 2026 22:24
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