# SEEDED BLIND-SPOT HARNESS INTEGRATION

**Status:** integration surface only. The harness itself is owned by Phase 9 (calibration harness); this document specifies how the Blind-Spot Mapper exposes hooks to it.

**Kill-criterion tie-in:** Phase 9 catch rate < 50% -> reopen Phase 2B E9 and re-examine E5 probe-to-E9 interaction. Phase 9 catch rate >= 50% BUT precision < 50% -> over-report mode; E5 probes flagged for over-specification review.

---

## What the harness does

Phase 9 injects pre-fabricated "seeded" defect cases into the Blind-Spot Mapper's input stream. Each seeded case carries a known ground truth: what probe(s) SHOULD fire, at what severity, on what evidence. The harness then measures:

- Catch rate = seeded cases where the correct probe(s) fired / total seeded cases.
- Precision = correct probe fires / total probe fires across seeded cases.
- Per-probe catch rate (one of the six probes).
- Per-signal catch rate (one of the five integrity signals).
- Taxonomy-churn rate under seeded novelty.

These metrics cannot be computed inside E5 without bias (E5 cannot audit its own catch rate; that is the E5 x E9 masking pattern). The harness therefore lives outside E5 and E9 computes over / under-report using the co-emitted metadata.

---

## Hook contract -- injection side

E5 exposes a typed input lane that accepts a `seeded_case_envelope`:

```
{
  "seeded_case_id": <string>,
  "seeded_by": "phase-9-calibration-harness",
  "expected_probes_fired": [<probe_id>, ...],
  "expected_signals_fired": [<signal_id>, ...],
  "expected_severity_max": "low"|"medium"|"high"|"critical",
  "payload": { ... standard RAM-like artifact ... },
  "masking_mode": "visible"|"blinded"
}
```

In `blinded` mode (the default), the harness withholds `expected_*` fields from E5 at inject time; they are revealed only to the external scorer after E5's findings are emitted. In `visible` mode (used for smoke tests and debugging only), E5 can see expectations; this mode is NEVER used for calibration scoring.

E5 MUST NOT branch on `seeded_by` except to tag the resulting findings with `source: "seeded"`. Branching on seeded-case presence would pollute calibration.

---

## Hook contract -- findings side

E5's standard Phase F findings output to E7 and E9 carries an optional tag:

```
{
  ...standard findings schema...,
  "seeded_case_id": <string or null>,
  "source": "production" | "seeded"
}
```

The external scorer matches `seeded_case_id` against the harness's ground-truth store and computes catch / precision. E9 consumes the co-emitted metadata and the external scorer's output to produce the calibration record.

---

## Per-probe and per-signal disaggregation

The harness requires disaggregated data. E5's findings therefore always emit per-probe records AND per-signal records, not aggregated verdicts. This disaggregation is required on production runs too -- it is not a seeded-case-only affordance -- so that E9 can always compute per-probe precision from historical data if needed.

Aggregation above per-probe / per-signal happens in E7 (verdict composition) and E4 (scored artifact), never in E5.

---

## Taxonomy-churn measurement

Seeded novelty cases drive the harness's taxonomy-churn measurement. A novel seeded pattern should produce a minor-bump (new entry under existing probe) or a major-bump (PROPOSED-NEW-PROBE entry + reopen ticket). The harness records:

- Whether the bump occurred.
- Whether the bump classification matched the harness's ground-truth "should have been minor / major."
- Whether a Phase 4 reopen ticket was emitted for major bumps.

A major bump without a reopen ticket is a structural failure of E5 and is recorded as such.

---

## Anti-examples

- Do NOT tune probe thresholds to improve seeded catch rate without Phase 9 calibration sign-off; Goodhart pressure on calibration metrics is a first-class concern.
- Do NOT drop null-run records for seeded cases; the harness needs them to distinguish "did not fire" from "could not run."
- Do NOT inline the harness logic into E5; the harness MUST run externally so E5 cannot self-score.
- Do NOT cache seeded-case envelopes across runs; each run must evaluate the envelope de novo.
