> ## 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 06 15

<Update label="June 15, 2026" description="Global search with ⌘K, new Bayesian / TuRBO / SOBER optimizers, faster ECM parameterization, inline image previews for file measurements">
  ## Global search across the platform

  A `⌘K` dialog now searches across projects, cell specifications,
  cell instances, cell measurements, pipelines, datafits, simulations,
  optimizations, and parameterized models — with grouped, deep-linked
  results and per-entity-type chip filters. Cell measurements and
  instances are indexed via server-side full-text search, so a partial
  name or id from any of these surfaces lands on the right detail page
  in one keystroke. The search dialog supports filtering and paging
  results server-side.

  ## Bayesian Optimization, TuRBO, and SOBER for parameter estimation

  Three surrogate-based optimizers ship in `ionworkspipeline`:

  * **`BayesianOptimization`** — sequential or batch BO with (log-)Expected
    Improvement and a feasibility-weighted acquisition for constrained
    problems.
  * **`TuRBO`** — trust-region BO with Thompson sampling and constraint
    handling.
  * **`SOBER`** — batch BO via Bayesian quadrature with prior-aware
    importance sampling.

  Each algorithm has a matching `BayesianOptimizationOptions`,
  `TuRBOOptions`, `SOBEROptions` schema, and a new method-selection guide
  in the docs explains when to reach for them over Nelder–Mead, CMA-ES,
  or differential evolution.

  ## ECM parameterization runs as a background job

  Authenticated ECM fits now run as background jobs instead of blocking
  on a synchronous request for 10–60 s. `POST /ecm/fit-from-file` and
  `POST /ecm/fit-from-measurements` return `202 {job_id, status}`; the
  public demo `POST /ecm/fit` stays synchronous so unauthenticated
  example fits still complete in one round-trip. The new `client.ecm`
  Python SDK sub-client covers all three input modes — `fit_from_example`
  (sync), `fit_from_file` and `fit_from_measurements` (returning an
  `EcmFitJob` with `wait_for_completion(...)` polling), plus
  `save_to_project` and `detect_and_read` — and a new `ecm-fitting` agent
  skill walks an agent through picking a mode, running the fit, and
  persisting it as a parameterized model. Solver errors from user data
  now surface as clear, actionable API errors instead of generic
  failures.

  ## Inline image previews for file measurements

  File-type cell measurements used to render a "Visualization not yet
  supported" placeholder; the measurement detail page now fetches every
  attached file, renders images inline (filling the column with a
  click-to-expand lightbox, Esc or click-out to dismiss), and offers a
  download link for any file type. The detail page also no longer fails
  to load for `file` and `properties`-type measurements that don't have
  time series data.

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

      * Optimizations get a lighter-weight `/optimizations` REST surface
        (list, get, config, metadata, runs, statuses, cancel, resubmit,
        delete), and the optimization list page now polls a lightweight
        status projection every 5 s for faster, more efficient updates. The
        parameterized-model selector also fetches by id rather than scanning
        a larger cache.
      * A project-scoped parameterized model listing lets the
        parameterized-model picker filter to models that belong to the
        current project.
      * Internal indexing helper fields are hidden in the object-fields
        panels so detail views no longer surface implementation details.
      * Datafit results now surface "Validation not supported" as an inline
        alert when applicable, instead of leaving the validation tab blank
        or failing the page.
      * Protocol files that pause or end on a non-error stop condition now
        render a user-correctable inline message; previously the route
        returned a generic error.
      * Errors raised internally are now consistently converted into
        structured error responses across simulation and datafit result
        endpoints.
      * The Universal Cycler Protocol simulator pages now list Arbin and
        Novonix alongside Maccor, Bitrode, and BioLogic as supported cycler
        protocol formats, and the supported-protocols copy is shared between
        both UCP pages so the two stay in sync.
      * Data grid cards now claim an intrinsic width, fixing collapsed-grid
        layout issues when the parent container had no explicit width.
      * Measurement-file uploads to storage now retry on transient errors
        with capped exponential backoff and a clear error once attempts are
        exhausted.
      * Pipeline list and detail views are more robust to out-of-order
        responses, so navigating between pipelines during a slow request no
        longer reverts the view to a stale pipeline. Pipeline-elements
        caching and background polling were also hardened against stale-data
        races.
      * The measurements list resets to page 1 at render time when the
        parent entity changes, removing the flash of stale rows that
        appeared while a new request was in flight.
      * Org-context resolution on hard refresh is now deterministic — the
        active project no longer briefly reverts to the first project in
        the list before the persisted selection loads.

      **Fixes**

      * Dark mode now derives selection, focus, and hover colors from the
        Ionworks brand pink so the focused row, selected nav item, and
        hovered button no longer look muddy against the dark background.
      * Validation plot axis titles render correctly with the latest
        charting library version.
      * The cell card on the cell detail page no longer shows redundant
        metadata fields that duplicated the breadcrumb.
      * The all-measurements page now loads cell specs on cold/direct
        navigation so the spec-name and spec-anode/cathode columns populate
        on first paint instead of only after navigating in from elsewhere.
    </Accordion>

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

      * `CycleAgeing` defaults to a unified experiment model when an
        experiment is supplied, and compiles by default in that mode.
        Cycling experiments repeat the same handful of steps many times, so
        this collapses build and solve cost, giving a substantial speedup
        for cycle-ageing fits. Pinned to PyBaMM 26.6.1.0.
      * `CycleAgeing` accepts `experiment="from data"`, which builds the
        cycling experiment from the loaded dataset instead of requiring
        the user to restate it.
      * `CycleAgeing` automatically skips storing intermediate-cycle data
        when every requested metric only needs first/last-cycle quantities.
      * `save_at_cycles` on `CycleAgeing` is now auto-derived from the
        requested metric tree when the caller does not pass one
        explicitly — only the cycles that downstream metrics actually
        consume are saved.
      * `ElectrodeBalancing` emits `dQ/dV` curves alongside the existing
        capacity outputs, so weighted costs can be computed directly against
        the dQ/dV peak structure.
      * The `Time` metric accepts a vector of times and reports the metric
        at each one, replacing the previous one-scalar-at-a-time loop in
        callers that needed a few sample points.
      * Solver options can now be passed through to every objective,
        complementing last week's solver options on the constructor side.
      * `SimplePipeline` is a new pipeline mode with a client-side validator
        that rejects configs containing more than one expensive element
        (`DataFit`, `ArrayDataFit`, `Validation`), mirroring the server-side
        guardrail.

      **Fixes**

      * An unsupported preprocessing option is now rejected at config time
        when passed in objective options, matching the runtime ban and
        giving a clearer config-time error.
    </Accordion>

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

      * `client.electrolyte.transport_from_dataset(dataset_id, forms=, columns=)`
        turns a material property dataset into a `pybamm.ParameterValues`
        of concentration-dependent transport functions ready to hand to
        `iws.direct_entries.DirectEntry(parameters=...)`. Two function
        forms are supported per property: tabulated interpolation
        (default) and a Landesfeind–Gasteiger isothermal exponential fit,
        which stays positive and finite below the lowest measured
        concentration so high-rate DFN solves don't fail when the
        electrolyte depletes.
      * `Quantity` constructors accept PyBaMM-style unit strings and
        normalize them on input, so values copied from a PyBaMM parameter
        set round-trip into and out of cell schemas without a manual unit
        rewrite.
      * `JobClient.get_parameter_trace(job_id)` returns the parameter-
        evaluation trace from an optimization job as a DataFrame for
        inspection or downstream plotting.
      * `client.ecm` (introduced above) is the new ECM sub-client.

      **Fixes**

      * POST and PATCH calls retry on transient connection drops with the
        same capped-backoff policy already used for GETs, removing spurious
        connection errors during long-running uploads against a flaky link.
    </Accordion>

    <Accordion title="Data Processing">
      **Fixes**

      * A constant-current discharge segment with the unsigned mixed-mode
        sign convention no longer mislabels the step direction, and the
        matching CC-discharge classifier no longer reverses the sign on
        file round-trip.
    </Accordion>

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

      * Arbin protocols with a `SIGN(...)` or step-time piecewise-current
        formula now parse correctly and emit the expected step plan; the
        previous parser failed on the conditional with a generic syntax
        error.
      * `human_readable_protocol(...)` renders drive-cycle steps in the
        same shorthand notation the simulator uses elsewhere, instead of
        expanding them inline.

      **Fixes**

      * Pause and end stop reasons now surface as user-correctable inline
        errors instead of being treated as solver failures.
    </Accordion>

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

      * The `parameterize` skill gains a current-driven fit template and a
        full-cell OCV template, each with an objective / cost decision tree
        so an agent can route an incoming dataset to the right starting
        configuration without re-deriving the choice every time.
      * A new `electrolyte-transport` SDK skill documents the
        `client.electrolyte.transport_from_dataset(...)` workflow,
        including the interpolant vs. Landesfeind-exponential trade-off
        and the `DirectEntry` integration pattern.
      * A new `ecm-fitting` SDK skill walks through the three ECM input
        modes (example, file, measurements) and the save-to-project flow.
      * The `parameterize` skill explains the component/material model and
        the material → cells reverse lookup so an agent can find which cell
        specs reference a given material before editing it.
    </Accordion>
  </AccordionGroup>
</Update>
