> ## 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 18

<Update label="May 18, 2026" description="Material properties in Studio, native UCP simulation for design optimization, SimplePipeline workflow, global search endpoint">
  ## Material properties in Studio

  A new **Materials** section in the project sidebar lets you create
  materials within a project and attach measured property datasets
  (CSV / parquet) to each one. Upload, plot, edit, re-process, replace,
  and delete are all wired up. The Python SDK gains read-only `client.material`
  and `client.material_property_dataset` sub-clients with `list`, `get`,
  `get_units`, and `get_data` (returns a `polars.DataFrame`); the REST
  surface supports signed-URL downloads, on-the-fly downsampling, and
  x-range filtering. A new docs page covers the UI workflow and REST
  endpoints.

  ## Native UCP simulation for design optimization

  `DesignObjective` gained a `backend="ucp"` option that runs UCP protocols
  natively inside the optimization loop instead of converting them first.
  This preserves UCP features that the conversion dropped — dynamic loops,
  conditionals, gotos, `set_variable`, subroutines — and avoids
  per-iteration overhead. EIS steps are now rejected up front in design
  optimization (with a clear error both in the frontend form and at the
  backend), because the UCP backend does not yet support frequency-domain
  steps; standalone simulations remain the path for EIS.

  ## SimplePipeline workflow

  A new lightweight pipeline variant for configs with at most one
  expensive element (one data fit or one validation). The whole config
  runs end-to-end as a single background job instead of fanning out to
  child jobs. CRUD endpoints under `/simple_pipelines` (POST returns 202;
  LIST supports filters; PATCH for name/description; cancel and delete),
  plus a `client.simple_pipeline` SDK sub-client with `create`, `get`,
  `list`, `update`, `cancel`, `delete`, and `wait_for_completion`.

  ## Global search API

  New `GET /search` endpoint performs prefix full-text + substring
  search across projects, studies, simulations, models, parameterized
  models, optimizations, optimization templates, experiment templates,
  pipelines, cell specifications, and materials within the authenticated
  organization. There is no frontend search bar in Studio yet — the
  new docs page makes this explicit so you don't go looking for one.

  <AccordionGroup>
    <Accordion title="Studio">
      **Improvements**

      * Optimizations table: bulk **Delete** restored next to the existing
        bulk Cancel action, gated by `optimization:delete`, with a
        confirmation dialog that pluralizes correctly and per-row error
        toasts.
      * Protocol simulator: **Download CSV** button next to "Configure Plot"
        exports the full time-series plus step-level columns (cycle count,
        step number, protocol variables) expanded to match each time point,
        regardless of zoom.
      * Time-series measurement plot: overlay multiple variables sharing the
        same unit on either Y-axis via a `+` button — unit-filtered dropdown,
        distinct color cycle per series, individual `×` to remove, and
        selecting a primary variable with a different unit clears
        incompatible extras.
      * ECM models now expose `Anode potential [V]`, `Cathode potential [V]`,
        and their open-circuit counterparts so BioLogic three-electrode
        EWE / ECE control limits can be reproduced from a simulation. New
        `LFP/Li metal` half-cell chemistry added to the parameter library and
        the cell configuration UI.
      * Hover tooltips standardized to 3 decimal places across all plots.
      * EIS Nyquist plot renders as markers-only scatter (no connecting
        lines), with a slightly larger marker.
      * Cell-spec cascade delete now batches storage-path deletion and
        parallelizes per-measurement folder deletes, so one transient
        failure doesn't abort cleanup for the others.
      * Storage downloads now retry transient errors with exponential
        backoff — fixes job failures on intermittent non-JSON error responses.
      * A new endpoint returns the parsed contents of a job's metadata blob,
        giving the Python SDK a path to large validation payloads that the
        legacy result endpoint could not reach.
      * Simulation submission unified to a two-step pattern (parse-to-template
        then simulate-with-template). Removed several redundant older
        simulation endpoints.

      **Fixes**

      * Simulation dedup: removed a session-specific identifier from the
        uniqueness key used to detect duplicate simulations, so the
        "simulation already exists" path actually triggers and duplicate
        rows stop accumulating.
      * Measurement details: Cycles tab is visible again and the cycle
        filter slider's range is correct after the `Cycle number` →
        `Cycle count` column rename.
      * Measurements of type `properties` or `file` now show an
        informational alert pointing to the details panel or the SDK
        instead of rendering empty time-series tabs.
    </Accordion>

    <Accordion title="Pipeline">
      **Improvements**

      * `ionworks-schema` is now the single validation boundary for parser
        inputs across the pipeline, improving consistency between the SDK's
        schema classes and pipeline execution.
      * Standardized user-facing optimizer kwargs across all fitting
        backends: `max_iterations` replaces older per-backend names, and
        `population_size` replaces `popsize` on the differential evolution
        optimizer. Old names continue to work with a `DeprecationWarning`.
      * A transient protocol solver failure during differential evolution now
        lands on the finite-penalty path instead of killing the optimization.
        Protocol and configuration errors still surface as errors so static
        bugs remain visible.

      **Fixes**

      * `pybamm.Experiment` `period` and `temperature` now round-trip
        correctly through serialization (fix shipped in `pybamm 26.4.3`).
        Experiment schemas accept the new field set (per-step `period`,
        `temperature`, `tags`, `description`, `direction`, `start_time`,
        `skip_ok`; experiment-level `period`, `temperature`, `termination`);
        `duration` also accepts human-readable strings like `"287 seconds"`.
      * SimplePipeline jobs run data fits in-process and now establish their
        own connection to the compute backend, so distributed evaluation
        actually fires; when that connection fails, the fit falls back to
        its in-process path. Legacy element-type labels are now canonicalized
        consistently at ingress.
    </Accordion>

    <Accordion title="Python API">
      **Improvements**

      * `client.simple_pipeline` sub-client for the new SimplePipeline
        workflow.
      * `client.protocol.convert(protocol, target)` returns a
        `ConvertResult` with `primary_bytes`, `text()`, and `save(dir)`
        helpers — exports a UCP YAML protocol to a native vendor file
        (Maccor, Arbin, Neware, BioLogic BT-Test, or Novonix). Maccor returns
        any drive-cycle MWF assets alongside the primary file.
      * `client.job.get_metadata(job_id)` returns the parsed contents of a
        job's metadata blob, giving the SDK access to large validation
        payloads the legacy result endpoint could not reach.
    </Accordion>

    <Accordion title="Protocol Simulator">
      **Improvements**

      * BioLogic `.mps` parser: User Profile (drive cycle) steps are now
        extracted from embedded Urban Profile Tables, or from sibling `.txt`
        files supplied via `additional_content` when the `.mps` lacks
        embedded tables. Current sign is flipped on the way in so positive
        represents discharge for UCP/PyBaMM.
      * Arbin parser rewritten to keep the step list flat with raw gotos
        instead of inferring loops from backward-goto patterns. Fixes
        sibling backward gotos to the same target, cross-loop goto
        resolution, and digit-bearing formula labels like
        `F_EIS_10%_capacity_change`. Pause steps emit UCP's first-class
        auxiliary `Pause` step.
      * More Arbin / Maccor step types recognized:
        Arbin `Internal Resistance` → `Rest` with a `UserWarning`,
        additional Arbin step variants mapped to their UCP types,
        bracketed `MV_UD[n]` normalised, leading-negative current
        expressions classified as `Discharge`. Maccor `User Def CYCLE <op> N`
        translated to a UCP `VariableEnd` against the runtime `CYCLE` alias.
      * Per-step overhead trimmed substantially on long protocols, speeding
        up simulation of protocols with many steps.
      * Solver failures are now distinguished from protocol and configuration
        errors, which keep their original error types and gain step context.

      **Fixes**

      * Real Maccor `.MWF` exports that include a multi-line preamble plus
        a header row now parse correctly. Files containing only data rows
        still parse unchanged.
    </Accordion>

    <Accordion title="Skills">
      **Improvements**

      * New `run-simple-pipelines` skill walks through the SimplePipeline
        client end-to-end.
      * `process-data`: clarified that `protocol` holds test conditions that
        affect the electrochemical outcome (temperature, C-rate, SoC, DoD,
        pressure) while `test_setup` holds physical logistics (cycler model,
        operator, lab, channel) that do not. `test_setup` lives only on
        measurements, not on cell instances.
      * `process-data`: `set_step_count` with a step column is now the
        unambiguous default, so decreasing / repeating step ids from GITT or
        RPT-with-substeps work the same as monotonic ones; the sign-based
        fallback is reframed as a fallback for when no step column exists at
        all. Added a caveat for cyclers that emit duplicate `Time [s]` rows
        at step transitions.
      * `process-data`: mandatory header-audit step codifies eight rules
        (walk every file, group by cohort × column-set, classify
        Standard / Auxiliary / Drop, diff reader output, preserve aux
        columns, keep multi-thermocouple channels separate, confirm units /
        sign per cohort, surface missing-temperature as a finding) and a
        required confirmation-report shape, so silent column drops between
        cycler families are caught before any standardized parquet is
        written.
    </Accordion>
  </AccordionGroup>
</Update>
