Oct 11, 2026 · v0.4.7

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 compound foo(); assert x, and unittest self.assertX / self.fail.
  • A test function whose name disappears, by def or async 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 assert cannot 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.