workflow v1.0.0 · Updated Apr 17, 2026 · by Justin Adams

Story-Driven Development

Requires Claude Code to find a story with acceptance criteria before writing any feature code — and to convert each AC into a failing test before implementation.

Claude Code Cursor
$ curl -fsSL https://www.cendis.ai/library/skill/story-driven-dev/install | sh

What it does

Forbids the agent from inventing requirements. Before any feature work begins, the agent looks for an existing story file (with explicit acceptance criteria), confirms ambiguities with the human, and then turns each acceptance criterion into a failing test before writing implementation code.

When to use it

  • In teams that already write user stories or PRDs
  • When the agent is operating semi-autonomously and might otherwise scope-creep into “improvements”
  • When a non-technical product owner needs to verify the agent built what was asked
  • For greenfield projects where you want to enforce spec-first culture from day one

How it works

Add to your CLAUDE.md:

## Story-Driven Development

Before starting any feature work:

1. Check `{{stories_dir}}/` for an existing story or acceptance criteria
2. If criteria are ambiguous, ask before coding — do not invent requirements
3. If no story exists for the requested work, flag it — do not proceed with assumptions
4. Implementation must satisfy all acceptance criteria in the story
5. For ATDD: convert each AC into a failing test before implementation begins

Configure for your stack

Replace {{stories_dir}} with your project’s story location:

  • docs/stories/ (markdown files, one per story)
  • linear://team/issues/ (link to Linear via MCP)
  • .github/ISSUE_TEMPLATE/ (GitHub Issues with AC sections)
  • notion:// (Notion via MCP)

Example story format

# Story: Member can be removed by admin

linear: TEAM-115
status: in-progress

## Acceptance Criteria

- [ ] Admin sees a "Remove" button next to each member in the org settings page
- [ ] Clicking "Remove" opens a confirmation modal showing the member's name
- [ ] Confirming removal calls DELETE /api/orgs/:orgId/members/:userId
- [ ] On success, the member is removed from the list without page reload
- [ ] On error, an inline error message is shown without removing the member
- [ ] A non-admin viewing the page does not see the Remove button at all
- [ ] The removed member loses access immediately (cannot use existing JWT)

## Dev Notes

- RLS policy on org_members must enforce admin-only deletion
- Cascade delete role_assignments on member removal
- Add audit log entry: action=member_removed

The agent reads this story, generates 7 failing tests (one per checkbox), commits them, then implements until all are green.

Why it matters

Without a story, the agent decides what to build based on ambient context — and that decision is often subtly wrong. A non-technical reviewer can’t catch the difference between “what was built” and “what was asked.” A story file makes the contract explicit and reviewable in plain English. ATDD then makes the test suite the authoritative interpretation of that contract.