.claude/skills/prd-v06-technical-specification/SKILL.md
Define implementation contracts (APIs and data models) that developers will build against during PRD v0.6 Architecture. Triggers on requests to define APIs, design database schema, create data models, or when user asks "define APIs", "data model", "database schema", "API contracts", "technical spec", "endpoint design", "schema design". Consumes ARC- (architecture), TECH- (Build items), UJ- (flows), SCR- (screens). Outputs API- entries for endpoints and DBT- entries for data models. Feeds v0.7 Build Execution.
npx skillsauth add mattgierhart/PRD-driven-context-engineering prd-v06-technical-specificationInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Position in workflow: v0.6 Architecture Design → v0.6 Technical Specification → v0.7 Build Execution
Technical specification defines the contracts developers build against: API endpoints and data models. This is the bridge between architecture and implementation.
This skill requires prior work from v0.3-v0.6:
This skill assumes v0.6 Architecture Design is complete with ARC- entries providing system structure.
This skill creates/updates:
All API- and DBT- entries are implementation contracts (not confidence-based). They are:
Example API- entry (from UJ- and SCR-):
API-001: Create Report
Method: POST
Path: /api/reports
Purpose: Create new report from selected data source and template (implements UJ-001 Step 1)
Auth: User
Journey: UJ-001 (Step 1 - Create Report)
Screen: SCR-002 (Report Builder)
Request:
Body:
{
title: string (required) — Report name
templateId: string (required) — Selected template (FEA-008)
dataSourceId: string (required) — Connected data source (FEA-001)
options: { dateRange: { start, end }, filters: [...] }
}
Response:
Success (201):
{
data: { id, title, status: "pending|generating|ready", createdAt }
}
Errors:
- 400: Invalid input — Missing required field
- 403: Forbidden — User doesn't own data source
- 404: Not found — Template or data source not found
- 429: Rate limit exceeded
Business Rules: BR-015 (max 100 reports per user)
Data: DBT-001 (reports table), DBT-002 (data_sources table)
Example DBT- entry (referenced by API- entries):
DBT-001: Reports
Purpose: Stores user-generated reports (entities created by API-001, updated by API-004)
Table: reports
Fields:
- id: uuid — Primary key
- user_id: uuid — Report owner (FK → users) [NOT NULL]
- title: varchar(255) — Display name [NOT NULL]
- status: enum('pending','generating','ready','failed') [NOT NULL]
- created_at: timestamp [NOT NULL, DEFAULT now()]
Relationships:
- belongs_to: users via user_id
- belongs_to: templates via template_id
Indexes:
- user_id — List reports by user (API-003)
- (user_id, created_at DESC) — Recent reports (API-003)
- status — Find pending reports (background job)
Constraints:
- title: NOT NULL, length 1-255
- status: valid enum only
Business Rules: BR-015 (max 100 per user — enforce in API-001)
APIs: API-001 (create), API-002 (get), API-003 (list), API-005 (delete)
| Type | What It Defines | Example | |------|-----------------|---------| | API- | Endpoint contracts | POST /users, GET /reports/:id | | DBT- | Data model/schema | Users table, Reports table |
Rule: Every API- should know which DBT- it reads/writes. Every DBT- should know which API- accesses it.
Pull ARC- decisions — System structure and boundaries
Pull TECH- Build items — What we're implementing
Pull UJ- journeys — User flows the API must support
Pull SCR- screens — UI data requirements
Define API contracts for each endpoint:
Define data models for each entity:
Validate consistency:
API-XXX: [Endpoint Name]
Method: [GET | POST | PUT | PATCH | DELETE]
Path: [/resource/{id}/action]
Purpose: [What this endpoint does]
Auth: [Public | User | Admin | Service]
Journey: [UJ-XXX that uses this]
Screen: [SCR-XXX that calls this]
Request:
Headers:
- Authorization: Bearer <token>
- Content-Type: application/json
Params:
- id: string (required) — Resource identifier
Query:
- limit: number (optional, default 20) — Pagination limit
Body:
{
field: type — Description
}
Response:
Success (200/201):
{
data: { ... }
}
Errors:
- 400: Invalid input — [when this occurs]
- 401: Unauthorized — [when this occurs]
- 404: Not found — [when this occurs]
- 500: Server error — [when this occurs]
Business Rules: [BR-XXX enforced here]
Data: [DBT-XXX entities accessed]
Rate Limit: [requests/minute if applicable]
Example API- entry:
API-001: Create Report
Method: POST
Path: /api/reports
Purpose: Create a new report from selected data source and template
Auth: User
Journey: UJ-001 (Step 1 - Create Report)
Screen: SCR-002 (Report Builder)
Request:
Headers:
- Authorization: Bearer <token>
- Content-Type: application/json
Body:
{
title: string (required) — Report name
templateId: string (required) — Selected template
dataSourceId: string (required) — Connected data source
options: {
dateRange: { start: ISO8601, end: ISO8601 }
filters: [{ field: string, operator: string, value: any }]
}
}
Response:
Success (201):
{
data: {
id: string
title: string
status: "pending" | "generating" | "ready"
createdAt: ISO8601
}
}
Errors:
- 400: Invalid input — Missing required field or invalid templateId
- 401: Unauthorized — Invalid or expired token
- 403: Forbidden — User doesn't own data source
- 404: Not found — Template or data source not found
- 429: Too many requests — Rate limit exceeded
Business Rules: BR-015 (max 100 reports per user)
Data: DBT-001 (reports), DBT-002 (data_sources)
Rate Limit: 10 requests/minute
DBT-XXX: [Entity Name]
Purpose: [What this entity represents]
Table: [database_table_name]
Fields:
- id: uuid — Primary key, auto-generated
- [field_name]: [type] — Description [constraints]
- created_at: timestamp — Record creation (auto)
- updated_at: timestamp — Last modification (auto)
Relationships:
- belongs_to: [DBT-YYY] via [foreign_key]
- has_many: [DBT-ZZZ]
Indexes:
- [field_name] — [Query pattern it supports]
Constraints:
- [field]: [UNIQUE | NOT NULL | CHECK expression]
Business Rules: [BR-XXX that affect this entity]
APIs: [API-XXX that read/write this]
Example DBT- entry:
DBT-001: Reports
Purpose: Stores user-generated reports with configuration and status
Table: reports
Fields:
- id: uuid — Primary key
- user_id: uuid — Report owner (FK → users) [NOT NULL]
- title: varchar(255) — Display name [NOT NULL]
- template_id: uuid — Template used (FK → templates) [NOT NULL]
- data_source_id: uuid — Data source (FK → data_sources) [NOT NULL]
- status: enum('pending','generating','ready','failed') — Generation status [NOT NULL, DEFAULT 'pending']
- options: jsonb — Report configuration (date range, filters) [DEFAULT '{}']
- output_url: varchar(500) — Generated report file URL [NULL until ready]
- created_at: timestamp — [NOT NULL, DEFAULT now()]
- updated_at: timestamp — [NOT NULL, DEFAULT now()]
Relationships:
- belongs_to: DBT-010 (users) via user_id
- belongs_to: DBT-002 (templates) via template_id
- belongs_to: DBT-003 (data_sources) via data_source_id
Indexes:
- user_id — List reports by user
- (user_id, created_at DESC) — List recent reports
- status — Find pending reports for processing
Constraints:
- title: NOT NULL, length 1-255
- status: NOT NULL, valid enum value
Business Rules: BR-015 (max 100 reports per user — enforce in API)
APIs: API-001 (create), API-002 (get), API-003 (list), API-005 (delete)
| Principle | Guidance | Example |
|-----------|----------|---------|
| Resource-oriented | URLs are nouns, not verbs | /reports not /createReport |
| Consistent naming | Plural nouns, kebab-case | /data-sources not /dataSource |
| Stateless | No server-side sessions | Auth via token, not cookie session |
| Versioned | Prefix for breaking changes | /v1/reports |
| Documented errors | Clear codes and messages | { error: { code: "LIMIT_EXCEEDED", message: "..." } } |
| Principle | Guidance | Example | |-----------|----------|---------| | Normalized | Avoid redundancy (unless denormalized for performance) | User name in users table, not duplicated | | Audit trail | created_at, updated_at on all tables | Track when records change | | Soft delete | deleted_at instead of hard delete (when needed) | Recover deleted data | | Foreign keys | Enforce referential integrity | user_id → users.id | | Index strategy | Index fields in WHERE and JOIN | Filter fields, FK columns |
Use this to ensure spec completeness:
| Anti-Pattern | Signal | Fix |
|--------------|--------|-----|
| API/UI mismatch | Screen needs data not in any API | Add API- or modify existing |
| Schema sprawl | 50+ tables for MVP | Consolidate; YAGNI applies |
| Missing constraints | No validation, anything accepted | Add BR- enforcement |
| N+1 queries baked in | API design requires multiple calls for one view | Add compound endpoints |
| No error handling | Only happy path documented | Define all error responses |
| Vague types | data: any | Specify exact shape |
Before proceeding to Build Execution:
API- and DBT- entries feed into:
| Consumer | What It Uses | Example | |----------|--------------|---------| | v0.7 Epic Scoping | API- and DBT- define EPIC scope | EPIC-01 implements API-001–005 | | v0.7 Test Planning | API- defines test contracts | TEST-001 validates API-001 | | v0.7 Implementation Loop | API-/DBT- are implementation tasks | Code implements API-001 | | API Documentation | API- becomes OpenAPI spec | Swagger from API- entries |
references/examples.mdassets/api.mdassets/dbt.mdtools
Make technology decisions for every product capability by discovering existing assets, evaluating vendor-aligned options, and categorizing as Reuse/Extend/Build/Buy/Integrate/Research during PRD v0.5 Red Team Review. Handles both greenfield and brownfield contexts. Triggers on "tech stack", "build or buy?", "what technologies?", "technical decisions", "what do we reuse?", "existing stack", "vendor constraint", "IBM-first", "what tools do we need?", "evaluate solutions", "select tech stack". Consumes FEA- (features), SCR- (screens), RISK- (constraints). Outputs TECH- entries with decisions, rationale, and cross-references. Feeds v0.6 Architecture Design.
development
Define success criteria and tracking setup for launch during PRD v0.9 Go-to-Market. Triggers on requests to define launch metrics, set up tracking, or when user asks "how do we measure launch success?", "launch KPIs", "tracking setup", "success criteria", "analytics", "launch goals". Outputs KPI- entries specialized for launch measurement.
development
Define go-to-market strategy including launch plan, messaging, channels, and timing during PRD v0.9 Go-to-Market. Triggers on requests to plan launch, define GTM strategy, or when user asks "how do we launch?", "go-to-market", "launch plan", "marketing strategy", "messaging", "launch channels", "GTM". Outputs GTM- entries with launch plan components.
development
Establish channels and processes for capturing and processing post-launch feedback during PRD v0.9 Go-to-Market. Triggers on requests to set up feedback systems, capture user input, or when user asks "how do we collect feedback?", "feedback loop", "user research", "post-launch feedback", "customer feedback", "NPS", "voice of customer". Outputs CFD- entries specialized for post-launch feedback capture.