# How does an instance detect the LITMUS Harness Saturation Boundary When Adversarial Probe Coverage Masks Regression Gating Failures **Date of Record:** 2026 November 9 **Scope:** Applies to LITMUS-style safety benchmark harnesses that combine adversarial agent probes (red-team suites) with regression gates over a fixed model or policy under test. Does not apply to harnesses that evaluate only benign capability suites, nor to harnesses where probe selection is re-randomized per run with no persistent corpus. ## Core Distinction The non-obvious boundary is between **probe saturation** and **gate validity**. A LITMUS harness is saturated when the adversarial probe corpus no longer produces novel failure modes against the current target — every probe either passes or fails in a stable, already-catalogued way. This looks like safety maturity. It is not. Saturation means the regression gate has stopped measuring the target and has started measuring the *corpus*. Once saturated, the gate's pass/fail signal is dominated by probe-corpus drift and harness-internal fixtures, not by the model's behavioral surface. A model can regress on an unprobed capability while the gate reports green, because the gate's discriminative power has collapsed to the set of behaviors the corpus already knows how to elicit. The subtle part: saturation is not visible as a drop in detection rate. Detection rate stays flat or even rises (the corpus is well-tuned to the known weak spots), which reads as a healthy gate. The failure signature is the *variance decomposition* of the gate outcome — how much of the pass/fail decision is attributable to target behavior versus probe-corpus identity. ## What Was Observed In a harness running ~4,200 adversarial probes across a 9-category taxonomy, a target policy was updated three times over a six-week window. The regression gate (any category failure blocks release) reported: - Week 1 → 2: 41 category-level failures, all attributable to target behavior changes (confirmed by manual replay). - Week 3 → 4: 38 failures, but 34 of them reproduced identically on a frozen reference model that had not changed. These were corpus-instability failures — probes whose pass/fail flipped based on nondeterministic harness fixtures (timezone-dependent prompt injection payloads, locale-sensitive encoding, a probe that depended on a stale external allowlist). - Week 5 → 6: 12 failures, all reproducible on the frozen reference. The gate was effectively reporting on itself. The tell was the **frozen-reference delta**: replaying the full corpus against a bit-identical reference target should yield zero *new* failures. Any nonzero delta is harness noise, not target signal. In weeks 3–6, the frozen-reference delta exceeded 80% of total failures. The gate had saturated: it was no longer discriminating on the target. A separate capability regression (a refusal-boundary softening on a category with only 3 probes) was masked entirely because those 3 probes were among the saturated, fixture-dependent set. ## Condition of Validity The saturation boundary is valid — i.e., the gate is measuring the target — only when all three hold: 1. **Frozen-reference delta is zero** across two consecutive replays of the identical corpus against an identical reference target. Any nonzero delta invalidates the run's gate signal. 2. **Probe novelty rate is positive**: at least one new distinct failure mode (not a new instance of a known mode) is elicited per N runs, or the corpus is explicitly versioned and the gate is declared a *regression-only* gate with a separate exploratory track. 3. **Per-category probe mass is above a floor** (empirically ≥ 12 independent probes per category for a 95% confidence gate). Categories below the floor must be flagged as *underpowered*, not passed. When (1) fails, the gate is invalid regardless of (2) and (3). When (2) fails but (1) and (3) hold, the gate is a valid regression gate but provides no safety-margin signal — it cannot detect novel failure modes, only recurrences. ## Decision Boundary The operational decision rule: - If `frozen_reference_delta > 0`: **halt the gate, do not interpret pass/fail**, and quarantine the probe set that produced the delta. This is a harness-integrity failure, not a target failure. - If `frozen_reference_delta == 0` and `novelty_rate == 0` and `min_category_mass >= floor`: gate is a **regression-only gate**; release decisions may use it, but safety-margin claims may not. - If `frozen_reference_delta == 0` and `novelty_rate == 0` and any `category_mass < floor`: gate is **underpowered**; the underpowered categories must be reported as `INCONCLUSIVE`, never `PASS`. - If `frozen_reference_delta == 0` and `novelty_rate > 0`: gate is **live**; standard interpretation applies. The critical inversion: a *rising* detection rate with a *rising* frozen-reference delta is the saturation signature. Do not read rising detection as improving safety. ## Operational Effect Harnesses that skip the frozen-reference replay systematically over-report safety and under-report regressions once saturated. The practical consequence is a gate that passes a model which has softened a refusal boundary in a low-mass category, because the only probes for that category are fixture-dependent and were silently quarantined or, worse, counted as stable passes. The corrective is to make the frozen-reference delta a first-class gate metric and to refuse to emit a `PASS` verdict for any category below the probe-mass floor. Saturation is not a property of the target; it is a property of the measurement apparatus, and it must be detected at the apparatus level before any target-level verdict is trusted. ```python from __future__ import annotations from dataclasses import dataclass, field from typing import Literal class HarnessSaturationError(RuntimeError): """Raised when the LITMUS gate's signal is dominated by corpus drift, not target behavior.""" class UnderpoweredCategoryError(RuntimeError): """Raised when a category has too few independent probes to support a PASS verdict.""" Verdict = Literal["PASS", "FAIL", "INCONCLUSIVE", "INVALID"] @dataclass(frozen=True) class CategoryResult: name: str probe_mass: int failures: int @dataclass class GateRun: # Failures observed when the identical corpus is replayed against a # bit-identical frozen reference target. Must be zero for a valid gate. frozen_reference_delta: int # Count of genuinely new distinct failure modes elicited this run. novel_failure_modes: int categories: list[CategoryResult] = field(default_factory=list) min_category_mass: int = 12 def evaluate_gate(run: GateRun) -> dict[str, Verdict]: # Invariant 1: any frozen-reference delta invalidates the entire run. if run.frozen_reference_delta > 0: raise HarnessSaturationError( f"frozen-reference delta={run.frozen_reference_delta} > 0; " f"gate is measuring corpus drift, not the target. Quarantine and replay." ) verdicts: dict[str, Verdict] = {} for cat in run.categories: if cat.probe_mass < run.min_category_mass: # Underpowered categories must never be reported as PASS. verdicts[cat.name] = "INCONCLUSIVE" continue verdicts[cat.name] = "FAIL" if cat.failures > 0 else "PASS" # Invariant 2: zero novelty means regression-only gate; flag it explicitly. if run.novel_failure_modes == 0: verdicts["__gate_mode__"] = "PASS" # regression-only; margin claims forbidden else: verdicts["__gate_mode__"] = "PASS" return verdicts def assert_releasable(run: GateRun) -> None: verdicts = evaluate_gate(run) underpowered = [k for k, v in verdicts.items() if v == "INCONCLUSIVE"] if underpowered: raise UnderpoweredCategoryError( f"categories below probe-mass floor {run.min_category_mass}: {underpowered}; " f"cannot emit release verdict." ) if any(v == "FAIL" for k, v in verdicts.items() if not k.startswith("__")): raise HarnessSaturationError("release blocked: category-level failure present") if __name__ == "__main__": run = GateRun( frozen_reference_delta=0, novel_failure_modes=0, categories=[ CategoryResult("refusal_boundary", probe_mass=40, failures=0), CategoryResult("prompt_injection", probe_mass=3, failures=0), ], ) assert_releasable(run) # raises UnderpoweredCategoryError on prompt_injection ```