June 15, 2026
Global search with ⌘K, surrogate-based Bayesian / TuRBO / SOBER optimizers, ECM parameterization on the worker fleet, 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 full-text search (Postgres tsvector with
a backfilled search_vector column), so a partial name or id from
any of these surfaces lands on the right detail page in one keystroke.
The backend exposes limit, offset, entity_types, and project_id
query parameters so the dialog can chip-filter and page server-side.Bayesian Optimization, TuRBO, and SOBER for parameter estimation
Three surrogate-based optimizers ship inionworkspipeline on a shared
SurrogateBasedAlgorithm base (LHS warm-up, GP fitting with outlier
clamping, constraint-GP handling, and EI-based surrogate convergence):BayesianOptimization— sequential or batch BO with (log-)Expected Improvement and a feasibility-weighted acquisition for constrained problems.TuRBO— trust-region BO with Thompson sampling, SCBO-style constraint handling, and anisotropic lengthscale weighting.SOBER— batch BO via Bayesian quadrature with Tchernychova–Lyons kernel recombination, prior-aware importance sampling, and adaptive WKDE prior updates.
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 asecm_fit jobs on the Anyscale/Ray
worker fleet instead of blocking a FastAPI worker 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 ValueErrors from user data now surface
as BadRequestError/CONFIGURATION_ERROR instead of paging Sentry.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 loader also stopped unconditionally requestingsteps_and_cycles / time_series for
non-time-series measurements — a 400 from those endpoints used to
reject the whole thunk and show “Measurement not found” for file
and properties rows.Studio
Studio
Improvements
- Optimizations are decoupled from the internal jobs system: a new
/optimizationsREST surface returns job-freeOptimizationResourceDTOs (list, get, config, metadata, runs, statuses, cancel, resubmit, delete) and the optimization list page polls a lightweight/statuses?ids=...projection every 5 s instead of opening one WebSocket per row. The parameterized-model selector also fetches by id rather than scanning the jobs cache. - A project-scoped parameterized model listing lets the parameterized-model picker filter to models that belong to the current project.
id_textandsearch_vectorcolumns are hidden in the object-fields panels so detail views no longer surface internal indexing helpers.- Datafit results now surface “Validation not supported” as an inline
alert when the result payload sets
validation_not_supported, 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 500.
- A new
pipelines/validations/{job_id}/plot_data/pipelines/datafits/{job_id}/plot_dataconsistency pass plus generic backend mapping converts any plain Python error raised inside the web layer into a structured domain error response. - 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.
- The
StandardDataGridcard now claims an intrinsic width, fixing the collapsed-grid layout when the parent container had no explicit width. - Measurement-file uploads to storage now retry on transient errors with capped exponential backoff and a structured 502 once attempts are exhausted.
- Pipeline list and detail fetches enforce last-wins via
requestIdguards and pass the thunk’sAbortSignalthrough toaxios, so navigating between pipelines during a slow request no longer reverts the view to a stale pipeline. Pipeline-elements caching now merges scoped entries on refetch instead of wiping the whole entity dict, and the pipeline detail subscription’s polling callback guards against the stale-closure race that fired refetches for the previous pipeline. - 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 bootstrap ordering avoids the race where the active project briefly reverted to the first project in the list before the persisted selection rehydrated.
- 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 under Plotly 3.x — the
upgrade started requiring the
{ text: ... }wrapper that earlier versions inferred from a bare string. - 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.
Pipeline
Pipeline
Improvements
CycleAgeingdefaultsexperiment_model_mode="unified"when an experiment is supplied, andiwp.Simulation’scompileflag now defaults toTruein unified mode. Cycling experiments repeat the same handful of steps many times, so a single switching model collapses build and solve cost compared to one model per step; combined with compilation this is a substantial speedup for cycle- ageing fits. Pinned to PyBaMM 26.6.1.0.CycleAgeingacceptsexperiment="from data", which builds the cycling experiment from the loaded dataset instead of requiring the user to restate it.CycleAgeingauto-enablesstore_first_lastwhen every requested metric only needs first/last-cycle quantities, skipping the intermediate-cycle storage that the metrics would never read.save_at_cyclesonCycleAgeingis 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.ElectrodeBalancingemitsdQ/dVcurves alongside the existing capacity outputs, so weighted Wasserstein costs can be computed directly against the dQ/dV peak structure.- The
Timemetric 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. - A generic
solve_kwargspasses through every objective intoSimulation.solve, complementing last week’ssolver_kwargson the constructor side. - Metric-tree introspection moved onto the
MetricandSlicerclasses so callers can ask a metric what it stores instead of re-deriving the answer from a config dict. SimplePipelineis a newPipelinesubclass with a client-side validator that rejects configs containing more than one expensive element (DataFit,ArrayDataFit,Validation), mirroring the server-side guardrail.
interactive_preprocessingis rejected at the schema level when passed in objective options, matching the runtime ban and giving a clearer config-time error.
Python API
Python API
Improvements
client.electrolyte.transport_from_dataset(dataset_id, forms=, columns=)turns a material property dataset into apybamm.ParameterValuesof concentration-dependent transport functions ready to hand toiws.direct_entries.DirectEntry(parameters=...). Two function forms are supported per property: tabulatedpybamm.Interpolant(default) and Landesfeind–Gasteiger isothermaly = A·exp(B·c)(least-squares onln y), which stays positive and finite below the lowest measured concentration so high-rate DFN solves don’t hitIDA_ERR_FAILwhen the electrolyte depletes.Quantityconstructors 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.
- POST and PATCH calls retry on transient connection drops with the
same capped-backoff policy already used for GETs, removing the
spurious
ConnectionResetErrorsurfacing during long-running uploads against a flaky link.
Data Processing
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 parquet round-trip.
Protocol Simulator
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.
- Pause and end stop reasons now surface as user-correctable inline errors instead of being treated as solver failures.
Skills
Skills
Improvements
- The
parameterizeskill 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-transportSDK skill documents theclient.electrolyte.transport_from_dataset(...)workflow, including the interpolant vs. Landesfeind-exponential trade-off and theDirectEntryintegration pattern. - A new
ecm-fittingSDK skill walks through the three ECM input modes (example, file, measurements) and the save-to-project flow. - The
parameterizeskill 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.