Opentrons · Flex harness

flex-testing-agent

Release-driven robot test suggestions with live Jira and monorepo PR links.

← All suggestions

validated · updated 2026-08-11

Pyro / protocol-subprocess smoke (Flex external 10.0.0-alpha.0)

Validation checklist for Pyro5 IPC on KansasFLEX after installing external v10.0.0-alpha.0 (same product line as former internal ot3@4.0.0-alpha.N; hardware + protocol subprocess flags default on). Prefer full robot reboot for recovery. Nameserver/hardware-api grouped restart later Closed RQA-5789 / RQA-5790 on v10.0.0-alpha.3 (oe-core#373 PartOf=). Narrative: docs/pyro-testing.md. Parent bug epic: RQA-5831.

Monorepo branch edge
Compared tov10.0.0-alpha.0
Robot OS10.0.0-alpha.0
Hardware flex_1channel_50 (right), opentrons_flex_96_filtertiprack_50ul in A1 (for live tip smoke only)

Harness commands

uv run flex-test inspect
uv run flex-test probe --no-picture
ALLOW_MUTATIONS=true uv run flex-test put 10.0.0-alpha.0 --channel external
ssh -i ~/.ssh/robot_key -o IdentitiesOnly=yes root@$ROBOT_HOST

Tests

IDPlan
A1
Systemd pyro stack active
pass

Nameserver must precede hardware-api and robot-server for IPC.

  • SSH or serial to the robot.
  • Run: systemctl is-active opentrons-pyro-nameserver opentrons-hardware-api opentrons-robot-server
  • Expect all active and enabled.

2026-08-11 all three active; flags enableHardwareSubprocess/enableProtocolSubprocess true.

A2
OT3API registered on nameserver
pass

Hardware entrypoint notifies ready only after OT3API is listed.

  • With Pyro5, locate_ns() and confirm OT3API in ns.list() within 60s.
  • Optional: Proxy(resolve('PYRONAME:OT3API')).get_fw_version().

OT3API + robot-server-resource present; get_fw_version → 68.

A3
Health OK with HW proxy path
pass

robot-server identify_hardware_process depends on NS + OT3API.

  • GET /health expect 200; GET /instruments and /subsystems/status populate.

v10.0.0-alpha.0 healthy; CRS on (OAuth used for mutating calls).

A4
Nameserver restart recovery
skipped

Historical; producers should re-register or fail clearly.

  • Optional regression after oe-core#373: restart opentrons-pyro-nameserver and confirm hardware-api + robot-server also bounce and OT3API re-registers.

Skipped on alpha.0. Later Closed on KansasFLEX v10.0.0-alpha.3 (grouped PartOf= restart; RQA-5789).

A5
Hardware-api restart reattach
skipped

Historical; robot-server must refresh OT3API proxy after HW daemon URI changes.

  • Optional regression after oe-core#373: restart opentrons-hardware-api and confirm robot-server also bounces; GET /health and /instruments recover without a separate robot-server restart.

Skipped on alpha.0. Later Closed on KansasFLEX v10.0.0-alpha.3 (grouped PartOf= restart; RQA-5790).

B1
Instruments and subsystems via HTTP
pass

Lower-line IPC must serve robot-server instrument inventory.

  • GET /instruments and /subsystems/status.

left p50_multi_flex + right p50_single_flex; 6 subsystems ok.

B2
Module nested proxies
skipped

Nested module proxies when hardware is attached.

  • Attach a module; GET /modules.

No modules attached.

B3
Door open/close via HTTP
pass

Door watcher / HW door events must surface through robot-server.

  • Poll GET /robot/door/status while opening and closing the door.

Door closed via GET /robot/door/status (no open/close cycle this session).

C1
Create run registers ot-protocol
pass

Run lifetime should own a protocol subprocess + NS name.

  • Upload a Python protocol; wait analysis completed; POST /runs.
  • Confirm NS has ot-protocol and ps shows run_process_entry_point.

Idle current run 7968ccc8-…; NS now uses UUID-suffixed names (ot-protocol_<uuid>) plus run_process_entry_point processes.

C2
Protocol analysis completes
pass

Analysis path uses simulating / subprocess machinery.

  • After upload, poll protocol analysisSummaries until completed.

Protocol b96f86d9-… analyses completed.

C3a
Idle run actions contract
pass

Actions must cross robot-server to ot-protocol Pyro boundary.

  • On idle run: pause expects 409; stop accepted; cancel is not a valid actionType.

stop accepted → status stopped.

C3b
Live tip smoke play
skipped

Play must execute motion commands across the protocol subprocess boundary.

  • Only with explicit operator request. Deck tiprack A1; play; wait succeeded.

No live motion requested this session.

C6
Uncurrent tears down process
blocked

Protocol process lifetime should match run record create to uncurrent.

  • With current run and ot-protocol in NS, PATCH run current=false.
  • Confirm NS drops ot-protocol and no orphan run_process_entry_point remains.

With CRS on, PATCH current=false returned 409 RunSignoffRequired. After stop, ot-protocol_<uuid> and ot-simulating-protocol_<uuid> processes still present (same class as RQA-5791). Needs CRS signoff path or CRS-off retest before filing a new bug.

D1
Door enum via HTTP
pass

DoorState must serialize through robot-server product path.

  • GET /robot/door/status; expect open or closed.

closed

D7
Subsystems status healthy
pass

Regression check for subsystem serialization issues.

  • GET /subsystems/status; expect all subsystems ok.

gantry_x/y, head, pipette_left/right, rear_panel all ok.