@eskoubar95/spec 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/lib/copy-template.js +6 -6
  2. package/dist/lib/copy-template.js.map +1 -1
  3. package/package.json +2 -2
  4. package/template/.cursor/MCP-SETUP.md +16 -0
  5. package/template/.cursor/agents/batch-runner.md +52 -0
  6. package/template/.cursor/agents/verifier.md +40 -0
  7. package/template/.cursor/commands/_shared/branch-detection.md +78 -0
  8. package/template/.cursor/commands/_shared/git-workflow.md +3 -1
  9. package/template/.cursor/commands/_shared/github-workflows.md +7 -5
  10. package/template/.cursor/commands/_shared/helper-metadata.md +20 -0
  11. package/template/.cursor/commands/_shared/linear-automation.md +14 -6
  12. package/template/.cursor/commands/_shared/linear-helpers.md +26 -14
  13. package/template/.cursor/commands/_shared/pr-description.md +11 -2
  14. package/template/.cursor/commands/spec/init.md +249 -15
  15. package/template/.cursor/commands/spec/plan.md +302 -7
  16. package/template/.cursor/commands/spec/refine.md +80 -2
  17. package/template/.cursor/commands/task/batch.md +112 -0
  18. package/template/.cursor/commands/task/start.md +318 -5
  19. package/template/.cursor/commands/task/validate.md +396 -1
  20. package/template/.cursor/rules/02-work-mode.mdc +71 -0
  21. package/template/.cursor/rules/openmemory.mdc +1 -1
  22. package/template/.cursor/scripts/{validate-helpers.js → validate-helpers.cjs} +30 -32
  23. package/template/.cursor/skills/sdd-commit-unit/SKILL.md +42 -0
  24. package/template/.cursor/skills/sdd-design-system-bootstrap/SKILL.md +35 -0
  25. package/template/.cursor/skills/sdd-git-default-branch/SKILL.md +49 -0
  26. package/template/.cursor/skills/sdd-pr-create-or-update/SKILL.md +41 -0
  27. package/template/.cursor/skills/sdd-task-preflight/SKILL.md +47 -0
  28. package/template/.cursor/skills/sdd-validation-suite/SKILL.md +47 -0
  29. package/template/spec/00-root-spec.md +9 -0
  30. package/template/spec/templates/02-architecture.md +64 -0
  31. package/template/spec/templates/06-acceptance.md +59 -0
  32. package/template/spec/templates/07-design-system.md +145 -0
  33. package/template/spec/templates/08-infrastructure.md +76 -0
  34. package/template/spec/templates/09-sitemap.md +50 -0
  35. package/template/work/backlog/tasks.local.md +6 -0
  36. package/template/work/linear/FALLBACK-STRATEGY.md +84 -0
  37. package/template/work/linear/LABEL-MAPPING-GUIDE.md +72 -0
  38. package/template/work/linear/SETUP.md +75 -0
  39. package/template/work/linear/sync-config.md +86 -0
@@ -2,7 +2,7 @@
2
2
 
