Anatomy of a suite
Every suite has:- An entry point (usually
main.py) that declares the ordered sequence of steps. - Suite files — Python modules, YAML step metadata, JSON fixtures, firmware binaries, reference images — uploaded into Stout’s object storage.
- Parsed steps — derived from the entry point at import time, each step carrying a name, a description, and optional visual metadata (icon, color, expected image).
Importing a suite
From Factory → Import Suite:- Upload a zip of your suite directory, or point at a GitHub repo.
- Stout parses
main.pyto extract the step list and validates each step. - The suite is saved with a version. Re-importing creates a new version so you can roll back if a suite regresses.
Running a suite
From Factory → [suite] → Run:- Pick a target box. Stout checks that the box has all the nets the suite requires.
- Click Start. The suite boots in a dedicated container on the box.
- The run detail page opens a WebSocket to the box and streams every step event in real time.
step_started/step_completedwith pass/fail and duration.image_captured/video_capturedif your step takes a camera capture.log_linefor free-form output.suite_finishedwith aggregatesuccessCount/failureCount.
Run states
| State | Meaning |
|---|---|
| pending | Accepted, waiting for the box. |
| uploading | Suite files being pushed to the box. |
| running | Steps executing. |
| passed | Every step completed successfully. |
| failed | At least one step failed. |
| cancelled | An operator clicked Cancel. |
| error | Infrastructure failure (box lost, suite parse error). |
Reports
Every run produces a report with per-step results, any captured images or videos, and a structured event log. Reports can be downloaded as JSON for integration with your MES or QA tracker.The authoring guide for factory suites (writing steps, defining pass/fail
criteria, camera capture, structured metadata) is coming soon. In the meantime,
look at an existing suite’s
main.py for the conventions.