Initial approach. The existing platform had scattered concepts — checklists, highlights, entities, signals — plus 143 live detectors.
Where it broke. Overlapping vocabulary meant overlapping screens. Nobody could say cleanly what was scored and what was merely observed.
Resolution. Collapsed everything into one unified Detector Library. A detector assigned to a template renders as a scored Checkpoint; an unassigned detector firing in the wild renders as an observed Moment (unscored). Detectors are typed — rule (deterministic) vs instructional (AI) — versioned, and pinned to each evaluation. Retired: checklist, highlight, entity, signal. This unification later flipped the entire build order (see §6).
Two more locks that came out of the same work:
- All three detector states must be authored — pass, fail, and not applicable. "Not applicable" is a first-class state that changes the scoring denominator, not an afterthought.
- Overrides happen only at the checkpoint leaf, recomputing upward with a delta preview before commit (e.g.
parameter 25 → 50 · total 62 → 68). Parent-level overrides break explainability; showing the consequence before the click turns a reflex into a considered judgment.
