Skip to main content

Make an agent plan first

There is no plan-mode switch. There is something better: a run can stop and ask you a question, and carry on with your answer. Pointing that at the plan is the recipe.

Ask for it in the brief

Per run, in What it is being asked to do when you delegate:

Plan first. Publish the plan and ask me to approve it before you write any code. Once I approve, implement it.

The brief is handed to the coding agent word for word, so say what you want in the words you would use with a colleague.

Or make it the default for a folder

The scan records AGENTS.md and CLAUDE.md from the root of a connected folder, and the coding agent reads them. Put the rule there and every run in that folder follows it without you retyping it:

## Before writing code

Publish the plan with `publish_artifact`, then `ask_human` with `kind: "approval"` and
`blocking: true`, quoting that artifact. Do not edit files until somebody has approved it.

This is the durable version. It also survives being handed to a different agent.

What the agent calls

Every run gets its own MCP server. Three of its tools matter here:

ToolWhat it does
report_progressSays what it is doing, in one line, on the run's timeline
publish_artifactHands over a file the run produced and returns an id
ask_humanAsks a person, and stops if it cannot go on without the answer

ask_human takes:

FieldMeaning
questionWhat you need a person to decide, as one question
optionsThe answers it would accept. Each becomes a button
allow_free_textAccept an answer that is not one of the options. Always on when there are no options
blockingtrue when it cannot go on. The usual case
meanwhileWhat it will do if nobody answers. Required when not blocking
kinddecision, clarification or approval
artifactsIds from publish_artifact this question is about
files, previewThe files or preview the question is about
wait_secondsHow long to hold the turn open. There is a default

A plan approval looks like this:

{
"question": "Approve this plan?",
"kind": "approval",
"blocking": true,
"options": ["Go ahead", "Change the approach"],
"allow_free_text": true,
"artifacts": ["<id from publish_artifact>"]
}

Offering options is worth it. Approving becomes one click instead of typing.

What you see

The run moves to Waiting on you and the question appears at the top of the run screen, above everything else.

Execution screenshot placeholder showing a plan approval question with its options

Each option is a button. Answer this — or Say something else when options exist — opens a box for free text. Dismiss refuses the question, and the run stops.

Answer it and the run carries on with what you said.

Waiting does not cost you a slot

When a blocking question goes unanswered inside its wait window, the agent is told to stop, and Norn starts it again with the answer once somebody gives one.

A plan left overnight is not holding the machine. The slot is released, and the run picks up where it left off. This is why blocking: true is the normal choice rather than something to avoid.

Tell me, do not ask me

Set blocking: false and say what it will do by default:

{
"question": "Going with the repository pattern for the new store. Object if you disagree.",
"kind": "decision",
"blocking": false,
"meanwhile": "proceeding with the repository pattern"
}

The question is recorded and the run keeps working. The run screen shows Working on the default meanwhile: proceeding with the repository pattern.

Use this when you want to know what it decided, not to gate it.

From a shell inside a run

The same thing is available to any process in the run:

norn ask "Approve this plan?" \
--kind approval \
--option "Go ahead" \
--option "Change the approach" \
--wait 600

It reads the run's id and token from the environment, which exists only inside that run's processes. A person at a terminal does not have them, and does not need them.

The alternative: review afterwards

If the work is usually right, skip the plan and let it finish. Request changes on the completed run resumes the same run — same branches, same preview addresses — with your text handed straight to the coding agent. New commits amend the result rather than starting a second one.

Plan firstRequest changes
You see the approachBefore any codeAfter the code
Cost of a wrong approachOne questionA full run
InterruptionsOne per run, at leastNone until the end

Planning first pays when a wrong approach is expensive. Reviewing afterwards pays when it usually is not.