cli-tri's build job checks out no submodules, so the design tri rtl check is pointed at is an empty directory.
This is the third sequential cause in the same job. #2303 hoisted the yosys install above the tests; #2305 assigned dry_run_sweep_ok, which was declared false and never set. With both fixed, cargo test -p tri reports 156 passed; 0 failed and the job advances to a step that had never executed once in the workflow's history:
./target/debug/tri rtl check chips/phi --json
Error: No such file or directory (os error 2)
verdict lines: 0
##[error]tri rtl check emitted 0 verdicts; five checks should each emit one
Cause
chips/phi is a gitlink (mode 160000) to gHashTag/tt-trinity-phi, pinned at f5456685c3593665153fe2765c85bb1f46ec14c2. .github/workflows/cli-tri.yml line 33 is a bare
- uses: actions/checkout@v4
with no with: block, so submodules takes its default of false and chips/phi is an empty directory on the runner. The binary is fine; it has nothing to read.
The error is bare rather than descriptive because top_from_info in cli/tri/src/rtl.rs reads the file without context:
let text = std::fs::read_to_string(dir.join("info.yaml"))?;
while its sibling declared_sources wraps the same failure in .with_context(|| format!("no info.yaml at {}", ...)). The missing file therefore surfaces as an unattributed os error 2 instead of naming the path.
Why this is mechanical and not a secrets decision
submodules: true with the default GITHUB_TOKEN only works if the submodule is public — the token is scoped to this repository alone. All three submodules are public:
| submodule |
repo |
private |
size |
chips/phi |
gHashTag/tt-trinity-phi |
false |
941 KB |
chips/euler |
gHashTag/tt-trinity-euler |
false |
3,954 KB |
chips/gamma |
gHashTag/tt-trinity-gamma |
false |
5,365 KB |
submodules: true pulls all three, ~10.2 MB total. None of the three has a nested .gitmodules, so recursive buys nothing and true is the minimal setting.
The pinned commit f5456685 is reachable in tt-trinity-phi (dated 2026-05-18), so the checkout resolves rather than failing on an orphaned gitlink.
The fix produces five real verdicts, not just a non-empty directory
Checked against the pinned commit, not main:
info.yaml is present (3,830 bytes) and sets top_module: "tt_um_trinity_nano", so top_from_info resolves.
- It declares 49
source_files; src/ at that commit holds 51 .v files, and all 49 declared files resolve. Check 1, sources resolve, passes rather than merely emitting.
The remaining four checks come from a single yosys pass, and yosys is already on PATH from the install step #2303 added above this one.
Not in scope
The N < 5 assertion stays exactly as written. The step asserted five verdicts and got zero; that is the assertion doing its job. Making this check pass by expecting less is the failure this sequence has been closing. No other line of the workflow changes, and build is not being added to the required contexts.
cli-tri'sbuildjob checks out no submodules, so the designtri rtl checkis pointed at is an empty directory.This is the third sequential cause in the same job. #2303 hoisted the yosys install above the tests; #2305 assigned
dry_run_sweep_ok, which was declaredfalseand never set. With both fixed,cargo test -p trireports156 passed; 0 failedand the job advances to a step that had never executed once in the workflow's history:Cause
chips/phiis a gitlink (mode160000) togHashTag/tt-trinity-phi, pinned atf5456685c3593665153fe2765c85bb1f46ec14c2..github/workflows/cli-tri.ymlline 33 is a barewith no
with:block, sosubmodulestakes its default offalseandchips/phiis an empty directory on the runner. The binary is fine; it has nothing to read.The error is bare rather than descriptive because
top_from_infoincli/tri/src/rtl.rsreads the file without context:while its sibling
declared_sourceswraps the same failure in.with_context(|| format!("no info.yaml at {}", ...)). The missing file therefore surfaces as an unattributedos error 2instead of naming the path.Why this is mechanical and not a secrets decision
submodules: truewith the defaultGITHUB_TOKENonly works if the submodule is public — the token is scoped to this repository alone. All three submodules are public:chips/phigHashTag/tt-trinity-phifalsechips/eulergHashTag/tt-trinity-eulerfalsechips/gammagHashTag/tt-trinity-gammafalsesubmodules: truepulls all three, ~10.2 MB total. None of the three has a nested.gitmodules, sorecursivebuys nothing andtrueis the minimal setting.The pinned commit
f5456685is reachable intt-trinity-phi(dated 2026-05-18), so the checkout resolves rather than failing on an orphaned gitlink.The fix produces five real verdicts, not just a non-empty directory
Checked against the pinned commit, not
main:info.yamlis present (3,830 bytes) and setstop_module: "tt_um_trinity_nano", sotop_from_inforesolves.source_files;src/at that commit holds 51.vfiles, and all 49 declared files resolve. Check 1,sources resolve, passes rather than merely emitting.The remaining four checks come from a single yosys pass, and yosys is already on
PATHfrom the install step #2303 added above this one.Not in scope
The
N < 5assertion stays exactly as written. The step asserted five verdicts and got zero; that is the assertion doing its job. Making this check pass by expecting less is the failure this sequence has been closing. No other line of the workflow changes, andbuildis not being added to the required contexts.