Parent: #495 Related: #630, #646
Evidence
Fresh Linux private-abi-boundary reaches the consumer-provider fixtures after the earlier audits pass, then executes /home/runner/Code/Home/lang/zig-out/bin/home-tool instead of the checked-out pinned runtime at $GITHUB_WORKSPACE/Home/lang/zig-out/bin/home-tool: https://github.com/zig-utils/zig-js/actions/runs/32388315489/job/96488305107
The job exports HOME_TOOL, but an earlier zig build home-tool-bootstrap configures the same no-option build graph before the runtime exists and resolves build.zig through its $HOME/Code/Home/... fallback. Later private-ABI commands omit -Dhome-tool, so cached command identity can retain the stale fallback. The first audit invocation already passes the option explicitly and succeeds.
Required change
- Pass the pinned checked-out Home tool path as an explicit
-Dhome-tooloption to everyzig buildinvocation in the private-ABI boundary matrix leg. - Keep one wrapper/definition so new commands cannot silently omit it.
- Preserve all Debug, ReleaseSafe, TSan, Home-profile, Bun-profile, filtered unit, and mixed-profile gates.
- Validate the exact consumer-provider fixtures that failed, then the complete Linux private-ABI leg.
No-workaround rules
No PATH alias, copied fallback binary, skipped provider fixtures, removed build modes, cache deletion as a fix, or dependency on runner $HOME layout. The pinned checkout/runtime remains the only accepted repository-tool implementation.
Acceptance
- Every private-ABI
zig buildreceives the exact pinned path in build-graph identity. - Debug, ReleaseSafe, and TSan consumer-provider fixtures pass.
- The complete private-ABI boundary leg passes on fresh Linux.
- Test262 flips 0 (CI-only dependency propagation).