Repository navigation
ci: run the full-suite job on docs-only PRs, where doc guards live - #511
Merged
Merged
Conversation
Root cause of the #509 -> #510 incident. The `changes` filter classifies '*.md' out of `code`: code: - '**' - '!{*.md,docs/**/*.md,...}' so a README-only PR sets code=false and every test job is skipped. But part of that suite takes documentation as its INPUT: tests_py/scripts/test_codex_plugin_contract.py reads README.md and asserts on the canonical published identities (the hypermnesia-mcp-viz anchor, the viz/spec migration strings). The guards were therefore switched OFF exactly when their subject changed. #509 was a README-only diff, every test job skipped, it merged green, and the push to main went red on that test across five jobs (run 34238410970 — 7663 passed, 1 failed). #510 fixed the symptom; this fixes the reason it could reach main at all. Adds `docs` to test-sqlite's predicate only, not to the 3.10-3.13 matrix: test-sqlite already runs THE FULL SUITE in one ~5-minute job, so it covers the doc-contract tests at the smallest cost that closes the gap. Waking the whole matrix on every prose edit would undo #475-#481. scripts/check_ci_gate_results.py mirrors ci.yml's predicates — its own check_policy docstring requires the workflow and the executable policy to stay "in exact agreement". Changing only the workflow would have left two sources of truth disagreeing about when test-sqlite may skip, so _required_jobs gains the same condition and both files carry the same note. Caught by re-reading the diff, not by CI. Its two docs-only tests are updated to the new policy, and the first is turned into a named regression test that asserts skipping test-sqlite on a docs-only PR is NOT justified — the exact hole #509 fell through. Verified: actionlint 1.7.12 (the pinned version) clean on ci.yml; check_ci_gate_complete.py OK; both gate test files 38 passed, 159 subtests; craftsmanship, ruff check, ruff format, doc-claims all clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01StMBvNd7eVJGtpnC2zNsx1
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.
Root cause of the #509 → #510 incident. #510 fixed the symptom; this fixes why it could reach
mainat all.The hole
The
changesfilter classifies*.mdout ofcode:So a README-only PR sets
code=falseand every test job is skipped. But part of that suite takes documentation as its input:tests_py/scripts/test_codex_plugin_contract.pyreadsREADME.mdand asserts on the canonical published identities — thehypermnesia-mcp-vizanchor, the viz/spec migration strings.The guards were switched off exactly when their subject changed. #509 was a README-only diff, every test job skipped, it merged green, and the push to
mainwent red on that test across five jobs (run 34238410970 — 7663 passed, 1 failed).The fix, and why this shape
docsis added totest-sqlite's predicate only — not the 3.10–3.13 matrix.That job already runs THE FULL SUITE (its own pytest step says so) in one ~5-minute job, so it covers the doc-contract tests at the smallest cost that actually closes the gap. Waking the whole matrix on every prose edit would undo the CI-efficiency work of #475–#481; doing nothing leaves the guard defeated. This is the middle that holds both.
The part I nearly got wrong
scripts/check_ci_gate_results.pymirrors ci.yml's predicates —_required_jobscomputesfullfrom("code", "deps", "workflows"), and its owncheck_policydocstring requires the workflow and the executable policy to stay "in exact agreement".Changing only the workflow would have left two sources of truth disagreeing about when
test-sqlitemay skip: the job would run, CI would pass, and the policy checker would still quietly bless a future regression that skipped it again. Exactly the duplicated-rule anti-pattern this repo builds against (craftsmanship_layer_table.pyparses the table rather than copying it).So
_required_jobsgains the same condition, and both files carry the same sourced note pointing at each other. Caught by re-reading my own diff, not by CI.Tests
Its two docs-only tests are brought to the new policy, and the first becomes a named regression test:
It asserts the exact hole #509 fell through is now closed — a mechanical guard, not a comment asking future readers to be careful.
Verification
actionlint1.7.12 (the version pinned inci.yml) onci.ymlscripts/check_ci_gate_complete.pytest_check_ci_gate_results.py+test_check_ci_gate_complete.pycheck_craftsmanship.py --base origin/mainruff check,ruff format --check,check_doc_claims.pyThis PR is its own proof: it touches
.github/**, soworkflows=true— the test jobs run here, unlike on #509.🤖 Generated with Claude Code
https://claude.ai/code/session_01StMBvNd7eVJGtpnC2zNsx1
Generated by Claude Code