What Happened
On #2278 the local run covered tests.test_pr_review and tests.test_local_review, the two modules the change touched, and both passed. CI's unit test job then failed in tests/test_tooling_encoding.py. That test walks every text-mode subprocess.run in the tree and requires each one to name its encoding, and a new test in test_pr_review.py did not. A full python3 -m unittest discover -s tests run would have caught it before the push. Instead it cost a fix push and a Copilot round.
Why It Recurs
GOVERNANCE.md "Verification Discipline" requires the whole lint gate before every push, "not the parts that look relevant", because CI runs all of it. Nothing states the same for tests. This repository carries suite-wide meta-tests (tooling encoding, the write-command partition, carried-content contracts) that judge any file, so a change can fail a test module it never touched.
Proposal
Extend that bullet, or add one beside it, to cover tests: run the repository's whole test suite before every push, in the invocation CI uses, for the reason the lint bullet already gives.
What Happened
On #2278 the local run covered
tests.test_pr_reviewandtests.test_local_review, the two modules the change touched, and both passed. CI's unit test job then failed intests/test_tooling_encoding.py. That test walks every text-modesubprocess.runin the tree and requires each one to name its encoding, and a new test intest_pr_review.pydid not. A fullpython3 -m unittest discover -s testsrun would have caught it before the push. Instead it cost a fix push and a Copilot round.Why It Recurs
GOVERNANCE.md"Verification Discipline" requires the whole lint gate before every push, "not the parts that look relevant", because CI runs all of it. Nothing states the same for tests. This repository carries suite-wide meta-tests (tooling encoding, the write-command partition, carried-content contracts) that judge any file, so a change can fail a test module it never touched.Proposal
Extend that bullet, or add one beside it, to cover tests: run the repository's whole test suite before every push, in the invocation CI uses, for the reason the lint bullet already gives.