Skill Tracer
Skills › Scientific Agent Skills › pylabrobot › review.md

review.md

103 lines · skills/pylabrobot/references/review.md at 5f2bc03

Open on GitHub
1# Release and transport review
2
3Reviewed **2026-10-01**, targeting **PyLabRobot 0.2.2** on Python 3.13.
4This review used imports, class inspection, resource serialization, chatterbox
5frontends and mocked failure paths. It made no device connections or commands.
6

Release and transport review

Reviewed 2026-10-01, targeting PyLabRobot 0.2.2 on Python 3.13. This review used imports, class inspection, resource serialization, chatterbox frontends and mocked failure paths. It made no device connections or commands.

Raw lines 1 to 6
7## Release evidence and documentation drift
8
9- [PyPI 0.2.2 metadata](https://pypi.org/pypi/pylabrobot/0.2.2/json) reports
10 release 2026-07-30, Python >=3.9 and optional hardware extras.
11- The official [release artifacts](https://pypi.org/project/PyLabRobot/0.2.2/#files)
12 were inspected. Source archive SHA-256:
13 `ec5c6308dae5280a36dd08dc50b709230efea11f23135ea625d238386083efde`.
14 Wheel SHA-256:
15 `18f61a943301bc448500c9f4babf28ecbd8a520fcdc2d01dfa8c8c5c71be66e2`.
16- [Official tags](https://api.github.com/repos/PyLabRobot/pylabrobot/tags?per_page=100)
17 listed `v0.2.1`, `v0.2.0`, and `paper-tag`; there was no `v0.2.2` tag.
18- [Changelog](https://github.com/PyLabRobot/pylabrobot/blob/main/CHANGELOG.md)
19 has no 0.2.2 release heading. MicroSpin and `Plate.stacking_z_height` appear
20 under `Unreleased` but are present in the wheel. Do not infer absence from
21 that heading or invent a release-tag URL.
22- The hosted [installation](https://docs.pylabrobot.org/stable/user_guide/_getting-started/installation.html)
23 and [liquid-handler API](https://docs.pylabrobot.org/stable/api/pylabrobot.liquid_handling.html)
24 identify 0.2.1, while [machines](https://docs.pylabrobot.org/stable/user_guide/machines.html)
25 and [trackers](https://docs.pylabrobot.org/stable/user_guide/machine-agnostic-features/using-trackers.html)
26 serve development content. The released source resolves this conflict.

Release evidence and documentation drift

  • PyPI 0.2.2 metadata reports release 2026-07-30, Python >=3.9 and optional hardware extras.
  • The official release artifacts were inspected. Source archive SHA-256: ec5c6308dae5280a36dd08dc50b709230efea11f23135ea625d238386083efde. Wheel SHA-256: 18f61a943301bc448500c9f4babf28ecbd8a520fcdc2d01dfa8c8c5c71be66e2.
  • Official tags listed v0.2.1, v0.2.0, and paper-tag; there was no v0.2.2 tag.
  • Changelog has no 0.2.2 release heading. MicroSpin and Plate.stacking_z_height appear under Unreleased but are present in the wheel. Do not infer absence from that heading or invent a release-tag URL.
  • The hosted installation and liquid-handler API identify 0.2.1, while machines and trackers serve development content. The released source resolves this conflict.
Raw lines 7 to 27
28## Native contracts verified
30- `LiquidHandler` with literal `LiquidHandlerChatterboxBackend`: async lifecycle,
31 resource/carrier assignment, fresh tip pickup, aspiration, dispense, return,
32 and exact 100 -> 90 uL source / 0 -> 10 uL destination ledger.
33- A synthetic backend exception rolls back pending volumes. Underfilled source
34 is rejected before the mocked aspiration backend runs. These tests do not
35 reproduce partial physical success or vendor/channelized errors.
36- `cor_96_wellplate_360uL_Fb` replaces deprecated `Cor_96_wellplate_360ul_Fb`.
37 Released Hamilton decks use `rails=`, not development `track=`.
38- A trusted resource-only tree and separate volume state round-trip through
39 JSON at `allow_marshal=False`; plate nesting metadata round-trips and three
40 20 mm plates with 15 mm nesting pitch produce 50 mm stack height.
41- Reader chatterbox: selected-well masks, full-plate behavior for `wells=[]`,
42 legacy matrix versus explicit `use_new_return_type=True` records.
43- Pump volume conversion delegates to duration using an explicit calibration;
44 no pump backend was constructed. `pump_volume()` exists in 0.2.2.
45- Scale `read_weight()` is current; `get_weight()` is deprecated. Use
46 `pylabrobot.scales.MettlerToledoWXS205SDUBackend`; the old module is absent
47 and the old unsuffixed class raises on construction. Synthetic scale
48 readings use `ScaleChatterboxBackend`, never a hardware backend.

Native contracts verified

  • LiquidHandler with literal LiquidHandlerChatterboxBackend: async lifecycle, resource/carrier assignment, fresh tip pickup, aspiration, dispense, return, and exact 100 -> 90 uL source / 0 -> 10 uL destination ledger.
  • A synthetic backend exception rolls back pending volumes. Underfilled source is rejected before the mocked aspiration backend runs. These tests do not reproduce partial physical success or vendor/channelized errors.
  • cor_96_wellplate_360uL_Fb replaces deprecated Cor_96_wellplate_360ul_Fb. Released Hamilton decks use rails=, not development track=.
  • A trusted resource-only tree and separate volume state round-trip through JSON at allow_marshal=False; plate nesting metadata round-trips and three 20 mm plates with 15 mm nesting pitch produce 50 mm stack height.
  • Reader chatterbox: selected-well masks, full-plate behavior for wells=[], legacy matrix versus explicit use_new_return_type=True records.
  • Pump volume conversion delegates to duration using an explicit calibration; no pump backend was constructed. pump_volume() exists in 0.2.2.
  • Scale read_weight() is current; get_weight() is deprecated. Use pylabrobot.scales.MettlerToledoWXS205SDUBackend; the old module is absent and the old unsuffixed class raises on construction. Synthetic scale readings use ScaleChatterboxBackend, never a hardware backend.
Raw lines 28 to 49
50## Transport contracts inspected, without transport execution
52The skill's CLIs have no endpoint or transport operations. API inspection
53imports a fixed set of symbols without backend construction. The following
54upstream behavior matters when reviewing a future, separately authorized run.

Transport contracts inspected, without transport execution

The skill's CLIs have no endpoint or transport operations. API inspection imports a fixed set of symbols without backend construction. The following upstream behavior matters when reviewing a future, separately authorized run.

Raw lines 50 to 55
56### OT-2 HTTP
58Released `liquid_handling/backends/opentrons_backend.py` uses optional
59`opentrons-http-api-client==0.2.1`. Its source sends plain HTTP to the configured
60host on port 31950 with `Opentrons-Version: 3`; it has no built-in bearer-token
61configuration or explicit request timeout. `setup()` creates a run via
62`POST /runs` (extracting `data.id`), loads mounted pipettes, reads `GET /health`
63(`api_version`), and homes unless `skip_home=True`. Commands are submitted as
64`data.commandType`, `data.params`, and `data.intent` under
65`POST /runs/{id}/commands`; responses provide command IDs and status. A submitted
66command is not proof of completed physical execution.
68The released `stop()` tries `POST /runs/{id}/cancel`, then
69`POST /runs/{id}/actions/cancel`, then `DELETE /runs/{id}`, swallowing failures.
70The [official HTTP specification](https://docs.opentrons.com/http/api_reference.html)
71has `POST /runs/{runId}/actions` and `DELETE /runs/{runId}`, not those two cancel
72paths. The [official action model](https://github.com/Opentrons/opentrons/blob/edge/robot-server/robot_server/runs/action_models.py)
73defines `data.actionType="stop"`; the [router](https://github.com/Opentrons/opentrons/blob/edge/robot-server/robot_server/runs/router/actions_router.py)
74returns an action record (201) and checks robot-control authorization in current
75source. No compatibility with a particular robot software/auth configuration
76is established. Do not use the released cleanup return as evidence of physical
77halt or silently patch/retry live commands. Resolve the integration under the
78site's commissioning process. Listing/pagination APIs are not used by the skill.

OT-2 HTTP

Released liquid_handling/backends/opentrons_backend.py uses optional opentrons-http-api-client==0.2.1. Its source sends plain HTTP to the configured host on port 31950 with Opentrons-Version: 3; it has no built-in bearer-token configuration or explicit request timeout. setup() creates a run via POST /runs (extracting data.id), loads mounted pipettes, reads GET /health (api_version), and homes unless skip_home=True. Commands are submitted as data.commandType, data.params, and data.intent under POST /runs/{id}/commands; responses provide command IDs and status. A submitted command is not proof of completed physical execution.

The released stop() tries POST /runs/{id}/cancel, then POST /runs/{id}/actions/cancel, then DELETE /runs/{id}, swallowing failures. The official HTTP specification has POST /runs/{runId}/actions and DELETE /runs/{runId}, not those two cancel paths. The official action model defines data.actionType="stop"; the router returns an action record (201) and checks robot-control authorization in current source. No compatibility with a particular robot software/auth configuration is established. Do not use the released cleanup return as evidence of physical halt or silently patch/retry live commands. Resolve the integration under the site's commissioning process. Listing/pagination APIs are not used by the skill.

Raw lines 56 to 79
80### MicroSpin TCP
82Released `centrifuge/highres/microspin_backend.py` specifies persistent TCP
83port 1000 and ASCII commands terminated by CRLF. Responses correlate an ACK
84and command ID with `OK!`, `ERROR!`, or `ABORTED!` terminal records.
85`status` may block until the spindle stops. `setup()` connects; `stop()` only
86closes the socket. Neither a closed socket nor a software timeout proves halt.
87The driver references HighRes manual 1058675; that manufacturer's manual and
88physical firmware were not independently obtained/validated. The in-package
89mock server was not started. No network scanning or device probe occurred.

MicroSpin TCP

Released centrifuge/highres/microspin_backend.py specifies persistent TCP port 1000 and ASCII commands terminated by CRLF. Responses correlate an ACK and command ID with OK!, ERROR!, or ABORTED! terminal records. status may block until the spindle stops. setup() connects; stop() only closes the socket. Neither a closed socket nor a software timeout proves halt. The driver references HighRes manual 1058675; that manufacturer's manual and physical firmware were not independently obtained/validated. The in-package mock server was not started. No network scanning or device probe occurred.

Raw lines 80 to 90
91### Other devices and Visualizer
93STAR/Vantage and EVO use model-specific firmware over USB; Masterflex takes a
94serial `com_port`; VSpin/Access2 use device-specific FTDI interfaces. Imports
95and signatures were checked without optional USB/serial/FTDI/HID discovery.
96The generic frontends do not establish baud rates, USB identity, firmware,
97liquid classes, interlocks, or supported physical options.
99Visualizer source keeps loopback host, WS 2121, HTTP 1337 defaults and async
100`setup()`/`stop()`. It serves resource/state events, not physical simulation.
101Its browser and socket lifecycle were source-inspected, not executed. No
102analytical measurement, calibration, mechanical motion or temperature control
103was validated in this review.

Other devices and Visualizer

STAR/Vantage and EVO use model-specific firmware over USB; Masterflex takes a serial com_port; VSpin/Access2 use device-specific FTDI interfaces. Imports and signatures were checked without optional USB/serial/FTDI/HID discovery. The generic frontends do not establish baud rates, USB identity, firmware, liquid classes, interlocks, or supported physical options.

Visualizer source keeps loopback host, WS 2121, HTTP 1337 defaults and async setup()/stop(). It serves resource/state events, not physical simulation. Its browser and socket lifecycle were source-inspected, not executed. No analytical measurement, calibration, mechanical motion or temperature control was validated in this review.

Raw lines 91 to 103