incremental-implementation

$npx mdskill add TerminalSkills/skills/incremental-implementation

Deliver 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

More from TerminalSkills/skills