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

# Changelog — Page 2

> Ionworks Studio product updates from February to April 2026

<Update label="April 6, 2026" description="Measurement types, performance improvements, total time termination, parameterized model enhancements">
  ## Measurement types for non-time-series data

  Cell measurements now support a `measurement_type` field with three values: `time_series` (the
  default), `properties` for key-value metadata such as checkpoint measurements, and `file` for arbitrary
  files such as images, PDFs, or numpy arrays. Each type has its own creation and retrieval flow, and
  list endpoints can filter by type.

  [Find out more →](/data/overview#measurement-types)

  ## Performance improvements

  Pipeline creation is now significantly faster: large job configurations are offloaded to object storage
  instead of being written inline to the database. The entire backend has also been migrated to an async
  Supabase client, improving throughput under concurrent load. Models, parameterized models, studies, and
  optimizations now use server-side pagination and filtering, eliminating the need to load entire
  collections into memory.

  ## Total time termination condition

  Protocol steps can now use `total_time` as a built-in termination condition, ending a step after a
  specified duration of total elapsed experiment time rather than just step time.

  [Find out more →](/simulate/simulating-commercial-protocols#total-time)

  ## Parameterized model improvements

  The parameterized model detail view has been consolidated into a single page with tabs, replacing the
  previous multi-page layout. Models can now be downloaded as a zip archive containing the full
  configuration, and initial temperature is now parsed in design optimization objectives for
  temperature-dependent studies.

  [Find out more →](/build/parameterized-models)

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

      * Cell specification list now displays as a sortable data table instead of cards.
      * Added a UI warning when a simulation produces no data because all protocol steps were skipped.
      * Removed hardcoded convenience variables from the variable evaluator and improved the evaluate
        variables UX.
      * Migrated all update endpoints from PUT to PATCH semantics with partial update bodies.
      * Standardized all duplicate resource errors to return HTTP 409 with structured error details.
      * Replaced signed URL downloads with HTTP 307 redirects for simpler, faster file access.
      * Flattened cell measurement composite response shapes for a more consistent API surface.
      * Design optimizations now default to the Differential Evolution algorithm.

      **Fixes**

      * Fixed optimization deletion hitting the wrong API endpoint.
      * Fixed clone optimization sending a reverted request body.
      * Fixed optimization list page sending redundant API requests.
    </Accordion>

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

      * Parse initial temperature in `DesignObjective` for temperature-dependent optimization studies.

      **Fixes**

      * Fixed `Transform.to_dict` leaking a `base_name` entry into fitted parameter dictionaries.
      * Fixed validation to correctly unwrap `FunctionForExport` when checking transformed parameters.
      * Fixed initial SOC not being passed to EIS frequency-domain simulations.
    </Accordion>

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

      * Added support for arithmetic expressions with input parameters in the UCP-to-PyBaMM converter
        (e.g. `1000 / input["Total cells"]` now produces correct symbolic expressions).

      **Fixes**

      * Fixed initial SOC not being applied in EIS frequency-domain simulations.
    </Accordion>

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

      * Replaced signed URL downloads with direct HTTP 307 redirects for measurement file access.
      * Flattened cell measurement response shapes for simpler data access.
      * Added `measurement_type` field to measurement models for non-time-series data.
      * Migrated all update methods from PUT to PATCH.
      * Improved loading of studies and parameterized models with large numbers of simulations via
        server-side pagination.
    </Accordion>

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

      * Replaced pickle-based local cache with Parquet format for faster, more portable caching.
      * Added Latin-1 encoding support for Neware CSV files.
    </Accordion>
  </AccordionGroup>
</Update>

<Update label="March 30, 2026" description="ECM parameterization, resistance scaling, custom variables, and BaSyTec reader">
  ## ECM parameterization

  A new ECM parameterization page lets you upload cycling data, select 0–5 RC pairs with a live circuit
  diagram, and view fitted parameters including OCV and R0. Results can be downloaded as CSV.

  [Find out more →](/build/ecm-parameterization)

  ## Adjust resistance in protocol simulations

  The protocol simulator now uses Equivalent Circuit Models (ECM) instead of SPM for faster, more robust
  cycler protocol simulations. ECM parameter sets are available for all six supported chemistries, and a
  new resistance scaling parameter in the UI lets you adjust the overall cell resistance before running a
  simulation.

  [Find out more →](/simulate/simulating-commercial-protocols)

  ## Custom variables on models

  You can now define custom derived quantities on models — such as electrode potentials or temperature in
  different units — as PyBaMM expressions stored in the model configuration. These custom variables are
  evaluated at simulation time and included in result data, making it easy to track application-specific
  metrics across design sweeps.

  [Find out more →](/build/custom-variables)

  ## BaSyTec battery cycler reader

  The data processing library now supports BaSyTec CSV exports (CTS, X50 series). The reader
  auto-detects BaSyTec files by header signature, parses `HH:MM:SS.sss` timestamps (including values
  above 24 hours), applies the correct current sign convention, and extracts start times from companion
  `_meta.txt` files.

  [Find out more →](/data/format#supported-cycler-formats)

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

      * Added dark mode with a theme toggle in the dashboard header.
      * Moved optimization templates from organization scope to project scope with project-level management
        pages.
      * Made optimization name optional when creating optimizations.
      * Added pagination to cell specification, instance, and measurement list endpoints.
      * Added OCV traces to drive cycle simulation result plots.
      * Unified EIS column naming to `Z_Re [Ohm]` / `Z_Im [Ohm]` across simulation, measurement ingestion,
        and frontend rendering.
      * Migrated experiment template metrics from code-string evaluation to serializable ionworkspipeline
        metric configs.
      * Completed removal of deprecated `slug` and `additional_data` columns from cell models.

      **Fixes**

      * Fixed datafit processor receiving unresolved `db:` refs during validation.
      * Fixed `LumpedSPMR` model crash due to missing `self.param` attribute.
      * Fixed mutating datafit setup configuration between runs.
    </Accordion>

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

      * Added support for computing lithium inventory from maximum stoichiometries without requiring maximum
        concentration values.
      * Adopted PyBaMM's native `to_config`/`from_config` for model and experiment serialization, removing
        custom parser logic.
      * Added `abs` as a unary operation for composed metrics.

      **Fixes**

      * Fixed thermal model using incorrect heat generation variable in ECM.
      * Fixed trailing space in electrode balancing direction parameter names.
      * Fixed validation to discover sub-parameters inside `FunctionParameter` nodes.
      * Fixed parser to handle sampler configurations and expanded schema sync tests.
      * Fixed pandas/polars/DataLoader compatibility issues.
    </Accordion>

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

      * Unified EIS impedance columns to `Z_Re [Ohm]` / `Z_Im [Ohm]` with SI units and standard sign
        convention.

      **Fixes**

      * Fixed CCCV resolution to apply consistently to all sub-steps within a protocol.
    </Accordion>

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

      * Added local data caching for cell measurements, reducing repeated downloads.
      * Added pagination support (`limit`/`offset`) to cell list methods, returning a `PaginatedList` with a
        `.total` attribute.
      * Completed removal of deprecated `slug` and `additional_data` fields from cell models.
      * Improved sign detection algorithm for measurement current data.
    </Accordion>

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

      * Added BioLogic plain CSV reader for non-MPR exports.
      * Added automatic derivation of `Z_Re` and `Z_Im` from `Z_Mod` and `Z_Phase` when impedance
        components are missing.
      * Moved cell data caching logic into `ionworks-api` for reuse across packages.

      **Fixes**

      * Fixed CSV reader to skip auto-detection for explicitly mapped columns.
      * Fixed plotting bugs in data visualization utilities.
    </Accordion>
  </AccordionGroup>
</Update>

<Update label="March 23, 2026" description="Protocols section, job cancellation, parameterized durations, and optimization management">
  ## Dedicated Protocols section with parameterized input support

  Studio now has a dedicated Protocols section where you can browse, edit, and clone saved experiment
  templates. Each protocol detail page shows the source YAML, a tabbed UCP/human-readable preview, and
  automatically detected input parameters with a generated `parameters_schema`. This makes it easy to
  build reusable, parameterized protocols and simulate them with different input values.

  [Find out more →](/simulate/protocols)

  ## Cancel running jobs from Studio

  You can now cancel pipelines, optimizations, and simulations directly from the UI. Each detail page
  shows a cancel button for in-progress jobs, with optimistic status updates and automatic rollback if
  the cancellation fails. On the backend, cancelling a parent job cascades to all child jobs.

  ## Protocol termination conditions and parameterized durations

  Protocol simulations now support early termination based on variable conditions — useful for ending
  long protocols (e.g. multi-cycle Arbin tests) after a target number of cycles. Duration and
  termination end conditions also accept `input['...']` references, enabling fully parameterized
  experiments such as eVTOL design optimization with variable cruise duration.

  [Find out more →](/simulate/simulating-commercial-protocols#termination-conditions-ends)

  ## Edit and delete optimizations

  Optimization name and description are now editable from the detail page, and you can delete
  optimizations with a confirmation dialog. The experiment-step validation toggle is also exposed as a
  per-objective setting, letting you control whether each objective validates against experiment steps.

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

      * Added cancel buttons for running pipelines, optimizations, and simulations with cascading
        cancellation.
      * Added optimization editing (name and description) and delete with permission checks.
      * Exposed the validate-against-experiment-steps toggle on each optimization objective.
      * Unified table UI across optimizations, protocols, and pipelines — actions behind three-dot menus,
        clickable row names, no more "Actions" column header.
      * Added more plot variables to the protocol simulator results view.
      * Design parameters and experiment conditions are now preserved when rerunning simulations, and
        columns for differing parameters default to visible.
      * Removed the `slug` and `additional_data` fields from cell specification, instance, and measurement
        models.

      **Fixes**

      * Fixed 500 error when simulating non-UTF-8 protocol files (e.g. BioLogic `.mps`).
      * Fixed optimization detail page layout issues.
    </Accordion>

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

      * Added support for `input['...']` parameter references in UCP duration and termination end
        conditions.
      * Deprecated the `ionworkspipeline.workflows` module in favor of the newer API.
    </Accordion>

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

      * Added `termination_condition` callback for ending protocol simulations early when a variable
        condition is met.
      * Added support for Python-style list repetition (`["step"] * N`) in PyBaMM experiment strings.
      * Added support for `PV_CHAN_Cycle_Index` branching in Arbin protocol parsing.

      **Fixes**

      * Fixed latin-1 fallback decoding for non-UTF-8 protocol files in the standalone simulator.
    </Accordion>

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

      * Large request payloads (>512 KB) are now gzip-compressed automatically, reducing upload sizes
        significantly (e.g. 24.5 MB to 3.7 MB for typical serialized models).
      * Removed `slug` and `additional_data` fields from cell models.
      * Job status fields now use typed enums instead of raw strings.
    </Accordion>
  </AccordionGroup>
</Update>

<Update label="March 16, 2026" description="Protocol Builder launch, stronger optimization guardrails, and better data ingestion">
  ## Protocol Builder is now available in Studio

  Studio now includes a visual Protocol Builder with step editing, drag-and-drop ordering,
  YAML import/export, and backend-backed validation before upload. You can also configure
  global safety limits for current, voltage, and temperature directly in the builder.

  [Find out more →](/simulate/protocol-builder)

  ## Optimization setup is safer and easier to reuse

  You can now clone optimizations and save them as reusable templates. Optimization runs
  also validate that fit parameters are actually used by at least one objective model
  before execution, helping catch invalid configurations earlier.

  ## Data ingestion and model setup got more robust

  This week adds stronger cycler-data handling across formats and improves initialization
  behavior for fitting workflows, including more flexible parameter configuration defaults.

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

      * Added pipeline edit/delete support with row actions, bulk delete, and permission checks.
      * Added a Simulations tab to parameterized model details for quicker navigation and
        management.
      * Added optimization cloning and "save as template" workflows.
      * Added simulation rerun actions and job resubmit support for failed jobs.
      * Added protocol YAML display on simulation result pages with input substitutions.
      * Added source metadata display for direct entry elements in pipeline details.
      * Validation views now surface partial-failure warnings instead of failing silently.
      * Timestamps across key tables now display as absolute datetimes.
      * Standalone and add-result protocol forms now hide initial SOC/temperature inputs when
        those values are explicitly defined in UCP global settings.

      **Fixes**

      * Fixed validation charts so single-point series render visibly.
      * Fixed edge cases in new-user onboarding, including logout and empty-credit handling.
      * Pipeline submission now runs asynchronously to avoid blocking request handling.
    </Accordion>

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

      * Added pre-run checks that reject fit parameters not used by objective models.
      * Fit parameter configs now allow omitted `initial_value` and compute defaults from bounds.
      * OCP balancing now supports GITT workflows with improved interpolation and safeguards.
      * Differential evolution and related optimizer defaults were tuned for more reliable
        convergence on real-world data.
      * Pulse objective helpers now support `DataLoader` cycle slicing while preserving lazy
        loading.
      * Objective setup now supports better partial-result handling on solver failure paths.

      **Fixes**

      * Fixed piecewise interpolation config roundtripping for 1D/2D direct-entry schemas.
      * Restored kwargs passthrough for custom initial-state handlers used by ECM and lumped
        SPMr workflows.
    </Accordion>

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

      * Added validation to block oversized inline time series payloads (>1000 rows) with clear
        guidance to upload measurements and reference `db:` IDs.

      **Fixes**

      * Non-idempotent API calls are no longer retried automatically.
      * Fixed current-sign normalization logic for mixed charge/discharge cycler exports that
        record absolute current values.
    </Accordion>

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

      * Added a Gamry EIS reader with auto-detection for `.dta` and related impedance formats.
      * Improved multi-sheet Neware handling with better timestamp ordering and monotonic time
        reconstruction.
      * Numeric-string columns are now inferred and promoted more reliably during read/clean
        steps.
      * Added `DataLoader.to_local()` for exporting self-contained inline configurations.

      **Fixes**

      * Fixed BioLogic reader handling for additional file variants.
    </Accordion>
  </AccordionGroup>
</Update>

<Update label="March 9, 2026" description="Multi-measurement comparison, cycle aging simulations, and improved optimizer convergence">
  ## Multi-measurement comparison view

  Select multiple measurements in the Cell Data table and click "Compare" to open a dedicated comparison page. The Time Series tab plots measurements on the same chart with configurable axes and a stack-cycles mode, while the Cycles tab shows cycle metrics like discharge capacity and coulombic efficiency across all selected measurements with optional retention mode. Filters can be applied globally or per-measurement.

  [Find out more →](/data/visualizing)

  ## Cycle aging simulation template

  A new cycle aging template is available for simulations, allowing you to define cycling protocols and visualize cycle-level metrics such as capacity fade and efficiency over hundreds of cycles.

  [Find out more →](/simulate/experiment-templates#9-cycle-aging)

  ## Improved optimizer convergence

  The Differential Evolution optimizer now uses Latin Hypercube Sampling for better initial coverage of the parameter space, along with canonical mutation factor clamping and seed-based reproducibility. These changes improve convergence reliability across a wide range of fitting problems.

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

      * Simulations can now be force-rerun while preserving the same simulation ID and study mappings.
      * The data list table now shows expanded specification columns (anode, cathode, electrolyte, case sub-fields), copy-on-click IDs, and a search-on-this-page feature.
      * EIS and dV/dQ data can now be viewed in dedicated tabs on measurement detail pages.
      * Cycler simulator jobs now provide live partial-result updates during execution.
      * Parameter sets are now dynamically discovered rather than hardcoded, so newly installed parameter sets appear automatically.
      * The API now includes a `/discovery` endpoint to help programmatic clients understand available capabilities and schemas.
      * Cell creation no longer requires anode and cathode to be defined upfront, simplifying the model creation workflow.

      **Fixes**

      * Fixed stale data appearing after switching organizations.
      * Fixed a deserialization bug where model options were missing from design optimization jobs.
      * Fixed PyBaMM expression parameters (symbol tree dicts) not being deserialized correctly during parameterized model creation.
    </Accordion>

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

      * Composite models now support nested list/tuple options (e.g. open-circuit potential configurations).
      * Capacity calculations now correctly account for the number of electrodes in parallel (`n_elec`).
      * Validation runs now surface simulation errors immediately instead of silently filling results with sentinel values.
      * Custom initial state support added for lumped SPMr and ECM models, accepting either a voltage string or SOC float directly.

      **Fixes**

      * Fixed drive cycle step serialization losing interpolant data during roundtrip.
      * Fixed EIS simulation including unnecessary output variables in kwargs.
      * Fixed NaN values in simulation results causing constraint actions (GreaterThan/LessThan) to crash instead of returning penalty values.
    </Accordion>

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

      * Added an API discovery skill to help agents explore available endpoints and schemas.
    </Accordion>

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

      * DataLoader now accepts environment configuration for database connections.
      * Step detection now checks the last step after the first for more reliable step boundary identification.

      **Fixes**

      * Fixed `DataLoader.copy()` failing on lazy-loaded `from_db` instances by ensuring time series data is loaded before cloning.
    </Accordion>

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

      * Fixed a drive cycle temperature handling bug.
      * Added validation that safety limit minimums must be less than maximums, preventing misconfigured protocols.
      * Fixed a delayed processing bug where initial SOC parameter values were not saved for later variable evaluation.
      * Fixed Maccor parser not recognizing constant-power/constant-voltage (CPCV) protocol steps.
    </Accordion>
  </AccordionGroup>
</Update>

<Update label="March 2, 2026" description="Protocols in studies, dependent parameters, and Polars-powered data processing">
  ## Protocols in studies

  Protocol simulations can now be run directly within a study, alongside standard experiments. Protocols can be uploaded from raw cycler format or Universal Cycler Protocol, with results appearing inline alongside other study results.

  [Find out more →](/simulate/studies)

  ## Dependent parameters

  When creating a parameterized model, any parameter value can now be set to an expression referencing other parameters. Referenced parameters are automatically detected and added to the model, enabling linked or derived parameter relationships without separate configuration.

  [Find out more →](/build/parameterized-models#dependent-parameter-expressions)

  ## Faster step handling with Parquet storage

  Cell measurement steps are now stored as Parquet files instead of SQL tables, significantly improving upload and download times for measurements with thousands of steps. Existing data is migrated transparently — no action is required.

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

      * Pipeline status now shows detailed element-level job status, giving better visibility into running, pending, and completed pipeline elements.
      * Data uploads are now parallelized for faster ingestion of large datasets.
      * EIS result plots are now displayed after impedance fitting.
      * Updated OCP and EIS validation plots.

      **Fixes**

      * Fixed simulation creation page not loading correctly.
      * Fixed an issue where chunk files could become temporarily unavailable during large downloads.
      * Fixed a race condition where shutting down one job could inadvertently terminate concurrent jobs on the same cluster.
    </Accordion>

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

      * Pipeline objectives can now create direct entries from Studio pipeline results using a pipeline ID.
      * OCP validation plots now include dUdQ (incremental capacity) curves.

      **Fixes**

      * Fixed EIS fits failing when models contained interpolant-based function parameters.
      * Fixed a serialization bug where deep-copying parameter values could corrupt model state.
    </Accordion>

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

      * OCP data can now be uploaded through the API.
    </Accordion>

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

      * DataLoader now uses Polars as its internal representation for faster data operations.
      * DataLoader.from\_db supports lazy loading — data is fetched only when first accessed, reducing unnecessary I/O for pipeline configurations.
      * Time series and steps can now be loaded independently, enabling efficient step filtering without downloading full time series.
      * Added a rest\_to\_ocp transform for extracting OCP from rest steps without requiring GITT labels.
      * Added Maccor CSV tab-separated file reader.

      **Fixes**

      * Fixed dUdQ computation failing on lazily-loaded data.
      * Fixed step summarization for data without a time column.
    </Accordion>

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

      * Added support for CCCV and PEIS protocols, plus anode and cathode voltage termination conditions.

      **Fixes**

      * Fixed a bug where building a model for voltage or power control modes mutated the base model, causing "overdetermined" errors on subsequent evaluation steps.
      * Fixed a Maccor protocol variable resolution bug.
    </Accordion>
  </AccordionGroup>
</Update>

<Update label="February 23, 2026" description="Initial conditions in objectives, memory-efficient streaming, and unified drive cycles">
  ## Initial conditions in pipeline objectives

  Pipeline objectives now support a preamble mechanism for setting initial conditions — initial state of charge, temperature, and voltage — directly on each objective. Conditions are properly isolated across multiple objectives, so sweeping over different starting points no longer requires separate pipeline configurations.

  [Find out more →](/optimize/running-optimization#add-an-objective)

  ## Memory-efficient simulation streaming

  Large simulation solutions are now uploaded and downloaded in chunks, significantly reducing peak memory usage on the backend. This makes it practical to run and retrieve results from long-duration or high-resolution simulations without hitting memory limits.

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

      * Cell measurement plots now support flexible x-axis selection with prioritized column options.
    </Accordion>

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

      * Initial SOC can now be set from the objective options dictionary at creation time.
    </Accordion>

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

      * Added a time-monotonicity validator that checks uploaded measurement time series are strictly increasing.
    </Accordion>

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

      * Protocol solution metadata can now be extracted in memory, eliminating the need to write intermediate files to disk during simulation.
      * Unified drive cycle handling across Maccor and Arbin protocols, replacing the Maccor-specific "Waveform" abstraction with a general "DriveCycle" concept.
    </Accordion>
  </AccordionGroup>
</Update>

<Update label="February 16, 2026" description="Permissions, optimizer selection, and Arbin protocol support">
  ## Role-based permissions for projects

  Studio now supports granular role-based permissions at the project level. Contributors and viewers see only the actions they are allowed to perform, with UI elements hidden or disabled based on their role. Admins can manage project membership directly from organization settings.

  ## Optimizer selection in optimization creation

  When creating an optimization, you can now choose from multiple optimizer algorithms — XNES, CMAES, SNES, PSO, Differential Evolution, and Nelder-Mead — and configure hyper-parameters like step size and population size directly in the UI.

  [Find out more →](/optimize/overview#optimizer-selection)

  ## Arbin protocol support

  The protocol simulator now supports Arbin cycler protocols. Drive cycle data is stored in a dedicated table, and users can configure variable callback rules for fine-grained control over protocol simulations.

  [Find out more →](/simulate/simulating-commercial-protocols)

  ## In-project protocol simulation

  Protocol simulations can now be run directly within a project context, using a parameterized model from that project instead of a generic one. A new Protocol Simulator page is available in the project navigation.

  [Find out more →](/simulate/simulating-commercial-protocols)

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

      * Distributed evaluation worker planning now scales from population size with polling-based readiness checks and retry with exponential backoff.
      * Extended job timeout to 14 days with automatic failure cascading to child jobs.
      * The "View" button in the simulation list is now in its own column for quicker access.

      **Fixes**

      * Fixed plot loading requiring two loads — plots now initialize correctly on first view.
      * Added search functionality to simulation plot dropdowns.
      * Fixed composite plating simulation bugs with SOC calculation error handling and missing variable detection.
      * Fixed voltage components plot reliability with proper loading states and data availability checks.
      * Fixed pipeline element list showing elements from other pipelines.
      * Fixed pending job status menu not displaying for optimization and data fit jobs.
      * Fixed linked parameters in pipeline baseline construction.
      * Fixed organization member list appearing empty on the admin settings page.
      * Fixed users being redirected to project list with an error after creating a new project.
      * Fixed permission guard to wait for project data before checking permissions.
    </Accordion>

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

      * Added `GaussianLogLikelihood` cost function for Gaussian negative log-likelihood optimization. Deprecated `MLE` in favor of `SSE`.
      * Reverse parsing now supports solver roundtrip serialization (ScipySolver, CasadiSolver, IDAKLUSolver, CompositeSolver).
      * `clean_parameters` now correctly handles nested expressions and dependent parameters, including `FunctionParameter` types.
      * Flat prior format is now supported alongside the nested format for simpler configuration.
      * Added missing API documentation for Arrhenius, piecewise conversion, and piecewise interpolation classes.
    </Accordion>

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

      * Standardized error parsing for the new backend error format while remaining backward-compatible. Pipeline failures are now surfaced via `raise_on_failure`.
    </Accordion>

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

      * Added cycle aging experiment template for long-duration degradation studies.
      * Additional Arbin protocol file formats can now be parsed and simulated.
      * Simulation results are now saved to disk during solve for improved reliability with long-running protocols.

      **Fixes**

      * Fixed amp-hour tracking in step charge protocols.
      * Fixed Arbin protocol parsing regression from a previous change.
    </Accordion>
  </AccordionGroup>
</Update>

<Update label="February 9, 2026" description="Cloud storage, signed URLs, and data validation">
  ## Simulation solutions in cloud storage

  Simulation solution data is now stored in cloud storage (Parquet format) instead of the database, significantly improving performance for large simulations and enabling more efficient data retrieval.

  ## Signed URL downloads

  Data downloads now use signed URLs, bypassing the backend proxy for faster and more reliable file transfers. This improvement is available in both Studio and the Python API.

  ## Measurement data validation

  The Python API now validates measurement time series data before upload, catching issues like incorrect current sign conventions, non-monotonic cumulative values, and insufficient data points per step — preventing invalid data from entering the system.

  [Find out more →](/data/preparing-data)

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

      * Measurements table now supports server-side filtering for improved performance with large datasets.
      * Studies now load more efficiently with optimized data fetching.
      * Backend now caches API keys to reduce authentication latency.
      * Protocol documentation is now shown in experiment templates.
      * Added links to Python library documentation throughout Studio.
      * File existence checks now use signed URLs, improving upload time by \~20%.

      **Fixes**

      * Fixed voltage components display and data loading.
      * Fixed simulation creation and retrieval via the API for cloud-stored solutions.
      * Fixed steps limit in experiment configuration.
      * Fixed various data display bugs including non-numeric column handling.
    </Accordion>

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

      * Priors are now properly parsed with support for distribution configuration.
    </Accordion>

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

      * Added customizable retry and timeout configuration for the API client, with correlation ID logging on errors.

      * Added step count and time validators for uploaded data.

      * Added infinity sanitizer for DataFrames.

      * Optional strict validation mode.
        **Fixes**

      * Fixed pipeline list pagination.
    </Accordion>

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

      * Added support for Maccor files with 4-digit suffixes.
      * Added data caching in the data loader for significantly faster repeated loads.
      * Added additional column mappings with dunders.
      * Added validation and capacity calculation options.
      * Updated README and examples.
    </Accordion>

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

      * Input expressions (e.g. `10 / input["C-rate"]`) are now supported in resolution fields for time, voltage, and current — previously only numeric values were accepted.
    </Accordion>
  </AccordionGroup>
</Update>

<Update label="February 2, 2026" description="API documentation, simulation study management, and input expressions">
  ## API documentation

  Studio now includes a full API Reference tab powered by a custom OpenAPI schema. Browse available endpoints, see request/response schemas, and try out calls directly from the documentation.

  ## Simulation study management

  A new simulation study feature lets you organize related simulation runs into studies, making it easier to compare parameter sweeps, model variants, and protocol configurations side by side.

  [Find out more →](/simulate/studies)

  ## Input expressions in protocol simulations

  The protocol simulator now supports input expressions in resolution fields, such as `10 / input["C-rate"]`. This lets you define resolution relative to operating conditions, so protocols automatically adapt when C-rate or other inputs change.

  [Find out more →](/simulate/simulating-commercial-protocols#functional-expressions)

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

      * Fraction and C-rate inputs are now accepted, with better failure messages and links to the relevant cell and model.
      * Pinned actions column and updated single simulation plot style.
      * Updated data management documentation.

      **Fixes**

      * Fixed voltage components plot displaying both split and unsplit data incorrectly.
      * Fixed Enter key not advancing from email to password on the login page.
    </Accordion>

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

      * Batteries 101 guide added to technical documentation.
      * Consolidated optimization documentation for easier navigation.
      * Calculation docs now link to corresponding Python API methods.
      * Technical guide figures are now included in the documentation.
      * Migrated documentation to GitHub Pages with a custom domain.
      * Replaced hardcoded polish default with a configurable option.

      **Fixes**

      * Fixed equations scrollbar overflow in documentation pages.
    </Accordion>

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

      * Added Sphinx documentation site for the Python API.
    </Accordion>
  </AccordionGroup>
</Update>

***

<div className="flex justify-between items-center pt-2">
  <a href="/changelog">← Newer updates</a>
  <a href="/changelog/3">Older updates →</a>
</div>
