How a change lands
How ADS sets the risk of a change, which changes land by themselves, and the checks, review layers and budgets on the way.
This page answers: will this change land by itself, or wait for me, and why? The answer depends on the risk of the change, its size, and what the review found. The rules below are the defaults that ads init writes, or that apply when .ads/config.yaml sets none.
The risk of a change
The risk is the highest of three:
- the risk the team declares for the request;
- the path rules in
.ads/config.yaml, for the files the change touches; - the risk a reviewer raises.
Agents cannot lower the risk below the path rules. The risk decides who signs the change:
| Risk | Lands | Signed by |
|---|---|---|
| trivial, low | by itself, when every check passes and the team key is set up | team key |
| medium | by itself, when every check passes, the run had no dispute and no stall, and the team key is set up; otherwise it waits for your sign-off | team key, or you |
| high, critical | waits for your sign-off | your key |
The team key signs only once ads init has set up the team key and listed it as trusted in .ads/allowed_signers. Until then ads work does not start, so no change runs or lands.
A report that starts with Ready for sign-off waits for you. After your ok <code>, the change is signed with your key. If the change moved in the meantime, the sign-off stops and the team gives a new report.
Path rules
A change to one of these files is high risk:
- dependency manifests and lock files, such as
package.json,go.modorCargo.lock; - CI configuration and build files, such as
.github/**or aMakefile; **/auth/**,**/crypto/**and**/migrations/**;- the files that steer agents:
.claude/**,CLAUDE.md,AGENTS.md,.mcp.json, and others.
A change to .claude/**, .mcp.json, CLAUDE.md, **/CLAUDE.md, AGENTS.md, .github/workflows/**, .github/actions/**, .gitmodules or .gitattributes is critical.
Size limits
Even within its risk, a change lands by itself only when it is small. The limit counts added plus deleted lines, without the frozen tests:
trivial: at most 20 changed lines;low: at most 200;medium: at most 400.
A binary file, or a change to a file outside what the request allows, also makes the change wait for your sign-off.
Review layers
Each layer is a separate reviewer. The more risk, the more layers:
| Risk | Layers |
|---|---|
| trivial | correctness |
| low | correctness, scope |
| medium | correctness, scope, acceptance |
| high, critical | correctness, scope, acceptance, security, concurrency, api |
A finding blocks the change only from severity major, and only with a reproducer: a test that fails on the change. A finding without both does not block the change.
Docs changes
A change of type docs has no test author: a test of a docs change passes before and after it, so it proves nothing. The plan names no test author, and the report’s Proof line says so:
…
#14 Plan implementer, 1 review layer · at most 3 rounds · 1M tokens · 3600 s
…
Proof docs only, no test · checks pass
A docs change may touch only documentation: *.md, *.mdx, *.markdown, *.rst and *.adoc files. If its diff changes any other file, its risk becomes at least high, so it waits for your sign-off, and its Proof line no longer says docs only. The report’s Risk line names the file and the rule, for example Risk high: scripts/build.sh is not a docs file, and a docs change may only change docs, declared low.
The final look
Before a change lands by itself, one more reviewer sees only the request and the final diff. A problem it confirms sends the change back for one more round. If it finds a problem again, the team asks you, with three options:
Waiting for you: #12 ApplyFee truncates instead of rounding
Blocked The final review found a problem again: "…".
Options 1. say how to fix it 2. explain why the finding is wrong 3. stop
Recommended say how to fix it
Answer say what to do, for example "say how to fix it"
Raised risk
A reviewer can raise the risk. The change then follows the rules of the higher risk, and the report says so on its Risk line, for example Risk high: security review raised it, declared low. A change you expected to land by itself can then wait for your sign-off.
Budgets
Each change has a budget, so a stuck run stops and asks you before it spends more. By default:
| Risk | Rounds | Seconds | Tokens |
|---|---|---|---|
| trivial | 3 | 3600 | 1M |
| low | 3 | 3600 | 1.5M |
| medium | 3 | 3600 | 3M |
| high | 3 | 3600 | 8M |
| critical | 3 | 3600 | 8M |
Tokens count every kind, cache reads included. There is no dollar limit by default. When a change uses up its budget, it stops with a question, for example The change used its token budget for low risk (1.5M of 1.5M tokens). Spend one more budget? One more budget needs your approval. To set your own budgets, change the team rules, for example “raise the budget for medium changes”.
Example: the same fix, two outcomes
A 12-line fix in src/ lands by itself; the same fix touching package.json waits for you.
Situation. Issue #12 asks to round a fee. The team declares it low.
You say
fix #12
You see, when the fix changes 12 lines in src/ only:
#12 Step risk low: as declared
…
#12 End landed · …
You see, when the same fix also adds a dependency to package.json:
#12 Step risk high: package.json matches a path rule
…
#12 End ready for sign-off · …
What happens. In the first case the risk stays low, 12 lines is within the limit of 200, and the change lands by itself once every check and the final look pass. In the second, package.json is a dependency manifest, so a path rule makes the change high: six review layers check it, and it waits for your ok <code> (see Approvals, undo, pause and stop).