> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ionworks.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 2026 05 25

<Update label="May 25, 2026" description="Tighter measurement-data validation, broader UCP-to-cycler conversion, Wasserstein distance 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

  A new Wasserstein (earth mover's) distance cost function is available for data
  fitting, comparing model output and data as distributions rather than
  point-by-point. Available in both the pipeline and schema packages.

  <AccordionGroup>
    <Accordion title="Studio">
      **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 with the platform's access
        controls.
    </Accordion>

    <Accordion title="Python API">
      **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.
    </Accordion>

    <Accordion title="Protocol Simulator">
      **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.
    </Accordion>

    <Accordion title="Skills">
      **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.
    </Accordion>
  </AccordionGroup>
</Update>
