Components

The picker

The picker is the front door and the only screen you need. It lists the sessions the factory owns: reception, the workers the gaffers dispatched, and — on the resident runtime — the gaffers themselves. (On the one-shot runtime a beat is a process, not a session, so between beats there is no gaffer row; each factory’s section header carries its last beat instead.) Each row carries the signals that matter for agent work: which are streaming output (●), which are waiting on you (○), which factory a session serves, the plan step it is working, and a ⚠ on any worker running past four hours without a pull request. Your own shells are not on it, because a list you have to read past is one you stop reading.

acme   \u2191 attach   ^x stop one   \u00b7   type to filter

\ud83d\udc81 reception      the front desk \u2014 ask anything
\u2500\u2500 sub-agents \u2500\u2500
\u25cf  gaffer-acme          acme                          claude  working    \u273b Brewed for 41s
\u25cf\u26a0 worker-acme-index    acme              ~index      claude  working    \u23fa Bash(npm test)
\u25cb  worker-acme-search   acme     HEV-14   rfc-search  claude  idle 12m   \u23fa Ready for review.

\ud83d\udea8 stop the line  stop 3 agent(s)

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:.

Reception is the top row whether or not the desk is on duty. An off-duty desk says so and ↵ puts it back on — which matters because the installed factory is the picker alone: it opens the screen without booting anything, so a desk that exited is a desk nothing restarts until the next ./factory.

↵ attaches to the highlighted session and ^x stops one. Typing filters, so an RFC slug narrows the list to the workers on it, and esc goes back to the factory list when the machine runs more than one. 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. 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 is on your PATH and 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 this checkout. A global install drifting behind the repo is the bug nobody looks for. FACTORY_NO_GLOBAL_INSTALL=1 turns it off. The installed factory is the picker and its subcommands, while the ./factory here also boots reception and the gaffers first. Both take the same arguments.

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

esc