Skip to content

The census counted parse failures it never had - #2886

Merged
gHashTag merged 1 commit into
masterfrom
name-the-blind-spot
Aug 29, 2026
Merged

The census counted parse failures it never had#2886
gHashTag merged 1 commit into
masterfrom
name-the-blind-spot

Conversation

@gHashTag

Copy link
Copy Markdown
Owner

tri unparsed called every non-zero t27c check "the compiler cannot read".
Of 97 such specs, only 79 fail at parse:

stage count
parse 79 the census operates here
typecheck 13 they parse perfectly
lex 4 unterminated string literal
semantic 1 nested fn captures enclosing locals

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 exactly that
line, 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

row probe (rejected) counter (compiles)
&[_]T{} anonymous array literal &[_][]const u8{} [ 1, 2 ]
;; statement terminated twice print("hi");; print("hi");
}; a brace with nothing open trailing }; no trailing brace
pub use NAME; pub use session_timeout; use session_timeout;
fn(a: T) R { } anonymous fn literal const h = fn(e: E) void { }; const h = handler;
  blind spot          32 -> 10
  construct NAMED     43 -> 53
  counters compiling  16 of 16

is_assignment joins 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:

loosest rule     fired on 8925 lines inside specs that PARSE
+ no brackets    97
+ sentence-like  42, and it lost 2 of the 5 real cases

Tuning was not the problem. Acceptance is position-dependent:
specs/api/sdk_contract.t27 parses while carrying

fn random(dim: usize, seed: u64) -> Hypervector
    Create random hypervector

so 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 I
could 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

  specs tracked                       745
  ... refused at PARSE                 79   <- this census
  ... refused at TYPECHECK             13
  ... refused at LEX                    4
  ... refused on SEMANTICS              1
  ... construct NAMED and PROBED       53
  ... cause is UPSTREAM, not named     16
  ... not decided, nothing claimed     10
  broken ON PURPOSE under fixtures/    21
  constructs the compiler now ACCEPTS   2

53 + 16 + 10 = 79. The parts sum to the stage they belong to.
--list now prints the undecided lines, so the blind spot is visible rather
than 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 tri 0 (17 tests in unparsed.rs) ·
rustfmt --check cli/tri/src/unparsed.rs 0.

bootstrap/src/compiler.rs is untouched, so FROZEN_HASH does not move.

Refs #2864

`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
gHashTag enabled auto-merge (squash) August 29, 2026 21:16
@github-actions

Copy link
Copy Markdown
Contributor

📓 NotebookLM Notebook linked to this PR

This notebook contains session context, decisions, and artifacts for this work.

@github-actions

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-08-29 21:17:06 UTC

Summary

Status Count
Total Open PRs 8
PRs with Failing Checks 7
PRs with All Checks Green 1
READY 0
FAILING 7
PENDING 0

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=f569da0c6c14 != manifest seal=87e5cbd3ad94.
    The committed NMSE numbers were certified against an older compiler.rs.
    Run scripts/reseal-check.sh locally for the two-step reseal command (advisory; not a merge gate).

@gHashTag
gHashTag merged commit 254141a into master Aug 29, 2026
25 of 27 checks passed
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.

2 participants