0011 — Home the M0.5 ≥95% extraction-recall acceptance at M1
- Status: accepted
- Date: 2026-06-27
- Deciders: bioedca
- PRD anchor: §9 M0.5(b), §9 M1, §11.2 (detection/extraction rows), §8 NFR-VALID (a)
- Milestone: M0.5 (close decision); the binding recall+intensity gate lands at M1
Context and problem statement
PRD §9 M0.5(b) lists three acceptance clauses: (1) "≥ 95% of Deep-LASI
molecules matched within 1 px"; (2) the TIRFdata decode recovers coordinates +
α/β/γ; (3) native registration RMS residual ≤ 0.5 px vs the .tmap. Clauses (2)
and (3) are met and merged — the MCOS decode (#25), the β→α/α→δ/γ→γ remap (#25,
ADR-0008), and native polynomial registration at RMS = 0.434 px vs the .tmap
(#27). Clause (1), the matched-molecule recall, is not met by the M0.5
detection work: the M0.5 S5 "thin preview" detector (detect_spots, #22) reaches
only ~20% recall @ 1 px on the full donor field, and even the underlying detection
image caps near ~80% local-max recall (#28). Closing the gap to ≥ 95% requires the
full M1 detector (à trous threshold/scale tuning, centroid merge, colocalization
pairing across the registered channels) — multi-session M1 work, not a preview.
The same recall bar appears verbatim in PRD §9 M1: "matched-molecule recall ≥ 95% within 1 px; per-frame integrated-intensity Pearson r ≥ 0.99 on matched molecules; registration RMS ≤ 0.5 px." So the question is not whether the gate holds, but which milestone owns it as a binding gate — and therefore whether M0.5 may close with clause (1) demonstrated-as-a-preview rather than passed at the 95% bar.
Decision drivers
- The recall+intensity extraction acceptance is a single coherent oracle (PRD §8 NFR-VALID (a): recall / intensity-Pearson / RMS), and the PLAN already homes that oracle at M1: §1.1 names it "M1 extraction tolerance (recall ≥ 95% @ 1px, Pearson r ≥ 0.99, RMS ≤ 0.5px)"; §2.3 oracle (a) is milestone M1; §4 S5 scoped M0.5 detection explicitly as "a thin M1 preview … loose threshold here; tightened at M1."
- M0.5's de-risking purpose is to retire the two highest risks before building on them: that the tMAVEN sidecar can be driven headlessly with a frozen parity tolerance (done — #20, #29, #21), and that the decode/registration/detection path works on real data (done — decode #25, registration RMS 0.434 px #27, detection+aperture demonstrated #22/#23/#28). Both risks are retired.
- Do not silently relax an acceptance gate — the homing must be explicit, recorded, and reversible; the recall bar must still bind somewhere (it binds at M1, which cannot sign off without it).
- The frozen PRD text must not be edited to make a milestone close. The recall clause stays in M1 (where it binds); this ADR records the reading of M0.5(b) clause (1) as the preview leg of that same M1 oracle.
Considered options
- A. Home the binding recall gate at M1; close M0.5 on its non-recall de-risking deliverables. The ≥ 95% recall bar is not treated as satisfied at M0.5 — it remains the binding M1 extraction-tolerance gate (PRD §9 M1, PLAN §1.1/§2.3/§4 S5), which M1 cannot close without. The M0.5(b) clause-(1) checklist item is annotated as homed at M1 (this ADR) when the milestone is closed — so the close and the checklist stay aligned. No PRD edit (recall stays in M1).
- B. Keep M0.5 open until the M1 detector reaches ≥ 95% recall. Circular against the milestone DAG (M0.5 → M1): M0.5 would only close partway through M1, while M1 work proceeds anyway. The recall gate is captured by M1's own acceptance regardless.
- C. Weaken the M0.5(b) recall bar in place (e.g. to 80%). Rejected — fabricates a non-PRD threshold and weakens a gate to match what's missing (forbidden by the working agreement); the real bar belongs at M1 unchanged.
Decision outcome
Chosen option: A. The binding ≥ 95% matched-molecule recall (with intensity
Pearson r ≥ 0.99) is the M1 extraction-tolerance gate and is not treated as
satisfied at M0.5. M0.5 closes on its non-recall de-risking deliverables —
headless vbFRET sidecar driver + the frozen §11.2 parity tolerance (the hard gate) +
the validated .tdat decode / factor remap / native registration — and the close is
enacted together with annotating the GitHub M0.5(b) clause-(1) checklist item as
homed at M1 (this ADR), so the milestone state and its checklist stay aligned.
No SemVer tag (M0.5 is a fractional de-risking gate, not a release — PRD §12.7's
SemVer track runs M0–M9 and omits M0.5). The frozen PRD §9 text is unchanged; the
recall criterion continues to bind at M1.
Consequences
- Good: M0.5 carries no remaining blocker; autonomous development proceeds into M1. Both M0.5 hard gates (schema freeze ADR-0005, parity-tol freeze ADR-0009) remain closed and bind every later milestone.
- The recall gate is not dropped — it binds at M1 and M1 cannot sign off
without recall ≥ 95% @ 1px, intensity Pearson r ≥ 0.99 on matched molecules, and
RMS ≤ 0.5 px on the UCKOPSB pair (PRD §9 M1; oracle wired into
large-fixtures.ymlper PLAN §5 S9). The M0.5 registration-RMS evidence (0.434 px) and the decode carry forward as M1 substrate. - Trade-off: M0.5 closes without the ≥ 95% recall having been met — that gate is deferred-in-place to M1, not passed at M0.5. Reversible — if the maintainer judges the bar should bind at M0.5, reopening the milestone and #17 is a one-step revert; the recall gate is unchanged either way.
- Follow-up: #17 is closed (its decode/remap/registration code is merged; this ADR resolves its remaining close-decision). M0.5 milestone closed; its acceptance checklist annotated (clause (1) → M1 (this ADR); GUI 2-OS leg → M9 (ADR-0010)).
More information
PRD §9 M0.5(b), §9 M1, §11.2, §8 NFR-VALID (a); PLAN §1.1, §2.3 oracle (a), §4 S5/S6, §5 S9; issues #17, #22, #23, #25, #27, #28; ADR-0005, ADR-0006, ADR-0008, ADR-0009, ADR-0010.