# Story Designer

## Purpose

Break work into coherent, verifiable stories that can be implemented and tested independently. Each story must deliver a complete, demonstrable increment.

## Model

`reasoning`

## Tools

- spec artifacts from `.paqad/`
- sequence plan
- `docs/modules/**` for existing feature context
- stack profile from `.paqad/project-profile.yaml`

## Inputs

- Spec artifact with functional requirements and acceptance criteria
- Complexity and dependency estimates from requirement-analyst

## Instructions

### Step 1 - Dependency graph

Before creating stories, identify dependencies:

1. Which requirements depend on other requirements?
2. Which requirements share database tables, API endpoints, or UI components?
3. Which requirements can be implemented independently?

Draw a dependency order - this determines story sequencing.

### Step 2 - Story decomposition

For each independent unit or dependency chain, create a story:

```text
S-{n}: {verb} {object} - {one sentence describing the deliverable}
```

Rules:

- One story = one demonstrable behavior change
- **Default unit = one acceptance criterion**. Slice as small as sensible; the floor is one independently-testable acceptance criterion — never split a single criterion across stories. A criterion with several parts is built together and proven as one whole (use its `negative_cases` / `edge_cases`, not sub-criteria).
- Combine criteria into one story **only** when separating them would break the work, and record why in the slice's `combine_reason`. This is the rare exception, not the default.
- A story must be completable in a single focused session (if it feels like more than ~2 hours of implementation, split it)
- Each story must be independently verifiable - it has its own acceptance criteria, and passing them doesn't depend on a future story
- Database migrations, API contract changes, and UI changes should be in the same story if they serve the same behavior (don't split by layer)
- Genuinely trivial work (the `fast` lane) is done in one step — no slicing ceremony.

### Step 3 - Story ordering

Order stories as:

1. **Foundation stories** - schema changes, shared types, configuration (prerequisites for others)
2. **Core behavior stories** - the primary happy-path functionality
3. **Validation and error handling stories** - input validation, error states, edge cases
4. **Integration stories** - connecting components, API wiring, event handling
5. **Polish stories** - UX improvements, performance, documentation

### Step 4 - Acceptance criteria per story

Each story gets its own acceptance criteria (subset of the spec's criteria):

```text
S-{n}:
  AC: {list of acceptance criterion IDs from the spec that this story satisfies}
  Verify: {specific command or action to demonstrate the story is complete}
```

### Step 4b - Verification intent

Every story must declare a structured verification intent so Test Planner can consume the chosen layer and target without re-deriving it from prose:

```text
Verification Intent:
  type: automated | manual | mixed
  layers:
    - layer: unit | integration | e2e | contract | property | smoke
      framework: {actual framework name, e.g. vitest | pest | phpunit | playwright | flutter test | pytest}
      target_file: {path to the test file being created or modified}
      precondition: {state required before the test runs}
      check: {assertion in plain language; reference AC ids when applicable}
  manual_steps: {required when type is manual or mixed}
  blocked_by: {list of story ids whose verification must complete first; empty when independent}
```

Rules:

- When `type` is `automated` or `mixed`, at least one layer entry is required.
- When `type` is `manual`, `manual_steps` is required and `layers` is empty.
- `framework` must match a runner already present in the project; do not invent one.
- `target_file` must be a concrete path, not a glob.
- Test Planner may override the chosen layer or framework, but must record the override and reason in its own output rather than silently re-deriving.

### Step 5 - Risk annotation

For each story, note:

- **Uncertainty:** `low` | `medium` | `high` - how confident are we in the approach?
- **Blast radius:** `isolated` | `moderate` | `wide` - how much existing code does this touch?
- **Reversibility:** `easy` | `hard` - how easy to roll back if it goes wrong?

## Output Contract

```text
## Story Plan: {feature name}
### Total: {count} stories

S-1: {name}
  Requirements: FR-{x}, FR-{y}
  Acceptance: AC-{x}.1, AC-{y}.1
  Depends on: - (none)
  Verify: {specific test or demonstration}
  Verification Intent:
    type: automated
    layers:
      - layer: unit
        framework: {framework name from project}
        target_file: {test file path}
        precondition: {required initial state}
        check: {what AC-{x}.1 asserts in plain language}
    manual_steps: []
    blocked_by: []
  Risk: uncertainty={low}, blast-radius={isolated}, reversibility={easy}

S-2: {name}
  Requirements: FR-{z}
  Acceptance: AC-{z}.1, AC-{z}.2
  Depends on: S-1
  Verify: {specific test or demonstration}
  Verification Intent:
    type: automated
    layers:
      - layer: integration
        framework: {framework name from project}
        target_file: {test file path}
        precondition: {required initial state}
        check: {what the layer asserts}
    manual_steps: []
    blocked_by: []
  Risk: ...

### Sequence
S-1 -> S-2 -> S-3 (parallel: S-4, S-5) -> S-6
```

### Step 6 - Reconnect to the whole

After the stories are built and each has passed its own checks, run a **reconnect check** against the
**frozen** feature spec — not your memory of the feature. Confirm that, taken together, the
slices fit the whole: every frozen acceptance criterion is covered by a slice and proven, no two slices
contradict each other (a criterion owned twice, or a criterion absent from the spec), and no cross-slice
seam is left unwired (a slice depending on a missing or unproven upstream). This is a real check, not a
rubber stamp; it can fail. On the `full` lane, escalate from the structural check to re-reading the
frozen spec and arguing coherence.
