Skip to content

chore(release): v1.3.0 — proof-carrying output, trap gate on the runtime path, solver migration Tier-1, loadable Linux binary - #312

Open
avrabe wants to merge 3 commits into
mainfrom
chore/release-v1.3.0
Open

chore(release): v1.3.0 — proof-carrying output, trap gate on the runtime path, solver migration Tier-1, loadable Linux binary#312
avrabe wants to merge 3 commits into
mainfrom
chore/release-v1.3.0

Conversation

@avrabe

@avrabe avrabe commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Cuts v1.3.0 (1.2.0 → 1.3.0 — minor: new output artifact + new verification backend, no breaking API change). First release in 24 days.

Scope — closed in rivet

rivet release status v1.3.0✓ Cuttable, 3 artifacts, all verified.

artifact issue
TEST-WSC-FACTS-EMITTER (new) #231 — proof-carrying facts + wsc.* trust boundary
TEST-RULE-SOLVER-DIFFERENTIAL (new) #277 — rule verifier on a certificate-checked solver
TEST-TRAP-GATE-RUNTIME-PATH #288 — gate proven to be the runtime authority

The two new artifacts close a real gap the release gate surfaced: #231 and #277 had shipped with passing tests but no requirement→verification node, so the V was open for both. rivet validate PASS (42 warnings — unchanged baseline); both new artifacts resolve in the verification-evidence oracle.

Fixes #311 — the Linux binary was unloadable

Reproduced from the shipped v1.2.0 artifact, not taken on report: it requires GLIBC_2.38 + GLIBCXX_3.4.31, so it dies in the dynamic linker on ubuntu-22.04 (2.35). Cause: the build ran on ubuntu-latest, so the floor silently tracked GitHub's newest image.

Fix is a pin plus an assertionubuntu-22.04, and the floor is checked after the build so the release fails rather than shipping an unloadable binary. A pin with only a comment is precisely what a dependency bump undid to the cranelift-isle pin last week; this one can't regress silently.

Measured, not quoted

  • 38/38 rules proven (100.0%) — identical under the incumbent and our own engine; in both mode the harness panics on divergence and did not.
  • 10 wsc.facts tests (golden bytes vs the consumer's frozen encoding, drop-safety, byte-identical facts-off path, trust boundary).
  • 481 pass / 0 fail / 2 ignored, core suite with verification enabled.

Two inherited numbers failed re-measurement while preparing this and were corrected (a "57 rules" that measured 38; a stale test count) — both had come from a report rather than a run.

Not done — in the CHANGELOG, not implied closed

Core validator still proves value equivalence over a total model (refinement, #300, specified not built); trap gate covers div/rem only; the fact source is unwired; only the rule verifier has been migrated.

Known systemic reds: Rocq Formal Proofs, Verification Gate.

avrabe added 2 commits August 7, 2026 19:06
Proof-carrying output, a trap gate on the runtime path, the first tier of the
solver migration, and a Linux binary that loads on the runners people use.
Version 1.2.0 -> 1.3.0 (minor: new output artifact + new verification backend,
no breaking API change).

Release scope closed in rivet — `rivet release status v1.3.0` reports cuttable,
3 artifacts, all verified:

- TEST-WSC-FACTS-EMITTER (new)          #231 proof-carrying facts + wsc.* trust boundary
- TEST-RULE-SOLVER-DIFFERENTIAL (new)   #277 rule verifier on a certificate-checked solver
- TEST-TRAP-GATE-RUNTIME-PATH           #288 gate proven to be the runtime authority

The two new artifacts close a traceability gap the release gate found: both
features had shipped with passing tests but no requirement->verification node.

Also fixes #311: the v1.2.0 linux-gnu binary required GLIBC 2.38 / GLIBCXX
3.4.31 (reproduced from the shipped artifact) and would not load on
ubuntu-22.04. Pinned the build image and ASSERTED the floor, because the
cranelift-isle pin proved that a comment does not hold a pin in place.

Measured, re-run rather than quoted: 38/38 rules proven (identical under both
engines; `both` mode panics on divergence and did not), 10 wsc.facts tests,
481 pass / 0 fail / 2 ignored.

Fixes #311
Verifies TEST-WSC-FACTS-EMITTER
Verifies TEST-RULE-SOLVER-DIFFERENTIAL
Refs #231
Refs #277
Refs #288
…e binary

Two changes, both because the consumer who reported #311 tests only released
artifacts in CI — they cannot catch a bad build before we publish, so the
release workflow has to be the thing that catches it.

1. FAIL-CLOSED. The first draft guarded each comparison with `[ -n "$need" ]`,
   so a readelf that produced no match (missing tool, changed output, wrong
   path) skipped the comparison and the step went green having tested nothing.
   That is the vacuous-check defect this repo keeps finding, reintroduced in the
   gate written to prevent a recurrence. A dynamically linked gnu binary always
   requires some GLIBC version; finding none now means the probe broke, and the
   step errors instead of passing.

2. SMOKE-RUN. The symbol check is static reasoning about the binary; this
   executes it. The runner is ubuntu-22.04, so `loom --version` succeeding
   there is direct evidence for the exact case that failed in #311, rather than
   an inference from symbol tables.

Verified by replay against the shipped v1.2.0 artifact (which requires GLIBC
2.38): the gate reports CAUGHT — the release would have failed instead of
publishing an unloadable binary. Comparison logic checked at 2.34 / 2.35 / 2.38
/ 2.39 against the 2.35 ceiling.

Refs #311
@avrabe
avrabe force-pushed the chore/release-v1.3.0 branch from 34fa677 to dc37e5f Compare August 7, 2026 17:08
Dependabot #310 widened the workspace cranelift-isle constraint from 0.132 back
to 0.134 — the second time this pin has been reverted by automation (#298 was
the first, fixed in #304). Both times the bump left the comment directly above
the constraint intact, a comment whose text explains exactly why not to widen
it. main's wasm32-wasip2 build is red again as a result, and because these PRs
auto-merge, no human saw the warning on either occasion.

A pin defended only by prose is not defended. Two changes:

- Re-pin to ^0.132 (0.133+ needs rustc 1.94.0, not stable on the CI image).
- Add a dependabot "ignore" entry for cranelift-isle on the root cargo
  ecosystem, so the bot cannot propose the change at all. The removal condition
  is written next to it: stable rustc 1.94, or the committed lockfile (#142).

This is the mechanical half of the same lesson as the release floor gate in this
branch — an invariant that only exists in a comment will be undone by something
that does not read comments.

Refs #142, #304, #311
@avrabe
avrabe force-pushed the chore/release-v1.3.0 branch from dc37e5f to 316fd28 Compare August 7, 2026 17:08
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.

release: the x86_64-unknown-linux-gnu binary needs GLIBC 2.38 — won't load on ubuntu-22.04 (a supported GitHub runner)

1 participant