Running it

RFCs and approving

An RFC, short for request for comments, is where you and the agents work on the same document. Reception drafts one with you or you write it by hand, and you argue about scope until it is worth building.

An RFC is a work list, not an essay: what changes for the user, why now, how success is measured, and steps with acceptance conditions specific enough that an agent cannot fill a gap with a guess. plans/README.md is the house style, including the 120-line budget.

How a plan gets in

A plan enters the factory when it lands in plans/active/ on plans_repo. That is the only way in, and everything downstream reads from that one branch: decomposition, dispatch, archive.

What differs between factories is the door onto that branch, and a factory has exactly one. Whether linear_team is in its config decides which.

The default door: a merged pull request

Reception opens a pull request that adds plans/active/<slug>.md, and the gaffer opens one when it has an RFC of its own to propose. Neither of them merges it. You merge it, and that merge is the approval. The next beat sees a new plan on the branch and dispatch follows from there.

Committing the file directly would not do, because reception has repo access and could commit it too, and a signal the machine can perform is not a signal. The merge is the one act nothing in the factory performs.

On an unprotected branch that is a rule the factory follows, and crossing it would be a defect rather than an impossibility. Switch on branch protection requiring a pull request and it becomes a 403. That switch has to be yours: a factory that could set it could unset it. The cost is that you also merge the factory’s bookkeeping commits, and contracts/approvals.md lays out the trade.

The better door: a Linear state

Name a linear_team and the RFC becomes a Linear issue whose description is the plan. You approve by moving the issue into one state. That is the entire signal, and a comment is not one. Which state is linear_approved_state, picked from your team’s own states at init. The gaffer then commits the plan to plans/active/ on your behalf, so a plan on that branch is still what approved means to everything downstream, and writing one in by hand still works.

This door is better because it works from a phone. Linear holds the RFC, the asks and the queues, while GitHub holds branches, pull requests and CI, none of which is ever waiting on you. A queue that stalls because you were not at a desk has stopped on posture rather than on judgment.

It does not depend on the factory behaving, either. Linear lets an integration create labels but not workflow states, so the marker that carries the decision had to be handed to the factory rather than made by it. The gaffer works the rest of your board and is barred from exactly one transition, which is moving anything into the approved state.

Comments are how you steer

A comment is how you change an RFC. “Looks good but drop step 3” gets applied to the document, the gaffer replies saying exactly what it changed, and the RFC sits where you left it until you approve it. Order does not matter, because every unapplied comment is applied before the plan is committed, so an approval that arrives first still gets the amended document. What the factory will never do is dispatch against a version you asked it to change.

Where the rest of your attention goes

Approved intent has one home even when the work has several. plans_repo is a single repo and plans_branch a single branch, which is why the gaffer’s watermark is one <branch> <sha>: it senses decisions, and a decision lands in one place. The repos a plan’s steps touch are repo_scope, and progress across them is counted per merged pull request rather than off the watermark, because a worker pushing to a work repo is work happening rather than somebody approving something.

Three queues carry everything else that needs you: verified work waiting on your review, anything blocked on a decision, and parked ideas nobody has committed to. With Linear they are your team’s own states and a blocked label, resolved from your real board at init rather than from a vocabulary the factory invented. Without it they are plans/blocked/ and plans/backlog/ in the plans repo, and work waiting on review is the open pull request itself. Either way anything blocked carries one ASK: question, edited as it sharpens and never reposted. contracts/queues.md is the taxonomy and the order the loop spends your attention in.

Finished plans archive with a dated stamp, so provenance stays greppable.

esc