Skip to content

fix: v0.15.1 — self-update converges on artifact identity (varve#38) - #39

Merged
avrabe merged 1 commit into
mainfrom
feat/v0.15.1
Aug 12, 2026
Merged

fix: v0.15.1 — self-update converges on artifact identity (varve#38)#39
avrabe merged 1 commit into
mainfrom
feat/v0.15.1

Conversation

@avrabe

@avrabe avrabe commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

v0.15.1 — fixes the second half of #38

#38: the v0.14.0 binary reported 0.13.1, so self-update --check compared self-reported version strings (is_newer("v0.14.0","0.13.1") = true forever) and looped — every run re-installing identical bytes. v0.15.0 fixed the version string + added a guard; this fixes the fragility underneath.

REQ-UPDATE-002 — decide on artifact identity, not version strings

A new core resolve_update fetches and verifies the candidate against the trust root, then compares it to what's on disk:

  • identical bytes → AlreadyCurrent (no-op — the loop terminates)
  • differing bytes → Available
  • not newer → UpToDate

The CLI handler is now a thin wrapper over it, so a mis-reported version degrades to a no-op instead of looping. perform was split into fetch_verified_binary + install_binary, keeping verify-before-write intact.

REQ-RELVER-001 strengthened

The release now also runs the freshly built binary and asserts --version == the tag (native targets) — the exact artifact-level oracle #38 suggested, on top of the pre-build version-guard.

Independent review — twice (VER-REVIEW-v0.15.1)

The first review passed all refutations but dissented that the handler behaviour was tested only by a pure helper. Resolved by adding behavioural tests through the real release-API mock server (signed archive, real ed25519 verify) — loop-break and impostor-refused-before-offer asserted end-to-end — and a second independent review confirmed the dissent closed. Residual handler-glue coverage tracked as a follow-up (#not-blocking).

Gate

128 lib + 6 self-update-double + 34 CLI green; clippy/fmt clean; --locked synced; rivet validate + verification-evidence (106 steps) + claim-check (12) + review-check (3 verdicts) all green.

Closes the loop half of #38 (version-string half shipped in v0.15.0).

🤖 Generated with Claude Code

https://claude.ai/code/session_019TNtfRjLNhEz82G2ggeeNu

varve#38: the v0.14.0 binary reported 0.13.1, so `self-update --check`
compared self-reported version strings (is_newer("v0.14.0","0.13.1") = true
forever) and looped — every run re-installing identical bytes.

REQ-UPDATE-002 — self-update now decides on ARTIFACT IDENTITY, not version
strings. A new core `resolve_update` fetches and VERIFIES the candidate against
the trust root, then compares it to what is on disk: identical bytes ->
AlreadyCurrent (a no-op — the loop terminates), differing bytes -> Available,
not-newer -> UpToDate. The CLI handler is a thin wrapper over it. So a
mis-reported version string degrades to a no-op instead of an infinite loop.
`perform` is refactored into `fetch_verified_binary` + `install_binary`, keeping
verify-before-write intact.

REQ-RELVER-001 strengthened — the release now also runs the freshly built
binary and asserts `--version` == the tag (native targets), the exact
artifact-level oracle varve#38 suggested, on top of the pre-build version-guard.

Independently reviewed twice (VER-REVIEW-v0.15.1): the first review passed all
refutations but DISSENTED that the handler behaviour was tested only by a pure
helper; resolved by adding behavioural tests through the real release-API mock
server (signed archive, real ed25519 verify) — loop-break and
impostor-refused-before-offer both asserted end-to-end — and a second
independent review confirmed the dissent closed. Residual handler-glue coverage
tracked as a follow-up.

128 lib + 6 self-update-double + 34 CLI green; clippy/fmt clean; --locked
synced; rivet validate + verification-evidence (106 steps) + claim-check green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019TNtfRjLNhEz82G2ggeeNu
@avrabe
avrabe merged commit 8b536c6 into main Aug 12, 2026
12 checks passed
@avrabe
avrabe deleted the feat/v0.15.1 branch August 12, 2026 07:50
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