Project Management

The Won't-Do List: How to Stop AI Agents From Scope Creep

AI coding agents love to add features. A written won't-do list keeps every version small, reviewable and shippable. How to write one agents follow.

By Tu Nguyen · · 2 min read.md

A clear boundary keeps a small finished project separate from extra features.

You ask the agent for a login screen. You get a login screen, a password-reset flow, a “remember me” checkbox, a settings page and a new AuthProvider abstraction “for future flexibility”. All of it compiles. None of it was the plan. Reviewing it takes longer than building the screen would have.

This is scope creep, and agents are very good at it. The cheapest defence we know is a won’t-do list.

Why agents over-build

It is not malice, it is helpfulness. An agent trained to be useful fills gaps it sees: a login screen usually has password reset, so add it. Without a boundary, the helpful move and the scope creep are the same move.

You can’t fix that by asking the agent to “keep it simple” — simple is relative. You fix it by naming the things that are out.

What goes on the list

For each version, write the features you are deliberately not building, each with a short reason:

## Won't do (v0.1)

- Full git client (diffs, branches, merges) — other tools do this well; we only commit & push.
- File watcher — manual refresh is enough until people ask.
- Mobile app — the workflow happens at a desk.
- Drag and drop between columns — buttons with undo are faster to build and to use.
- Editing tasks inside the app — the repo files are the source of truth.

Good entries are specific (a feature, not a vibe), tempting (something you or the agent would plausibly build) and justified in one line.

Make the agent follow it

A list the agent never reads does nothing. Put it in the plan file the agent reads at the start of every session — see Memory lives in files — and add one instruction:

If the task seems to need anything from the "Won't do" list, stop and ask me.
Don't build it, don't add a placeholder for it, don't add an abstraction to make it easier later.

The last sentence matters. “Future flexibility” abstractions are scope creep in disguise.

The list is a decision record

The reasons are the valuable part. Three months later, when you (or an agent) propose adding a file watcher, the list tells you why you said no and what would have to change for a yes. You reopen the decision on purpose instead of by accident.

When a version ships, review the list: some items graduate into the next version’s plan, some stay out. This is part of carrying work forward between versions.

Signs your list is working

  • Diffs from the agent are smaller and easier to review.
  • You finish phases instead of widening them — see phases, not to-do lists.
  • Versions ship with a clear one-line promise.
  • You catch yourself saying “that’s on the won’t-do list” to your own ideas.

Where ShotMatic fits

ShotMatic itself is built this way — its spec has a “deliberately left out” section that is as long as the feature list, which is why it stays a small, fast app. And because it reads your repo’s own plan and progress files, the won’t-do list sits right next to the phase and next step your agent works from.

FAQ

What is scope creep in AI-assisted development?

It is when the work grows beyond what you asked for — extra screens, settings, abstractions or refactors the agent adds on its own. Each addition seems small, but together they make the change hard to review and delay the release.

How do I make Claude Code respect a won't-do list?

Keep the list in a file the agent reads at the start of every session, and add one instruction: if a task seems to require something on the list, stop and ask instead of implementing it.

Is a won't-do list the same as a backlog?

No. A backlog is work you plan to do later. A won't-do list is work you decided not to do in this version, with the reason written down so you don't reopen the debate every week.