Repository navigation
fix(deps): the gonuts pin is one version, everywhere — manifest truth, glob fence, mechanical bump (#791) - #798
Conversation
…, glob fence, mechanical bump (#791) The wallet fork's pin drifted three ways in one release week: a hand bump moved four carriers and left a fifth (scripts/token-recovery) three minors behind; two open PRs pinned the same lines to a tag and a pseudo-version; a newer fork tag carrying an open-P2 fix went unnoticed. - packaging/build-inputs.json names the pin (.gonuts.version) as the single source of truth, beside the go and portal pins. - tests/contract/check-gonuts-pin.py discovers carriers by glob (both go.mod require shapes — the single-line form hid the token-recovery stale pin from the checker's first draft) and refuses any disagreement, offline, in pre-commit and both CI twins; --latest (release-check only) refuses a release while the fork has a newer stable tag. - tests/contract/gonuts-pin_test.sh: 7 planted-drift verdicts. - scripts/bump-gonuts.sh rewrites manifest and every carrier together. - scripts/token-recovery raised v0.10.0 -> v0.13.0 (the fence's first catch; builds and vets clean against the new pin). - AGENTS.md states the rule and the check, never a carrier count.
|
Verdict: CLEAN — land it, and land it FIRST among the pin PRs. Every mechanism piece #791 specified is present, the fence has real teeth (re-proven live here, including against #781's exact shape), and the ordering constraint it creates for #781 is the feature working, not a defect. Reviewed against PR-REVIEW.md's 13 criteria + the AGENTS.md fund-safety lens, with #791 read first as the contract. Mapping the issue's six mechanism pieces to this diff: manifest truth ( What I ran (isolated worktree at 81778a3): The fence's teeth, re-proven on the next live incident: I applied #781's four carrier bumps (v0.13.2, as pushed) onto this tree and ran the fence — 8 findings, every go.mod and go.sum named with the fix command. That is not a hypothetical drift shape; it is the exact state main would reach if #781 merged without the unified bump. The negative control the house demands exists twice over: shipped fixtures and the real adjacent PR. Notes, none blocking: Ordering / freeze call: CI/tests/tooling only plus a dev-tool dependency — freeze-compatible, rides 0.6.0. Merge before #781's rebase: after this lands, main is deliberately |
|
🏷️ Next action — ready-to-merge Ready to merge — review verdict CLEAN/land; mergeable with no open gates. |
Amperstrand
left a comment
There was a problem hiding this comment.
13-criteria pre-review (rubric pass, evidence attached)
Verdict: ready to merge pending a write-access approval.
- (1) Body/diff match: body claims manifest-truth pin + glob fence + mechanical bump — diff delivers exactly that (build-inputs.json
.gonuts.version,check-gonuts-pin.pyglob discovery,bump-gonuts.sh, release-check gate). Refs #791. ✅ - (2/3) Hygiene: single commit, fresh base, no attribution footers. ✅
- (4) Does what it says: ran the fences on the head tree —
gonuts-pin_test.sh7 cases, 0 failed;check-gonuts-pin.pydiscovers 5 carriers by glob (confirming the doc-rot: the hand-maintained "four go.mod" list missedscripts/token-recovery). ✅ - (5) Coherent whole: also repairs the drifted carrier (
scripts/token-recoverywas 3 minors behind). In-scope for #791. ✅ - (6) Idioms: glob-discovery + manifest-truth + planted-drift verdicts — exactly the AGENTS.md drift doctrine. ✅
- (7) Deps: no new dependency surface (scripts only). ✅
- (8) Tests: fence + negative control verified: planted a bad pin → check refuses (drift not accepted). ✅
- (9) Docs: AGENTS.md updated to remove the rotting enumeration; changelog fragment present. ✅
- (10–13) Security/cross-cutting: no portal surface, no secret handling, no protocol behavior. ✅
Merging note for the approver: #781 carries this branch's full payload (built on top of it) — merge #798 first, then #781 (delta = the v0.14.0 pin + #705 fragment), then #780 needs a trim (its pin changes become redundant; its unique content = fee-verdict fixtures + cloud-lab Dockerfile hoist).
@ — one approval unblocks the chain.
… enforce the two-path doctrine — surface contract test, one-pass matrix split, rails
… enforce the two-path doctrine — surface contract test, one-pass matrix split, rails (#713) Co-authored-by: Amperstrand <dev@amperstrand.no>
Closes #791. Single commit, off current
main(4614ac2). Freeze-compatible: CI/tests/tooling only — the one dependency change is a dev tool (scripts/token-recovery) moving to the versionmainalready pins everywhere else; no shipped surface moves.The drift, and what now makes it impossible
Three incidents, one root cause (#791): carriers enumerated in prose and in a checker scoped to
src/, whilego.modfiles exist repo-wide.scripts/token-recoverystayed at v0.10.0 (predating the fork's #480/#495/#496 counter fixes)--latestleg inrelease-check.sh— a release is not cut on a stale pinThe pieces
packaging/build-inputs.jsongains.gonuts(repo, version, rule comment) — the same manifest-truth idiom asgo.versionandportal.commit.tests/contract/check-gonuts-pin.py— discovers carriers by repo-rootrglob("go.mod")(the test(contract): four drift fences — fragment identity, toolchain ceiling, SSID matcher table, clean-container lane #775 ceiling's enumeration), matches BOTHgo.modrequire shapes, and refuses any disagreement with the manifest, including a go.sum that never recorded the truth version (the half-update shape). Offline, milliseconds.--latestis the network leg: real tag AND newest stable tag — wired ONLY intoscripts/release-check.sh, because failing every open PR the moment the fork tags would be noise; refusing to cut a release is the catch.tests/contract/gonuts-pin_test.sh— 7 planted-drift cases (both require shapes, the stale-carrier shape, the sum-lag shape, a self-consistent pseudo-version accepted offline, missing manifest key, carrierless tree). A fence that cannot fail is decoration.scripts/bump-gonuts.sh <tag>— manifest first, then every discovered carrier viago get+go mod tidy(never hand-edited sums), then the full--latestverdict. A half-update cannot happen.hooks/pre-commit(offline only; triggers ongo.mod/go.sum/build-inputs.json; network stays out of hooks), both workflow twins (offline, beside deps-sync),release-check.sh(offline +--latest).replacedirective" claim is dropped (the tree pins require-only; verified).scripts/token-recoveryraised v0.10.0 → v0.13.0 (the version main already pins). Builds and vets clean against v0.13.0 — the fork's API surface it uses survived three minors.Verification (this branch)
✅ one pin, everywhere … across 5 carrier(s).--latestlive against the real fork: refuses v0.13.0 with "newer stable tag v0.13.2 … this is how the Priority: P2 — NUT-13 residue-collision guard is dead code in gonuts v0.13.0 (Conduition disclosure): CheckCollidingKeysets never invoked; wallet-level fix belongs in gonuts-tollgate, tracked here #705 fix nearly missed a release" — the exact gonuts-tollgate pin drifts: single-source-of-truth pin (manifest + rglob fence + mechanical bump + release-time latest-tag gate) #791 incident, now mechanical.scripts/bump-gonuts.sh v0.13.1moved manifest + all 5 carriers in lockstep (zero identity findings) and then refused to complete because v0.13.2 exists — a maintainer cannot land a deliberate pin choice by accident anymore. Exit non-zero; tree left for the human decision.gonuts-pin_test.sh7/7;check-deps-sync✅ (136 shared);check-toolchain-parity✅;check-import-paths✅;changelog-assemble check✅ (9 fragments);changelog-fragments_test.sh✅;go build/go vetclean inscripts/token-recovery; YAML twins parse;bash -non every touched shell file.src/file is touched.Interplay with the open train
scripts/bump-gonuts.sh <tag>, which also resolves fix(wallet-bump): gonuts-tollgate v0.13.1 — amount==fee swaps refused locally, never POSTed with empty outputs (#752) #780's review finding 1 (pin choice) mechanically.--latestwill correctly refuse a release cut while main pins < v0.13.2 — that refusal is the feature (Priority: P2 — NUT-13 residue-collision guard is dead code in gonuts v0.13.0 (Conduition disclosure): CheckCollidingKeysets never invoked; wallet-level fix belongs in gonuts-tollgate, tracked here #705).Router honesty
No router-visible surface is exercised: the shipped binary's module graph is untouched (the four src carriers stay at v0.13.0), and the fence is offline tooling. The token-recovery change is dev-tooling-only.