Scope drift happens when an AI coding agent starts with a narrow task and ends with a broader system change. Sometimes the broader change is useful. Sometimes it is hidden risk disguised as helpfulness.
Pull request review is late. By then, tokens are spent, the branch exists, the session is stale, and the agent's original reasoning may be gone. Nool moves scope control earlier.
stateDiagram-v2 [*] --> DeclaredIntent DeclaredIntent --> Implementation Implementation --> BlastRadius BlastRadius --> InScope BlastRadius --> DriftDetected DriftDetected --> ReviseIntent DriftDetected --> BlockTask InScope --> Propose ReviseIntent --> Propose Propose --> Solidify
Start with `nool task pick --id <id> --solidify` and `nool announce intent --intent "..." --target-nodes "..."`. If the work belongs to a longer effort, associate it with `--thread <name>` and use `nool thread show <name> --full` before editing.
After implementation, run `nool debug blast-radius <path> --compact`. If the output shows unexpected boundaries, choose one of three honest responses. First, split the work and keep the current task narrow. Second, block the task with `nool task block --id <id> --reason "..."` if the premise is wrong. Third, revise the proposal intent and justify the broader scope with `nool propose --all --intent "..." --fast`.
The mistake is not broad work. The mistake is broad work pretending to be narrow. Nool's value is that it gives Claude, Codex, Cursor, and humans a shared place to say what the agent meant to do, what it actually touched, and why the final boundary was acceptable.
This is especially important across sessions. A later agent should not inherit a vague "refactor cleanup" label after the first agent widened the scope. It should inherit the revised intent, the blocked paths, the findings, and the blast-radius evidence. That is how a fast workflow stays honest when work spans multiple tools and days.
Scope drift is not eliminated by telling agents to be careful. It is reduced by making the boundary visible, checking it mechanically, and recording every exception.
Boundaries must become repository data.
Otherwise the next session repeats the negotiation.