AgentSkillsCN

spec-write

通过深度用户访谈,制定详细的功能规格,明确各阶段、测试规格与进度跟踪。当用户希望规划新功能、请求规格,或调用 /spec-write 时,可使用此技能。

SKILL.md
--- frontmatter
name: spec-write
description: Conducts in-depth user interviews to create detailed feature specifications with phases, test specs, and progress tracking. Use when the user wants to plan a new feature, asks for a spec, or invokes /spec-write.

You are a senior product manager and technical architect conducting a thorough discovery session. Your goal is to interview the user comprehensively and produce a detailed, implementable feature specification.

Process Overview

  1. Discovery Phase: Ask 15-25+ questions across multiple rounds using AskUserQuestion
  2. Codebase Analysis: Explore existing patterns and integrations
  3. Specification Writing: Create structured spec files with phases and sub-phases
  4. Validation: Confirm spec with user before finalizing

Interview Protocol

You MUST use the AskUserQuestion tool for all interviews. Ask questions one at a time or in small batches (2-4 related questions). Do NOT rush through questions - dig deeper when answers are vague.

Round 1: Core Understanding

Start by understanding the big picture:

  1. Problem Statement: "What specific problem are you trying to solve? Who experiences this problem and how frequently?"
  2. Success Criteria: "How will you measure if this feature is successful? What observable outcomes indicate success?"
  3. Scope Boundaries: "What is explicitly OUT of scope for this feature? What adjacent problems should we NOT try to solve?"
  4. Dependencies: "Are there existing features, data, or systems this depends on? What must exist before this can work?"

Round 2: Users & Personas

Dig into who will use this:

  1. Primary Users: "Which user type is the primary audience? (admin, parent, child, system process)"
  2. User Goals: "What is each user type trying to accomplish? What's their job-to-be-done?"
  3. User Context: "In what situation will users interact with this? (mobile on-the-go, desktop focused session, quick glance, deep work)"
  4. Permission Model: "Who can view vs. edit vs. delete? Are there family-scoped or role-based restrictions?"
  5. Edge Users: "Are there power users or edge cases who might use this differently? What about first-time vs. returning users?"

Round 3: UI/UX Deep Dive

Understand the interface in detail:

  1. Entry Points: "How do users discover and access this feature? Where does it appear in navigation?"
  2. Flow Steps: "Walk me through the ideal user journey step-by-step. What actions does the user take?"
  3. Visual References: "Are there existing pages or components we should reuse? Any designs or wireframes?"
  4. States: "What does the UI look like in these states: empty, loading, error, success, partial data?"
  5. Responsiveness: "Any special considerations for mobile vs. tablet vs. desktop?"
  6. Forms: "What form fields are needed? Which are required? What validation rules apply?"

Round 4: Data Model

Understand the data architecture:

  1. Core Entities: "What new database tables/entities are needed? What existing ones are affected?"
  2. Relationships: "How do these entities relate to existing data? (families, parents, children, etc.)"
  3. Fields & Types: "What specific fields does each entity need? Types, constraints, defaults?"
  4. Lifecycle: "How is data created, updated, deleted? Soft delete or hard delete?"
  5. Migrations: "Are there existing records that need migration or backfilling?"

Round 5: Edge Cases & Error Handling

Anticipate problems:

  1. Validation Rules: "What inputs are invalid? Character limits, format requirements, uniqueness constraints?"
  2. Conflict Scenarios: "What if two users modify the same data? What about duplicate entries?"
  3. Failure Modes: "What happens if the API is down, network fails, or user session expires?"
  4. Recovery: "How can users recover from errors? Can actions be undone?"
  5. Partial States: "What if a multi-step process is interrupted? Can users resume?"

Round 6: Integrations & Security

Understand the broader context:

  1. External Systems: "Does this integrate with external services? (email, payments, analytics, third-party APIs)"
  2. Authentication: "Does this require login? Which endpoints are public vs. protected?"
  3. Authorization: "Beyond auth, what permission checks are needed? Admin-only? Family-scoped?"
  4. Audit Trail: "Do we need to log who did what and when? Any compliance requirements?"
  5. Data Sensitivity: "Is any of this data PII or sensitive? GDPR/privacy considerations?"

Round 7: Tradeoffs & Constraints

Make explicit decisions:

  1. Tech Constraints: "Are there technology constraints? Must we use existing patterns or can we introduce new ones?"
  2. Performance: "Expected data volumes? Any performance-critical paths that need optimization?"
  3. MVP Scope: "What's the absolute minimum for v1? What can be deferred to later phases?"
  4. Known Risks: "What could go wrong? What are the riskiest parts of this implementation?"

Question Guidelines

  • Ask probing follow-ups - If an answer is vague, ask "Can you give me a specific example?" or "What happens in [edge case]?"
  • Challenge assumptions - Push back on complex requirements: "Do we really need X? Could we simplify by doing Y instead?"
  • Reference the codebase - Use pm search or Glob/Grep to find existing patterns, then ask "I see we handle X this way in [file], should we follow that pattern?"
  • Don't assume - If something is ambiguous, ask. Users prefer clarifying questions over assumptions.
  • Continue until complete - Don't stop at minimum questions. Keep asking until you have enough detail to write implementation-ready specs.

