Skip to content

GoldenMatch

v1.9.0 Breaking

This release includes breaking changes for platform teams planning a safe upgrade.

Published 2mo Data Pipelines & ETL
✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →

✓ No known CVEs patched in this version

Topics

data-cleaning data-engineering data-matching data-quality deduplication entity-resolution
+14 more
fellegi-sunter fuzzy-matching knowledge-graph llm master-data-management mcp-server polars pprl python record-linkage rust splink typescript zero-config

Summary

AI summary

RunHistory.pick_committed() adds best‑effort RED entry selection, stop_reason enum, and virtual v0 fallback precision‑collapse floor.

Full changelog

Highlights

  • Best-effort commit: RunHistory.pick_committed() extends the lex key to RED entries (rank=2), filters errored entries via error is None and profile is not None, returns highest-ranked entry. Replaces v1.8's cheapest_healthy() (now a deprecation alias; removed in v2.0).
  • RunHistory.stop_reason: StopReason | None populated at every break point in AutoConfigController.run(). Eight values: GREEN, CONVERGED, BUDGET_ITERATIONS, BUDGET_TIME, POLICY_SATISFIED, POLICY_NO_PROGRESS, OSCILLATING, CANCELLED. Observable via result.postflight_report.controller_history.stop_reason.
  • Virtual v0 fallback + precision-collapse floor: controller appends config_v0's profile as a synthetic HistoryEntry(iteration=-1) before pick_committed(). pick_committed(precision_collapse_floor=0.9) demotes RED entries with mass_above_threshold > 0.9 to rank=3, guarding against the "everything matches" pathology.
  • Health-aware commit logging: WARNING on RED commit (failing sub-profile + stop_reason + iteration), INFO on YELLOW, silent on GREEN, ERROR on all-errored fallback.
  • StopReason enum moved from core/autoconfig_controller.py to core/complexity_profile.py.

Benchmarks (zero-config, no LLM)

| Dataset | v1.8.0 | v1.9.0 |
|---|---|---|
| DBLP-ACM | 0.9641 | 0.9641 |
| Febrl3 | 0.9443 | 0.9443 |
| NCVR | 0.9719 | 0.9719 |
| DQbench composite | 62.87 | 62.87 |

Notes

The original v1.9 spec assumed best-effort RED commit would deliver a DQbench composite gain (target >= 65). In practice, the controller's complexity indicators can't distinguish "blocking key is wrong" from "blocking key is right but sample has no visible matches" - both produce mass_above_threshold=0.0. Virtual v0 + precision floor restored v1.8 parity. v1.10 will add new indicators (identity-column priors, cross-blocking overlap probe, blocking-column corruption signal, sparse-match sensitivity, full-population matchkey hits) so the controller can distinguish these cases and deliver real DQbench gains.

Breaking changes

None. RunHistory.cheapest_healthy() is a deprecation alias; behavior change documented in DeprecationWarning text.

Full diff: https://github.com/benzsevern/goldenmatch/compare/v1.8.0...v1.9.0

Weekly OSS security release digest.

The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.

No spam, unsubscribe anytime.

Share this release

Track GoldenMatch

Get notified when new releases ship.

Sign up free

About GoldenMatch

All releases →

Related context

Related tools

Earlier breaking changes

  • v3.1.0 `GOLDENMATCH_FRAME=polars` now requires the `[polars]` extra; raises error without it.
  • vgoldencheck-v3.0.0 `inferred_type` emits neutral dtype vocabulary (str/int/uint/float/date/datetime/bool/other) instead of raw Polars dtypes.
  • vgoldencheck-v3.0.0 'inferred_type' now emits a neutral dtype vocabulary instead of raw Polars dtype strings.
  • vgoldencheck-v3.0.0 `scan_file`, `scan_dataframe`, and CLI `check` now run without Polars, using Arrow-native pyarrow.Table.
  • v3.0.0 Result frames now return pyarrow.Table instead of Polars DataFrame.

Beta — feedback welcome: [email protected]