| name | implement-feature |
| icon | lucide:blocks |
| labels | ["Engineering"] |
| description | Use this skill whenever you add new behaviour a user or caller can see — a feature, screen, field, route, endpoint, flag, setting, or capability. It is the senior-engineer method: understand the real intent, feel the current product, reuse what already exists before adding anything, ship a thin vertical slice, and prove it works. Load it the moment a task says "add", "build", "support", "create", "implement", or "let users…", or whenever you're about to write code that resembles something the project may already do. Never start a feature without it. For a behaviour-preserving change use make-improvement; for a defect use fix-bug. |
implement-feature
New behaviour, fully integrated — not a prototype. The two expensive mistakes here are building the
wrong thing and building a second copy of something that already exists in a different shape. So
you earn the right to write code by first understanding the intent and feeling the ground you stand
on. For a structural or performance change that keeps behaviour the same, use make-improvement; for
a defect, fix-bug; for the tests, test-code; to open the PR, create-pr.
When this applies
Any task that adds behaviour a user or caller can see — a screen, a field, a route, an endpoint, a
setting, a capability. Skip the ceremony only for a one-line change in a place you already know.
Write a note first
Invoke write-notes and answer this form before you implement:
- Intent: Describe exactly what a user or caller will be able to do that they can't today — and what stays the same.
- Status quo: Describe how the area behaves now and how it's built — which files/components own it, and what you saw when you ran or read it.
- Reuse: Describe the existing concept you'll build on (name the component / hook / util / endpoint and its path) and how you'll extend or compose it. If you're adding new, explain what you searched for and why nothing fit.
- Approach: Describe the thinnest end-to-end slice (data → logic → UI) and how it wires into the code already there.
- Ripple: For each area a change of this shape can touch (tests, migration, docs, i18n, a11y), describe what this one requires.
- Risks & unknowns: Where are you least confident? Describe the assumption that, if wrong, would break this — and how you'd catch it before it bites.
Gate A — before you write code
The senior move is to slow down here. Tick every box, or N/A with a reason — an unticked box means
not done.
Build the vertical slice
- Thinnest end-to-end slice first. Make the intent work all the way through — data → logic → UI —
before widening. Avoid gold-plating and speculative generality; build what was asked, well.
- Match the neighbours exactly. Mirror the structure, naming, and error handling of the files
you're in. Code that looks like it was always there is the goal.
- Validate at every boundary. Treat all external input (requests, params, payloads, files) as
adversarial; parse and reject at the edge.
Gate B — before you call it done
Tick every box, or N/A with a reason — an unticked box means not done.
Then take it to a clean PR with create-pr.
Patterns
- Thin slice over big bang. Five small integrated commits that each keep the suite green beat one
thousand-line drop nobody can review or revert.
- The reuse miss you can't see is the costly one. About to name a new component
XList/XGrid/XPicker? Stop — search-codebase first; the project almost certainly already has
the concept.