Skip to content

feat(tri): vsim funnel -- how far each spec gets when its Verilog is RUN - #2993

Merged
gHashTag merged 4 commits into
masterfrom
w42-tri-vsim
Aug 30, 2026
Merged

feat(tri): vsim funnel -- how far each spec gets when its Verilog is RUN#2993
gHashTag merged 4 commits into
masterfrom
w42-tri-vsim

Conversation

@gHashTag

Copy link
Copy Markdown
Owner

The one arm of this compiler that can catch a defect whose whole nature is that
it compiles is the one that simulates. Its gate has had no targets since
specs/scratch was untracked in #2283tri vsim funnel does not repair that
(#2987 is half a line and half a decision about 260 baselines for subjects that
no longer exist), it makes the measurement available while the decision waits.

Pointing it at the corpus by hand, once, produced four defects in one sitting:
#2988, #2989, #2990 and #2869.

Measured at 487003fb9, over 650 specs

  refused by gen-verilog-for-simulation    69
  iverilog rejected the testbench         410
  simulation exited non-zero                0
  ran and REPORTED FAILURES                10
  ran and produced a verdict              106
  ran, exit 0, and said NOTHING            55
  timed out at 60s                          0

  650 of 650 accounted for.

The ten reporting failures right now: fpga/bpsk, fpga/mac, fpga/spi,
fpga/top_level, fpga/verification/build_verify, numeric/gft64,
numeric/gft128, numeric/gft256, server/api, trinet/etx. (etx is the
one #2991 repairs, so this list is nine the moment that lands.)

Three properties worth naming

  • silent is its own row. run_icarus_simulate bails only on a line saying
    FAILED, so the testbench checked everything and passed and the testbench
    checked nothing
    are the same exit code. A spec in that row is not passing —
    nothing asked it anything.
  • One TMPDIR per spec. run_icarus_simulate writes
    <temp_dir>/t27c_icarus_<file_stem>.v, keyed on the BASENAME alone, and this
    corpus shares stems — two specs would overwrite each other's Verilog.
  • It refuses rather than reporting zeros. With no iverilog on PATH every
    spec lands in elab and the table reads as a corpus-wide regression, so the
    command says so and exits non-zero. It asks the OS rather than matching an
    error message — ci-gates 426, written after that exact guard failed in CI on
    fix(verilog): a real value must not travel in an integer container (+6 declared tests, 0 regressions) #2991 an hour earlier.

It reports and never gates. Which of the ten are compiler defects and which are
spec defects is not a question a walker may answer, and #2987 says so.

Honesty

  • 5 unit tests, all on the verdict reader — the one decision with a wrong
    answer available: : starting and : NOT CHECKED are not verdicts, and
    counting either would make the silent row permanently zero.
  • The parts sum to the total, and the command prints the mismatch if they ever
    stop.
  • rustfmt applied to the new leaf module only; git status confirms no other
    file moved (the crate-root trap from an earlier pass).
  • The first commit's message lost the word silent to a backtick substitution
    in git commit -m "...". It is pushed and this repository forbids
    force-pushing, so the second commit carries the correction and ci-gates 427
    closes the class that 418 named too narrowly.

Refs #2987

🤖 Generated with Claude Code

claude and others added 2 commits August 31, 2026 04:39
The one arm that can catch a defect whose nature is that it COMPILES is the one
that simulates, and its gate has had no targets since specs/scratch was
untracked in #2283 (#2987). Pointing it at the corpus by hand produced four
defects in one sitting: #2988, #2989, #2990 and #2869.

Repairing the gate is half a line and half a decision about 260 baselines for
subjects that no longer exist. The measurement should not wait for it.

Measured at 487003f over 650 specs:
  refused by gen-verilog-for-simulation    69
  iverilog rejected the testbench         410
  simulation exited non-zero                0
  ran and REPORTED FAILURES                10
  ran and produced a verdict              106
  ran, exit 0, and said NOTHING            55
  650 of 650 accounted for.

Three properties worth naming:

*  is its own row. run_icarus_simulate bails only on a line saying
  FAILED, so `checked everything and passed` and `checked nothing` are the
  same exit code. A spec there is not passing; nothing asked it anything.
* One TMPDIR per spec, because run_icarus_simulate keys its scratch file on the
  BASENAME alone and this corpus shares stems.
* It refuses when iverilog or t27c is absent rather than printing a table it did
  not earn, and asks the OS rather than matching an error message (ci-gates 426).

It reports and never gates: which of the 10 are compiler defects and which are
spec defects is not a question a walker may answer.

Refs #2987
The message for `tri vsim funnel` was passed inline to `git commit -m "..."`.
Double quotes do not stop command substitution, so the span naming the `silent`
row was executed and removed:

    * `silent` is its own row.      ->      *  is its own row.

zsh printed `command not found: silent`, which is the only reason it was seen.
The commit is pushed and this repository forbids force-pushing, so the message
stands with the hole and this is the correction. The missing word is `silent` --
the row for a spec that ran, exited 0, and printed no verdict line at all.

ci-gates 418 already says to quote a heredoc delimiter when the body carries a
backtick. That is too narrow: this went through the argument list instead. 427
names the class -- prose containing a backtick never reaches the shell as an
argument; write it to a file or pipe it through a QUOTED heredoc and let git
read it with `-F -`.

Third occurrence in this repository's log, which by its own rule means the cure
was wrong rather than that this is another case.

Refs #2987
@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-30 21:41:14 UTC

Summary

Status Count
Total Open PRs 9
PRs with Failing Checks 7
PRs with All Checks Green 2
READY 0
FAILING 7
PENDING 0

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=fd01b746e208 != 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).

