Repository navigation
quality-loop 0.2.0
quality-loop 0.2.0
A command line for running and following the loop. quality-loop run starts a run in the background and prints its id. status, watch, findings, cancel, restore and check take it from there. findings compares a run with the one before it, by room and id: new, still there, gone, back. qa/quality-loop.toml names the product's adapter.
Runs you can watch from another terminal. Each run writes run.log and status.json beside its rooms: every room's phase, its cost, when it was last active, and whether it is quiet but alive. A room that reaches into those files is an isolation breach.
Rooms side by side. An adapter can declare parallel, resources and needs() to run rooms at once without sharing what they must not. An adapter that declares none of them runs one room at a time, as before. A room that fails gets a report and the others go on.
The framework drives the product's app. drive.TerminalApp runs a terminal app in a pty and reads its screen as text (pip install 'quality-loop[tui]'). drive.DesktopApp drives a GUI with synthetic keys, checking before every key that the app's window is in front, and reads it by screenshot. A scenario's new Live check section has the operator drive the real app after the room is done. With room_apps, a human-facing product's room drives the app with only its manual. Every step is recorded with its intent and the screen afterwards. An app that writes JSON lines to QUALITY_LOOP_EVENTS gets level-1 evidence. examples/tui/ measures a terminal app and its manual with a few dozen lines of adapter.
A conductor skill. quality-loop init installs a skill into the product's .claude/skills/, stamped with this version. With it, a Claude Code session in the product's repository can set quality-loop up, plan runs with a person, file findings as Issues, fix what the person chooses and retest. init --upgrade refuses to overwrite a copy that was edited by hand.
Known problems as neutral data. run --known gives each operator the ids and titles of problems earlier runs reported for its scenario, never a status. Reports gain an optional Reproduce field, and each room's evidence/run.json records where it started: product version and commit, OS, fixtures and models.
For adapters
Nothing has to change: every addition is optional. A few new hooks are worth adopting:
default_variantnames the unnamed variant for--variant.restore()backsquality-loop restore.bundle_place = "docs"puts a manual where a skill would go.
QUESTIONS.md now starts "What I was not told". findings.json entries gain reproduce and run.
Windows: the key and screenshot backends are unit-tested only, and terminal apps are not driven there yet.