3
3
  /**
4
4
  * Helper Metadata Validation Script
5
- *
5
+ *
6
6
  * Validates helper metadata for consistency and correctness:
7
7
  * - All helpers have YAML frontmatter
8
8
  * - Section line ranges match actual section markers
@@ -33,17 +33,17 @@ function log(message, color = 'reset') {
33
33
  function parseYAMLFrontmatter(content) {
34
34
  const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
35
35
  if (!frontmatterMatch) return null;
36
-
36
+
37
37
  const frontmatter = {};
38
38
  const lines = frontmatterMatch[1].split('\n');
39
-
39
+
40
40
  let currentKey = null;
41
41
  let currentValue = [];
42
42
  let inArray = false;
43
-
43
+
44
44
  for (const line of lines) {
45
45
  if (line.trim() === '') continue;
46
-
46
+
47
47
  // Check for array start
48
48
  if (line.match(/^(\s*)([a-z_]+):\s*$/)) {
49
49
  if (currentKey) {
@@ -54,13 +54,13 @@ function parseYAMLFrontmatter(content) {
54
54
  inArray = true;
55
55
  continue;
56
56
  }
57
-
57
+
58
58
  // Check for array item
59
59
  if (inArray && line.match(/^\s*-\s*(.+)$/)) {
60
60
  currentValue.push(line.match(/^\s*-\s*(.+)$/)[1]);
61
61
  continue;
62
62
  }
63
-
63
+
64
64
  // Check for key-value
65
65
  if (line.match(/^(\s*)([a-z_]+):\s*(.+)$/)) {
66
66
  if (currentKey) {
@@ -72,25 +72,25 @@ function parseYAMLFrontmatter(content) {
72
72
  inArray = false;
73
73
  continue;
74
74
  }
75
-
75
+
76
76
  // Check for nested structure (sections)
77
77
  if (line.match(/^\s+([a-z_]+):/)) {
78
78
  // This is a nested key, skip for now (simplified parsing)
79
79
  continue;
80
80
  }
81
81
  }
82
-
82
+
83
83
  if (currentKey) {
84
84
  frontmatter[currentKey] = currentValue.length === 1 ? currentValue[0] : currentValue;
85
85
  }
86
-
86
+
87
87
  return frontmatter;
88
88
  }
89
89
 
90
90
  function findSectionMarkers(content) {
91
91
  const sections = [];
92
92
  const lines = content.split('\n');
93
-
93
+
94
94
  for (let i = 0; i < lines.length; i++) {
95
95
  const line = lines[i];
96
96
  const sectionMatch = line.match(/^## Section: (.+?) \(Lines (\d+)-(\d+)\)$/);
@@ -103,7 +103,7 @@ function findSectionMarkers(content) {
103
103
  });
104
104
  }
105
105
  }
106
-
106
+
107
107
  return sections;
108
108
  }
109
109
 
@@ -111,14 +111,14 @@ function validateHelper(helperFile) {
111
111
  const filePath = path.join(HELPERS_DIR, helperFile);
112
112
  const content = fs.readFileSync(filePath, 'utf-8');
113
113
  const issues = [];
114
-
114
+
115
115
  // 1. Check frontmatter exists
116
116
  const frontmatter = parseYAMLFrontmatter(content);
117
117
  if (!frontmatter) {
118
118
  issues.push({ type: 'error', message: 'Missing YAML frontmatter' });
119
119
  return { file: helperFile, issues };
120
120
  }
121
-
121
+
122
122
  // 2. Check required fields
123
123
  const requiredFields = ['helper_id', 'load_when', 'sections', 'always_load'];
124
124
  for (const field of requiredFields) {
@@ -126,7 +126,7 @@ function validateHelper(helperFile) {
126
126
  issues.push({ type: 'error', message: `Missing required field: ${field}` });
127
127
  }
128
128
  }
129
-
129
+
130
130
  // 3. Check section markers match metadata
131
131
  const sections = findSectionMarkers(content);
132
132
  if (sections.length > 0 && frontmatter.sections) {
@@ -141,23 +141,22 @@ function validateHelper(helperFile) {
141
141
  }
142
142
  }
143
143
  }
144
-
144
+
145
145
  return { file: helperFile, frontmatter, sections, issues };
146
146
  }
147
147
 
148
148
  function validateRegistry() {
149
149
  const content = fs.readFileSync(METADATA_FILE, 'utf-8');
150
- const helperFiles = fs.readdirSync(HELPERS_DIR)
151
- .filter(f => f.endsWith('.md') && f !== 'helper-metadata.md');
152
-
150
+ const helperFiles = fs.readdirSync(HELPERS_DIR).filter((f) => f.endsWith('.md') && f !== 'helper-metadata.md');
151
+
153
152
  const registryHelpers = [];
154
153
  const registryMatch = content.match(/### ([a-z-]+)\.md/g);
155
154
  if (registryMatch) {
156
- registryHelpers.push(...registryMatch.map(m => m.replace('### ', '').replace('.md', '')));
155
+ registryHelpers.push(...registryMatch.map((m) => m.replace('### ', '').replace('.md', '')));
157
156
  }
158
-
157
+
159
158
  const issues = [];
160
-
159
+
161
160
  // Check all helpers are in registry
162
161
  for (const helperFile of helperFiles) {
163
162
  const helperId = helperFile.replace('.md', '');
@@ -168,7 +167,7 @@ function validateRegistry() {
168
167
  });
169
168
  }
170
169
  }
171
-
170
+
172
171
  // Check registry has all helpers
173
172
  for (const registryHelper of registryHelpers) {
174
173
  if (!helperFiles.includes(`${registryHelper}.md`)) {
@@ -178,20 +177,19 @@ function validateRegistry() {
178
177
  });
179
178
  }
180
179
  }
181
-
180
+
182
181
  return { helperFiles, registryHelpers, issues };
183
182
  }
184
183
 
185
184
  function main() {
186
185
  log('🔍 Validating Helper Metadata...\n', 'blue');
187
-
188
- const helperFiles = fs.readdirSync(HELPERS_DIR)
189
- .filter(f => f.endsWith('.md') && f !== 'helper-metadata.md');
190
-
186
+
187
+ const helperFiles = fs.readdirSync(HELPERS_DIR).filter((f) => f.endsWith('.md') && f !== 'helper-metadata.md');
188
+
191
189
  let totalIssues = 0;
192
190
  let totalErrors = 0;
193
191
  let totalWarnings = 0;
194
-
192
+
195
193
  // Validate each helper
196
194
  for (const helperFile of helperFiles) {
197
195
  const result = validateHelper(helperFile);
@@ -211,11 +209,11 @@ function main() {
211
209
  log(`✅ ${helperFile}`, 'green');
212
210
  }
213
211
  }
214
-
212
+
215
213
  // Validate registry
216
214
  log('\n📋 Validating Helper Registry...\n', 'blue');
217
215
  const registryResult = validateRegistry();
218
-
216
+
219
217
  if (registryResult.issues.length > 0) {
220
218
  for (const issue of registryResult.issues) {
221
219
  if (issue.type === 'error') {
@@ -230,7 +228,7 @@ function main() {
230
228
  } else {
231
229
  log('✅ Helper registry is consistent', 'green');
232
230
  }
233
-
231
+
234
232
  // Summary
235
233
  log('\n' + '='.repeat(50), 'blue');
236
234
  if (totalIssues === 0) {
@@ -0,0 +1,42 @@
1
+ ---
2
+ name: sdd-commit-unit
3
+ description: Create small, reviewable commits per logical unit of work with consistent messages tied to the task ID. Use during implementation and batch runs.
4
+ metadata:
5
+ sdd_category: git
6
+ ---
7
+
8
+ # SDD: Commit a Logical Unit
9
+
10
+ ## When to use
11
+
12
+ - After completing a coherent step (not after every file).
13
+ - Before switching focus or running validation.
14
+ - During batch runs after each “unit” completes.
15
+
16
+ ## Inputs
17
+
18
+ - Task ID (from `work/backlog/tasks.local.md` or user input)
19
+ - Current diff (`git diff` and `git status`)
20
+ - Commit message style: concise, why-focused, task-linked
21
+
22
+ ## Output contract
23
+
24
+ Return:
25
+ - `commitCreated`: yes/no
26
+ - `commitHash` (if created)
27
+ - `message`
28
+ - `filesChangedSummary`
29
+
30
+ ## Rules
31
+
32
+ - Never commit secrets (`.env`, credential files, tokens).
33
+ - If there are no changes, do not create an empty commit.
34
+ - Keep commits small and reviewable; split if multiple concerns.
35
+
36
+ ## Suggested commit message pattern
37
+
38
+ - Title: `<task-id>: <verb> <scope> (<why>)`
39
+ - Body (optional): 1–3 bullets explaining intent and risk
40
+
41
+ Example:
42
+ - `t1.2: add branch detection helper (avoid hardcoded main)`
@@ -0,0 +1,35 @@
1
+ ---
2
+ name: sdd-design-system-bootstrap
3
+ description: Bootstrap a usable design system early (Tailwind + shadcn/ui) to avoid design babysitting later. Produces spec/07-design-system.md and a UI Definition of Done checklist.
4
+ metadata:
5
+ sdd_category: design
6
+ ---
7
+
8
+ # SDD: Design System Bootstrap (Tailwind + shadcn/ui)
9
+
10
+ ## When to use
11
+
12
+ - During `/spec/init` or `/spec/refine` when design direction is unclear or repeatedly causes rework.
13
+ - Before `/spec/plan` so design work can be turned into concrete, non-babysat tasks.
14
+
15
+ ## Inputs (ask if missing)
16
+
17
+ - Product vibe / adjectives (3–5)
18
+ - Target surfaces (primary screens + whether data-dense)
19
+ - Brand constraints (logo, existing colors, typography)
20
+ - Accessibility target (default: WCAG AA)
21
+
22
+ ## Output contract
23
+
24
+ Produce or update `spec/07-design-system.md` with:
25
+ - Style direction (do/don’t)
26
+ - Token table (semantic colors, typography, spacing, radius/shadows)
27
+ - Component conventions (shadcn/ui)
28
+ - UI patterns (nav/forms/tables/states)
29
+ - UI Definition of Done checklist
30
+
31
+ ## Rules
32
+
33
+ - Make it usable, not aspirational.
34
+ - Prefer semantic tokens over raw colors.
35
+ - Keep it compatible with Tailwind + shadcn/ui defaults (can be overridden intentionally).
@@ -0,0 +1,49 @@
1
+ ---
2
+ name: sdd-git-default-branch
3
+ description: Resolve default/development/production branches consistently across projects. Use before creating task branches, counting commits, creating PRs, or generating diffs.
4
+ metadata:
5
+ sdd_category: git
6
+ ---
7
+
8
+ # SDD: Resolve Git Default Branch
9
+
10
+ ## When to use
11
+
12
+ - You are about to create a task branch.
13
+ - You need to compute diffs/commit counts against the base branch.
14
+ - You are about to create or update a PR.
15
+ - You see any workflow text hardcoding `main`/`develop`/`staging` and need to make it project-agnostic.
16
+
17
+ ## Inputs
18
+
19
+ - Optional: `.sdd/git-config.json` (project-specific config; preferred)
20
+ - Git remote metadata: `origin` HEAD branch (if available)
21
+ - Local/remote branch existence
22
+
23
+ ## Output contract (what you must return)
24
+
25
+ Return a short structured result:
26
+
27
+ - `defaultBranch`: the branch to use as PR base and “clean base” checkout
28
+ - `developmentBranch`: optional; defaults to `defaultBranch` if not known
29
+ - `productionBranch`: optional; defaults to `defaultBranch` if not known
30
+ - `source`: `config` | `remoteHead` | `fallback`
31
+
32
+ ## Algorithm (project-agnostic)
33
+
34
+ 1. **Config (highest priority)**: If `.sdd/git-config.json` exists, read:
35
+ - `default_branch` OR `development_branch` as `defaultBranch`
36
+ - `development_branch` as `developmentBranch` (fallback: `defaultBranch`)
37
+ - `production_branch` as `productionBranch` (fallback: `defaultBranch`)
38
+ 2. **Remote HEAD**: If `origin` exists, read the remote default branch (e.g., `git remote show origin` and parse `HEAD branch`).
39
+ 3. **Fallback**: If remote HEAD is unavailable, pick the first existing branch in this order (local OR remote):
40
+ - `main`
41
+ - `master`
42
+ - `develop`
43
+ 4. If nothing is detectable, return `defaultBranch: "main"` and include a warning in your explanation.
44
+
45
+ ## Rules
46
+
47
+ - Do not assume `staging` exists. If a project uses `staging`, it should be configured in `.sdd/git-config.json`.
48
+ - Never hardcode `main` as “the” default branch in documentation. Use `defaultBranch` (resolved by this skill).
49
+ - If the project has `work/backlog/tasks.local.md`, include the task ID in downstream commit/PR titles (but this skill itself only resolves branches).
@@ -0,0 +1,41 @@
1
+ ---
2
+ name: sdd-pr-create-or-update
3
+ description: Create or update a PR with correct base branch, task-linked title, and a structured body (changes, testing, acceptance). Use after validation or at milestone boundaries.
4
+ metadata:
5
+ sdd_category: github
6
+ ---
7
+
8
+ # SDD: Create or Update Pull Request
9
+
10
+ ## When to use
11
+
12
+ - After `/task/validate` passes (or passes with known exceptions).
13
+ - During `/task/batch` when configured to open PRs per task or per milestone.
14
+
15
+ ## Inputs
16
+
17
+ - Base branch: resolve via `/sdd-git-default-branch`
18
+ - Task ID + short title
19
+ - Git changes: commits since base branch, `git diff <base>...HEAD --stat`
20
+ - Validation result summary (lint/tests/build)
21
+
22
+ ## Output contract
23
+
24
+ Return:
25
+ - `action`: created/updated/noop
26
+ - `prUrl` (if created/updated)
27
+ - `baseBranchUsed`
28
+
29
+ ## Body template
30
+
31
+ Use a structured PR body:
32
+
33
+ - **Summary**: 1–3 bullets
34
+ - **Test plan**: checklist
35
+ - **Notes / risks**: optional
36
+
37
+ ## Rules
38
+
39
+ - Never assume base is `main`.
40
+ - Prefer updating an existing PR over creating duplicates.
41
+ - Do not push unless user asked to push (or the workflow explicitly requires it).
@@ -0,0 +1,47 @@
1
+ ---
2
+ name: sdd-task-preflight
3
+ description: Prepare a task workspace safely before implementation: clean working tree, correct base branch, and task branch naming. Use before /task/start execution work.
4
+ metadata:
5
+ sdd_category: git
6
+ ---
7
+
8
+ # SDD: Task Preflight (Git Safety)
9
+
10
+ ## When to use
11
+
12
+ - Right before starting implementation for a task (single task or batch task).
13
+ - When you suspect you’re on the wrong branch or have dirty state.
14
+
15
+ ## Inputs
16
+
17
+ - Task context (ideally: `taskId`, short description)
18
+ - Repo state: `git status`, current branch, remotes
19
+ - Base branch: resolve via `/sdd-git-default-branch` (preferred) or helper `branch-detection.md`
20
+
21
+ ## Output contract
22
+
23
+ Return:
24
+ - `baseBranch`
25
+ - `taskBranch`
26
+ - `actionsTaken` (bullets)
27
+ - `blockingIssues` (bullets; empty if none)
28
+
29
+ ## Procedure
30
+
31
+ 1. **Validate working tree is clean**
32
+ - If dirty/untracked: stop and report as `blockingIssues` (do not auto-stash).
33
+ 2. **Resolve `baseBranch`**
34
+ - Use `/sdd-git-default-branch` to resolve `defaultBranch`.
35
+ 3. **Ensure base branch is up to date**
36
+ - Checkout `baseBranch`
37
+ - If remote exists: pull latest (`git pull origin <baseBranch>`)
38
+ 4. **Create/checkout task branch**
39
+ - Naming: `task/<task-id>-<short-description>` (kebab-case)
40
+ - If exists locally: checkout
41
+ - Else: create from `baseBranch`
42
+
43
+ ## Rules
44
+
45
+ - Never merge/rebase in preflight.
46
+ - Never commit anything in preflight.
47
+ - Never assume `main`.
@@ -0,0 +1,47 @@
1
+ ---
2
+ name: sdd-validation-suite
3
+ description: Run a lightweight, project-agnostic validation suite (lint, typecheck, build, tests when present) and summarize pass/fail with actionable error highlights.
4
+ metadata:
5
+ sdd_category: validation
6
+ ---
7
+
8
+ # SDD: Validation Suite
9
+
10
+ ## When to use
11
+
12
+ - During `/task/validate` before opening/updating a PR.
13
+ - During `/task/batch` after each task (and optionally after each logical unit).
14
+
15
+ ## Inputs
16
+
17
+ - Project type + tooling (from detection or repo files)
18
+ - Available scripts (package.json, makefile, etc.)
19
+ - Optional: workspace scope (monorepo), e.g. `apps/storefront`
20
+
21
+ ## Output contract
22
+
23
+ Return a compact report:
24
+ - `lint`: pass/fail/skipped
25
+ - `typecheck`: pass/fail/skipped
26
+ - `tests`: pass/fail/skipped
27
+ - `build`: pass/fail/skipped
28
+ - `highlights`: top 3 actionable errors (if any)
29
+
30
+ ## Execution strategy (project-agnostic)
31
+
32
+ - If JS/TS: prefer `npm run lint`, `npm run typecheck`, `npm test`, `npm run build` when scripts exist.
33
+ - If Python: prefer `ruff`, `mypy`, `pytest` when configured.
34
+ - If unknown: run the minimum safe checks available, and clearly mark skipped items.
35
+
36
+ **Monorepo rule (if applicable):**
37
+ - If the repo is a monorepo, run commands **scoped to the task workspace** (do not run repo-wide by default).
38
+ - Examples:
39
+ - `pnpm -C <workspace> run lint`
40
+ - `npm --prefix <workspace> run test`
41
+ - `yarn --cwd <workspace> test`
42
+ - If no workspace scope is provided for a monorepo task, treat validation as **blocked** until scope is clarified.
43
+
44
+ ## Rules
45
+
46
+ - Do not invent commands that don’t exist.
47
+ - If a step fails, stop and report errors before continuing.
@@ -19,6 +19,14 @@ What is the main value delivered to users?
19
19
  What feels in-scope right now?
20
20
  What explicitly feels out-of-scope?
21
21
 
22
+ ## 5.1 MVP vs Future (scope locking)
23
+
24
+ ### MVP (ship target)
25
+ - [List the minimum set of capabilities required to ship an MVP.]
26
+
27
+ ### Future ideas / Roadmap (park here)
28
+ - [If your initial prompt includes visionary “later” ideas, list them here so they don’t accidentally become MVP scope.]
29
+
22
30
  ## 6. Open Questions
23
31
  List uncertainties, assumptions, or things that need clarification.
24
32
 
@@ -32,5 +40,6 @@ Anything else discovered during discussion or research.
32
40
  If applicable, reference:
33
41
  - `spec/01-prd.md` (if PRD was created)
34
42
  - `spec/02-architecture.md` (if architecture is documented)
43
+ - `spec/06-acceptance.md` (MVP ship checklist / definition of done)
35
44
  - `spec/07-design-system.md` (if design is critical)
36
45
  - `spec/08-infrastructure.md` (if infrastructure is critical)
@@ -0,0 +1,64 @@
1
+ # Architecture
2
+
3
+ ## System Overview
4
+ High-level description of system architecture and how components interact.
5
+
6
+ ## Component Architecture
7
+ - Frontend: [Description]
8
+ - Backend/API: [Description]
9
+ - Database: [Description]
10
+ - External Services: [Description]
11
+
12
+ ## Data Flow
13
+ How data moves through the system:
14
+ - User actions → [flow description]
15
+ - Data fetching → [flow description]
16
+ - Mutations → [flow description]
17
+
18
+ ## Design Patterns
19
+ Architecture patterns used:
20
+ - [Pattern name]: [Description and rationale]
21
+
22
+ ## Technology Stack
23
+
24
+ Document the technologies, frameworks, and tools used in this project. This is the source of truth for framework/tool detection and rule activation.
25
+
26
+ **Format:**
27
+ - Frontend Framework: [Framework name, e.g., Next.js, Vite, React]
28
+ - Backend Framework: [Framework name, e.g., Express, FastAPI, Flask]
29
+ - CMS: [CMS name, e.g., Payload CMS, Strapi]
30
+ - Database: [Database name, e.g., PostgreSQL, MongoDB]
31
+ - Build Tool: [Build tool name, e.g., Vite, Webpack]
32
+ - Language: [Language name, e.g., TypeScript, Python]
33
+ - Other: [List other tools/libraries]
34
+
35
+ **Example:**
36
+ - Frontend Framework: Next.js
37
+ - CMS: Payload CMS
38
+ - Database: PostgreSQL
39
+ - Build Tool: Vite (for admin)
40
+ - Language: TypeScript
41
+
42
+ **Note:** If tech stack is documented here, it should also be referenced in `spec/08-infrastructure.md` for consistency.
43
+
44
+ ## API Design (if applicable)
45
+ - API structure: [Description]
46
+ - Authentication: [Description]
47
+ - Error handling: [Description]
48
+
49
+ ## Security Architecture (if critical)
50
+ - Authentication flow: [Description]
51
+ - Authorization: [Description]
52
+ - Data protection: [Description]
53
+
54
+ ## Scalability Considerations
55
+ - Current scale: [Description]
56
+ - Future scale: [Description]
57
+ - Scaling strategy: [Description]
58
+
59
+ ## CI/CD Architecture (if applicable)
60
+ - CI pipeline: [Description of CI workflow]
61
+ - CD pipeline: [Description of CD workflow]
62
+ - Testing strategy: [Unit tests, integration tests, E2E tests]
63
+ - Quality gates: [Required checks before merge/deploy]
64
+
@@ -0,0 +1,59 @@
1
+ # Acceptance Criteria / Ship Checklist
2
+
3
+ This document defines what “done” means for the **MVP** (and optionally later phases).
4
+ Use it as the project’s **ship gate** during planning and validation.
5
+
6
+ ## MVP definition (1–5 bullets)
7
+
8
+ - [What must be true to call the MVP shipped?]
9
+
10
+ ## Success criteria (measurable if possible)
11
+
12
+ - [Metric / outcome]
13
+
14
+ ## Scope boundaries
15
+
16
+ ### In scope (MVP)
17
+ - [Feature / capability]
18
+
19
+ ### Out of scope (MVP)
20
+ - [Feature / capability]
21
+
22
+ ### Future ideas / Roadmap (park here)
23
+ - [Item]
24
+
25
+ ## Non-functional requirements (MVP)
26
+
27
+ - **Performance**: [e.g., pages load < 2s on mid-tier device]
28
+ - **Reliability**: [e.g., error budget / retries]
29
+ - **Security**: [e.g., auth, roles, audit trail]
30
+ - **Accessibility**: [e.g., WCAG AA]
31
+ - **Privacy/Compliance**: [if applicable]
32
+
33
+ ## Quality gates (must pass to ship MVP)
34
+
35
+ - [ ] Key user journeys verified end-to-end
36
+ - [ ] Error/empty/loading states implemented for primary flows
37
+ - [ ] Logging/monitoring in place (minimum viable observability)
38
+ - [ ] Data migrations/backups strategy (if DB)
39
+ - [ ] Security basics covered (auth, access control, secrets handling)
40
+ - [ ] CI checks passing (lint/typecheck/tests/build as applicable)
41
+ - [ ] Deployment pipeline ready (preview + production)
42
+
43
+ ## Test plan (MVP)
44
+
45
+ - **Manual smoke tests**:
46
+ - [Flow 1]
47
+ - [Flow 2]
48
+ - **Automated tests**:
49
+ - Unit: [yes/no]
50
+ - Integration: [yes/no]
51
+ - E2E: [yes/no]
52
+
53
+ ## Release plan (MVP)
54
+
55
+ - **Rollout**: [gradual/full]
56
+ - **Rollback**: [plan]
57
+ - **Monitoring**: [what to watch]
58
+ - **Support**: [who responds to incidents]
59
+