Part 2 of 6 Working through your agent
A question that waits for you
By the end of this chapter your agent has hit something only you can settle, has said so and carried on with other work rather than guessing, and the answer you gave once is sitting on the item for a session that has not started yet.
This is the behaviour that most changes what it is like to work with an agent. The alternative is an agent that guesses and is confidently wrong, or one that stops dead until somebody who is not at the keyboard comes back. Both are worse, and without somewhere to put a question both are what you get.
The work so far
The website rebuild as Decisions, findings and dead ends left it: the navigation broken into pieces, and three documents governing them.
uv tool install subroutine
subroutine init
subroutine project create web "Website rebuild"
subroutine agent create claude --profile worker --project web --store
subroutine add "Write the copy for the home page +web"
subroutine add "Choose a typeface for the headings by Tuesday +web"
subroutine add "Agree the new navigation +web"
subroutine add "Build the new navigation +web ~1d"
subroutine add 'Audit the third-party scripts +web !3/2'
subroutine link 3 blocks 4
subroutine done 3
subroutine document create "Navigation stays one level deep" --type decision --project web --body "One level, and the four second-level links go in the footer."
subroutine link 6 documents 4
subroutine document create "Do not generate the navigation from the sitemap" --type dead_end --project web --body "It goes stale the moment a page moves, and the build cannot tell."
subroutine link 7 documents 4
subroutine document create "The analytics tag loads the consent banner a second time" --type finding --project web --body "Both are injected by the tag manager."
subroutine link 8 documents 5
subroutine add "Write the dropdown markup +web" --under 4
subroutine add "Check the navigation on a phone +web" --under 4
subroutine document create "The dropdown opens on click, not on hover" --type decision --project web --body "Hover has no equivalent on a touchscreen."
subroutine link 11 documents 9
{
"mcpServers": {
"subroutine": {
"command": "subroutine",
"args": ["mcp"]
}
}
}
Something only you can settle
Your agent picks up the dropdown markup and gets one paragraph in before it meets a question that is not a coding question. Whether the navigation has to work with JavaScript turned off is a decision about the product, and about who the site is for. Nobody should want an agent to settle that on its own.
So it writes the question down, says who it is for, and says what it is holding up:
subroutine_add(text="Must the dropdown work without JavaScript? +web @laurence", type="question")
subroutine_link(ref=12, type="blocks", other=9)
@laurence in the sentence is the whole of the assignment, as +web is the whole of the filing. And blocks is the same relation the last two chapters used for work waiting on work. A question is work: somebody has to do it, and until they do, something else cannot start.
It moves on
The agent asks what it can start now, and gets a different answer than it would have a minute ago:
subroutine_list(ready=true)
The dropdown markup is not in that list. It asked a question about it thirty seconds ago and has already stopped being offered it, because it is blocked by something unfinished, and ready leaves those out. The agent does not have to remember that it is waiting, and neither do you.
The question is at the top of the list instead, marked blocker, with your name on it. The thing holding the work up has become the most startable thing there is, which is the correct answer to what should happen next and is not one anybody had to arrange.
Meanwhile there is plenty left, so the agent takes the phone check and carries on.
It reaches you
You are not in that session and did not see any of it. You look at your own list:
subroutine agenda
Two lines say it. The work is blocked, and underneath it waiting on #12 @laurence, which names both the question and the person who owes the answer. That second line is the one worth knowing about: work stalled on somebody is the thing that goes unnoticed longest, and here it says so on the face of the item.
The same two lines are on the agenda in the browser you left running in Watch it happen, which is where most people will actually meet them. Answering there instead, without a terminal at all, is what the browser part of this guide is for.
You answer once
subroutine comment 12 "No. Progressive enhancement everywhere else on the site, but the navigation is the one place we already require JavaScript."
subroutine done 12
That is the whole of your part: one sentence, and the question ticked off. You did not have to find the agent that asked, and it did not have to still exist.
And it is waiting for whoever comes next
A session later, or a month later, something picks the work up again. It may not be the agent that asked. It asks the same question it always asks:
subroutine_list(ready=true)
The dropdown markup is back, without anybody unblocking it. You finished the question; the thing it was holding up became startable again; and the list said so to the next thing that asked.
subroutine_show(ref=9)
1 of 1 blockers done and (over) are the difference between this was never blocked and this was blocked, and here is what by. The second is worth reading, so it is still there:
subroutine_show(ref=12)
assigned by @claude is the part to notice. The record says an agent decided this was yours to answer, you answered it, and both of those are attributed. Nobody has to take anybody's word for how the decision got made.
The answer is a sentence, written once, sitting where the work is. Every agent that touches the dropdown from now on reads it without being told it exists, and none of them asks you again.
So far every agent here has been the same one. The next chapter gives a second project its own, and has the two of them hand work to each other.