# Conflicts:
#	.claude/skills/ci-gates/SKILL.md
…cking gate

Measured with a committed entry in the wrong shape:

  tri hooks now-gate      exit 0    "NOW gate PASSED"
  t27c check-now          exit 0    "build authorized"
  scripts/verify.sh                 "gates:OK"
  check_now_entry_shape   exit 1    "FAIL: 1 of 3 entr(y/ies) do not say
                                     anything checkable"

The last is the REQUIRED `check` context. docs/now/README.md documents the other
gate's three conditions and then says the same three are what the local tools
enforce; the shape condition -- a `# NOW -- <title> (YYYY-MM-DD)` first line and
a `## ` section heading -- is previewed by nothing. The two local tools also name
a different entry than the one the change adds: they answer "is the newest entry
fresh", not "is the added entry well formed".

Found by paying for it: this made `check` red on #2991.

Refs #2987
@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-30 21:55:33 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)=fd84214651ae != 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 eecb818 into master Aug 30, 2026
36 checks passed
@gHashTag
gHashTag deleted the w42-tri-vsim branch August 30, 2026 22:05
gHashTag added a commit that referenced this pull request Aug 30, 2026
`tri vsim funnel` shipped in #2993 with two arms returning `Stage::Gen` for
states nobody had measured: a process that could not be spawned, and a failure
whose message matched none of the four patterns. Both file a hole in this reader
as a verdict about the spec -- the shape ci-gates 428 names, written in the same
session and then present in my own code.

  * new `Unattributed` stage, with its own printed row
  * attribution extracted into `attribute_failure(&log)`, so the decision can be
    tested without spawning anything
  * two tests: a message matching no arm is Unattributed and NOT Gen; and each
    of the four arms is reachable by the compiler's own words

Measured over 650 specs at d7f20a5: the new row reads 0 and every other row is
identical (69 / 410 / 0 / 9 / 107 / 55 / 0). Nothing was being misfiled today --
the change is preventive, and the zero is printed beside the hits because a
reader cannot otherwise tell "none" from "not looked for".

Refs #2987
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