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.