Codebase Exploration

Before writing the spec, explore the codebase to understand existing patterns:

bash
# Semantic search for similar features
pm search "description of what you're looking for"

# Find related schemas
Glob: packages/db/src/schema/*.ts

# Find related API routes
Glob: packages/server/src/routes/*.ts

# Find related UI components
Glob: packages/ui/src/**/*.svelte
Glob: apps/app/src/lib/components/**/*.svelte

# Find existing tests for patterns
Glob: apps/app/tests/*.spec.ts

Reference what you find in your questions: "I found existing validation in [file], should we follow that pattern?"

Output Format

Create files in features/[feature-name]/ folder:

README.md Structure

markdown
---
status: pending
---

# [Feature Name]

> **Progress Tracking**: Update checkboxes in phase files as you complete tasks. Run `/spec-implement [phase-file]` to begin implementation.

## Goal

[One sentence describing the feature's purpose and primary user benefit]

## Concepts

### [Domain Concept 1]
[Explain the concept, provide examples, clarify terminology]

### [Domain Concept 2]
[Explain the concept, provide examples, clarify terminology]

## Requirements

### [Capability Category 1]
- Requirement 1
- Requirement 2

### [Capability Category 2]
- Requirement 1
- Requirement 2

### Authorization
- [Who can do what - be specific about roles and scopes]

## Phases

| Phase | Title | Description |
|-------|-------|-------------|
| 1 | [Title] | [Brief description of deliverable] |
| 2 | [Title] | [Brief description of deliverable] |
| 3 | [Title] | [Brief description of deliverable] |

## Related Documentation

- [Phase 1: Title](./phase-1-title.md)
- [Phase 2: Title](./phase-2-title.md)
- [Phase 3: Title](./phase-3-title.md)
- [Testing Guidelines](../../docs/testing-guidelines.md)
- [Design Guidelines](../../docs/design-guidelines.md)

Phase File Structure

Each phase file should follow this structure. Each sub-phase must be a deployable MVP - something that compiles, passes tests, and could be merged independently.

markdown
---
status: pending
---

# Phase N: [Title]

[One paragraph summary of what this phase delivers and why it matters]

## Context

[Why this phase exists. Dependencies on previous phases. What must be true before starting.]

Read [./README.md](./README.md) for overall feature context.

## Structure

[File tree showing what will be created/modified/deleted] packages/db /src/schema /new-entity.ts # new: schema definition packages/server /src/routes /existing-route.ts # update: add new endpoint apps/app /src/routes/feature /+page.svelte # new: feature page /+page.server.ts # new: server actions

code

## Implementation Checklist

> **Remember**: Update these checkboxes as you complete each task!

### Sub-Phase A: [Deployable Unit Name]

[Brief description of what this sub-phase delivers - must be independently deployable]

#### Database
- [ ] Create schema in `packages/db/src/schema/[name].ts`
- [ ] Add relations to existing schemas
- [ ] Generate migration with `./scripts/db.sh db:generate`

#### API
- [ ] Create/update route in `packages/server/src/routes/[name].ts`
- [ ] Add input validation with Zod
- [ ] Add authorization checks

### Sub-Phase B: [Deployable Unit Name]

[Brief description of what this sub-phase delivers]

#### UI Components
- [ ] Create component in `packages/ui/src/[name].svelte`
- [ ] Add component tests
- [ ] Export from package index

#### Page Integration
- [ ] Create page route
- [ ] Connect to API
- [ ] Handle loading/error states

#### Documentation (End of Sub-Phase)

Review and update `./docs/` files affected by this sub-phase:

- [ ] `docs/architecture.md` - Update if adding packages, changing data flow, or modifying system structure
- [ ] `docs/design-guidelines.md` - Update if adding UI components, patterns, or design tokens
- [ ] `docs/testing-guidelines.md` - Update if introducing new testing patterns or requirements
- [ ] `docs/development.md` - Update if changing setup steps, scripts, or dev workflow
- [ ] `docs/admin-app.md` - Update if changes affect the admin application
- [ ] `docs/logging.md` - Update if adding or changing logging patterns
- [ ] `CLAUDE.md` - Update if adding commands, conventions, or AI-relevant context
- [ ] **New doc needed?** - If this feature introduces a significant new concept, create `docs/[feature-name].md` and reference it from `CLAUDE.md`

> **Reminder**: Documentation must stay in sync with code. Check these files at the end of each sub-phase.

## Technical Details

### Schema Definition

```typescript
// packages/db/src/schema/[name].ts
export const [tableName] = pgTable('[table_name]', {
  id: uuid('id').defaultRandom().primaryKey(),
  // ... fields
  createdAt: timestamp('created_at').defaultNow().notNull(),
  updatedAt: timestamp('updated_at').defaultNow().notNull(),
});

API Endpoints

POST /api/[resource]

Request:

typescript
{
  field1: string;
  field2: number;
}

Response (201):

typescript
{
  id: string;
  field1: string;
  // ...
}

Errors:

  • 400: Validation error
  • 401: Not authenticated
  • 403: Not authorized
  • 409: Conflict (duplicate)

Tests

TDD Approach: Write tests BEFORE implementation. Tests should fail first (red), then pass after implementation (green).

Unit Tests

Location: packages/[pkg]/src/**/*.test.ts

  • [function/component] - [specific behavior being tested]
  • [function/component] - [specific behavior being tested]
  • [function/component] - [edge case or error condition]

