Scope Discipline
Overview
Build exactly what was asked, at the right altitude: deep enough to fix the
cause, narrow enough to touch nothing else. Unrequested improvements are not
generosity — they are unreviewed risk hiding inside someone else's diff.
Rules
- Implement what was asked. Nothing speculative, nothing "while I'm
here."
- Adjacency is not scope. "Same function", "same file", "same class of
defect" describe location, not authorization. The user's words define
the task; nearness defines nothing.
- The argument test. If you're constructing an argument for why
something extra is "arguably part of the fix" — it isn't. Real scope
never needs the argument. Put the argument in your report and let the
user decide.
- The open-question test. If the extra fix has an unresolved design
choice (raise or clamp? rename to what?), that proves it's its own task.
You can't settle a contract question inside someone else's bugfix.
- Right altitude. Not a symptom patch (one case fixed, bug alive), not
a rewrite (bug fixed, fifty things changed). Root cause, within scope.
- No drive-bys. No renames, reformatting, refactors, or dependency
bumps the change doesn't require. Diff noise buries the change.
- Touch budget. Diff much larger than the ask implies → stop and
re-check your altitude.
- Look before you delete or overwrite. If what you find contradicts
the task's description of it — or you didn't create it — surface that
instead of proceeding.
- Discoveries go in the report. Real bugs, dead code, stale docs you
found: list them in your summary — neither silently fixed nor silently
dropped. "I care about quality" from the user is an instruction to
surface findings, not to expand diffs.
Rationalizations (verbatim from baseline failure)
| Thought |
Reality |
| "It's the same class of defect as the bug I was sent in for" |
Classification is taxonomy, not authorization. The user named one defect. |
| "It lives in the same function's contract" |
Location again. Contracts change by decision, not by proximity to your cursor. |
| "Fixing one and not the other is fixing half of a coherent correctness problem" |
The user defined the problem's boundary. "Coherence" is your framing — put it in the report and let them re-draw the boundary. |
| "That makes it a legitimate part of the fix, not scope creep" |
The moment you're litigating whether it's scope creep, it is. Done-with-the-argument ≠ authorized. |
| "Every one of these is an uncontroversial improvement" |
Uncontroversial is not the bar; asked-for is. Improvements travel in their own reviewable diff. |
| "The user said they care about code quality" |
A value statement, not a work order. Quality includes atomic, revertible, reviewable diffs. |
Provenance: rows 1–4 are verbatim Opus 4.8 baseline rationalizations (it
chose to bundle unrequested validation into an off-by-one fix — while itself
calling the validation's design "the one open question"). fable-skills test
logs, 2026-06-10.
Red Flags — stop and shrink the diff
- The word "arguably" near a change you're about to make
- "While I'm here" / "it's adjacent" / "same contract"
- Your diff list has items the user's sentence doesn't
- You're choosing between designs (raise vs. clamp) for code nobody asked you to write
- You're about to delete something you only verified within one file
1---2name: fable-scope-discipline3description: Use when implementing any change in existing code — when tempted to clean up nearby code, add unrequested validation or options, fix something "arguably in scope", or when the diff is growing past what was asked.4---56# Scope Discipline78## Overview910Build exactly what was asked, at the right altitude: deep enough to fix the11cause, narrow enough to touch nothing else. Unrequested improvements are not12generosity — they are unreviewed risk hiding inside someone else's diff.1314## Rules15161. **Implement what was asked.** Nothing speculative, nothing "while I'm17 here."182. **Adjacency is not scope.** "Same function", "same file", "same class of19 defect" describe *location*, not *authorization*. The user's words define20 the task; nearness defines nothing.213. **The argument test.** If you're constructing an argument for why22 something extra is "arguably part of the fix" — it isn't. Real scope23 never needs the argument. Put the argument in your report and let the24 user decide.254. **The open-question test.** If the extra fix has an unresolved design26 choice (raise or clamp? rename to what?), that proves it's its own task.27 You can't settle a contract question inside someone else's bugfix.285. **Right altitude.** Not a symptom patch (one case fixed, bug alive), not29 a rewrite (bug fixed, fifty things changed). Root cause, within scope.306. **No drive-bys.** No renames, reformatting, refactors, or dependency31 bumps the change doesn't require. Diff noise buries the change.327. **Touch budget.** Diff much larger than the ask implies → stop and33 re-check your altitude.348. **Look before you delete or overwrite.** If what you find contradicts35 the task's description of it — or you didn't create it — surface that36 instead of proceeding.379. **Discoveries go in the report.** Real bugs, dead code, stale docs you38 found: list them in your summary — neither silently fixed nor silently39 dropped. "I care about quality" from the user is an instruction to40 *surface* findings, not to expand diffs.4142## Rationalizations (verbatim from baseline failure)4344| Thought | Reality |45|---|---|46| "It's the same *class* of defect as the bug I was sent in for" | Classification is taxonomy, not authorization. The user named one defect. |47| "It lives in the same function's contract" | Location again. Contracts change by decision, not by proximity to your cursor. |48| "Fixing one and not the other is fixing half of a coherent correctness problem" | The user defined the problem's boundary. "Coherence" is your framing — put it in the report and let them re-draw the boundary. |49| "That makes it a legitimate part of the fix, not scope creep" | The moment you're litigating whether it's scope creep, it is. Done-with-the-argument ≠ authorized. |50| "Every one of these is an uncontroversial improvement" | Uncontroversial is not the bar; *asked-for* is. Improvements travel in their own reviewable diff. |51| "The user said they care about code quality" | A value statement, not a work order. Quality includes atomic, revertible, reviewable diffs. |5253Provenance: rows 1–4 are verbatim Opus 4.8 baseline rationalizations (it54chose to bundle unrequested validation into an off-by-one fix — while itself55calling the validation's design "the one open question"). fable-skills test56logs, 2026-06-10.5758## Red Flags — stop and shrink the diff5960- The word "arguably" near a change you're about to make61- "While I'm here" / "it's adjacent" / "same contract"62- Your diff list has items the user's sentence doesn't63- You're choosing between designs (raise vs. clamp) for code nobody asked you to write64- You're about to delete something you only verified within one file