Mutate the Grader, Not the Code: A Weekly Self-Audit for AI C++ Patch Evals A developer has proposed a self-audit technique for AI-generated C++ patch evaluation harnesses in which seeded faulty patches, called mutants, are pushed through the real grading pipeline to identify graders that fail to reject them. The approach targets grader weaknesses rather than missing test cases, flagging exit-code-only grading, baseline-normalized output that absorbs real diagnostics, and assertions that patches can edit. The audit relies on a clean git worktree, a manifest declaring which graders must reject each mutant, and a harness that reports per-grader status as machine-readable output. Example scenario illustrative, not a reported incident : a team's eval harness has returned PASS on every AI-generated C++ patch for three weeks. Then a patch replaces a bounded comparison with a modulo on a signed value. The unit grader stays green because no golden case feeds a negative operand. The sanitizer grader stays green because it runs the same test binary, which never reaches the branch. Nothing in the report is lying — the harness simply stopped being able to see that class of bug. Green means "the cases we wrote still pass". It does not mean "the grader can still detect this failure". Those are different properties, and only the second one decays silently. The technique below audits the second property directly: seeded faulty patches, known as mutants, are pushed through the real harness, and every grader that fails to reject them is reported as blind. No model names, quotas, or benchmark numbers are assumed; the artifact is a plain script and a manifest. Exit-code-only grading. The harness records returncode = 0 as a failure and nothing else. A patch that compiles, runs, and prints a wrong number passes. So does one that emits a new warning nobody promoted to an error. Baseline-normalized output. Warnings and diagnostics are diffed against a stored baseline file. When the baseline is regenerated after a noisy commit, the diff quietly absorbs the next real diagnostic. Assertions the patch can edit. The grader greps test output for a string, and the test file lives in the same tree the model may modify. The patch adjusts the expected string; the grader confirms the adjustment. Each of these is a grader weakness, not a case weakness. Adding golden cases will not fix any of them, which is why pruning and shuffling the case set does not surface the problem either. The audit needs three inputs: a clean git worktree, a list of small patches with known faults, and a harness entry point that can report per-grader status as machine-readable output. A manifest declares, for each mutant, which graders must reject it. mutants/manifest.yaml illustrative mutants: - id: signed-modulo-clamp diff: mutants/signed modulo clamp.diff why: replaces a bounded comparison with a modulo must fail: unit clamp, prop clamp bounds - id: unchecked-alloc-size diff: mutants/unchecked alloc size.diff why: drops a size guard before memcpy must fail: asan guard - id: silent-float-narrowing diff: mutants/silent float narrowing.diff why: narrows double to float without a cast warning gate must fail: warnings as errors The must fail list is the contract. A mutant that survives a listed grader is a finding; a mutant that fails extra graders is fine and often informative. Dirty state is the most common cause of false "invalid diff" verdicts. A dedicated worktree keeps the audit off the developer's working tree. git worktree add ../eval-audit HEAD python tools/mutant audit.py \ --manifest mutants/manifest.yaml \ --worktree ../eval-audit \ --report audit-$ date -u +%Y%m%d .md The runner below is illustrative and has not been executed as part of this article. It expects python -m evals.grade --json to print {"graders": {"