You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
spec-guards differential: ring-096 REFUSED -- specs/numeric/formats.t27 has no function bodies #6893
Once the drift is fixed (#6887), ring-096-rust / specs/numeric/formats.t27 reads CONVERGED, so the spec-guards step "Run each CONVERGED pair on the same inputs" runs it. Measured on the t27c Railway lab at 6156948 (branch fix/spec-guards-ring-096):
python3 tools/ring_spec_differential.py rings/ring-096-rust specs/numeric/formats.t27
stripped 2 inner doc-comment/attribute line(s) from rings/ring-096-rust/src/lib.rs so it can be included as a module
covered 2 of 6 identical-signature functions
REFUSED 4 -- these were NOT tested:
f32_to_ternary: return type Trit
format_bytes: parameter type Format
quantize_value: parameter type Format
ternary_to_f32: parameter type Trit
exit 2
This is an honest "could not test", not a pass and not a disagreement. There are three causes:
The spec has no bodies. All six functions in formats.t27 are fn ... { }, which gen-rust lowers to unimplemented!(). Even the two covered functions (gf16_to_f32, f32_to_gf16) can only disagree with the ring until the spec says what they compute. The SSOT bodies exist in specs/numeric/gf16.t27 (gf16_decode_to_f32, gf16_encode_f32).
The harness cannot build Format or Trit. Neither type has a producer, which is a spec function returning that type from grid-only parameters.
Harness detail. The blank line where the cases N agree N line should be is real. The producer call that builds the f32 argument (spec::gf16_to_f32) runs outside catch_unwind. It panics on unimplemented!(), so the whole harness process dies before printing. The exit code is still 2 because of the refusals, so nothing is hidden. But a "producer panicked" case should be reported as a difference, not as silence.
Done when
formats.t27 either gets bodies or delegates to the gf16 SSOT functions, so gen-rust emits real code.
ring_spec_differential.py rings/ring-096-rust specs/numeric/formats.t27 either exits 0 with all six functions covered, or names its disagreements.
The harness reports a producer panic as a disagreement and no longer dies silently. This is a separate change to tools/ring_spec_differential.py, which is Python; under the only-t27 rule it needs the owner's label or a t27 port.
Until then, the spec-guards job is red at this step on any PR that reaches it. On master today, tools/published_figures.py --check fails earlier in the same job: 8 drifted figures, independent of this pair.
Label owner-approved-foreign added under the owner's standing rule of 2026-10-06 (add the label yourself and do the work).
What it covers: tools/ring_spec_differential.py, the harness this issue names. The change is limited to three things:
Enum inputs and outputs. The harness reads the variants of each pub enum on both sides. It pairs them case-insensitively and refuses if they do not pair one to one. Enum parameters are then built by index, and enum returns are compared by variant name.
A float input grid. It covers signed zeros, ties, denormals, the overflow edge, +/-Inf and NaN. Float parameters are no longer only whatever a u16 -> f32 decoder happens to produce. Floats are still compared by {:?}, which round-trips exactly and tells -0.0 from 0.0.
Producer panics. A producer call that panics on one side only is counted as a disagreement; it no longer kills the harness without output.
The spec side is in .t27: the bodies of specs/numeric/formats.t27. The path is listed in tools/policy/foreign-exceptions.txt until PR #6894 merges.
Activity
gHashTag commentedon Oct 6, 2026
Label
owner-approved-foreignadded under the owner's standing rule of 2026-10-06 (add the label yourself and do the work).What it covers:
tools/ring_spec_differential.py, the harness this issue names. The change is limited to three things:pub enumon both sides. It pairs them case-insensitively and refuses if they do not pair one to one. Enum parameters are then built by index, and enum returns are compared by variant name.u16 -> f32decoder happens to produce. Floats are still compared by{:?}, which round-trips exactly and tells -0.0 from 0.0.The spec side is in .t27: the bodies of
specs/numeric/formats.t27. The path is listed intools/policy/foreign-exceptions.txtuntil PR #6894 merges.numeric/formats: implement the codec bodies; ring-096 encodes denormals
spec-guards: published figures follow the corpus; harness learns enum…
numeric/formats: build the decoded NaN through a typed local
reseal formats.t27 after NaN typed-local fix (lab, 34/34)
fix(numeric): settle gf16.t27 against FORMAT-SPEC-001 -- no subnormal…
feat(t27b): std.mem.eql/indexOf on byte slices and byte-array pointers (
gHashTag commentedon Oct 6, 2026
Landed on master via #6969 (2116d20), which carried #6894's commits.
fix(codegen): gen-rust enum order and gen-zig float-call cast (#6941) (…