ci(fpga-build): run the gate-precondition control when a gate it guards changes, and after a red ratchet (Refs #5453) - #5489
Merged
Conversation
…ds changes, and after a red ratchet (Refs #5453) tools/check_gate_preconditions.py runs six gates on an empty tree and names any that exit 0 with nothing to check. Given master's one-line tools/check_seal_coverage.py it says, in under two seconds: VACUOUS check_seal_coverage.py [bare] exits 0 with nothing to check It never got to say it, for two independent reasons: - fpga-build.yml listed only two of the six gates in its path filters, so #5183 -- which emptied check_seal_coverage.py on 2026-09-29 and touched nothing else but a docs/now entry -- never started it. - Since a90bdac (2026-09-22) every master run of fpga-conformance has failed at "Elaboration errors may fall, never rise", and GitHub skips every later step, this control included. So the other four gates in its table and tools/_prereq.py (which it plants them with) join both path lists, and the step runs with `if: always()`, the idiom bootstrap-tests and corpus-ratchet already use. It reads the built t27c and the tree, never the ratchet's verdict; when t27c did not build it reports UNRUN, which is red and true. On this PR the step is expected to report VACUOUS for check_seal_coverage.py: master still carries the one-line file until #5454 lands. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
|
📓 NotebookLM Notebook linked to this PR
This notebook contains session context, decisions, and artifacts for this work. |
Contributor
This was referenced Oct 1, 2026
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.
Refs #5453
tools/check_gate_preconditions.pyalready catches what #5183 did to the seal gate. It never ran where it could have, and this PR makes it run. The restore itself is #5454; this PR does not touchtools/check_seal_coverage.py.What the control says
Measured locally on master d4c4f2f, with t27c rebuilt from it:
tools/check_seal_coverage.pypython3 tools/check_gate_preconditions.pyVACUOUS check_seal_coverage.py [bare] exits 0 with nothing to checkbcb32d723^(#5454)OK: 10 precondition(s) across 6 gates fail loudlyWhy it never said so
fpga-build.ymlstarted only on two of the six gates in that table (check_vector_data.py,check_elab_ratchet.py). 131 seals are stale: the spec changed after sealing #5183 touchedtools/check_seal_coverage.pyand a docs/now entry, so the workflow never ran.fpga-conformancehas failed at step 9, "Elaboration errors may fall, never rise", and GitHub skipped steps 10-16. Step 11 is this control (run 36883584257 is the latest). So it returned no verdict for the week before 131 seals are stale: the spec changed after sealing #5183 and the two days after.Change
pull_request,push) gain the other four gates in the table, plus the helper it plants them with:check_seal_coverage.py,check_duplicate_agreement.py,check_specs_generate.py,check_specs_parse.pyandtools/_prereq.py.if: always(), the idiombootstrap-tests.ymlandcorpus-ratchet.ymlalready use. It reads the built t27c and the tree, never the ratchet's verdict. If t27c did not build, it reports UNRUN, which is red and true.Expected on this PR: step 11 goes red with VACUOUS for
check_seal_coverage.py, because master still carries the one-line file. It goes green when #5454 lands.fpga-conformanceis red on master anyway, from step 9. Neither is a required check; the required checks arevalidate,check-linked-issueandparse-ratchet.Not changed: steps 10 and 12-16, which the same ratchet skips: its own negative control, both vector-data steps, conformance vector execution, JSON structure and power regression. Whether they should run past a red ratchet is the FPGA job's call.
Independent check of #5454
No code from #5454 is in this PR. Its file is byte-identical to
bcb32d723^(checked withcmp).--self-check: exit 0. All 8 end-to-end cases land on the right branch; compare passes 4 of 4 and the legend covers 8 of 8.shasum,jqandt27c sealwith no Python: the same 654 name/kind pairs, plus 656 that hold, 89 with no spec on disk and 5 with nospec_path.specs/tri/agent/faculty_board.t27gives 655, withagent_FacultyBoard.json [stale].t27c seal --verifyagrees: spec_hash MISMATCH.gen_hash_ziggives 655, with[gen-drift].--self-check.bcb32d723^itself, with t27c built there: 641 of 1397 (539 stale, 102 gen-drift), not 131.gen_hash_zigmatches no master compiler, either at those commits or now. They were wrong on arrival, and the gate that would have said so was empty.check_seal_currency.py: it reports 592 stale gen hashes, 68gen_hash=none, 650 current and 94 missing. That is the same partition once its two design choices are named:spec_hash. So the 21 seals whose spec changed while all four outputs stayed byte-identical read as current there.noneseals apart. Here 27 of them read as holding, becausenone == none(ci-gates §314).Baseline: unchanged, by measurement
tools/seal_baseline.txthas 94 lines, and they are exactly the 94 seals with no spec on disk or nospec_path, one for one. None is paid, none departed and none changed class, so there is nothing to tighten (§67).Writing the 654 into it by hand would produce the same file
--update-baselinewrites. That is the decision #5158 left to the owner, and #5453 asks the gate to report red until it is made. It would also file seven seals that are simply wrong as debt, when the fix for those is a re-seal with master's t27c.🤖 Generated with Claude Code