| 93% coverage gate enforced in CI |
holds |
--cov-fail-under=93 in pyproject addopts; CI runs it on every PR (recent runs: 93.5%) |
| Safe defaults (never imputes identifiers, never touches targets, no blind outlier removal) |
holds |
protected-column guard + role inference tests; strict=True escalates ambiguity to errors |
Fully offline; only network call is fd.models.pull |
holds |
default test gate is -m "not online"; no other network code paths |
| Polars/DuckDB/Spark backends scale beyond pandas |
holds with measured boundary |
see backends: DuckDB native handle peaks at ~40% of eager RSS (measured); polars-lazy defers only final materialization — pipeline intermediates still collect eagerly. Reproduce: python benchmarks/bench_outofcore.py |
Native handle kept with strategy="conservative" |
corrected |
also requires fix_dtypes=False; dtype fixing forces the recorded pandas fallback |
| StreamingCleaner cleans arbitrarily tall data with stable memory |
holds |
bounded reservoirs/counters, RSS benchmark benchmarks/bench_streaming.py; dedupe window is recent-window, not global (see limitations) |
| CSV exports safe to open in spreadsheets |
holds for review queues by default; opt-in elsewhere |
see threat model; tests/test_csv_formula_sanitize.py |
Typed (py.typed), mypy-clean |
holds |
mypy src/freshdata in CI quality gate (187 files) |
fallback_policy="error" prevents any unrequested pandas materialization |
holds |
enforced before the pandas pipeline runs at every backend delegation point; tests/test_execution/test_fallback_policy.py |
| Polars subset dedup matches pandas keep semantics byte-for-byte |
holds |
order-preserving unique(subset=...); parity tests incl. nulls/unicode/multi-column in tests/test_execution/test_fallback_policy.py (order preservation makes the stage eager, disclosed on the report) |
| Validation never mutates data |
holds |
tests/test_validation_suite.py::test_validation_never_mutates; non-pandas inputs record their materialization on ValidationResult.execution |
| Entity-resolution accuracy is measured, not asserted |
holds with named method |
committed labelled dataset + benchmarks/er_results.json (P/R/F1, FP/FN, false merges per null_policy × mode); scoring is rule-weighted (no EM/Fellegi–Sunter — no Splink-parity claim) |
| Out-of-core evidence covers 10M+ rows |
holds to 25M |
src/freshdata/benchmarks/RESULTS.md (10k–25M, machine + versions + command recorded); 100M/1B size keys exist in the harness but have no committed evidence |