CHANGELOG

Small changes. Better testing.

Stay up to date with new features and improvements.

August 26, 2026CLI 1.4.4Dashboard 2.40.5

Attribute runs to operators without accounts

A run's operator no longer has to be a TofuPilot account, so a line running on a station key can attribute its runs to the operators who ran them.

  • Added free-text operator names to operated_by: an email matching a member of your organization still links the run to that account, any other value is recorded as a declared name.
  • Extended it to every surface that produces a run — the V2 API, the operated_by: key in procedure.yaml, an Operator UI badge scan, Python phases, OpenHTF, pytest, Robot, and CSV, STDF, ATDF, ATML, TestStand, WATS and WSXF imports.
  • Added declared names to the runs list, the Operated By filter and the operator analytics, so a declared operator gets its own row instead of falling into Unknown, and alert concentration can name them.
  • Added operated_by_names to the run, histogram, measurement and phase list endpoints, combined with operated_by_ids as OR.
  • Changed file imports to take the operator from the file rather than from whoever clicks Import.
August 26, 2026Dashboard 2.40.0

Automate InvenTree stock from your workflows

Workflows can write test results and stock movements straight into InvenTree, so your inventory reflects what happened on the line without anyone retyping it.

  • Added workflow actions that create stock items, upload test results, update stock status, transfer stock, complete build outputs and print labels on your InvenTree server, with an existing serial reused rather than rejected so a re-run stays idempotent.
  • Added serial-number matching, with an optional part IPN when several parts share a serial, so an action targets the item a run actually produced.
  • Added pickers for parts, stock locations, build orders, build outputs and label templates, so a resolved option shows its name rather than a raw ID.
August 24, 2026CLI 1.4.3

Fix Python procedures crashing on Windows

Every OpenHTF, pytest and Robot Framework procedure died at startup on a Windows station, before the first phase could run, showing a Python traceback instead of a test result.

  • Fixed two calls in the connector the CLI injects that do not exist on Windows, which stopped the interpreter before any phase started.
  • Restored station deployment on Windows for all three frameworks — procedures written on the TofuPilot framework were never affected.
  • Added Windows to the automated test suite, so a procedure now runs end to end on Windows before every release.
August 24, 2026CLI 1.4.2

Catch broken Python references before the run

A test run that cannot succeed now refuses to start and tells you exactly why, and everything your phase code logs is captured where you expect it.

  • Added a pre-flight check that names every unresolvable Python reference — phase or plug — before the run starts, replacing mid-run tracebacks and silently missing plug arguments
  • Added capture of Python logging output from phase code into run logs, with severity and file:line origin; critical messages render as errors
  • Fixed deploy packing the .git file of worktree checkouts into the source archive
  • Fixed printed dashboard links mixing identities on machines holding both a user and a station login, and a false "Not logged in" hint when the identity cache was cold
August 18, 2026Dashboard 2.39.2

Filter units that have never been tested

The units list could not answer "which units were never tested?" — filtering by run count only ever considered units that already had a run, so asking for zero came back empty on every organization.

  • Fixed the run count filter to count units with no runs as zero and return them.
  • Added the zero bucket to the run count histogram, so the range covers never-tested units.
August 14, 2026Docs 2.5.1

Rework access and alerts documentation

The access and alerts docs are rewritten in a shorter overview-and-configure format: corrected access-group visibility rules, five alerts pages collapsed into two with all detection thresholds documented, and Root Cause Analysis promoted to the top level of the AI section, with redirects for every removed page.

August 13, 2026Python SDK 2.16.1C# SDK 2.14.0Rust SDK 2.15.1C++ SDK 2.9.1MATLAB SDK 2.9.1

Add Bitbucket support to all five SDKs

All five official clients are generated from one V2 specification, so they stay consistent with each other and with the API.

  • Added Bitbucket alongside GitHub and GitLab wherever a repository provider is returned, so procedures and deployments connected through Bitbucket now read correctly.
  • Improved aggregation values in the C# client to carry any measured type, instead of text only.
  • Documented the order phases are returned in: the attempts of a retried phase always arrive in attempt order.
  • Removed the conflict error from the station create and update paths, since station names are deliberately not unique and the API never returns it.
August 12, 2026Dashboard 2.38.10

Track each curve axis on its own control chart

A multi-dimensional measurement records several quantities across one test, and each of them now gets its own control chart in Measurement Control.

  • Added one control chart per axis, so an average, minimum or maximum is tracked against the quantity it actually belongs to.
  • Added series names to the chart's axis selectors, so a curve is picked by what it measures rather than by its unit alone.
  • Extended the second Y axis to the whole population of runs, so a comparison between two quantities is visible before any unit is selected.
August 12, 2026Rust SDK 2.15.0

Pass private CA certificates as PEM bytes

add_root_certificate now takes the PEM bytes and returns a Result. It accepts a bundle, so a root and its intermediates can be passed together.

  • Changed add_root_certificate to take PEM bytes; certificates added through it are now applied to the trust store
  • Added the bundled certificate authorities alongside the system trust store, so a container without a system certificate bundle keeps connecting
  • Added a connect timeout to attachment transfers
August 12, 2026Studio 1.4.14Station 1.4.14Framework 1.4.14

Version your procedures from procedure.yaml

The version in your procedure.yaml is now the version recorded with every run. It used to be ignored — runs read pyproject.toml instead, so monorepo procedures recorded no version at all.

  • Changed the recorded version to come from procedure.yaml. OpenHTF, pytest and Robot Framework procedures keep using pyproject.toml.
  • Made version optional. Procedures without one run normally and are not linked to a version.

Try these features today