EIS upload validation in the Python API, and faster pipeline detail page and ECM fits
EIS upload validation
cell_measurement.create(...) now accepts a data_type="eis" hint on the
measurement dict. When set, validate_measurement_data runs a structural
columns check (always on, requires Frequency [Hz], Z_Re [Ohm],
Z_Im [Ohm]) plus two strict-only, individually-skippable heuristic checks.
eis_zim_sign flags a spectrum whose capacitive band is predominantly
positive — i.e. the raw Im(Z) sign is flipped, with the fix hint
Z_Im = -Z_Im. eis_impedance_magnitude catches order-of-magnitude unit
errors by comparing min(Z_Re) against a wide 100× band around a capacity-
derived estimate — no data fetch, just a sanity check against the supplied
rated_capacity. Both fire only on order-of-magnitude issues (a 1000× unit
error, a fully flipped sign) so a plausible spectrum is never touched. The
BioLogic reader now stores the raw imaginary part directly as Z_Im [Ohm]
(negative across the capacitive arc), matching the validator’s convention.Faster pipeline detail page and ECM fits
The pipeline detail page now loads noticeably faster: large per-element data is now loaded lazily on expand instead of upfront, and a slow client-side recalculation on every 5s poll tick has been optimized away. Separately, pipeline ECM fits got faster and more accurate through several internal fit-strategy improvements, with fit quality fully preserved.Studio
Studio
Improvements
- Protocol detail pages now show a Simulations section listing every simulation that uses the protocol, with the same bulk actions (add to study, rerun, delete) available on the parameterized-model simulation list.
- Pipeline bulk cancel is now instant. The UI flips immediately with optimistic updates, and the slower job-termination work is offloaded to run in the background. A single bulk-cancel endpoint replaces the per-pipeline loop the frontend was previously doing.
- The Cycle Filter now clamps
First N,Last N, andRangevalues that exceed the number of available cycles: it returns all available cycles and showsShowing all N cyclesin neutral text. Explicit single-cycle typos (e.g.0,50,200on a 100-cycle measurement) still error, with a short, actionable message instead of the previous thousands-of-numbers wall of text. - Compute hours are now a first-class usage dimension alongside simulation hours, driven by each org’s contract. The account drawer renders one meter per configured usage type, gated on a combined loading signal with placeholder cards sized to the last-known meter count, so the list no longer briefly collapses to zero at load.
- Deleting an organization as a regular Admin (non-super-admin) now returns a proper 403 Forbidden. Previously the delete was silently blocked but the endpoint returned 204, giving a false success while the org remained in the database.
- Current sign-convention documentation corrected across backend field descriptions, the API discovery endpoint, and the data-upload docs: positive = discharge, negative = charge (matching the platform’s actual data and validators). Descriptions of external cycler conventions that legitimately differ (e.g. BioLogic / Arbin native positive = charge) are unchanged.
Pipeline
Pipeline
Improvements
- Default population size for the DE and PSO optimizers is now
capped at 40. Explicit
population_sizevalues still bypass the cap; only the auto-scaled default changed, and only above the cap.
- Local pipeline runs now match server behavior in three places where they
had drifted. An OCP interpolant input with only a
datakey is no longer rejected as missing metadata. Schema-provided transforms (Log10,Log,Inverse, …) are no longer silently dropped. And the vacuous multistart guard (Multiple multistarts are being used, but all initial guesses are identical) that fired as a downstream symptom of those drops is gone as a consequence.
Python API
Python API
Improvements
GET /organizations/current/usageis now public and returns per- dimension usage (simulation,compute) with limits, so SDK clients can read their own quotas without an admin token.
Data Processing
Data Processing
Improvements
- Neware BTSDA
.xlsxfiles with no explicitsheetsoption now auto-select therecordsheet — where the time series actually lives — instead of defaulting to the metadata-only first sheet and failing with a missingTimestamperror. The previous “you must passsheets={type: 'name', value: 'record'}” gotcha is now automatic; files without arecordsheet still fall back to the first-sheet default.
- The Maccor reader now maps
Cycle C— the cumulative cycle counter, the true cycle number — toCycle from cycler. Previously it mappedCycle P, a program/loop counter that is often0and can reset within a procedure, so any file containing both columns reported meaningless zeros for the cycle number.
Protocol Simulator
Protocol Simulator
Fixes
- Arbin schedules that reference a subschedule (
SubSchedulestep) no longer fail parsing withDuplicate step name found: 'End Test'. The reservedEnd Testterminal is exempted from the duplicate-name check — each subschedule keeps its own copy, so anygoto: "End Test"from any scope still resolves at simulation time. Genuinely-named block collisions (e.g. a userLoop_Xappearing in two scopes) still error as they should.