review.md
103 lines · skills/pylabrobot/references/review.md at 5f2bc03
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 6Release 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, andpaper-tag; there was nov0.2.2tag. - Changelog has no 0.2.2 release heading. MicroSpin and
Plate.stacking_z_heightappear underUnreleasedbut 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.
Native contracts verified
LiquidHandlerwith literalLiquidHandlerChatterboxBackend: 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_Fbreplaces deprecatedCor_96_wellplate_360ul_Fb. Released Hamilton decks userails=, not developmenttrack=.- 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 explicituse_new_return_type=Truerecords. - 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. Usepylabrobot.scales.MettlerToledoWXS205SDUBackend; the old module is absent and the old unsuffixed class raises on construction. Synthetic scale readings useScaleChatterboxBackend, never a hardware backend.
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 55OT-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.
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.
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.