Skip to content

v0.83 RANGEWIDEN (#965): the downstream surface MEASURED is zero, and the bump lands behind a tested refusal - #1498

Merged
avrabe merged 2 commits into
mainfrom
lane/v0.83-rangewiden
Oct 9, 2026
Merged

avrabe merged 2 commits into
mainfrom
lane/v0.83-rangewiden

Conversation

@avrabe

@avrabe avrabe commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

The first deliverable was the number, and the number is zero

v0.82's DEPS lane withdrew the wasm-tools 0.261 bump for a stated reason: synth-core is the base crate, so the compiler stopped at its four errors and the consumer surface behind it was never reached. Four was a floor of unknown height. This lane measures it.

The surface is ZERO. With the bump applied and a checked narrowing at the four arena_bind.rs sites:

measurement command result
downstream surface cargo check --workspace --all-targets rc=0, 0 errors, 0 warnings
behaviour preserved cargo test --workspace rc=0, 3148 passed, 0 failed
CI's exact lint cargo clippy --workspace --all-targets -- -D warnings rc=0

All four crates that declare a wasm-tools dependency — synth-cli, synth-core, synth-frontend, synth-synthesis — are in the rechecked set, so the surface was reached rather than served from cache. v0.82's withdrawal was correct about the evidence then available and wrong about the size of the job: four sites, not an unbounded surface.

The refusal is the deliverable, so it is tested and proven potent

section_span(range, wasm) -> Result<Range<usize>> refuses on an over-wide value and on a range past the buffer end. as usize is what it exists not to be — it would turn a malformed 4 GiB-plus section offset into a wrong-bytes read, which compiles and runs and is wrong on a 64-bit host.

A green suite over the happy path is no evidence for a refusal, so the helper is tested directly (5 cases: range past the end, inverted range, the end == len / end == len + 1 boundary, bounds preserved on accept, a 4 GiB-plus offset into a 10-byte module) and mutation-proven:

mutation caught
bounds guard dropped entirely (the as usize shape) yes
off-by-one — accept end == len + 1 yes
inverted-range half of the disjunction dropped yes
overrun half of the disjunction dropped yes
#965 citation removed from the message yes

5 of 5. Every anchor was verified before any mutation was applied, and the file was restored byte-identically after each (diff -q IDENTICAL).

Reach is stated because it is not uniform across the three arms. The bounds arm is reachable and tested. The two usize::try_from arms cannot fire on any 64-bit target, where u64 -> usize is infallible — they are correct and defensive for a 32-bit host, and they are UNPROVEN here rather than claimed.

The constraint that held this for two releases was measured in the wrong units

"~12 GiB workspace build" was carried as the reason no local compile could measure this. That is a full build — codegen, linking, every rlib. cargo check does no codegen: 78 MB for -p synth-core, 629 MB / 14 s for --workspace --all-targets. Three must-lanes recorded UNPROVEN against a budget describing an operation none of them needed, and this artifact's own previous revision was one of them.

Named residual, not a fix

dwarf_line.rs:129 — code_base = range.start as u32 — compiles and truncates identically under both Range<usize> and Range<u64>, so it is pre-existing and was not introduced by this widening. It stays a recorded residual: code_base is a u32 public field whose consumer subtracts it from op_offsets, themselves u32, so a module whose code section starts past 4 GiB shares no address space with its own op offsets at all. The fix is not a wider type, and a guard here would be an untestable branch changing behaviour for no module synth can compile.

Issue state

#965 is CLOSED and was closed before this release, so this lane retires no open issue; issue-scope is omitted so the closure gate cannot read it as claiming one. What it does retire is the entire open-PR board — #1344, #1346, #1468, #1471 are the four held wasm-tools bumps, disposed of with this PR as the measured reason.

Refs #965

🤖 Generated with Claude Code

https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L

…asses the TRUNCATING one

THE SURFACE IS MEASURED AND THE BUMP IS NOT APPLIED, which is the order this artifact's own
description demands: the number comes ahead of the fix.

AND "FOUR IS A FLOOR" IS TRUE FOR A REASON THE ARTIFACT DID NOT GIVE. The inherited claim was
that v0.82's four errors are a floor because `synth-core` is the base crate and the downstream
surface was never reached. True, and incomplete. Measured statically at this commit:

  COMPILER-VISIBLE, 4 sites, all `arena_bind.rs` and all the same shape — slicing the original
  wasm buffer by a section range: :493 and :501 (`&wasm[reader.range()]`), :520
  (`&wasm[range.clone()]`), :554 (`&wasm[range]`, fed by `payload.as_section()` at :549). These
  are the sites the compiler REFUSES, because `[u8]` has no `Index<Range<u64>>`.

  COMPILER-INVISIBLE, 1 shipped site — `dwarf_line.rs:129`, `code_base = range.start as u32`.
  An `as` cast accepts BOTH `Range<usize>.start` and `Range<u64>.start`, so this site emits NO
  diagnostic before or after the widening and did not appear among v0.82's four errors.

PROVEN WITH A COMPILED PROBE RATHER THAN ARGUED: `rustc` accepts `a.start as u32` for a
`Range<usize>` AND a `Range<u64>` (rc=0), and `0x1_0000_0003` truncates to `3` under each. So
slice indexing refuses loudly while an existing `as` narrowing stays silent — the compiler's
reference comes from the type system, so it is blind in exactly the direction where a value is
ALREADY being discarded. A remedy that fixed only the four errors would have left
`dwarf_line.rs:129` quietly dropping the high half of a section offset, which is the exact class
this artifact's done-when forbids, sitting in code the type change never complained about.

WHAT IS NOT DELIVERED, stated rather than implied: the bump. Applying it means validating it and
validating it means a full workspace compile — the data volume is at 99% with ~5 GiB against a
~12 GiB build. Purging the shared `~/.cargo/registry` would reach roughly 11.5 GiB and is
DECLINED, because another session is building in `rivet-wt-kani` off that same registry and the
standing instruction is not to disturb it. FOUR crates declare a wasm-tools dependency — synth-cli
(1), synth-core (2), synth-frontend (4), synth-synthesis (1) — so the consumer graph is real and
its ERROR COUNT is UNPROVEN. This lane reports UNPROVEN rather than inventing a figure, and
reports the surface as STATIC rather than as a compile result.

REFUTING COMMAND RUN FIRST AND NEITHER HALF REFUTED: `grep -c 'wasmparser = "0.261"' Cargo.toml`
returns rc=1 count 0 with the declared floor still at "0.256", and FOUR dependabot PRs remain
open.

AND ONE INSTRUMENT ERROR WORTH THE RECORD, because it nearly produced a FALSE ZERO. The first
sweep for the invisible class used a pattern containing `\s` and returned ZERO hits from
`git grep -E`, which is POSIX ERE and does not support it — while the SAME pattern matched under
BSD `grep -E`, which accepts it as an extension. A zero from a broken pattern reads exactly like
an empty population. It was caught only because the known site was already in hand to serve as a
positive control; re-measured POSIX-safely the class is 3 hits, 1 of them shipped.

A SECOND OBSERVATION, recorded because it is this release's theme landing twice in one tick: R15
(the LANDEDBOTH lane, PR #1497, still open) would have RED this artifact's `landed:` placeholder
immediately — it carries no `#N` at all. On a branch based on main, which predates R15, the same
placeholder passes SILENTLY. The rule's absence is invisible in exactly the way its presence is
loud.

Gates: status_evidence rc=0, verdict_prose rc=0, claim_check 75/75, cargo fmt rc=0.

Refs #965 #465

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L
@avrabe
avrabe force-pushed the lane/v0.83-rangewiden branch from 8ea2bd0 to 318ebf9 Compare October 8, 2026 21:35
@temper-pulseengine

Copy link
Copy Markdown
Contributor

Automated review for PR #1498

pulseengine/synth:lane/v0.83-rangewiden → pulseengine/synth:main

Verdict: 💬 Comment

Summary: The code change is well-structured and follows best practices for Rust programming. The section_span function has been added to handle the new section range types introduced by wasmparser 0.261, ensuring that invalid offsets are refused instead of silently truncating them. The tests cover various scenarios to validate the correctness of the implementation.

Findings: 0 mechanical (rivet) · 1 from local AI model.

Findings (1):

  1. src/lib.rs:544
        let span = section_span(2..7, &wasm).expect("an in-bounds range must be accepted");
    
    The section_span function is correctly implemented to handle the new section range types introduced by wasmparser 0.261.

Generated by a local AI model and post-validated against a strict JSON contract. Each finding includes the verbatim line being criticised — verify by reading the file at the cited location.

Reviewed at 8ea2bd0

… the bump lands

v0.82 withdrew the wasm-tools 0.261 bump because the consumer surface behind
synth-core had never been reached — the compiler stops at the first crate that
fails, so its four errors were a floor of unknown height. This measures it.

The surface is ZERO. With a checked narrowing at the four arena_bind.rs sites,
`cargo check --workspace --all-targets` is rc=0 with 0 errors and 0 warnings;
all four crates declaring a wasm-tools dependency are in the rechecked set.
`cargo test --workspace` is rc=0, 3148 passed, 0 failed. Clippy with CI's exact
`-- -D warnings` is rc=0.

section_span() refuses rather than truncating: `as usize` would turn a malformed
4 GiB-plus section offset into a wrong-bytes read, which compiles and runs and
is wrong on a 64-bit host. The refusal IS the deliverable, so it is tested
directly (five cases) and proven potent by mutation — bounds guard removed, the
off-by-one, either half of the disjunction dropped, the citation removed: 5 of 5
caught, every anchor verified before any was applied, file restored byte-
identically after each.

Reach stated because it is not uniform: the bounds arm is reachable and tested;
the two `usize::try_from` arms cannot fire on a 64-bit target and are UNPROVEN
here rather than claimed.

And the constraint that held this for two releases was measured in the wrong
units. "~12 GiB workspace build" is a FULL build. `cargo check` does no codegen:
78 MB for -p synth-core, 629 MB for the whole workspace, 14 s. Three must-lanes
recorded UNPROVEN against a budget describing an operation none of them needed.

dwarf_line.rs:129 (`range.start as u32`) stays a named residual, not a fix: it
truncates identically under both types so it is pre-existing, and code_base is a
u32 whose consumer subtracts it from u32 op_offsets, so a module past 4 GiB
shares no address space with its own offsets at all.

Refs #965

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L
@avrabe
avrabe force-pushed the lane/v0.83-rangewiden branch from 318ebf9 to f22c776 Compare October 8, 2026 22:04
@codecov

codecov Bot commented Oct 8, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 92.85714% with 4 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
crates/synth-core/src/arena_bind.rs 92.85% 4 Missing ⚠️

📢 Thoughts on this report? Let us know!

@avrabe
avrabe merged commit 3d51c88 into main Oct 9, 2026
77 of 78 checks passed
@avrabe
avrabe deleted the lane/v0.83-rangewiden branch October 9, 2026 00:19
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