Incremental Implementation
Addy OsmaniCommunityCreated by Addy Osmani
- Skill
- Guidelines
- Software development
- MIT
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
Incremental Implementation provides a structured execution strategy for software development. By focusing on thin vertical slices, developers and AI agents can ensure that every change is testable, compilable, and logically isolated. This methodology emphasizes simplicity, strict scope discipline, and continuous verification to prevent the accumulation of bugs and technical debt. It encourages developers to avoid premature abstractions, maintain a clean commit history, and use feature flags to manage incomplete work, ultimately making large features manageable and rollbacks straightforward.
What it does
- Defines a cycle of implementing, testing, verifying, and committing small code slices.
- Provides strategies for vertical, contract-first, and risk-first slicing of tasks.
- Enforces strict scope discipline to prevent unnecessary refactoring or feature creep.
- Requires that the codebase remains in a compilable and test-passing state after every increment.
- Offers a checklist for verifying build, test, and linting status after each change.
- Identifies common red flags and rationalizations to avoid during the development process.
When to use it
- When implementing multi-file changes or complex features.
- When refactoring existing codebases.
- When a task feels too large to be completed in a single step.
- When you are tempted to write more than 100 lines of code before running tests.
- When working on features that require parallel development between frontend and backend.
Advantages
- Reduces the difficulty of debugging by isolating changes.
- Ensures the system remains in a working state throughout the development process.
- Makes rollbacks easier by keeping commits small and focused.
- Prevents the accumulation of hidden bugs through continuous testing.
- Encourages simpler, more maintainable code by discouraging premature abstractions.
Usage examples
- “We need to implement the user authentication module. Let's start with the database schema and the login API endpoint. Do not touch the frontend yet.”
- The agent will focus exclusively on the backend schema and API, verify them with tests, and commit the changes before moving to the next slice.
- “I am working on a large refactor. How should I approach this to ensure I don't break the build?”
- The agent will guide you to break the refactor into small, logical increments, verifying the build and tests after each individual change.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/addyosmani/incremental-implementation/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip incremental-implementation.zip -d .agents/skills
Documentation by Addy Osmani
Incremental Implementation
Overview
Build in thin vertical slices — implement one piece, test it, verify it, then expand. Avoid implementing an entire feature in one pass. Each increment should leave the system in a working, testable state. This is the execution discipline that makes large features manageable.
When to Use
Implementing any multi-file change
Building a new feature from a task breakdown
Refactoring existing code
Any time you're tempted to write more than ~100 lines before testing
When NOT to use: Single-file, single-function changes where the scope is already minimal.
The Increment Cycle
┌──────────────────────────────────────┐
│ │
│ Implement ──→ Test ──→ Verify ──┐ │
│ ▲ │ │
│ └───── Commit ◄─────────────┘ │
│ │ │
│ ▼ │
│ Next slice │
│ │
└──────────────────────────────────────┘For each slice:
Implement the smallest complete piece of functionality
Test — run the test suite (or write a test if none exists)
Verify — confirm the slice works as expected (tests pass, build succeeds, manual check)
Commit -- save your progress with a descriptive message (see
git-workflow-and-versioningfor atomic commit guidance)Move to the next slice — carry forward, don't restart
Slicing Strategies
Vertical Slices (Preferred)
Build one complete path through the stack:
Slice 1: Create a task (DB + API + basic UI)
→ Tests pass, user can create a task via the UI
Slice 2: List tasks (query + API + UI)
→ Tests pass, user can see their tasks
Slice 3: Edit a task (update + API + UI)
→ Tests pass, user can modify tasks
Slice 4: Delete a task (delete + API + UI + confirmation)
→ Tests pass, full CRUD completeEach slice delivers working end-to-end functionality.
Contract-First Slicing
When backend and frontend need to develop in parallel:
Slice 0: Define the API contract (types, interfaces, OpenAPI spec)
Slice 1a: Implement backend against the contract + API tests
Slice 1b: Implement frontend against mock data matching the contract
Slice 2: Integrate and test end-to-endRisk-First Slicing
Tackle the riskiest or most uncertain piece first:
Slice 1: Prove the WebSocket connection works (highest risk)
Slice 2: Build real-time task updates on the proven connection
Slice 3: Add offline support and reconnectionIf Slice 1 fails, you discover it before investing in Slices 2 and 3.
Implementation Rules
Rule 0: Simplicity First
Before writing any code, ask: "What is the simplest thing that could work?"
After writing code, review it against these checks:
Can this be done in fewer lines?
Are these abstractions earning their complexity?
Would a staff engineer look at this and say "why didn't you just..."?
Am I building for hypothetical future requirements, or the current task?
SIMPLICITY CHECK:
✗ Generic EventBus with middleware pipeline for one notification
✓ Simple function call
✗ Abstract factory pattern for two similar components
✓ Two straightforward components with shared utilities
✗ Config-driven form builder for three forms
✓ Three form componentsThree similar lines of code is better than a premature abstraction. Implement the naive, obviously-correct version first. Optimize only after correctness is proven with tests.
Rule 0.5: Scope Discipline
Touch only what the task requires.
Do NOT:
"Clean up" code adjacent to your change
Refactor imports in files you're not modifying
Remove comments you don't fully understand
Add features not in the spec because they "seem useful"
Modernize syntax in files you're only reading
If you notice something worth improving outside your task scope, note it — don't fix it:
NOTICED BUT NOT TOUCHING:
- src/utils/format.ts has an unused import (unrelated to this task)
- The auth middleware could use better error messages (separate task)
→ Want me to create tasks for these?Rule 1: One Thing at a Time
Each increment changes one logical thing. Don't mix concerns:
Bad: One commit that adds a new component, refactors an existing one, and updates the build config.
Good: Three separate commits — one for each change.
Rule 2: Keep It Compilable
After each increment, the project must build and existing tests must pass. Don't leave the codebase in a broken state between slices.
Rule 3: Feature Flags for Incomplete Features
If a feature isn't ready for users but you need to merge increments:
// Feature flag for work-in-progress
const ENABLE_TASK_SHARING = process.env.FEATURE_TASK_SHARING === 'true';
if (ENABLE_TASK_SHARING) {
// New sharing UI
}This lets you merge small increments to the main branch without exposing incomplete work.
Rule 4: Safe Defaults
New code should default to safe, conservative behavior:
// Safe: disabled by default, opt-in
export function createTask(data: TaskInput, options?: { notify?: boolean }) {
const shouldNotify = options?.notify ?? false;
// ...
}Rule 5: Rollback-Friendly
Each increment should be independently revertable:
Additive changes (new files, new functions) are easy to revert
Modifications to existing code should be minimal and focused
Database migrations should have corresponding rollback migrations
Avoid deleting something in one commit and replacing it in the same commit — separate them
Working with Agents
When directing an agent to implement incrementally:
"Let's implement Task 3 from the plan.
Start with just the database schema change and the API endpoint.
Don't touch the UI yet — we'll do that in the next increment.
After implementing, run the repository's test and build commands to
verify nothing is broken."Be explicit about what's in scope and what's NOT in scope for each increment.
Increment Checklist
After each increment, verify with the repository's own commands (see the test-driven-development skill's Discover the Stack First section):
[ ] The change does one thing and does it completely
[ ] All existing tests still pass (the repository's test command:
npm test,./gradlew test,pytest, ...)[ ] The build succeeds (the repository's build command)
[ ] Type checking passes, where the stack has one (
npx tsc --noEmit,mypy, ...)[ ] Linting passes (the repository's lint command)
[ ] The new functionality works as expected
[ ] The change is committed with a descriptive message
Note: Run each verification command after a change that could affect it. After a successful run, don't repeat the same command unless the code has changed since — re-running on unchanged code adds no information.
Common Rationalizations
| Rationalization | Reality |
|---|---|
| "I'll test it all at the end" | Bugs compound. A bug in Slice 1 makes Slices 2-5 wrong. Test each slice. |
| "It's faster to do it all at once" | It feels faster until something breaks and you can't find which of 500 changed lines caused it. |
| "These changes are too small to commit separately" | Small commits are free. Large commits hide bugs and make rollbacks painful. |
| "I'll add the feature flag later" | If the feature isn't complete, it shouldn't be user-visible. Add the flag now. |
| "This refactor is small enough to include" | Refactors mixed with features make both harder to review and debug. Separate them. |
| "Let me run the build command again just to be sure" | After a successful run, repeating the same command adds nothing unless the code has changed since. Run it again after subsequent edits, not as reassurance. |
Red Flags
More than 100 lines of code written without running tests
Multiple unrelated changes in a single increment
"Let me just quickly add this too" scope expansion
Skipping the test/verify step to move faster
Build or tests broken between increments
Large uncommitted changes accumulating
Building abstractions before the third use case demands it
Touching files outside the task scope "while I'm here"
Creating new utility files for one-time operations
Running the same build/test command twice in a row without any intervening code change
Verification
After completing all increments for a task:
[ ] Each increment was individually tested and committed
[ ] The full test suite passes
[ ] The build is clean
[ ] The feature works end-to-end as specified
[ ] No uncommitted changes remain
See Also
Per-increment verification is the local check. Before declaring a task done, apply the project-wide Definition of Done as the final gate, the standing bar every increment clears regardless of the task. See ../../references/definition-of-done.md.
Files
- ATTRIBUTION.mdAdded by AutoGineer893 B
- LICENSELicence file added by AutoGineer1.0 KiB
- SKILL.md9.4 KiB
ATTRIBUTION.md
Attribution
This folder is an unmodified copy of the Agent Skill "incremental-implementation", distributed by AutoGineer (https://autogineer.com/agent-skills).
Commit: 301b02b12bff98e4688e6984af6556802322bbde
Created by: Addy Osmani (https://github.com/addyosmani)
Publisher: Addy Osmani (https://github.com/addyosmani)
Licence: MIT License (https://github.com/addyosmani/agent-skills/blob/301b02b12bff98e4688e6984af6556802322bbde/LICENSE)
Licence evidence: repository licence LICENSE
Retrieved: 2026-11-07
The skill's own files are unmodified copies. AutoGineer is not affiliated with or endorsed by the author or the publisher.
Files added by AutoGineer
ATTRIBUTION.md: this file, written by AutoGineer
LICENSE: copied from LICENSE
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs Node.js
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- Addy Osmani
- Publisher
- Addy Osmani (Community)
- Source
- addyosmani/agent-skills · skills/incremental-implementation · commit 301b02b
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Addy Osmani or Addy Osmani.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download incremental-implementation.zip