Approvals, undo, pause and stop

How you approve an action with ok and its code, what the approval protects and what it does not, and how undo, pause and stop differ.

This page answers: what needs my approval, how do I give it, and what is the difference between undo, pause and stop? Five actions wait for you: a sign-off, an undo, a stop, one more budget, and a change of the team rules. A pause does not, because it loses nothing.

The approval block

When an action needs you, Claude Code shows one block: ads needs your approval: and what it is about, the facts on indented lines, and last the line to reply with.

Situation. #13 adds a target to the Makefile, which a path rule makes high risk. The report says Ready for sign-off.

You say

sign off #13

You see

ads needs your approval: sign off and land #13 "Add a cover target to the Makefile"

  Risk: high
  Tests: 1 frozen test failed before the change and passes now, checks pass
  Spent: 123k tokens
  Changed files:
    - cover_cdr0013_test.go (+18 −0)
    - Makefile (+4 −0)
  Head: 3f9c0a7b12de

To approve, reply:   ok 4f2a

What happens. Reply with that line alone: ok 4f2a. Then the change is signed with your key and lands. The code is 4 random hex characters, new for each question, and appears only on the last line.

How to answer

  • Reply ok <code> within 10 minutes. After that the question expires: ask again.
  • A plain “ok” with no code approves nothing. A reply with anything besides ok and the code approves nothing either.
  • The fifth wrong code drops the question: ask again.
  • If the change moved after you approved, the action does not happen, and Claude Code says so.

What the approval protects, and what it does not

ADS stores a hash of the code, not the code, so reading its files cannot approve anything. The hash is keyed with a key of your machine, kept in your user config directory (ads/approval.key).

The limits:

  • Claude Code’s transcript of the session holds the code in plain text.
  • The guard that keeps the session away from the store, the key and the transcript is a text filter that runs as your own user. It stops mistakes and casual prompt injection. It does not stop a model that sets out to get around it. A real boundary needs an OS sandbox, which ads does not ship yet.

Undo, pause and stop

Action You say Needs approval Loses work Can still land
undo undo #12 yes no: a signed revert takes the change off the trunk, and its history stays it has landed; the revert is reviewed before it lands
pause pause #12 no no: the pull request, the branch, the tests and the budget used stay yes: the step that runs when you pause can still land it
stop stop #12 yes yes: the work ends, the pull request is closed and its branch deleted no

Only a stop keeps a change from landing. When you only want the team to wait, pause.

Undo a landed change

You take a landed change back without touching git yourself.

Situation. #12 landed this morning, and now the login fails.

You say

undo #12, it broke the login

You see

ads needs your approval: undo #12 "ApplyFee truncates instead of rounding"

  Landed: 2026-11-14

To approve, reply:   ok 9e1b

What happens. After your ok <code>, ADS creates a revert of #12 with your reason, “it broke the login”, and runs it. The revert is reviewed, by the correctness layer by default, and takes #12 off the trunk with a signed commit. The history of #12 stays in git. When later changes build on #12, the block adds a line Later changes that build on it stay: …. Afterwards what is waiting for me? lists it under Recent as undone.

Pause a change

You stop the team for now and keep everything it did.

Situation. #12 is in its first round, and you want to look at the issue again before the team spends more.

You say

pause #12

You see

Paused: #12 ApplyFee truncates instead of rounding            risk low · …
…
Resume       say "work on #12"

What happens. The team stops after its current step. Nothing is lost, and no approval is needed. The current step can still land the change. “work on #12”, “fix #12” or “resume #12” goes on where it paused. While it is paused, what is waiting for me? shows #12 "ApplyFee truncates instead of rounding": paused, say "work on #12" to go on. When nothing runs, the answer is nothing to pause for #12.

Stop a change

You make sure a change does not land.

Situation. #14 turned out to be a duplicate of another issue.

You say

stop #14

You see the approval block, then the end:

ads needs your approval: stop the work on #14 "Prevent duplicates"

  The team stops, and the pull request of the change is closed.

To approve, reply:   ok 2c7d

Stopped: #14 Prevent duplicates

What happens. After your ok <code>, the team stops, its pull request is closed and the branch of the change is deleted. The signed history of the change stays in git.

One more budget

When a change uses up its budget, it stops with a question. Spending more needs your approval.

ads needs your approval: spend one more budget on #12 "ApplyFee truncates instead of rounding"

  Risk: low
  One more budget: 1.5M tokens
  Spent so far: 1.5M tokens

To approve, reply:   ok 5a03

After your ok <code>, the team goes on with one more budget of the same size. How a change lands lists the budgets.

A change of the team rules

A change of the team rules shows what it does in plain words, so you see what you give up before you approve. For a path rule, ADS checks the files on the trunk and the files that open fixes change, with the old and the new rules. A file that stays under checks.sensitive_paths is critical whatever the rules say, so it never counts. An open fix whose head is not in this clone is not counted, and the question says so. The files that lose protection come before the files that gain it.

Situation. Someone asks to make the default high-risk rule low risk.

You see

ads needs your approval: change the team rules

  Changes the high-risk rule from high to low risk.
  2 files on the trunk lose protection and go from high to low risk, for example go.mod.
  New files that match these globs can get a lower risk.

To approve, reply:   ok 3d8f

What happens. Approve only if you mean it: after your ok <code>, a change to those files can land by itself. The last line warns that a future file can get a lower risk too, even when no file on the trunk does today. If the files that change risk are not the same when ads trust apply lands the rule (a new one on the trunk or in an open fix, or one gone), the approval no longer holds: the state changed after the approval: ask again. A new file that changes no risk keeps it. Everyday use shows a change that adds protection.