v1.12.0 - Path Y: NE on exact matchkeys (DQbench 66.99 → 91.04)
Highlights
v1.12.0 ships Path Y — extending negative-evidence scoring to exact matchkeys. DQbench composite jumps from 66.99 → 91.04 (+24.05pp), the largest single-release gain in the suite's history. T3 F1 lands at 85.5% (from 53.8%), within the diagnostic's 85-90% projection. T2 F1 jumps to 97.5% (from 69.0%) as a bonus from the same mechanism.
What shipped
_apply_negative_evidence_to_exact_pairsincore/scorer.py: post-filter helper called fromcore/pipeline.pyafterfind_exact_matches. Score formula:final = max(0, 1.0 - sum(disagreement_penalties)); emit iffinal >= matchkey.threshold(default 0.5 when NE set + threshold None).promote_negative_evidenceextended to walk all matchkey types (was weighted-only in v1.11). Selectively skips_is_exact_matchkey_fieldgate on the exact-matchkey iteration branch — its v1.11 rationale doesn't apply when iterating an exact matchkey for itself. Sets defaultthreshold=0.5on threshold-None exact matchkeys after adding NE.- Spec amendment documented: v1.11 spec §Non-goals explicitly excluded NE on exact matchkeys ("Path Y rejected as semantic confusion"); v1.12 reverses this on Phase 7 diagnostic evidence showing Path X (clustered-guard demote) couldn't reach T3.
Benchmarks (zero-config, no LLM)
| Dataset | v1.11.0 | v1.12.0 | Δ |
|---|---|---|---|
| DBLP-ACM | 0.9641 | 0.9641 | flat |
| Febrl3 | 0.9443 | 0.9443 | flat |
| NCVR | 0.9719 | 0.9719 | flat |
| DQbench composite | 66.99 | 91.04 | +24.05pp |
| T1 F1 | 88.9% | 89.3% | +0.4pp |
| T2 F1 | 69.0% | 97.5% | +28.5pp |
| T3 F1 | 53.8% | 85.5% | +31.7pp |
How Path Y works
T3's adversarial pattern: same email shared across distinct entities with divergent phone+address. v0 produces an exact_email matchkey that emits 1.0 for these collision pairs. Pre-v1.12, NE only applied to weighted matchkeys, so exact_email's output was uncorrectable. Path Y wires _apply_negative_evidence_to_exact_pairs as a post-filter: when phone OR address strongly disagree on a same-email pair, the cumulative penalty drops the final score below 0.5 → pair filtered. True duplicates (agreeing phone+address) preserved.
Backward compat
None. Exact matchkey without negative_evidence preserves today's binary 1.0/0.0 emit. v1.10 + v1.11 cache entries deserialize cleanly with negative_evidence=None.
Spec + plan
- v1.12 spec: `docs/superpowers/specs/2026-05-09-autoconfig-path-y-design.md`
- v1.12 plan: `docs/superpowers/plans/2026-05-09-autoconfig-path-y.md`
- T3 diagnostic that motivated Path Y: `.profile_tmp/v111_t3_diagnostic.txt` (gitignored)
Full diff: v1.11.0...v1.12.0