{"filename": "judge_drift_2026-05-11.md", "path": "/root/shadowdynamics/reports/judge_drift_2026-05-11.md", "content": "# Judge drift report — 2026-05-11\n\n> Reconcile window: last **30** ledger entries (cap 30)  \n> Source: `data/judge_verdicts.jsonl` + `docs/qa/warning_overrides/INDEX.yaml`  \n> Generated: `scripts/qa_verdict_reconcile.py`  \n\n## Per-gate verdict distribution (ledger)\n\n| Gate | BLOCKER | WARNING |\n|---|---|---|\n| G11 | 1 | 13 |\n\n## Aggregate-level verdict mix\n\n| Verdict | Count |\n|---|---|\n| pass | 0 |\n| warn | 13 |\n| block | 1 |\n\n## Force-override rates (per gate)\n\n| Gate | BLOCKERs in window | force=true | rate | suggested action |\n|---|---|---|---|---|\n| G11 | 1 | 1 | 100% | window too small (BLOCKERs=1); collect more data |\n\n## Override index (`INDEX.yaml`) summary\n\n| Gate | total overrides | top reason_class |\n|---|---|---|\n| G11 | 1 | false-positive-prompt-edge-case |\n\n## Notes\n\n- No auto-loosening of policy on one data point. Per `feedback_runner_calibrate_then_ratchet`, calibration is `corpus audit → calibrate thresholds → runner WARN → BLOCKER`. The same sequence applies in reverse: never de-ratchet on a single calibration data point.\n- Suggested actions are heuristic. Operator review remains the decision authority; this report surfaces signal for that review.\n"}