One Feature at a Time

Intent

Constrain the agent to one feature per pass: a session takes one item, carries it all the way to a verified "works" — and only then takes the next one. A constraint against the agent's built-in urge to do everything at once: the window is spent on depth, not breadth.

Also known as

One feature at a time, one feature per session, incremental progress; a relative of kanban's WIP limit.

Problem

Left to itself on a large task, an agent tries to do too much at once — essentially to one-shot the whole app. It looks productive: files appear by the dozen, features get "started" one after another. It always ends the same way:

  • The window is eaten by the breadth of the front: midway through the tenth feature the context is exhausted, and none of the ten is finished.
  • "Almost done" can't be verified: verification needs finished behavior, and there is none anywhere.
  • Half-done is worse than not-done: the next session inherits not a clean task list but an excavation — what of the started work runs, what to drop, what to finish.
  • A session cutoff is expensive: progress is lost across the whole front at once.

Solution

An explicit constraint, anchored in project memory and prompts: one pass — one feature, carried to the end. The end is not "code written" but the full cycle:

  1. Take one item — the next failing one from the Feature List, or a single ticket.
  2. Implement it and only it.
  3. Verify as a user — run the Feedback Loop to green.
  4. Record: the status in the list, a commit, an entry in the Progress Journal.

Everything noticed along the way — a broken neighboring feature, a refactoring begging to happen — doesn't widen the current pass; it gets written down: as a new list item or a journal note. If, after the finale, the window allows, the agent takes the next item — by the same cycle, not "while we're at it".

Why it works: one feature fits in the window whole, with room for verification iterations; completeness becomes binary — a feature is either finished and verified or not started; and any session cutoff costs at most one unfinished feature, not the whole front.

Structure

one feature at a timewithout the constraint a one-shot attemptPass 1the whole front at oncefeature A ~ · feature B ~feature C ~ · feature D ~ ·the window ran out nonefinished, none verifiedPass 1feature A verifiedPass 2feature B verifiedPass 3feature C verifiedwhatever is noticed along theway goes tothe feature list and the journal,not into the current diffthe window is spent on depth, not breadth

The top lane is what happens without the constraint: one pass fans out across the whole front, the window ends before the front does, and the residue is a scattering of "almosts" that nothing can verify. The bottom lane is the pattern: a chain of passes, each ending in one finished, verified feature. The perceived speed is lower; the actual speed is higher — only finished items count.

Participants / Components

  • The pass — the unit of work: a session, or part of one, devoted to exactly one feature.
  • The feature — one verifiable item; "finished" is defined by the check, not by the volume of code written.
  • The feature list — the queue the pass takes its next item from, and where everything noticed along the way goes.
  • The agent — implements and verifies; the constraint is held by the prompt and project memory.
  • The developer — keeps the discipline: doesn't toss in "while you're at it" and demands the finale before the next item.

When to use

  • Long work driven by a feature list — that's where the constraint was born: without it, autonomous sessions reliably try to do everything at once.
  • Autonomous runs: the less supervision, the stricter the pass's frame must be.
  • As the default for any non-trivial work: an "and X while you're at it" in the prompt is already a bid for a smeared, unverifiable diff.

It doesn't fit honestly cross-cutting changes — a format migration, a rename across the codebase: they can't be sliced into features and need a separate pass with its own completion criterion.

Consequences and trade-offs

  • ➕ Every pass ends with a verified increment: progress counts in finished features, not started ones.
  • ➕ The window is spent on depth: the implementation, verification, and iterations of one feature — instead of being scattered across ten.
  • ➕ A cutoff is cheap: the session died — at most one unfinished feature is lost, and the artifacts say which.
  • ➖ It feels slower: no invigorating illusion of "everything is almost done". That's the price of "done" becoming true.
  • ➖ Cross-cutting changes don't fit the frame — they have to be carved out into separate passes with their own criteria.
  • ➖ The discipline cuts both ways: the prompt holds the agent, but nothing holds the developer; the temptation to "toss in Y too" at the end of a good pass breaks the pattern from the inside.

Implementation

  1. Anchor the rule in Project Memory: "one feature per pass, carried to a verified status; incidental findings go to the list, not into the diff."
  2. Word the pass's prompt narrowly: "take the next failing feature from the list and carry it to passes" — not "work on the app".
  3. Define the pass's finale and demand it whole: check, status, commit, journal entry. A feature without the finale isn't done.
  4. Route what's noticed along the way into artifacts: a bug — as a new list item, a refactoring idea — as a journal note. The pass's diff touches only its own feature.
  5. If the window allows continuing — the next item starts as a new pass, from reading the list, not as an extension of the current diff.
  6. Plan cross-cutting groundwork — migrations, renames, infrastructure — as separate passes with an explicit completion criterion.

Example

The notes service from the Feature List chapter. Project memory holds the one-pass rule. The developer starts a session:

Take the next failing feature from feature-list.json and carry it to passes.

The agent takes "search by tag". Along the way it notices: the notes list's pagination is broken, and the filters are begging for a refactor. Instead of fixing and rewriting "while it's at it", it adds pagination as a new list item, writes the refactoring idea into the journal — and continues with search. By the end of the pass: search implemented, run as a user, passes: true, a commit, a journal entry.

For contrast — what happened before the rule: the prompt "work on the app" ended with a session that had "implemented search, filters, pagination, and started export". The window died on export; nothing was verified; the next session spent half its context figuring out what of it worked at all.

Anti-patterns and common mistakes

  • The one-shot attempt. "Build the whole app" in one pass — the front is wider than the window, and the residue is a scattering of "almosts". Expecting a feature from a single prompt with no verification cycle is a separate anti-pattern, covered in its own section.
  • "While you're at it." Every incidental "and also fix X" smears the diff and pushes verification out. What's noticed goes to the list, not into the pass.
  • A feature without a finale. Implemented but not verified and not recorded — the pass doesn't count: the next session starts with an excavation.
  • Breadth instead of depth. Starting three items "in parallel" is the same one-shot in miniature: it ends with zero finished.
  • Incidental refactoring. Rewriting neighboring code inside the pass mixes two changes into one diff — and the feature's verification with the refactoring's.

Known uses

  • Anthropic's harness for long-running agents — the primary source: without the constraint "the agent tended to try to do too much at once — essentially to attempt to one-shot the app"; the "choose a single feature to work on" rule, together with the session ritual.
  • Superpowers — the same frame at the task level: the plan is sliced into 2–5 minute tasks, each implemented by a separate subagent with a fresh window.
  • Matt Pocock's skills — tracer-bullet tickets: the work is sliced into tickets with blocking edges, and /implement drives exactly one ticket at a time.
  • Kanban WIP limits — the pre-agent lineage: limiting work-in-progress as the way to force a system to finish rather than start.
  • Feature List — supplies the queue: the pass takes the next failing item and returns a verified status.
  • Feedback Loop — defines "finished": the pass's finale is a green check, not a volume of code.
  • Progress Journal — receives the incidental findings and records the pass's finale for the next session.
  • Four Phases — the same completeness principle at the scale of one task: the pass ends with a commit, not an "almost".

results matching ""

    No results matching ""