Repository navigation
[EPIC] t27b for t27o: every spec t27o emits runs natively under t27b and agrees with t27c (100 %) #10879
Description
Goal
Every spec t27o emits -- from Rust (rust_convert.t27), Zig (zig_convert.t27) and SPICE (spice_convert.t27) -- runs under t27b test (the native JIT) and agrees with the reference (t27c test-report). Then tri t27o --check never falls back to the reference (0.89 s against 94 s on rust_std.t27), and a whole-tree golden check is seconds, not hours. Owner, 2026-10-19 (translated): "study how to strengthen t27b for t27o -- maximally, 100 %". Part of #10522; t27b's own epic is #8326, its full-generation track #6198.
Why this matters
tri t27o --check runs t27b test first and falls back to t27c test-report only when t27b cannot judge (#10525). Tonight a converted file already hit t27b: unsupported construct ExprCall(undeclared fn) ... (call to type_text::same): every converted text comparison goes through that used fn. Each such gap sends a spec to the 100x slower path, and a disagreement between the two would make "golden" depend on which runner ran.
Plan
- Measure (step 1): the corpus of t27o output -- every converted spec of the five roadmap repositories (Rust, end-of-night converter) and of trinity
src/+ trioscrates/(Zig, t27o: Zig front end, step 1 -- zig_convert.t27 converts tier-1 fns and containers and translates the file's own tests into the oracle (Closes #10765) #10819) -- undert27b corpus <dir> --blockers(greedy unlock order) and, on a sample,--reference(disagreement). Headline: t27b acceptance of t27o output, and the ranked missing constructs. - Close the gaps in that order, each one PR: the decision in a
specs/tri/t27b/*_plan.t27(reuse the area's existing plan), tests with a negative control, the gen file regenerated,cli/t27bhand lines net <= 0 (epic: t27b in t27 -- port the backend and its tooling from Rust/Python into .t27 #6198, policy: hand-written code in any language but t27 may only shrink (Closes #8227) #8236), the t27b ledger rows left to the steward (t27b ledger steward: rules and job card, so spec PRs stop editing the ledger #8654). - Ratchet: the acceptance rate of t27o output only rises; a converter change that emits a construct t27b lacks is caught before it lands (a check in the t27o review checklist, then in CI).
Done when
t27b accepts 100 % of the t27o corpus that t27c accepts, with 0 disagreements on the full corpus (t27b corpus --reference), or every remaining gap has its own issue with the construct named.
Boundary
- May touch:
specs/tri/t27b/*.t27, their gen files and seals,cli/t27b/src(net <= 0 hand lines),specs/tools/t27o/*only where the converter can emit a form t27b already has with the same meaning. - Must not touch:
docs/reports/t27b_expectations.json(the steward writes it),spice_convert.t27(the analog loop).
Activity
gHashTag commentedon Oct 19, 2026
Step 1 measured (master 57aa3bc; data: the lane's RESULTS.txt)
Corpus: every t27o output with at least one converted fn or test -- Rust: 492 specs from all 1,388 tracked
.rsfiles of the five roadmap repositories; Zig: 724 specs from trinitysrc/+ trioscrates/(#10819).lazy_sig_plan.t27), not for bodies or consts.--checkadds oracle tests); the acceptance metric counts them, the golden metric must not.use tri::crypto::sha256(orhex,sha512) next touse tri::t27b::type_textbreaksuseresolution in t27c too -- both declaresame(t27c gen: two imported modules that each declare a helper of the same name make the splicer drop both, so a pulled function loses its own helper #10556);tri t27o --checkcannot passbootstrap/src/compiler.rsormain.rstoday under either runner.gHashTag commentedon Oct 19, 2026
Progress 2026-10-19 evening.
Merged:
specs/compiler/use_splice.t27, net -112 hand lines). This is thesame/type_textblocker named in the side finding;tri t27o --checkoncompiler.rsgoes from BLOCKED to t27c 87/87.Open, next lane (TB2, running): #10899 and #10903 (unreferenced module constants, the constant variant of the #10897 rule), then #10901 (type mismatch in an unreached fn) and #10900 (array literals).
Note: these four issues had been closed as "not planned" by the issue-shape gate at 06:38Z and were reopened by the self-heal of #11007; the gate itself is fixed by #11008.
gHashTag commentedon Oct 19, 2026
Progress 2026-10-19, late.
Merged: #11046 (closes #10899, #10903 and #11053). A module constant nothing analyzed reaches is lazy like an unreached body; the reach (
analyzedinast_shape.t27) now covers constants and subsumes two hand-written exemptions (cli/t27b hand lines +27 -28, net -1). The same PR closes the hole in #10999: a local of a type declared nowhere, in an unreached fn, keeps its refusal.Measured (t27b built from the branch against the master build,
--jobs 1): Rust 421 -> 434, Zig 710 -> 710, total 1,131 -> 1,144 of 1,216 (94.1%), unsupported 68 -> 55; 13 specs gained, none lost, no per-test verdict changed;--reference t27cover the 13 and over the two newly decided tracked specs: 0 disagreements. cargo test -p t27b green on linux and macos; ledger rows recounted in the PR (specs/lsp/schema.t27pass, cap 127).Left on this epic: #10901 (type mismatch in an unreached fn, +8 specs in the first measurement) and #10900 (array literals, +8); the 55 specs t27c cannot compile were made valid or refused by #10976; the real gap (t27c passes, t27b refuses) was 21 specs after #10999 and has not been re-measured since #11046; the next lane runs
t27b corpus --blockersfirst.