A Diff That Weakens Its Own Tests
A change that also relaxed the tests that would catch it made the weakened suite pass, and on the trusted path that read SAFE. Deleting an assertion, removing a test, adding a skip: the gate measured the suite the diff had just rewritten. A would-be SAFE is now UNPROVEN, naming the file.
verify-diff and the MCP verify_change tool run the post-diff suite. That is the right suite to run, because it is the one the change ships. It is also a suite the change is free to rewrite.
A diff that relaxed the tests which would have caught it made the weakened suite pass, and on the trusted path (--trusted) that read SAFE. Remove an assertion, delete or rename a test, add a skip: the gate measured exactly what the diff told it to measure. When a diff weakens a test file, a would-be SAFE is now reported UNPROVEN with a reason naming the file.
What counts as weakening
- A net drop in assertions. pytest
assert, including a compoundfoo(); assert x, and unittestself.assertX/self.fail. - A test function whose name disappears, by
deforasync def. - Added skip or xfail markers.
@pytest.mark.skip,skipif,xfail,pytest.skip(),unittest.skip,self.skipTest. - Assertion text inside strings and docstrings does not count, so a docstring mentioning
assertcannot manufacture a result either way.
The report gains testWeakening ([{ file, reasons }]), present only when weakening was found. reportVersion stays 1 and engineVersion marks the change. Untrusted diffs are unaffected, because their SAFE was already withheld in 0.4.6.
What this does not catch
Weakening that keeps the assertion count the same is not detected: a loosened comparison, compensating assertions, an early return. And any weakened test file counts, not only the one covering the change. Both limits can only leave a previous verdict standing; neither can produce a SAFE.
Dependencies
Transitive production dependencies are updated to clear new advisories: proxy-addr (critical), hono (high and moderate) and ip-address (moderate), all reached through @modelcontextprotocol/sdk, which moves from 1.30.0 to 1.32.1. No declared dependency ranges changed.