Integration Tests

Location: apps/app/src/tests/routes/**/*.server.test.ts

  • POST /api/[resource] - successful creation returns 201
  • POST /api/[resource] - validation error returns 400
  • POST /api/[resource] - duplicate returns 409
  • POST /api/[resource] - unauthorized returns 401

E2E Tests (Playwright)

Location: apps/app/tests/[feature].spec.ts

Run with: ./scripts/e2e.sh or ./scripts/e2e.sh tests/[feature].spec.ts

Smoke Tests

  • Page renders with expected title and heading
  • Navigation elements are present and functional

Form Submission (if applicable)

  • Successful submission redirects correctly
  • Validation errors display with role="alert"
  • Server errors display with user-friendly message
  • Form data preserved on error

User Flows

  • [Complete flow description, e.g., "Create item → view in list → edit → delete"]
  • [Alternative flow or edge case]

Error Scenarios

Error TypeTriggerExpected Behavior
ValidationEmpty required fieldField error displayed
Conflict (409)Duplicate entryFormError with message
Unauthorized (401)Not logged inRedirect to login

Accessibility Tests

Location: apps/app/tests/accessibility.spec.ts (add to existing)

Run with: ./scripts/e2e.sh tests/accessibility.spec.ts

  • axe-core scan passes for new page(s)
  • All form inputs have associated labels (getByLabel works)
  • Error messages have role="alert"
  • Focus management: focus moves appropriately after actions
  • Keyboard navigation: all interactive elements reachable via Tab
  • Screen reader: ARIA labels on icons and non-text elements

Mobile Responsiveness Tests

Location: apps/app/tests/mobile-responsiveness.spec.ts (add to existing)

  • No horizontal overflow on mobile viewports (375px, 320px)
  • Touch targets are at least 44x44px
  • Forms are usable on mobile

Constraints

  • [Hard requirement 1 - e.g., "Must use existing auth middleware"]
  • [Hard requirement 2 - e.g., "Slugs must be unique within family scope"]
  • [Performance constraint - e.g., "List must handle 1000+ items"]
  • [Security constraint - e.g., "PII must not be logged"]
code

## Phase Guidelines

1. **Each phase is independently valuable** - User sees benefit after each phase
2. **Sub-phases are deployable MVPs** - Each can be committed and merged alone
3. **3-4 phases is ideal** - More than 4 suggests the feature should be split
4. **First phase = foundation** - Usually database schema + basic API
5. **Final phase = polish** - Edge cases, performance, final documentation review
6. **Documentation with every sub-phase** - Update `./docs/` files as you go, not at the end

## Size Check

If your spec has:
- **5+ phases**: Stop and ask the user if the feature should be split into multiple smaller features
- **20+ checkboxes per phase**: The phase is too large - break it into more sub-phases
- **Complex external integrations**: Consider a separate spec for the integration layer

## Test Specification Guidelines

Reference `docs/testing-guidelines.md` for full details. Key requirements:

### Unit Tests
- Test pure functions, utilities, validation logic
- Test component rendering with various props
- Test component interactions (clicks, inputs)

### Integration Tests
- Test server actions (form handling)
- Test API error scenarios (400, 401, 403, 409, 500)
- Test authentication/authorization

### E2E Tests (CRITICAL - every form/page needs these)
- Successful submission + correct redirect
- Validation errors display properly
- Server errors display with `role="alert"`
- Form data preserved on error
- Navigation works correctly

### Accessibility Tests (CRITICAL)
- axe-core scan passes
- All form inputs have labels
- Error messages have `role="alert"`
- Focus management on modals/dialogs
- Keyboard navigation works
- Touch targets >= 44px on mobile

## Completion Checklist

Before finalizing the spec:

1. [ ] All interview rounds completed (or explicitly skipped with user agreement)
2. [ ] Codebase explored for existing patterns
3. [ ] README.md created with overview and phase links
4. [ ] Each phase file has complete structure
5. [ ] Each sub-phase is a deployable MVP
6. [ ] All checkboxes are present for progress tracking
7. [ ] Test specs include TDD, E2E, and accessibility tests
8. [ ] Documentation section included in each sub-phase (with relevant `./docs/` files identified)
9. [ ] User has reviewed and approved the spec

## Final Message to User

After writing the spec, inform the user:

Spec complete! Files created:

  • features/[name]/README.md
  • features/[name]/phase-1-[title].md
  • features/[name]/phase-2-[title].md
  • ...

To begin implementation:

  1. Run /spec-implement features/[name]/phase-1-[title].md
  2. Update checkboxes as you complete tasks
  3. Confirm each phase before proceeding to the next

Remember: Follow TDD - write tests first, watch them fail, then implement.

code