ci(typecheck): warning ratchet — an undefined call no longer passes silently - #375
Merged
Conversation
…silently
Negative audit of every gate (the follow-up to the wave-65 pipefail
finding: a green check means nothing until it is proven able to redden).
Injection-tested each gate; two behaved, one did not:
zig-exec break a gen -> DETECTED
C-exec compile break a gen -> DETECTED
C-exec runtime failing assert -> DETECTED (t27_assert is
__builtin_trap, so a failure is SIGILL, not exit 0)
typecheck call an UNDEFINED function -> NOT DETECTED
t27c downgrades a call to an undefined function to a WARNING, and prints
'Typecheck OK (0 errors, 1 warnings)' with exit 0. The gate grepped only
for 'Typecheck OK', so the corpus could acquire undefined calls silently.
Failing on any warning is not yet possible -- 47 of 107 specs carry
pre-existing warnings (788 total). So pin each spec's CURRENT count and
fail when it GROWS. A newly introduced undefined call, in any spec, now
reddens the gate. Counts were verified deterministic across repeated
runs, and the baseline was generated with t27c built from t27 master --
the same compiler CI uses.
Also guards the baseline itself: if the table does not cover every spec
(a new spec that skipped it), the gate fails and names the gap -- the
same shape as the wave-55 icarus coverage guard.
Verified three ways: healthy corpus exits 0; an injected
undefined_function_xyz call is caught with the spec named; an unpinned
new spec is caught.
Lower a pinned number whenever a spec's warnings are fixed; never raise.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Negative audit of every gate — the follow-up to the wave-65 pipefail finding: a green check means nothing until it is proven able to redden. I injection-tested each gate:
t27_assertis__builtin_trap, so failure is SIGILL, not exit 0The hole
t27cdowngrades a call to an undefined function to a warning and printsTypecheck OK (0 errors, 1 warnings)with exit 0. The gate grepped only forTypecheck OK, so the corpus could acquire undefined calls silently.The fix: a warning ratchet
Failing on any warning isn't yet possible — 47 of 107 specs carry pre-existing warnings (788 total). So each spec's current count is pinned, and the gate fails when a count grows. A newly introduced undefined call, in any spec, now reddens the gate.
Counts were verified deterministic across repeated runs, and the baseline was generated with t27c built from t27 master — the same compiler CI uses.
It also guards the baseline itself: if the table doesn't cover every spec (a new spec that skipped it), the gate fails and names the gap — same shape as the wave-55 icarus coverage guard.
Verified three ways
107 specs pinned, corpus has 107)undefined_function_xyz→ caught, spec namedbaseline covers 107 but the corpus has 108)Lower a pinned number whenever a spec's warnings are fixed; never raise one.
🤖 Generated with Claude Code