Pointblank v0.26.0 is a major release focused on clinical data standards, data quality measurement, and AI-assisted validation editing. This release introduces comprehensive CDISC conformance validation with a built-in rule engine and bundled controlled terminology, a metadata import/export system supporting SDTM, ADaM, Frictionless, and CSVW formats, and structured missingness handling through a new MissingSpec type. Validation steps are now automatically tagged with data quality dimensions and rolled up into health scores, and the new EditValidation class lets you modify existing validation plans through interaction with an LLM.
New Features
-
Data quality dimensions and health scoring — Every validation step is now tagged with a data quality dimension (Completeness, Validity, Uniqueness, Consistency, Timeliness, or Volume) inferred automatically from the assertion type. Dimensions are overridable per step via
dimension=or remappable globally viapb.config(dimension_map=...). New methodsget_dimension_scores(),get_health_score(),get_scorecard(), andget_validation_summary()expose test-unit-weighted scores, withassert_dimension_scores()available to fail a run when a dimension falls below a threshold. The validation report shows color-coded dimension badges on each step number with a health-score summary in the footer. (#409) -
CDISC submission conformance — A new conformance validation framework provides a rule engine, bundled SDTMIG 3.4 rules with SDTM controlled terminology, and public APIs for validating study submission packages. Includes
ConformanceReportwith JSON and Excel export,findings_df()andget_findings_table()for detailed inspection, and integration with the CDISC CORE engine. (#413) -
Metadata standards — New metadata import, export, and validation workflows for clinical data standards. The
import_metadata()function reads Frictionless Table Schema, CSVW, CDISC Define-XML, CDISC Controlled Terminology, and SPSS/SAS/Stata files into a unifiedMetadataImportobject. Built-in SDTM and ADaM templates enable domain-level structure validation withvalidate_sdtm()andvalidate_adam(). Metadata can be exported back to Frictionless format and converted to Pointblank schemas. (#403) -
Schema enforcement API — A contract import/export system with a modular adapter architecture.
import_contract()andexport_contract()translate between external schema formats (JSON Schema, Frictionless Table Schema) and Pointblank validations or contracts. Custom adapters can be registered via the@register_adapterdecorator. (#402) -
Structured missingness — A new
MissingSpectype maps sentinel values to reasons, and amissing=parameter oncol_vals_*()methods excludes coded values from checks. Four dedicated validation steps are added:col_pct_missing(),col_missing_coded(),col_missing_only_coded(), andcol_missing_consistent(). (#404) -
AI validation editor — The new
EditValidationclass lets you modify an existing validation plan from a natural-language instruction, withdiff(),changed_steps(),preview(), andaccept()methods for reviewing changes. Plan serialization viaValidate.to_code()andValidate.to_yaml()is fully round-trippable. Also addsValidate.suggest_improvements(),Validate.from_prompt(),Validate.from_plans(), a syntax-lint guardrail with auto-reprompt, and apb editCLI command. (#408) -
float_field()precision=parameter — Generated float values can now be rounded to a specified number of decimal places, useful for prices, scores, and other fields where full floating-point precision is not desired. (#412)
Bug Fixes
-
Per-row validation checks on Polars LazyFrames are no longer 8–11× slower than v0.24.0. The result-tallying code now computes row, pass, fail, and null counts in a single aggregation instead of issuing three to four separate
.collect()calls that re-executed the entire lazy plan. (#407) -
Segmented validation on Polars LazyFrames no longer raises an
UnboundLocalErrorforseg_tuples(). Segment expressions now work consistently for both eager and lazy DataFrames. (#414)
Documentation
- CDISC validation user guide examples are now fully executable against sample metadata documents bundled with the package via the new
load_metadata_example()function. (#406)