incremental-implementation
$
npx mdskill add TerminalSkills/skills/incremental-implementationDeliver working code in testable vertical slices.
- Prevents large features from failing in one pass.
- Requires no external tools or API integrations.
- Executes by implementing, testing, verifying, and committing.
- Outputs verified code increments ready for deployment.
SKILL.md
.github/skills/incremental-implementationView on GitHub ↗
---
name: incremental-implementation
description: >-
Delivers changes incrementally in thin vertical slices. Use when implementing
any feature or change that touches more than one file, when you're about to
write a large amount of code at once, or when a task feels too big to land
in one step. Each increment leaves the system in a working, testable state.
license: MIT
compatibility: "Any AI coding agent"
metadata:
author: terminal-skills
version: "1.0.0"
category: development
tags: ["incremental", "implementation", "workflow"]
---
# 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.
## Instructions
### The Increment Cycle
For each slice:
1. **Implement** the smallest complete piece of functionality
2. **Test** — run the test suite (or write a test if none exists)
3. **Verify** — confirm the slice works (tests pass, build succeeds)
4. **Commit** — save progress with a descriptive message
5. **Move to the next slice**
### Slicing Strategies
**Vertical Slices (Preferred)** — Build one complete path through the stack:
```
Slice 1: Create a task (DB + API + basic UI) → User can create a task
Slice 2: List tasks (query + API + UI) → User can see their tasks
Slice 3: Edit a task (update + API + UI) → User can modify tasks
Slice 4: Delete a task (delete + API + UI) → Full CRUD complete
```
**Contract-First Slicing** — When backend and frontend develop in parallel:
```
Slice 0: Define API contract (types, interfaces, OpenAPI spec)
Slice 1a: Backend against the contract + API tests
Slice 1b: Frontend against mock data matching the contract
Slice 2: Integrate and test end-to-end
```
**Risk-First Slicing** — Tackle the riskiest piece first:
```
Slice 1: Prove the WebSocket connection works (highest risk)
Slice 2: Build real-time updates on the proven connection
Slice 3: Add offline support and reconnection
```
### Implementation Rules
**Simplicity First:** Before writing code, ask "What is the simplest thing that could work?"
```
✗ 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 components
```
**Scope Discipline:** Touch only what the task requires. Don't "clean up" adjacent code, refactor unrelated imports, or add features not in the spec.
```
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?
```
**One Thing at a Time:** Each increment changes one logical thing. Don't mix a new component, a refactor, and a build config change in one commit.
**Keep It Compilable:** After each increment, the project must build and existing tests must pass.
**Feature Flags for Incomplete Features:**
```typescript
const ENABLE_TASK_SHARING = process.env.FEATURE_TASK_SHARING === 'true';
if (ENABLE_TASK_SHARING) {
// New sharing UI — merged but not exposed
}
```
**Rollback-Friendly:** Each increment should be independently revertable. Prefer additive changes; keep modifications minimal and focused.
## Examples
### Directing an Agent
```
"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 `npm test` and `npm run build` to verify
nothing is broken."
```
### Increment Checklist
After each increment:
- [ ] The change does one thing and does it completely
- [ ] All existing tests still pass (`npm test`)
- [ ] The build succeeds (`npm run build`)
- [ ] Type checking passes (`npx tsc --noEmit`)
- [ ] The new functionality works as expected
- [ ] The change is committed with a descriptive message
## Guidelines
### Common Rationalizations
| Rationalization | Reality |
|---|---|
| "I'll test it all at the end" | Bugs compound. A bug in Slice 1 makes Slices 2-5 wrong |
| "It's faster to do it all at once" | Feels faster until something breaks in 500 changed lines |
| "These changes are too small to commit separately" | Small commits are free. Large commits hide bugs |
| "This refactor is small enough to include" | Refactors mixed with features make both harder to review |
### Red Flags
- More than 100 lines written without running tests
- Multiple unrelated changes in a single increment
- "Let me just quickly add this too" scope expansion
- Build or tests broken between increments
- Building abstractions before the third use case demands it
- Touching files outside the task scope "while I'm here"
### Verification
After completing all increments:
- [ ] 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