Skip to main content
May 25, 2026
Tighter measurement-data validation, broader UCP-to-cycler conversion, Wasserstein cost function

Stronger measurement-data validation and processing

A new strict-mode check, capacity_energy_from_current_power, compares the reported Discharge/Charge capacity [A.h] and …energy [W.h] columns against a per-step trapezoidal integral of Current [A] and Power [W], flagging row-by-row mismatches (10% default tolerance) so a transient mid-step error that later cancels out is still caught. When the reported charge/discharge columns are swapped — common in half-cell exports — fix_swapped_charge_discharge_columns detects and corrects the labels. The current-sign-convention check now weights each step’s vote by the charge it actually passes (∫|I| dt) instead of its row count, so a long near-zero-current voltage hold no longer outvotes genuine discharge pulses and raises a false CURRENT_SIGN_REVERSED.Small-current coin- and half-cell data now processes end-to-end: rest-step detection scales its threshold to the trace’s peak current (sub-mA currents are no longer all classified as rest), the auto-flip retry drops stale capacity/energy columns before recomputing, and caller-supplied Step count labels survive sign correction. A new generic parquet reader uses the same alias-based column detection as the CSV reader, and folder: data references now accept time_series.parquet / steps.parquet (preferred over CSV when both are present).

Broader, validated UCP-to-cycler conversion

The UCP-to-Arbin and UCP-to-Maccor converters handle more end-condition and step types (variable / loop / compound ends, temperature ends, Maccor pause steps) and now validate up front, raising clear errors on features a target cycler genuinely cannot represent instead of emitting files that fail to re-parse.

Wasserstein distance cost function

iwp.costs.Wasserstein adds the 1-Wasserstein (earth mover’s) distance as a data-fitting cost, comparing model output and data as distributions rather than point-by-point. Available in both the pipeline and schema packages.
Improvements
  • Protocols list loads dramatically faster: the experiment-templates list endpoint now omits heavy JSONB columns by default (~7.5 KB vs 7.7 MB on 22 templates), with callers opting into protocol_config, parameters_schema, and similar fields via ?include=.
  • Failed pipelines can be resubmitted from the pipeline details page, which now shows an error banner that deep-links to each failed element; individual elements display an inline error alert.
  • Material property dataset plots now have an always-visible vertical legend with units, positioned to the right of the plot.
Fixes
  • Filtering measurements by ID on the project data page now narrows the list — the id query parameter was previously dropped silently, returning every measurement.
  • Material dataset upload no longer shifts column indices when a CSV has an unnamed leading column, and now requires every column to be named (with a clear error) instead of silently skipping unnamed ones.
  • Project membership management, active-organization switching, and parameterized-model deletion now go through the backend API instead of direct database writes, so they behave consistently under row-level security.
Improvements
  • client.auth_check() and client.whoami() verify which user and organization a configured API key resolves to, backed by a new GET /auth/health endpoint — useful for debugging wrong-org (403) errors and confirming which key is active.
Improvements
  • Maccor protocols with SubRout steps survive UCP YAML round-trips: resolved subroutine steps are namespaced and written back into the YAML, and intra-subroutine goto targets resolve at simulation time, fixing the Subroutine '<name>' not found error in the parse-then-simulate flow.
Improvements
  • New validate-data skill guides agents through the measurement-data validation and column-fix workflow.
  • A Codex plugin manifest was added so the Ionworks skills package installs in Codex alongside Claude Code.