Repository navigation
epic: t27 vs direct Verilog on spec-to-RTL -- close the model-matrix gap (Build-A-Chip-Bench proxy) #10066
Copy link
Copy link
Open
Labels
Description
Close the gap between a model writing .t27 (compiled by t27b verilog) and the same model writing
Verilog directly, then measure whether t27's in-spec tests let it pull ahead.
Where we stand (2026-10-18)
Proxy for Build-A-Chip-Bench: the 10 smallest CVDP cid003 spec-to-RTL tasks, one shot, the same
prompts for every model. Gates: G1 cocotb/Icarus, G2 Yosys, G3 ORFS nangate45 with 0 DRC and
hold >= 0, G4 setup >= 0 at 2.5 ns. All runs were on the Railway lab.
Tasks passing all gates, of 10:
| Model | A: direct Verilog | B: .t27 -> t27b | B - A | Writer cost A / B |
|---|---|---|---|---|
| Claude Sonnet 5.5 | 9 | 7 | -2 | ~$0.41 / ~$0.77 |
| Claude Opus 5.5 | 8 | 7 | -1 | ~$0.99 / ~$1.53 |
| GLM-4.7-flash (z.ai free) | 5 | 2 | -3 | $0 / $0 |
- Direct Verilog wins on every model. On the Claude models, B's losses are t27 tool gaps, not wrong
designs. GLM-flash could not write parseable t27 from a one-page guide (5 of 10 failed to parse). - Claude dollar figures are estimates at assumed list prices.
- Sonnet beat Opus at about 40% of the cost: route spec-to-RTL work to Sonnet by default.
- N = 10 and a single shot, so a one-task gap is noise. The robust parts are the direction (3 of 3
models) and GLM's -3.
Sub-tasks
Tool gaps, cheapest first:
- t27b verilog: fold a constant rst_n/en tie-off out of the clocked process #10046 fold a constant
rst_n/entie-off out of the clocked process (PR fix(t27b): fold a constant rst_n/en tie-off out of the clocked process (Closes #10046) #10057, merged) - t27b verilog: a port cannot be named after a t27 keyword (in, for, ...) #10061 a port cannot be named after a t27 keyword (
in). The shape gate closed the issue;
the fix is in progress. - odd-width
uNas a fn param/return type and inas uNcasts (issue to be filed by the
session that took it) - no test bench when the clock is a renamed net (
clk = i_clk) -
t27b testJIT runs only on arm64, but the lab is x86_64. Writers cannot run their own tests. - signed
iN, arrays and Verilogparameterint27b verilog
Learnability:
- parser hints for foreign syntax:
let,loop,as u3and Rust-style returns get a "use X"
message - a worked-examples guide (10 small modules) generated from specs, replacing the one-page
cheat sheet
Measurement:
- re-run the matrix after the tool gaps land, with a compile/check feedback loop (at most 3
iterations) for both arms - the full cid003 set, pass@3, one harness for every model, and tasks whose tests probe hidden
internal names filtered out - one paid non-Anthropic model, once a provider balance exists (all paid GLM tiers answer 1113)
EDA in t27:
- turn
specs/igla/race/eda.t27from a data model into a real gate that reads ORFS reports
(DRC, WNS, area)
Boundary
- specs/tri/t27b/verilog_emit.t27
- specs/tri/t27b/verilog_plan.t27
- specs/igla/race/eda.t27
User Scenarios
- Given a CVDP task prompt when a model writes
.t27andt27b verilogcompiles it then
the emitted module matches the task's interface and passes the same four gates as hand Verilog.
Requirements
- FR-001: Every tool fix MUST land as a
.t27change withtestblocks and a negative control. - FR-002: Every published number MUST come from a lab run with receipts (logs + sha256).
- FR-003: The headline MUST say only what the model x arm x gate table supports.
Success Criteria
- Sonnet 5.5 arm B reaches 9 of 10 tasks on the same 10-task set (tie with arm A).
- With a feedback loop, arm B is at or above arm A on at least 2 of 3 models over at least 30 tasks.
- GLM-flash arm B parses at least 8 of 10 specs.
Reactions are currently unavailable
Activity
gHashTag commentedon Oct 17, 2026
Odd-width casts (
as u3,as u12) for the proxy run: #10072, PR #10084.feat: t27_check -- parse and typecheck .t27 source, with a fix hint f…
feat: t27_spec brief by default; field lists and failure reasons come…
spec(t27mcp): check_hints -- compiler message to a short fix hint for…
t27c: accept uN casts, 1 <= N <= 64, decided in int_type_names.t27 (C…
feat(t27mcp): spec_brief -- brief spec row fields and failure-reason …
feat(t27mcp): find.t27 -- t27_find, intent to ranked corpus specs or …
feat: t27_find -- intent to ranked corpus specs, or an honest miss
feat(t27mcp): dashboard.t27 -- grades and next step of the t27 MCP se…
feat(t27o): obligation ledger -- per-fn status, oracle outcomes, proo…
feat(t27mcp): telegram.t27 -- the owner's Telegram account as read-on…
feat: tg_* tools -- the owner's Telegram account, read-only, graded b…
spec(t27mcp): seal_verdict -- the seal receipt of t27_spec (#10066) (#…
spec(t27mcp): seal_verdict -- the seal receipt of t27_spec
feat(tg): tg_* tools read the owner's Telegram through the VIBEE app,…
specs(t27mcp): telegram.t27 names the owner's app TRI CLAW
docs(tg): the owner's app is TRI CLAW in the tg_* texts, README and b…
specs(t27mcp): telegram.t27 reads Telegram through the VIBEE app (refs …
gHashTag commentedon Oct 18, 2026
t27-mcp measurement: does the MCP server help cheap models write correct .t27? (10 tasks x 2 models x 2 arms)
Short answer. On these 10 tasks the MCP server made Sonnet 5.5 about 2x cheaper (same 10/10 correctness). It did not measurably help GLM-4.7-flash on correctness (4/10 with MCP vs 5/10 without, within noise at N=10). Sonnet hit a ceiling, so this set cannot show a correctness effect for it.
Design
mcp: the t27-mcp tools (t27_check,t27_examples,t27_spec,t27_grep,t27_find) are available.plain: nomcp__t27__*tools; the same read-only corpus (specs, docs, CLAUDE.md, AGENTS.md at a18d7ee) is readable by file tools in both arms, so the baseline is strong.t27_check, becauseok:trueis not correctness, t27#8087). The model's file is run throught27c test-reporton the Railway lab. A pass needs: the model's own tests pass, at least 2 tests, 0 vacuous, AND a hidden oracle test block (appended by the gate, never shown to the model) compiles and passes. Reference solutions pass the gate; 4 negative controls (wrong behaviour that still compiles) fail it as intended.gate.sh, which stops after 3). Pass = gate passes within 3 attempts.claude -pcannot run Anthropic models here) and GLM-4.7-flash (claude -pon z.ai, free tier).Results (pass = hidden-oracle gate, 0 vacuous, <= 3 attempts)
Details behind the columns:
ToolSearchper task that loads the MCP tool schemas); uncached input 124 / 184; cache write 380,524 / 786,904; cache read 3,093,880 / 6,409,004; output 15,600 / 22,963 (output = max(reported, chars/4); streaming records under-count).total_cost_usdas notional (flash tier is free), so cost per passing task is $0 actual and the notional figure is not reported. The MCP arm's GLM runs made 51 MCP calls in total, but only 7 weret27_check; the model's retry loop is driven bygate.shin both arms.What this supports and what it does not
Harness differences and deviations (disclosed)
plainarm the MCP tools were excluded by instruction only; I audited the subagent transcripts: zeromcp__t27__*calls. The GLMplainarm has no MCP server configured (--strict-mcp-config), also zero calls.glm-infra-failed/). A run counts only if the gate reached a pass or three failed attempts, or the model ended normally. 01-glm-mcp was re-run once more because its first run had been orphaned by a killed runner (superseded transcript kept).Receipts
mcp_bench_receipts.tgz, 12.6 MB, sha2567f92eee49537df22624ce2817209679b1c1a945ad1f76a29511fe782371239bb. Contents: task statements, hidden oracles and reference solutions, all prompts, every gate attempt file and output per run (runs/<id>/attempt-N.t27|out,log), Sonnet usage JSON plus the 20 subagent transcripts, the 20 GLM stream-json transcripts plus discarded API-error runs, the harness scripts, and the runner log. Scanned for secrets before packing (key values from the environment and common token patterns): none found. The archive is in the side-session notes folder of the starting session (not uploaded to GitHub; ask for a release asset if wanted).Follow-ups worth a separate issue: (1) tier-B tasks to get past the Sonnet ceiling, (2) classify why 01, 05, 06, 07 fail for GLM in both arms (probably a language-feature gap the MCP examples do not cover), (3) a
t27_check-in-the-loop variant where the gate command is withheld so MCP is the only compile feedback.