July 6, 2026
ECM fitting with regularization and per-cell nominal capacities, ArrayDataFit through the JSON config path, and near-instant measurement deletion
ECM fitting: regularization and per-cell capacities
Studio’s ECM fit adds two options. A regularization setting smooths the fitted parameters, and a per-measurement capacity lets you set a known nominal capacity for each measurement in a fit that spans several measurements of the same cell. Capacity fitting is now opt-in, and each fitted measurement reports its own capacity.ArrayDataFit through the JSON config path
iws.ArrayDataFit — fitting the same model independently at each value
of an independent variable (e.g. diffusivity vs. stoichiometry from
GITT / pulse data, or a parameter vs. temperature) — is now a
first-class element_type: "array_data_fit" end to end. The library
and schema already supported it, but the config path (the only surface
the production API sees) previously collapsed it into a plain
DataFit. Array fits now round-trip through config, schema, parser,
executor, and results serialization, and Studio renders the array-
valued fitted parameters with a per-parameter scatter view reachable
from the parameter editor.Studio
Studio
Improvements
- Cell measurement deletion is now near-instant. Logfire traces showed
DELETE /cell_measurements/{id}averaging 10.3s (max 20.2s), with ~100% of the latency in a single recursivelistof the measurement’s storage folder. The per-measurement bucket layout is deterministic, so the file set is now derived from the DB record and removed in a single batched call. The recursive list stays for the org-wide sweep, where it’s genuinely needed. - Missing or empty
steps.parquetfiles on a measurement now surface as a typed 422MEASUREMENT_DATA_MISSINGwith a re-upload prompt in the UI, distinct from transient storage failures (which get a Retry button). Upload validation also rejects empty step sets, and the upload rollback cleans up orphaned storage files.
Pipeline
Pipeline
Improvements
initial_guess_sampleroniws.DataFitacceptsLatinHypercubeorUniformexplicitly, and unknown sampler / distribution / prior names and stray keys are now rejected at submission time with a clearValidationErrorinstead of a later runtime crash.
- Configuring an
ArrayDataFitwith a non-number-likeobjectiveskey (the reported bug) now surfaces as aUserConfigurationErrorrouted toCONFIGURATION_ERROR— the message is shown, no Sentry page — instead of the opaque “An unexpected error occurred” path. Same treatment applied to sibling user-config validation sites reachable during construction / parse: badMaterialinputs, non-Transform/ParameterinTransform.__init__, a non-dictPipeline.elements, and cost-setter type checks on parameter estimators. - Continued sweep of ~50 more bare
ValueErrorraises reclassified asUserConfigurationError/ModelError/ProtocolConfigurationErroracross the data-fit, optimizer, sampler, metrics, and transform code — user-correctable mistakes surface with an actionable message and no on-call page.
Python API
Python API
Improvements
client.ecm.fit(...)now accepts aregularizationoption and a per-measurementcapacityonFitMeasurementRequest(set on all measurements or none);FitResults.capacity_Ahreports one value per fitted measurement.- Submitting an
array_data_fitelement via the JSON config path now round-trips end to end (schema → parser → pipeline → results), so API clients get the same first-class support the library object path already had.
- Documentation examples fixed against the real API surface: the
resubmit endpoint is
POST /jobs/{pipeline_id}/resubmit(the documented/pipelines/{pipeline_id}/resubmitdoes not exist and would 404); theModellist response has nomodel_type/configfield (onlyclient.model.get(id)returns it);model.createconfig usestype, notmodel_type; simulate protocol examples use named steps + string end conditions;CellMeasurementBundleResponseis flat (bundle.name, notbundle.measurement.name).
Skills
Skills
Improvements
run-simple-pipelinesdocuments thearray_data_fitelement type alongside the standarddata_fit.manage-cells:cell_spec.createandcreate_or_getexamples now matchCreateCellSpecificationNested— aratingsobject (capacity,voltage_min,voltage_maxas{value, unit}Quantities) and per-slotcathode/anodekeys each holding aNestedComponentInputwith a singularmaterialdict. The previous body usedrated_capacity/voltage_range_dc/components: [...]fields that do not exist on the model and would have failed server-side validation.