Skip to content

v1.11.0 - negative evidence + clustered-identity guard (foundation)

Choose a tag to compare

@benzsevern benzsevern released this 10 May 17:37
bd09b43

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] | None field. Each entry: field, transforms, scorer, threshold, penalty. Default-None for v1.10 cache compat.
  • _apply_negative_evidence in core/scorer.py subtracts NE penalties from weighted-matchkey positive score.
  • promote_negative_evidence eager 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_signal lazy indicator (8s budget) + IndicatorContext.identity_collision_signal method.
  • rule_demote_clustered_identity at position 7 in DEFAULT_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