v1.11.0 - negative evidence + clustered-identity guard (foundation)
Highlights
v1.11.0 ships the negative-evidence + clustered-identity-guard infrastructure as the foundation for v1.12's T3 recovery. DQbench composite essentially unchanged at 66.99 (v1.10 was 66.91) — the indicator-driven demote rule cannot fire on real DQbench T3 because of two structural findings (collision-signal not discriminative; iteration budget exhausted). v1.12.0 (released alongside) reverses v1.11's spec §Non-goals to deliver Path Y, where T3 finally moves.
What shipped
MatchkeyConfig.negative_evidence: list[NegativeEvidenceField] | Nonefield. Each entry:field,transforms,scorer,threshold,penalty. Default-None for v1.10 cache compat._apply_negative_evidenceincore/scorer.pysubtracts NE penalties from weighted-matchkey positive score.promote_negative_evidenceeager rule populates NE on weighted matchkeys for high-identity-prior columns (gated on identity_score >= 0.75 + cardinality_ratio >= 0.5 + col not in matchkey.fields + col not in blocking + col has exact-matchkey counterpart).compute_identity_collision_signallazy indicator (8s budget) +IndicatorContext.identity_collision_signalmethod.rule_demote_clustered_identityat position 7 inDEFAULT_RULES. Threshold 0.75 (raised from 0.5 after T2 false-fire analysis).
Benchmarks (zero-config, no LLM)
| Dataset | v1.10.0 | v1.11.0 |
|---|---|---|
| DBLP-ACM | 0.9641 | 0.9641 |
| Febrl3 | 0.9443 | 0.9443 |
| NCVR | 0.9719 | 0.9719 |
| DQbench composite | 66.91 | 66.99 |
Honest framing
Shipped at parity with v1.10 — the demote rule never executes on real T3 due to iteration budget exhaustion (rule_blocking_too_coarse oscillates), and the collision_rate metric isn't discriminative (T3 = 0.59, T2 = 0.62). v1.12.0 (released alongside) addresses this via Path Y.
Breaking changes
None. Adds optional fields with default-None for v1.10 cache compat.
Full diff: v1.10.0...v1.11.0