Components

The picker

The picker is the front door and the only screen you need. It lists the sessions one factory owns: its reception, its gaffer, and the workers that gaffer dispatched. Each row carries the signals that matter for agent work: which are streaming output () and which are idle (), a ! on anything in trouble and a ? on anything waiting for an answer from you, the plan step the session is working, and what it is doing this second. Your own shells are not on it, because a list you have to read past is one you stop reading.

acme   ↵ attach   ^d details   ^g tell gaffer   ^x stop one   ·   type to filter

💁 reception      the front desk — ask anything
── sub-agents ──
●  gaffer-acme          acme                          claude  working   dispatching the index worker
●! worker-acme-index    acme              ~index      claude  working   npm test has failed the same way …
○? worker-acme-search   acme     HEV-14   rfc-search  claude  waiting   asks which index to rebuild first

🚨 stop the line  3 agent(s) in 3 sub-agent(s)

One screen is one factory. Configure two on the same machine and the picker asks which one before it shows anything, and esc on the floor goes back to that question rather than quitting. Configure one and there is nothing to choose, so the question is skipped.

The last column is read out of each pane every two seconds and labelled by Claude Haiku, so the screen says what every agent is doing and not only that it is up. A session that has stopped to ask you something reads waiting, and the count of those rides in the header so the one that needs you is visible before you have scrolled to it.

Reception is the top row whether or not the desk is on duty. An off-duty desk says so, and boots it and attaches once it comes up. That matters because factory opens the screen without starting anything on its own, so a desk that exited stays down until you put it back.

attaches to the highlighted session, ^d opens the detail panel for the row the cursor is on, and ^g leaves the gaffer a note it reads on its next beat. Typing filters, so an RFC slug narrows the list to the workers on it. ^x stops one session.

Stop the line is the andon cord and the one control on the screen that touches a running agent. It sends TERM to every agent in this factory and closes those sessions, and it reaches exactly the rows above it, so your own shells keep running. Reception is not on the cord, because the desk is who you ask about a line that just stopped.

factory comes from Homebrew and is on your PATH from the moment you install it. In a checkout it stays current on its own: every run of ./factory copies the binary it just built into $GOBIN, so the command you type from any directory is the code in that tree. A global install drifting behind the repo is the bug nobody looks for, and FACTORY_NO_GLOBAL_INSTALL=1 turns the copy off. Bare factory is the picker and its subcommands, while ./factory in the checkout boots reception and the gaffers first. Both take the same arguments.

docs/picker.md in the repo is the deeper reference: every column, the scope rule that decides what counts as the factory’s, and how the pane summaries are produced.

esc