The census counted parse failures it never had - #2886
Merged
Conversation
`tri unparsed` called every non-zero `t27c check` "the compiler cannot read".
Of 97 such specs only 79 fail at PARSE. Thirteen parse perfectly and fail type
checking, four die in the lexer on an unterminated string, one is a semantic
refusal.
That is a category error, not a rounding difference: the census read a
CONSTRUCT off the failing line of a TYPE error. `specs/numeric/gf8.t27` stops
at `exp = exp + 1;` -- an assignment that compiles -- rejected as
`cannot assign F64 to F32`. Seven gf* specs sat in the residue on that line,
and the residue was the census's own confusion.
The stage split is checked BOTH ways: no typecheck output contains a parse
word, and no parse output contains "Typecheck".
Five constructs added, each with its probe and counter:
&[_]T{} anonymous array literal ([ 1, 2 ] compiles)
;; statement terminated twice (one semicolon compiles)
}; a brace with nothing open
pub use NAME; visibility on a use (use NAME; compiles)
fn(a: T) R { } anonymous fn literal (a named fn compiles)
blind spot 32 -> 10
construct NAMED 43 -> 53
counters compiling 16 of 16
`is_assignment` joins the abstention, justified by probe: `x = x + 1;`
compiles, so a failing line that is one is a symptom.
TWO ROWS WERE NOT SHIPPED, and both refusals are the point.
A prose row was built and measured out. Prose does stop the parser -- its probe
is rejected -- but acceptance is POSITION-DEPENDENT: sdk_contract.t27 parses
while carrying a paragraph after a body-less signature. The loosest rule fired
on 8925 lines inside specs that PARSE; tightening reached 42 while losing 2 of
the 5 real cases. No line-level matcher is faithful to that at any threshold.
The reason is in the source where the next person will look. Shipping it would
have made the residue read 5 instead of 10.
A switch-prong row has no honest probe: the form copied VERBATIM from a parsing
spec is rejected in isolation. A category you cannot isolate is one you cannot
claim, so the line stays undecided.
`bootstrap/src/compiler.rs` untouched; FROZEN_HASH does not move.
Refs #2864
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
gHashTag
enabled auto-merge (squash)
August 29, 2026 21:16
Contributor
|
📓 NotebookLM Notebook linked to this PR
This notebook contains session context, decisions, and artifacts for this work. |
Contributor
PR DashboardGenerated at: 2026-08-29 21:17:06 UTC
Summary
Seal Status
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
tri unparsedcalled every non-zerot27c check"the compiler cannot read".Of 97 such specs, only 79 fail at parse:
That is a category error, not a rounding difference: the census read a
construct off the failing line of a type error.
specs/numeric/gf8.t27stops at
exp = exp + 1;— an assignment that compiles — rejected ascannot assign F64 to F32. Sevengf*specs sat in the residue on exactly thatline, and the residue was the census's own confusion.
The discriminator is checked both ways: no typecheck output contains a parse
word, and no parse output contains
Typecheck.Five constructs added, each with probe and counter
&[_]T{}anonymous array literal&[_][]const u8{}[ 1, 2 ];;statement terminated twiceprint("hi");;print("hi");};a brace with nothing open};pub use NAME;pub use session_timeout;use session_timeout;fn(a: T) R { }anonymous fn literalconst h = fn(e: E) void { };const h = handler;is_assignmentjoins the abstention, justified by its own probe:x = x + 1;compiles, so a failing line that is one is a symptom.
Two rows were NOT shipped, and both refusals are the point
Prose. A paragraph where a declaration belongs does stop the parser — its
probe is rejected — so a row looked obvious. Then the control:
Tuning was not the problem. Acceptance is position-dependent:
specs/api/sdk_contract.t27parses while carryingso the same words after a body-less signature are fine. No line-level matcher
is faithful to that at any threshold. The row came out, the reason went into the
source, and the six specs went back into the blind spot — where
tri prose report, which asks the compiler line by line, already answers them.Shipping it would have made the residue read 5 instead of 10.
A switch prong.
.module => "module",looks like an easy row. Every probe Icould write fails — including the form copied verbatim from a spec that
parses, because in isolation it needs context the snippet does not carry. No
honest probe, therefore no row.
The census now
53 + 16 + 10 = 79. The parts sum to the stage they belong to.
--listnow prints the undecided lines, so the blind spot is visible ratherthan carried.
Gates, run locally
specs generate 0 · specs parse 0 · conflict markers 0 · seals fresh 0 ·
types ratchet 0 · skill check 0 · prose report 0 · unparsed probe 0 ·
cargo test -p tri0 (17 tests inunparsed.rs) ·rustfmt --check cli/tri/src/unparsed.rs0.bootstrap/src/compiler.rsis untouched, soFROZEN_HASHdoes not move.Refs #2864