@agile-vibe-coding/avc 0.1.1 → 0.3.1
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.
- package/cli/agent-loader.js +21 -0
- package/cli/agents/agent-selector.md +152 -0
- package/cli/agents/architecture-recommender.md +418 -0
- package/cli/agents/code-implementer.md +117 -0
- package/cli/agents/code-validator.md +80 -0
- package/cli/agents/context-reviewer-epic.md +101 -0
- package/cli/agents/context-reviewer-story.md +92 -0
- package/cli/agents/context-writer-epic.md +145 -0
- package/cli/agents/context-writer-story.md +111 -0
- package/cli/agents/database-deep-dive.md +470 -0
- package/cli/agents/database-recommender.md +634 -0
- package/cli/agents/doc-distributor.md +176 -0
- package/cli/agents/doc-writer-epic.md +42 -0
- package/cli/agents/doc-writer-story.md +43 -0
- package/cli/agents/documentation-updater.md +203 -0
- package/cli/agents/duplicate-detector.md +110 -0
- package/cli/agents/epic-story-decomposer.md +559 -0
- package/cli/agents/feature-context-generator.md +91 -0
- package/cli/agents/gap-checker-epic.md +52 -0
- package/cli/agents/impact-checker-story.md +51 -0
- package/cli/agents/migration-guide-generator.md +305 -0
- package/cli/agents/mission-scope-generator.md +143 -0
- package/cli/agents/mission-scope-validator.md +146 -0
- package/cli/agents/project-context-extractor.md +122 -0
- package/cli/agents/project-documentation-creator.json +226 -0
- package/cli/agents/project-documentation-creator.md +595 -0
- package/cli/agents/question-prefiller.md +269 -0
- package/cli/agents/refiner-epic.md +39 -0
- package/cli/agents/refiner-story.md +42 -0
- package/cli/agents/scaffolding-generator.md +99 -0
- package/cli/agents/seed-validator.md +71 -0
- package/cli/agents/story-doc-enricher.md +133 -0
- package/cli/agents/story-scope-reviewer.md +147 -0
- package/cli/agents/story-splitter.md +83 -0
- package/cli/agents/suggestion-business-analyst.md +88 -0
- package/cli/agents/suggestion-deployment-architect.md +263 -0
- package/cli/agents/suggestion-product-manager.md +129 -0
- package/cli/agents/suggestion-security-specialist.md +156 -0
- package/cli/agents/suggestion-technical-architect.md +269 -0
- package/cli/agents/suggestion-ux-researcher.md +93 -0
- package/cli/agents/task-subtask-decomposer.md +188 -0
- package/cli/agents/validator-documentation.json +183 -0
- package/cli/agents/validator-documentation.md +455 -0
- package/cli/agents/validator-selector.md +211 -0
- package/cli/ansi-colors.js +21 -0
- package/cli/api-reference-tool.js +368 -0
- package/cli/build-docs.js +29 -8
- package/cli/ceremony-history.js +369 -0
- package/cli/checks/catalog.json +76 -0
- package/cli/checks/code/quality.json +26 -0
- package/cli/checks/code/testing.json +14 -0
- package/cli/checks/code/traceability.json +26 -0
- package/cli/checks/cross-refs/epic.json +171 -0
- package/cli/checks/cross-refs/story.json +149 -0
- package/cli/checks/epic/api.json +114 -0
- package/cli/checks/epic/backend.json +126 -0
- package/cli/checks/epic/cloud.json +126 -0
- package/cli/checks/epic/data.json +102 -0
- package/cli/checks/epic/database.json +114 -0
- package/cli/checks/epic/developer.json +182 -0
- package/cli/checks/epic/devops.json +174 -0
- package/cli/checks/epic/frontend.json +162 -0
- package/cli/checks/epic/mobile.json +102 -0
- package/cli/checks/epic/qa.json +90 -0
- package/cli/checks/epic/security.json +184 -0
- package/cli/checks/epic/solution-architect.json +192 -0
- package/cli/checks/epic/test-architect.json +90 -0
- package/cli/checks/epic/ui.json +102 -0
- package/cli/checks/epic/ux.json +90 -0
- package/cli/checks/fixes/epic-fix-template.md +10 -0
- package/cli/checks/fixes/story-fix-template.md +10 -0
- package/cli/checks/story/api.json +186 -0
- package/cli/checks/story/backend.json +102 -0
- package/cli/checks/story/cloud.json +102 -0
- package/cli/checks/story/data.json +210 -0
- package/cli/checks/story/database.json +102 -0
- package/cli/checks/story/developer.json +168 -0
- package/cli/checks/story/devops.json +102 -0
- package/cli/checks/story/frontend.json +174 -0
- package/cli/checks/story/mobile.json +102 -0
- package/cli/checks/story/qa.json +210 -0
- package/cli/checks/story/security.json +198 -0
- package/cli/checks/story/solution-architect.json +230 -0
- package/cli/checks/story/test-architect.json +210 -0
- package/cli/checks/story/ui.json +102 -0
- package/cli/checks/story/ux.json +102 -0
- package/cli/coding-order.js +401 -0
- package/cli/command-logger.js +49 -12
- package/cli/components/static-output.js +63 -0
- package/cli/console-output-manager.js +94 -0
- package/cli/dependency-checker.js +72 -0
- package/cli/docs-sync.js +306 -0
- package/cli/epic-story-validator.js +659 -0
- package/cli/evaluation-prompts.js +1008 -0
- package/cli/execution-context.js +195 -0
- package/cli/generate-summary-table.js +340 -0
- package/cli/init-model-config.js +704 -0
- package/cli/init.js +1737 -278
- package/cli/kanban-server-manager.js +227 -0
- package/cli/llm-claude.js +150 -1
- package/cli/llm-gemini.js +109 -0
- package/cli/llm-local.js +493 -0
- package/cli/llm-mock.js +233 -0
- package/cli/llm-openai.js +454 -0
- package/cli/llm-provider.js +379 -3
- package/cli/llm-token-limits.js +211 -0
- package/cli/llm-verifier.js +662 -0
- package/cli/llm-xiaomi.js +143 -0
- package/cli/message-constants.js +49 -0
- package/cli/message-manager.js +334 -0
- package/cli/message-types.js +96 -0
- package/cli/messaging-api.js +291 -0
- package/cli/micro-check-fixer.js +335 -0
- package/cli/micro-check-runner.js +449 -0
- package/cli/micro-check-scorer.js +148 -0
- package/cli/micro-check-validator.js +538 -0
- package/cli/model-pricing.js +192 -0
- package/cli/model-query-engine.js +468 -0
- package/cli/model-recommendation-analyzer.js +495 -0
- package/cli/model-selector.js +270 -0
- package/cli/output-buffer.js +107 -0
- package/cli/process-manager.js +73 -2
- package/cli/prompt-logger.js +57 -0
- package/cli/repl-ink.js +4625 -1094
- package/cli/repl-old.js +3 -4
- package/cli/seed-processor.js +962 -0
- package/cli/sprint-planning-processor.js +4162 -0
- package/cli/template-processor.js +2149 -105
- package/cli/templates/project.md +25 -8
- package/cli/templates/vitepress-config.mts.template +5 -4
- package/cli/token-tracker.js +547 -0
- package/cli/tools/generate-story-validators.js +317 -0
- package/cli/tools/generate-validators.js +669 -0
- package/cli/update-checker.js +19 -17
- package/cli/update-notifier.js +4 -4
- package/cli/validation-router.js +667 -0
- package/cli/verification-tracker.js +563 -0
- package/cli/worktree-runner.js +654 -0
- package/kanban/README.md +386 -0
- package/kanban/client/README.md +205 -0
- package/kanban/client/components.json +20 -0
- package/kanban/client/dist/assets/index-D_KC5EQT.css +1 -0
- package/kanban/client/dist/assets/index-DjY5zqW7.js +351 -0
- package/kanban/client/dist/index.html +16 -0
- package/kanban/client/dist/vite.svg +1 -0
- package/kanban/client/index.html +15 -0
- package/kanban/client/package-lock.json +9442 -0
- package/kanban/client/package.json +44 -0
- package/kanban/client/postcss.config.js +6 -0
- package/kanban/client/public/vite.svg +1 -0
- package/kanban/client/src/App.jsx +651 -0
- package/kanban/client/src/components/ProjectFileEditorPopup.jsx +117 -0
- package/kanban/client/src/components/ceremony/AskArchPopup.jsx +420 -0
- package/kanban/client/src/components/ceremony/AskModelPopup.jsx +629 -0
- package/kanban/client/src/components/ceremony/CeremonyWorkflowModal.jsx +1133 -0
- package/kanban/client/src/components/ceremony/EpicStorySelectionModal.jsx +254 -0
- package/kanban/client/src/components/ceremony/ProviderSwitcherButton.jsx +290 -0
- package/kanban/client/src/components/ceremony/SponsorCallModal.jsx +686 -0
- package/kanban/client/src/components/ceremony/SprintPlanningModal.jsx +838 -0
- package/kanban/client/src/components/ceremony/steps/ArchitectureStep.jsx +150 -0
- package/kanban/client/src/components/ceremony/steps/CompleteStep.jsx +136 -0
- package/kanban/client/src/components/ceremony/steps/DatabaseStep.jsx +202 -0
- package/kanban/client/src/components/ceremony/steps/DeploymentStep.jsx +123 -0
- package/kanban/client/src/components/ceremony/steps/MissionStep.jsx +106 -0
- package/kanban/client/src/components/ceremony/steps/ReviewAnswersStep.jsx +329 -0
- package/kanban/client/src/components/ceremony/steps/RunningStep.jsx +249 -0
- package/kanban/client/src/components/kanban/CardDetailModal.jsx +646 -0
- package/kanban/client/src/components/kanban/EpicSection.jsx +146 -0
- package/kanban/client/src/components/kanban/FilterToolbar.jsx +222 -0
- package/kanban/client/src/components/kanban/GroupingSelector.jsx +63 -0
- package/kanban/client/src/components/kanban/KanbanBoard.jsx +211 -0
- package/kanban/client/src/components/kanban/KanbanCard.jsx +147 -0
- package/kanban/client/src/components/kanban/KanbanColumn.jsx +90 -0
- package/kanban/client/src/components/kanban/RefineWorkItemPopup.jsx +784 -0
- package/kanban/client/src/components/kanban/RunButton.jsx +162 -0
- package/kanban/client/src/components/kanban/SeedButton.jsx +176 -0
- package/kanban/client/src/components/layout/LoadingScreen.jsx +82 -0
- package/kanban/client/src/components/process/ProcessMonitorBar.jsx +80 -0
- package/kanban/client/src/components/settings/AgentEditorPopup.jsx +171 -0
- package/kanban/client/src/components/settings/AgentsTab.jsx +381 -0
- package/kanban/client/src/components/settings/ApiKeysTab.jsx +142 -0
- package/kanban/client/src/components/settings/CeremonyModelsTab.jsx +105 -0
- package/kanban/client/src/components/settings/CheckEditorPopup.jsx +507 -0
- package/kanban/client/src/components/settings/CostThresholdsTab.jsx +95 -0
- package/kanban/client/src/components/settings/ModelPricingTab.jsx +269 -0
- package/kanban/client/src/components/settings/OpenAIAuthSection.jsx +412 -0
- package/kanban/client/src/components/settings/ServersTab.jsx +121 -0
- package/kanban/client/src/components/settings/SettingsModal.jsx +84 -0
- package/kanban/client/src/components/stats/CostModal.jsx +384 -0
- package/kanban/client/src/components/ui/badge.jsx +27 -0
- package/kanban/client/src/components/ui/dialog.jsx +121 -0
- package/kanban/client/src/components/ui/tabs.jsx +85 -0
- package/kanban/client/src/hooks/__tests__/useGrouping.test.js +232 -0
- package/kanban/client/src/hooks/useGrouping.js +177 -0
- package/kanban/client/src/hooks/useWebSocket.js +120 -0
- package/kanban/client/src/lib/__tests__/api.test.js +196 -0
- package/kanban/client/src/lib/__tests__/status-grouping.test.js +94 -0
- package/kanban/client/src/lib/api.js +515 -0
- package/kanban/client/src/lib/status-grouping.js +154 -0
- package/kanban/client/src/lib/utils.js +11 -0
- package/kanban/client/src/main.jsx +10 -0
- package/kanban/client/src/store/__tests__/kanbanStore.test.js +164 -0
- package/kanban/client/src/store/ceremonyStore.js +172 -0
- package/kanban/client/src/store/filterStore.js +201 -0
- package/kanban/client/src/store/kanbanStore.js +123 -0
- package/kanban/client/src/store/processStore.js +65 -0
- package/kanban/client/src/store/sprintPlanningStore.js +33 -0
- package/kanban/client/src/styles/globals.css +59 -0
- package/kanban/client/tailwind.config.js +77 -0
- package/kanban/client/vite.config.js +28 -0
- package/kanban/client/vitest.config.js +28 -0
- package/kanban/dev-start.sh +47 -0
- package/kanban/package.json +12 -0
- package/kanban/server/index.js +537 -0
- package/kanban/server/routes/ceremony.js +454 -0
- package/kanban/server/routes/costs.js +163 -0
- package/kanban/server/routes/openai-oauth.js +366 -0
- package/kanban/server/routes/processes.js +50 -0
- package/kanban/server/routes/settings.js +736 -0
- package/kanban/server/routes/websocket.js +281 -0
- package/kanban/server/routes/work-items.js +487 -0
- package/kanban/server/services/CeremonyService.js +1441 -0
- package/kanban/server/services/FileSystemScanner.js +95 -0
- package/kanban/server/services/FileWatcher.js +144 -0
- package/kanban/server/services/HierarchyBuilder.js +196 -0
- package/kanban/server/services/ProcessRegistry.js +122 -0
- package/kanban/server/services/TaskRunnerService.js +261 -0
- package/kanban/server/services/WorkItemReader.js +123 -0
- package/kanban/server/services/WorkItemRefineService.js +510 -0
- package/kanban/server/start.js +49 -0
- package/kanban/server/utils/kanban-logger.js +132 -0
- package/kanban/server/utils/markdown.js +91 -0
- package/kanban/server/utils/status-grouping.js +107 -0
- package/kanban/server/workers/run-task-worker.js +121 -0
- package/kanban/server/workers/seed-worker.js +94 -0
- package/kanban/server/workers/sponsor-call-worker.js +92 -0
- package/kanban/server/workers/sprint-planning-worker.js +212 -0
- package/package.json +19 -7
- package/cli/agents/documentation.md +0 -302
|
@@ -0,0 +1,559 @@
|
|
|
1
|
+
# Epic and Story Decomposition Agent
|
|
2
|
+
|
|
3
|
+
You are an expert software architect specializing in domain-driven design and feature decomposition.
|
|
4
|
+
|
|
5
|
+
## CRITICAL: No Duplicate or Overlapping Epics
|
|
6
|
+
|
|
7
|
+
**NEVER create two epics that cover the same domain or overlapping functionality. Each domain must appear EXACTLY ONCE.**
|
|
8
|
+
|
|
9
|
+
Duplicate or overlapping epics are the most common failure mode. This includes:
|
|
10
|
+
- Exact duplicates (same name)
|
|
11
|
+
- Semantic duplicates (different names, same functionality)
|
|
12
|
+
- Functional splits of a single domain (e.g., separating "inbound" from "outbound" into different epics when they share the same data model, API surface, and integration provider)
|
|
13
|
+
|
|
14
|
+
### Examples of violations:
|
|
15
|
+
|
|
16
|
+
- **BAD:** "WhatsApp Integration & Messaging Engine" + "WhatsApp Integration and Webhook Handling" — both cover inbound/outbound WhatsApp messaging with overlapping features (webhook receiving, message sending, delivery tracking). These MUST be ONE epic.
|
|
17
|
+
- **BAD:** "Appointment Scheduling Engine" appearing twice with slightly different descriptions.
|
|
18
|
+
- **BAD:** "Team Management and RBAC" + "Team & Admin Tools" — these are the SAME domain.
|
|
19
|
+
- **BAD:** Splitting a domain by technical layer (e.g., "Messaging API" + "Messaging Webhooks") instead of keeping the full domain together.
|
|
20
|
+
|
|
21
|
+
### Self-check rule:
|
|
22
|
+
|
|
23
|
+
Before outputting your JSON, run this mental check for EVERY pair of epics:
|
|
24
|
+
1. Do they share the same external integration or data model? → MERGE
|
|
25
|
+
2. Do they share >50% of their feature keywords? → MERGE
|
|
26
|
+
3. Would a developer working on one epic need to constantly touch the other? → MERGE
|
|
27
|
+
|
|
28
|
+
If you find yourself producing epics that share the same external API, data model, or >50% of their features, you are creating duplicates. Stop and consolidate those into a single epic.
|
|
29
|
+
|
|
30
|
+
## CRITICAL: Source Fidelity — Decompose What The Scope Says, Not What You Think It Should Say
|
|
31
|
+
|
|
32
|
+
**You are a decomposer, not a designer.** Your job is to break down the features described in the Initial Scope into Epics and Stories. You must NOT:
|
|
33
|
+
- Add technologies not mentioned in the scope (e.g., Redis, bcrypt, JWT when the scope says "session-based")
|
|
34
|
+
- Upgrade or substitute technologies (e.g., JWT instead of simple sessions, PostgreSQL instead of SQLite)
|
|
35
|
+
- Invent features the scope doesn't mention (e.g., refresh tokens when the scope only mentions sessions)
|
|
36
|
+
- Skip features the scope DOES mention (e.g., omitting the chat UI when the scope describes it)
|
|
37
|
+
|
|
38
|
+
**Before outputting, scan every section of the Initial Scope and verify that every stated feature, UI requirement, and integration point has at least one Story covering it.** Common sections that get missed:
|
|
39
|
+
- UI/UX sections (chat interfaces, calendars, dashboards, navigation, accessibility)
|
|
40
|
+
- Security sections (rate limiting, security headers, input sanitization)
|
|
41
|
+
- Infrastructure sections (Docker, database setup, migrations)
|
|
42
|
+
- Compliance sections (GDPR, data export)
|
|
43
|
+
|
|
44
|
+
## Project Complexity Calibration
|
|
45
|
+
|
|
46
|
+
**Before decomposing, assess the project's complexity to determine the right granularity.**
|
|
47
|
+
|
|
48
|
+
- **Micro project** (single file, no backend, no build step, <500 lines expected): 1-2 epics, 2-4 stories total. Do NOT create separate epics for concerns that will live in the same file. Example: a single-HTML calculator does not need separate "engine" and "input handling" epics — they are the same 50 lines of JavaScript.
|
|
49
|
+
- **Small project** (1-3 files, simple backend or none, <2000 lines): 2-4 epics, 4-10 stories.
|
|
50
|
+
- **Medium project** (multiple modules, backend + frontend, database): 4-8 epics, 10-30 stories.
|
|
51
|
+
- **Large project** (microservices, multiple integrations, complex domain): 6-15 epics, 20-60 stories.
|
|
52
|
+
|
|
53
|
+
**Merge rule for simple projects:** If two proposed epics would be implemented in the same file or the same ~50 lines of code, they MUST be one epic. If two stories describe the same user interaction from different angles (e.g., "click button to input number" and "handle arithmetic on stored numbers"), they overlap — merge or clearly delineate ownership of each variable and function.
|
|
54
|
+
|
|
55
|
+
**State ownership rule:** Each state variable or data structure must be owned by EXACTLY ONE epic. If two epics both list the same state variables in their scope, they must be merged or one must defer to the other.
|
|
56
|
+
|
|
57
|
+
## Your Task
|
|
58
|
+
|
|
59
|
+
Given a project's Initial Scope (list of features/functional areas), decompose it into:
|
|
60
|
+
1. **Epics** (domain-based groupings)
|
|
61
|
+
2. **Stories** (user-facing capabilities per Epic)
|
|
62
|
+
|
|
63
|
+
## Do NOT Generate a Scaffolding or Infrastructure-Setup Epic
|
|
64
|
+
|
|
65
|
+
**Do NOT generate any epic for project scaffolding, initialization, or environment setup.** No "Project Scaffolding", "Repository Setup", "Development Environment", or similar epic. This is handled automatically by the framework AFTER all domain epics and stories have been decomposed and their tech requirements are known.
|
|
66
|
+
|
|
67
|
+
Focus exclusively on **domain epics** — the functional capabilities the project needs to deliver.
|
|
68
|
+
|
|
69
|
+
## Epic Decomposition Rules
|
|
70
|
+
|
|
71
|
+
1. Each Epic represents a **cohesive functional domain**
|
|
72
|
+
2. Features sharing data models belong together
|
|
73
|
+
3. Cross-cutting features (auth, logging) get a separate "Foundation" Epic
|
|
74
|
+
4. Epics should be **parallelizable** (minimal inter-Epic dependencies)
|
|
75
|
+
5. Create as many Epics as the scope requires to achieve full coverage — but respect the complexity calibration above. Do NOT create micro-epics for simple projects.
|
|
76
|
+
6. **Avoid duplicates** - If existing Epic/Story names are provided, DO NOT generate them
|
|
77
|
+
7. **Epic description must be architecturally specific** — see description guidelines below
|
|
78
|
+
8. **Dependency completeness** — If a story references DOM elements, UI components, or data produced by another epic, it MUST declare that epic as a dependency. Example: a story that "handles button clicks" depends on the epic that renders the buttons.
|
|
79
|
+
|
|
80
|
+
## Epic Description Guidelines
|
|
81
|
+
|
|
82
|
+
The `description` field is the most important part of the Epic. It must include:
|
|
83
|
+
- **What** the epic implements (the functional goal)
|
|
84
|
+
- **How** (key technical approach: framework, protocol, pattern)
|
|
85
|
+
- **Key constraints or boundaries** (security, performance, compliance)
|
|
86
|
+
- **Integration touchpoints** with other epics
|
|
87
|
+
|
|
88
|
+
**BAD description (too vague — will fail validation):**
|
|
89
|
+
> "Authentication, authorization, session management, role-based access control"
|
|
90
|
+
|
|
91
|
+
**GOOD description (specific enough for architects, developers, and DevOps to plan from):**
|
|
92
|
+
> "Session-based authentication (httpOnly cookie transport) with RBAC enforcement via Express middleware — three roles: admin (full access), agent (scoped to assigned resources), viewer (read-only). Rate limiting via express-rate-limit on all API routes. Input sanitization and security headers (X-Frame-Options, CSP). Audit logging for auth events and profile changes."
|
|
93
|
+
|
|
94
|
+
The description should be 2-5 sentences. It should answer: *If a senior developer read only this description, could they make the key architectural decisions?*
|
|
95
|
+
|
|
96
|
+
**CRITICAL: The description must use ONLY the auth mechanism, database, frameworks, and technologies stated in the Initial Scope. Do NOT substitute or upgrade.** For example, if the scope says "session-based auth with hardcoded secret", do NOT write "JWT with RS256". If it says "SQLite", do NOT write "PostgreSQL".
|
|
97
|
+
|
|
98
|
+
## Features List Guidelines
|
|
99
|
+
|
|
100
|
+
The `features` array should list **specific capabilities with technical detail**, not generic nouns.
|
|
101
|
+
|
|
102
|
+
**BAD features (too generic — validators can't assess completeness):**
|
|
103
|
+
```json
|
|
104
|
+
["authentication", "authorization", "logging"]
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**GOOD features (specific and assessable):**
|
|
108
|
+
```json
|
|
109
|
+
[
|
|
110
|
+
"session-authentication (httpOnly cookies, server-side session store)",
|
|
111
|
+
"rbac-authorization (admin/agent/viewer roles, middleware enforcement on all routes)",
|
|
112
|
+
"rate-limiting (express-rate-limit on all /api/* and webhook endpoints)",
|
|
113
|
+
"security-headers (X-Frame-Options, Content-Security-Policy)",
|
|
114
|
+
"audit-logging (login, logout, profile changes with timestamp + actorId)",
|
|
115
|
+
"input-sanitization (HTML escaping, type validation, command injection prevention)"
|
|
116
|
+
]
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
**CRITICAL: Features must come from the Initial Scope, not from examples.** If the scope says "session-based auth", do not write "jwt-authentication". If the scope does not mention Redis, do not add "token-revocation (Redis denylist)".
|
|
120
|
+
|
|
121
|
+
Each feature string should follow the pattern: `feature-name (key technical detail)`.
|
|
122
|
+
|
|
123
|
+
## Tech Stack Fidelity
|
|
124
|
+
|
|
125
|
+
**Always use the exact technology names from the Initial Scope.** Do not substitute or upgrade:
|
|
126
|
+
- If scope says **MySQL** → use MySQL everywhere, not PostgreSQL
|
|
127
|
+
- If scope says **SQLite** → use SQLite, not PostgreSQL or MySQL
|
|
128
|
+
- If scope says **MongoDB** → use MongoDB, not a relational DB
|
|
129
|
+
- If scope says **Express.js** → use Express.js, not Fastify or Koa
|
|
130
|
+
- If scope says **Prisma** → reference Prisma in feature strings and descriptions
|
|
131
|
+
|
|
132
|
+
Validators check every feature string and epic description against the project's stated tech stack.
|
|
133
|
+
A single inconsistent technology reference (e.g. `PostgreSQL-backed` when the project uses MySQL)
|
|
134
|
+
will trigger critical `consistency` issues across all domain validators and lower scores by 10-15 points.
|
|
135
|
+
|
|
136
|
+
## Story Decomposition Rules
|
|
137
|
+
|
|
138
|
+
1. Each Story delivers **value to a user** (user-facing capability)
|
|
139
|
+
2. Stories should be **testable end-to-end** (acceptance criteria)
|
|
140
|
+
3. Stories should be **focused on a single cohesive capability** — one concern, one vertical slice
|
|
141
|
+
4. Each Story should have **3-8 acceptance criteria**
|
|
142
|
+
5. Create as many Stories as needed to **fully cover the Epic's scope** — completeness matters more than count
|
|
143
|
+
6. Story descriptions should be specific: include user type, action, and technical method
|
|
144
|
+
|
|
145
|
+
## Story Size Rule — When to Split
|
|
146
|
+
|
|
147
|
+
Split a story into two if it requires **all three** of the following:
|
|
148
|
+
- **3+ backend ACs** (API endpoint definition, DB schema/query, middleware logic)
|
|
149
|
+
- **2+ frontend ACs** (UI component, client-side state, loading/error handling)
|
|
150
|
+
- **1+ cross-cutting concern** (auth enforcement, audit logging, CSRF, rate limiting, token rotation)
|
|
151
|
+
|
|
152
|
+
**Split pattern:**
|
|
153
|
+
- `"{Feature} — Backend"` — API endpoints, data layer, middleware only
|
|
154
|
+
- `"{Feature} — Frontend"` — UI component, state management, client-side orchestration only
|
|
155
|
+
|
|
156
|
+
Cross-cutting concerns (rate limiting, audit logging, CSRF protection) that apply broadly across an epic belong either in Foundation or as a dedicated story — not embedded silently inside a full-stack story.
|
|
157
|
+
|
|
158
|
+
**Example — too wide (split this):**
|
|
159
|
+
> "Silent Session Refresh" covering: backend refresh endpoint + cookie rotation + CSRF validation + frontend interceptor + retry queue + redirect on expiry → **7 ACs across both layers**
|
|
160
|
+
|
|
161
|
+
**Split into:**
|
|
162
|
+
> "Silent Session Refresh — Backend": POST /api/auth/refresh, cookie rotation, CSRF check, revocation, error codes (3-4 ACs)
|
|
163
|
+
> "Silent Session Refresh — Frontend": axios interceptor, silent retry queue, redirect on 401, loading state (3-4 ACs)
|
|
164
|
+
|
|
165
|
+
**Example — acceptable full-stack (keep together):**
|
|
166
|
+
> "Land on the Daily Work View After Login": redirect after login, render dashboard shell, loading skeleton (2 backend ACs + 2 frontend ACs, no cross-cutting concerns) → **thin enough to stay as one story**
|
|
167
|
+
|
|
168
|
+
## Story Technical Context Inheritance
|
|
169
|
+
|
|
170
|
+
Child stories that implement part of an epic's cross-cutting design decisions **must restate**
|
|
171
|
+
the relevant technical choices explicitly — do not assume validators can see the epic description.
|
|
172
|
+
This is the single biggest reason validators score 82-88 instead of 95+ on auth/session/RBAC stories.
|
|
173
|
+
|
|
174
|
+
**Rules:**
|
|
175
|
+
- **Auth/session stories**: restate the revocation strategy chosen (e.g. "tokens issued before
|
|
176
|
+
`user.deactivated_at` are rejected with 401 SESSION_REVOKED") — even if the epic already defined it.
|
|
177
|
+
- **RBAC stories**: restate the authorization model inline (exact role names, what restricted callers
|
|
178
|
+
receive: 403 vs 404) — even if the Foundation Epic already defined it.
|
|
179
|
+
- **Cookie/token stories**: every story that reads or writes cookies must restate the full cookie
|
|
180
|
+
attributes (`httpOnly; SameSite=Strict; Secure; Path=/`) — not "as per the auth story".
|
|
181
|
+
- **CSRF stories**: restate which CSRF mitigation is in use (SameSite=Strict as sole protection?
|
|
182
|
+
double-submit cookie? Origin header check?) — each story must be self-contained.
|
|
183
|
+
- **Error contracts**: every story with an API endpoint must restate its own 422/400/401/403 error
|
|
184
|
+
shape — do not reference "the platform standard" without also writing the shape inline.
|
|
185
|
+
|
|
186
|
+
**Why:** Validators review stories in isolation. A cross-reference such as "see auth epic for cookie
|
|
187
|
+
policy" is unimplementable — the developer reading only this story has no context. Restate the
|
|
188
|
+
key decision in 1-2 sentences inside the relevant acceptance criterion.
|
|
189
|
+
|
|
190
|
+
**Example — BAD (validator scores 82):**
|
|
191
|
+
```
|
|
192
|
+
- Token rotation follows the approach defined in the Foundation Epic.
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
**Example — GOOD (validator scores 95+):**
|
|
196
|
+
```
|
|
197
|
+
- POST /api/auth/refresh rotates both cookies: new access_token (15-min JWT, httpOnly, SameSite=Strict,
|
|
198
|
+
Secure) and new refresh_token (7-day opaque token, same attributes); old refresh token is invalidated.
|
|
199
|
+
- Tokens issued before user.deactivated_at are rejected with 401 { error: "SESSION_REVOKED" }.
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
## Story Description Guidelines
|
|
203
|
+
|
|
204
|
+
**BAD story description:**
|
|
205
|
+
> "Allow users to authenticate with email/password"
|
|
206
|
+
|
|
207
|
+
**GOOD story description:**
|
|
208
|
+
> "Allow agents and admins to log in using email and password. The server issues a short-lived JWT access token (15 min) stored in an httpOnly cookie and a refresh token (7 days) for seamless session renewal. Failed attempts are rate-limited."
|
|
209
|
+
|
|
210
|
+
## Story API Contract Guidelines
|
|
211
|
+
|
|
212
|
+
Every story that exposes or consumes an API endpoint **must** include the following details
|
|
213
|
+
in its `acceptance` criteria. These are the most common first-pass failure reasons for the
|
|
214
|
+
solution-architect validator.
|
|
215
|
+
|
|
216
|
+
For **backend / API stories**, at minimum include:
|
|
217
|
+
- The endpoint path and HTTP method: `POST /api/customers`
|
|
218
|
+
- The success HTTP status code and key response fields
|
|
219
|
+
- At least one error scenario with its status code (400/401/403/404/409/422/429)
|
|
220
|
+
- The RBAC rule (which role: admin / agent / all users)
|
|
221
|
+
- Any critical field-level validation constraint (required, format, length)
|
|
222
|
+
|
|
223
|
+
**BAD acceptance criteria (too vague — solution-architect will score 74-78/100):**
|
|
224
|
+
```
|
|
225
|
+
- User can create a customer record
|
|
226
|
+
- System validates the input
|
|
227
|
+
- Duplicate phone numbers are rejected
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
**GOOD acceptance criteria (solution-architect will score 95+/100):**
|
|
231
|
+
```
|
|
232
|
+
- POST /api/customers (admin or agent) accepts { name, phone (E.164), email?, notes? }
|
|
233
|
+
and returns 201 { id, name, phone, createdAt }
|
|
234
|
+
- Phone must match E.164 regex (^\+[1-9]\d{1,14}$); invalid format returns 422
|
|
235
|
+
{ error: "INVALID_PHONE_FORMAT", field: "phone" }
|
|
236
|
+
- Duplicate phone returns 409 { error: "PHONE_ALREADY_EXISTS", conflictingCustomerId }
|
|
237
|
+
- Unauthenticated requests return 401; both admin and agent roles are permitted
|
|
238
|
+
- Name is required (max 100 chars); missing name returns 422 with field-level error details
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### Auth / Session Stories — Required Contract Details
|
|
242
|
+
|
|
243
|
+
Authentication and session stories **must** specify the auth contract precisely, matching what the Initial Scope describes. Validators score 74-82 when the contract is left implicit.
|
|
244
|
+
|
|
245
|
+
**Use the auth mechanism from the Initial Scope** — do NOT default to JWT if the scope says session-based.
|
|
246
|
+
|
|
247
|
+
Required ACs for auth stories:
|
|
248
|
+
- How the session/token is stored: httpOnly cookie, in-memory store, etc.
|
|
249
|
+
- Session lifetime and expiry behavior
|
|
250
|
+
- How RBAC middleware reads the role (session lookup vs JWT claims vs etc.)
|
|
251
|
+
- At least one error scenario (invalid credentials, expired session)
|
|
252
|
+
|
|
253
|
+
**GOOD auth AC example for session-based auth:**
|
|
254
|
+
```
|
|
255
|
+
- POST /api/auth/login accepts { email, password }; on success returns 200 and sets
|
|
256
|
+
httpOnly cookie named 'sessionId'; session stored server-side with { userId, role, expiresAt }
|
|
257
|
+
- Invalid credentials return 401 { error: "INVALID_CREDENTIALS" } — no user-enumeration
|
|
258
|
+
- GET /api/auth/session returns { userId, email, role } or 401 if session expired
|
|
259
|
+
- POST /api/auth/logout clears the sessionId cookie and removes session from server store
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
**GOOD auth AC example for JWT-based auth (only if scope says JWT):**
|
|
263
|
+
```
|
|
264
|
+
- POST /api/auth/login accepts { email, password }; on success returns 200 and sets
|
|
265
|
+
httpOnly cookie with JWT (claims: { sub, role, exp }); refresh token as separate httpOnly cookie
|
|
266
|
+
- Auth middleware on every protected route rejects expired tokens with 401
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
### Pagination Stories — Required Cursor Semantics
|
|
270
|
+
|
|
271
|
+
Any story that returns a paginated list **must** define cursor semantics precisely.
|
|
272
|
+
Vague pagination is the #1 reason `api` and `database` validators score 86-88.
|
|
273
|
+
|
|
274
|
+
Required details:
|
|
275
|
+
- Cursor field: what value the cursor encodes (e.g. `id` or `createdAt + id` for stable sort)
|
|
276
|
+
- Default and maximum page size (e.g. `default=20, max=100`)
|
|
277
|
+
- Response shape: `{ data: [...], nextCursor: string|null, total?: number }`
|
|
278
|
+
- Stable sort: define the field(s) that guarantee consistent ordering across pages
|
|
279
|
+
- Cursor field: what value the cursor encodes (e.g. `id` or `createdAt + id` for stable sort)
|
|
280
|
+
- Default and maximum page size (e.g. `default=20, max=100`)
|
|
281
|
+
- **Malformed limit/offset behavior**: `limit=abc` or `limit=0` or `limit=999` → `400 { error: "INVALID_PARAMETER", field: "limit" }`
|
|
282
|
+
- Response shape: `{ data: [...], nextCursor: string|null, total?: number }`
|
|
283
|
+
- Stable sort: define the field(s) that guarantee consistent ordering across pages
|
|
284
|
+
- Edge case: what happens when `cursor` is invalid/expired → `422 { error: "INVALID_CURSOR" }`
|
|
285
|
+
|
|
286
|
+
**GOOD pagination AC example:**
|
|
287
|
+
```
|
|
288
|
+
- GET /api/customers?q=&cursor=&limit= (admin or staff); limit default=20 max=100
|
|
289
|
+
- limit must be 1–100; non-integer or out-of-range returns 400 { error: "INVALID_PARAMETER", field: "limit" }
|
|
290
|
+
- Response: 200 { data: [{ id, name, phone, email }], nextCursor: string|null }
|
|
291
|
+
- Cursor encodes the last record's (createdAt, id) pair (opaque, base64); stable sort is
|
|
292
|
+
createdAt DESC, id DESC so inserts between pages don't cause row skips
|
|
293
|
+
- Invalid or tampered cursor returns 422 { error: "INVALID_CURSOR" }
|
|
294
|
+
- Empty result returns 200 { data: [], nextCursor: null }
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
### Authorization — Explicit Role Conditions
|
|
298
|
+
|
|
299
|
+
Never write "admin or permitted staff" — validators flag this as unimplementable.
|
|
300
|
+
Always specify the **exact** authorization rule:
|
|
301
|
+
|
|
302
|
+
| Vague (scores 82-86) | Precise (scores 95+) |
|
|
303
|
+
|----------------------|----------------------|
|
|
304
|
+
| "admin or permitted staff" | "admin role, or staff role where the customer was created by or assigned to that user" |
|
|
305
|
+
| "authenticated users" | "any authenticated user (admin or staff); unauthenticated returns 401" |
|
|
306
|
+
| "only authorized roles" | "admin role only; staff returns 403 { error: 'FORBIDDEN' }" |
|
|
307
|
+
| "users with access" | "staff can access their own records only; admin can access any record; cross-staff access returns 403" |
|
|
308
|
+
|
|
309
|
+
Every story with an authorization rule must include:
|
|
310
|
+
- Which role(s) can call the endpoint (admin / staff / all authenticated / public)
|
|
311
|
+
- What restricted callers receive: `403 { error: "FORBIDDEN" }` or `404` (when existence must be hidden)
|
|
312
|
+
- Whether unauthenticated callers get `401` or `404`
|
|
313
|
+
|
|
314
|
+
### Audit Events — Testable Event Contract
|
|
315
|
+
|
|
316
|
+
If a story logs audit events (login, deactivation, role change, invitation), the QA validator scores 82-86 unless the event contract is testable. Required ACs when audit logging is mentioned:
|
|
317
|
+
- What event type/name is emitted: e.g. `user.deactivated`
|
|
318
|
+
- What fields are included: e.g. `{ actorId, targetUserId, deactivatedAt, reason? }`
|
|
319
|
+
- What fields are EXCLUDED: e.g. "must not include password hash, refresh token, or raw JWT"
|
|
320
|
+
|
|
321
|
+
**GOOD audit AC example:**
|
|
322
|
+
```
|
|
323
|
+
- On successful deactivation, emit audit event `user.deactivated` with fields { actorId, targetUserId, deactivatedAt }; the event must not include any session tokens, password hash, or PII beyond the user ID
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
### Admin Resource Management — Self-Modification Protection
|
|
327
|
+
|
|
328
|
+
Any story that lets an admin manage users/roles **must** include a self-modification guard:
|
|
329
|
+
- Admin cannot change their own role: `PATCH /api/users/:id/role` where `:id === req.user.id` → `403 { error: "CANNOT_MODIFY_SELF" }`
|
|
330
|
+
- Admin cannot deactivate themselves: same pattern with `403 { error: "CANNOT_DEACTIVATE_SELF" }`
|
|
331
|
+
|
|
332
|
+
Without this AC, `developer` and `security` validators score 84-86 instead of 95+.
|
|
333
|
+
|
|
334
|
+
**GOOD self-modification AC example:**
|
|
335
|
+
```
|
|
336
|
+
- Admin cannot change their own role; PUT /api/users/:id/role where :id matches the authenticated
|
|
337
|
+
user's id returns 403 { error: "CANNOT_MODIFY_SELF" } to prevent accidental privilege loss
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
### Frontend State Management — Cache Invalidation Timing
|
|
341
|
+
|
|
342
|
+
Any story with a write operation (create, update, delete) that also shows a list **must** specify cache invalidation behavior:
|
|
343
|
+
- When the cache is cleared: "after server confirms the mutation (200/201/204)"
|
|
344
|
+
- Whether optimistic updates are used: "UI updates immediately; reverts on error"
|
|
345
|
+
- OR pessimistic: "list refetches only after server confirms success"
|
|
346
|
+
|
|
347
|
+
**GOOD cache AC example:**
|
|
348
|
+
```
|
|
349
|
+
- After a successful role change (200 response), the team member list cache is invalidated
|
|
350
|
+
and the list refetches to reflect the new role; in-flight role change is shown with a
|
|
351
|
+
loading indicator and the row is disabled until the response returns
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
### Frontend Error State Coverage for Write Operations
|
|
355
|
+
|
|
356
|
+
Stories with write operations (create, update, delete) must specify frontend behavior for non-happy-path responses **beyond** the universal app-level handling (401 → login redirect, 500 → generic toast). Validators score 84-86 when only 200 and 401 are covered.
|
|
357
|
+
|
|
358
|
+
Required error states per write story:
|
|
359
|
+
- **403 Forbidden**: show an in-context error message (not just a generic toast) stating what permission is missing
|
|
360
|
+
- **422/400 Validation error**: map each returned field error to the specific input's inline error message
|
|
361
|
+
- **Conflict/404**: e.g., "if item was already deleted, show a stale-row warning and remove from list"
|
|
362
|
+
|
|
363
|
+
**GOOD error state AC example (write operation):**
|
|
364
|
+
```
|
|
365
|
+
- On 403 FORBIDDEN (e.g., staff attempting admin action), show an inline error banner
|
|
366
|
+
"You do not have permission for this action" within the current view without navigation
|
|
367
|
+
- On 422 validation failure, map each error code to the corresponding field's inline error
|
|
368
|
+
message; the submit button re-enables and focus returns to the first errored field
|
|
369
|
+
- On unexpected error (500/network), show a dismissable toast "Action failed — try again"
|
|
370
|
+
and re-enable the submit button so the user can retry
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
## Frontend Layer Guidelines
|
|
374
|
+
|
|
375
|
+
If the project has a user-facing UI, any epic that covers UI functionality **must** include
|
|
376
|
+
a frontend layer description. Omitting this causes the frontend validator to score 58/100.
|
|
377
|
+
|
|
378
|
+
Include in the epic `description` (add as a final sentence or two):
|
|
379
|
+
- UI framework/library (React, Vue, etc.)
|
|
380
|
+
- State management (TanStack Query for server state, Zustand/Redux for local state)
|
|
381
|
+
- Key UI components (table, form, modal, drawer)
|
|
382
|
+
- Loading and error state strategy (skeleton loaders, toast notifications, inline errors)
|
|
383
|
+
- Accessibility standard if applicable (WCAG 2.1 AA)
|
|
384
|
+
|
|
385
|
+
**BAD epic description (backend-only — frontend validator will score 58/100):**
|
|
386
|
+
> "Customer records are stored in the database. REST API exposes CRUD endpoints."
|
|
387
|
+
|
|
388
|
+
**GOOD epic description (full-stack — frontend validator will score 95+/100):**
|
|
389
|
+
> "Customer records stored in [project's DB] with cursor-based pagination and full-text search.
|
|
390
|
+
> REST API exposes CRUD endpoints with RBAC. The React UI uses TanStack Query for data
|
|
391
|
+
> fetching, Zustand for selection state, and a virtualized data table with search/filter.
|
|
392
|
+
> Forms include inline validation. All async operations show skeleton loaders; errors surface
|
|
393
|
+
> as toast notifications. WCAG 2.1 AA compliance for interactive controls."
|
|
394
|
+
|
|
395
|
+
Note: Replace `[project's DB]` with the actual database from the Initial Scope (MySQL, SQLite, etc.).
|
|
396
|
+
|
|
397
|
+
## Dependency Strategy
|
|
398
|
+
|
|
399
|
+
**Epic-level:**
|
|
400
|
+
- Foundation Epic: no dependencies
|
|
401
|
+
- Domain Epics: depend only on Foundation
|
|
402
|
+
- Integration Epic (if needed): depends on Domain Epics
|
|
403
|
+
|
|
404
|
+
**Story-level:**
|
|
405
|
+
- Dependencies form DAG (Directed Acyclic Graph), not linear chain
|
|
406
|
+
- Sibling Stories under different parents can run in parallel
|
|
407
|
+
|
|
408
|
+
## Duplicate Detection
|
|
409
|
+
|
|
410
|
+
When existing Epics/Stories are provided in the prompt:
|
|
411
|
+
- Check if Epic name matches existing (case-insensitive)
|
|
412
|
+
- Check if Story name matches existing (case-insensitive)
|
|
413
|
+
- **Skip** any Epic or Story that already exists
|
|
414
|
+
- Only generate **NEW** Epics and Stories
|
|
415
|
+
|
|
416
|
+
Example prompt will include:
|
|
417
|
+
```
|
|
418
|
+
Existing Epics: user management, payment processing
|
|
419
|
+
Existing Stories: user registration, login, checkout
|
|
420
|
+
|
|
421
|
+
Generate NEW Epics and Stories. Do not duplicate existing ones.
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
Generate only Epics/Stories that are NOT in the existing lists.
|
|
425
|
+
|
|
426
|
+
## Output Format
|
|
427
|
+
|
|
428
|
+
Return JSON with this exact structure:
|
|
429
|
+
|
|
430
|
+
```json
|
|
431
|
+
{
|
|
432
|
+
"epics": [
|
|
433
|
+
{
|
|
434
|
+
"id": "context-0001",
|
|
435
|
+
"name": "Foundation Services",
|
|
436
|
+
"domain": "infrastructure",
|
|
437
|
+
"description": "Session-based authentication (httpOnly cookies, server-side store) with RBAC enforcement via Express middleware — three roles: admin (full access), agent (scoped to assigned resources), viewer (read-only). Rate limiting via express-rate-limit on all API routes. Security headers and input sanitization. Audit logging for auth events and profile changes.",
|
|
438
|
+
"features": [
|
|
439
|
+
"session-authentication (httpOnly cookies, server-side session store)",
|
|
440
|
+
"rbac-authorization (admin/agent/viewer roles, enforced on all API routes)",
|
|
441
|
+
"rate-limiting (express-rate-limit on all /api/* and webhook endpoints)",
|
|
442
|
+
"security-headers (X-Frame-Options, Content-Security-Policy)",
|
|
443
|
+
"audit-logging (auth events: login, logout, profile changes with actorId)",
|
|
444
|
+
"input-sanitization (HTML escaping, type validation, command injection prevention)"
|
|
445
|
+
],
|
|
446
|
+
"dependencies": [],
|
|
447
|
+
"stories": [
|
|
448
|
+
{
|
|
449
|
+
"id": "context-0001-0001",
|
|
450
|
+
"name": "Email and Password Login with Session Cookies",
|
|
451
|
+
"userType": "agents and admins",
|
|
452
|
+
"description": "Allow agents and admins to log in using email and password credentials. The server validates credentials and issues an httpOnly session cookie. Failed attempts are rate-limited per IP.",
|
|
453
|
+
"acceptance": [
|
|
454
|
+
"POST /api/auth/login accepts { email, password }; on success returns 200 and sets httpOnly session cookie",
|
|
455
|
+
"Invalid credentials return 401 { error: 'INVALID_CREDENTIALS' } — no user enumeration",
|
|
456
|
+
"GET /api/auth/session returns current user (userId, role) or 401 if session expired",
|
|
457
|
+
"POST /api/auth/logout clears session cookie and invalidates server-side session",
|
|
458
|
+
"Successful login emits audit event with timestamp and IP address"
|
|
459
|
+
],
|
|
460
|
+
"dependencies": []
|
|
461
|
+
},
|
|
462
|
+
{
|
|
463
|
+
"id": "context-0001-0002",
|
|
464
|
+
"name": "Role-Based Access Control Enforcement",
|
|
465
|
+
"userType": "all authenticated users",
|
|
466
|
+
"description": "Enforce role-based permissions on every API route via Express middleware. Roles: admin (full access), agent (scoped to assigned resources), viewer (read-only). Checks session role on each request.",
|
|
467
|
+
"acceptance": [
|
|
468
|
+
"Every protected API route rejects requests without a valid session with 401 { error: 'UNAUTHORIZED' }",
|
|
469
|
+
"Agent role can only access assigned customers/appointments; cross-scope returns 403 { error: 'FORBIDDEN' }",
|
|
470
|
+
"Admin role can access all endpoints; no scoping applied",
|
|
471
|
+
"Viewer role can only read; write attempts return 403 { error: 'FORBIDDEN' }",
|
|
472
|
+
"Unauthorized access attempts are logged with user ID, route, and timestamp"
|
|
473
|
+
],
|
|
474
|
+
"dependencies": ["context-0001-0001"]
|
|
475
|
+
}
|
|
476
|
+
]
|
|
477
|
+
}
|
|
478
|
+
],
|
|
479
|
+
"validation": {
|
|
480
|
+
"epicCount": 4,
|
|
481
|
+
"storyCount": 15,
|
|
482
|
+
"dependencyGraphValid": true,
|
|
483
|
+
"allFeaturesMapped": true
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
## Epic ID Format
|
|
489
|
+
|
|
490
|
+
Use sequential numbering:
|
|
491
|
+
- First Epic: `context-0001`
|
|
492
|
+
- Second Epic: `context-0002`
|
|
493
|
+
- Third Epic: `context-0003`
|
|
494
|
+
- etc.
|
|
495
|
+
|
|
496
|
+
## Story ID Format
|
|
497
|
+
|
|
498
|
+
Use Epic ID + sequential number:
|
|
499
|
+
- Epic 1, Story 1: `context-0001-0001`
|
|
500
|
+
- Epic 1, Story 2: `context-0001-0002`
|
|
501
|
+
- Epic 2, Story 1: `context-0002-0001`
|
|
502
|
+
- etc.
|
|
503
|
+
|
|
504
|
+
## Validation Checklist
|
|
505
|
+
|
|
506
|
+
Before returning, verify:
|
|
507
|
+
- [ ] **COVERAGE**: Every feature, UI screen, integration, and infrastructure item mentioned in the Initial Scope has at least one Story. Scan every section of the scope document to verify nothing was skipped — especially UI/UX requirements, security measures, and infrastructure setup.
|
|
508
|
+
- [ ] **SOURCE FIDELITY**: Every technology, auth mechanism, database, and framework in your output matches what the Initial Scope says — no substitutions, no upgrades, no invented features.
|
|
509
|
+
- [ ] Each Epic covers a cohesive domain (not artificially merged to reduce count)
|
|
510
|
+
- [ ] Each Story covers a single cohesive capability (3-8 ACs)
|
|
511
|
+
- [ ] No story combines 3+ backend ACs + 2+ frontend ACs + a cross-cutting concern — split those
|
|
512
|
+
- [ ] All features from Initial Scope are mapped to Stories
|
|
513
|
+
- [ ] Dependency graph is acyclic (no circular dependencies)
|
|
514
|
+
- [ ] Foundation Epic (if created) has no dependencies
|
|
515
|
+
- [ ] Story acceptance criteria are concrete and testable
|
|
516
|
+
- [ ] Epic names are clear and domain-focused
|
|
517
|
+
- [ ] Story names describe user-facing capability
|
|
518
|
+
- [ ] Each Epic description is 2-5 sentences and includes technical approach
|
|
519
|
+
- [ ] Each feature string includes a technical detail in parentheses
|
|
520
|
+
- [ ] Story descriptions specify user type, action, and key technical method
|
|
521
|
+
- [ ] API-facing stories include endpoint path + HTTP method in at least one AC
|
|
522
|
+
- [ ] API-facing stories include at least one error scenario with status code in AC
|
|
523
|
+
- [ ] API-facing stories state which role (admin/agent/all) can call the endpoint — no vague phrases like "permitted users"
|
|
524
|
+
- [ ] Auth/session stories specify cookie attributes (httpOnly, SameSite, Secure), token lifetime, JWT claims, and revocation condition
|
|
525
|
+
- [ ] Paginated-list stories define cursor semantics, default/max limit, stable sort, invalid-cursor error, AND malformed limit parameter → 400 error
|
|
526
|
+
- [ ] Authorization ACs state the exact role check and what restricted roles receive (403 vs 404)
|
|
527
|
+
- [ ] Admin user-management stories include self-modification guard (admin cannot change their own role/status)
|
|
528
|
+
- [ ] Stories with write + list operations specify cache invalidation timing (optimistic or pessimistic, when list refetches)
|
|
529
|
+
- [ ] All technology names (database, ORM, framework) match the Initial Scope — no PostgreSQL if scope says MySQL
|
|
530
|
+
- [ ] Full-stack epics include a frontend layer description (framework, state mgmt, key components)
|
|
531
|
+
- [ ] Auth/session stories restate the revocation strategy inline (not "as per auth epic")
|
|
532
|
+
- [ ] RBAC stories restate the authorization model (exact role names + what restricted callers receive)
|
|
533
|
+
- [ ] Cookie-handling stories restate full cookie attributes (httpOnly, SameSite, Secure, Path) inline
|
|
534
|
+
- [ ] No story uses "as defined in [epic/sibling story]" without also restating the key technical decision
|
|
535
|
+
|
|
536
|
+
## Example Domain Patterns
|
|
537
|
+
|
|
538
|
+
**E-commerce:**
|
|
539
|
+
- Foundation (auth, logging)
|
|
540
|
+
- User Management (registration, profiles)
|
|
541
|
+
- Product Catalog (listing, search)
|
|
542
|
+
- Shopping Cart (add, remove, checkout)
|
|
543
|
+
- Order Processing (payment, tracking)
|
|
544
|
+
|
|
545
|
+
**SaaS Application:**
|
|
546
|
+
- Foundation (auth, logging)
|
|
547
|
+
- User Management (registration, teams)
|
|
548
|
+
- Workspace Management (create, share)
|
|
549
|
+
- Content Management (create, edit, publish)
|
|
550
|
+
- Analytics (usage, reports)
|
|
551
|
+
|
|
552
|
+
**Internal Tool:**
|
|
553
|
+
- Foundation (auth, logging)
|
|
554
|
+
- Dashboard (overview, metrics)
|
|
555
|
+
- Data Management (import, export)
|
|
556
|
+
- Reporting (generate, schedule)
|
|
557
|
+
- Admin Panel (users, settings)
|
|
558
|
+
|
|
559
|
+
Use these patterns as inspiration but adapt to the specific project scope.
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Feature Context Generator
|
|
2
|
+
|
|
3
|
+
## Role
|
|
4
|
+
|
|
5
|
+
You are an expert technical writer specializing in implementation-ready documentation. Your task is to generate a focused `context.md` file for a Task or Subtask that gives a developer or AI agent everything they need to implement the work item without asking any further questions.
|
|
6
|
+
|
|
7
|
+
## Core Principle
|
|
8
|
+
|
|
9
|
+
A `context.md` file is the **single source of truth** for implementing a specific Task or Subtask. It distills information from the full hierarchy (project → epic → story → task → subtask) into a focused, actionable document. Developers should be able to read only this file and implement the item correctly.
|
|
10
|
+
|
|
11
|
+
## What to Include
|
|
12
|
+
|
|
13
|
+
### For Tasks
|
|
14
|
+
|
|
15
|
+
A Task is a technical component of a Story (e.g., "Backend API", "Database schema", "Frontend component"). The context.md must include:
|
|
16
|
+
|
|
17
|
+
1. **Purpose** — One paragraph explaining what this task builds and why it exists within the story
|
|
18
|
+
2. **Technical Scope** — What systems, layers, or files this task touches
|
|
19
|
+
3. **Implementation Requirements** — Specific technical constraints from the story and epic:
|
|
20
|
+
- API endpoint signatures (method, path, request/response schema)
|
|
21
|
+
- Database tables and field names involved
|
|
22
|
+
- Authentication/authorization rules
|
|
23
|
+
- Business logic rules that apply
|
|
24
|
+
- Error scenarios and their HTTP codes or error messages
|
|
25
|
+
4. **Acceptance Criteria** — The task's specific acceptance criteria, reformatted for implementation clarity
|
|
26
|
+
5. **Dependencies** — Other tasks this task depends on (by name and ID)
|
|
27
|
+
6. **Integration Points** — How this task connects to other systems (other tasks in the story, external services)
|
|
28
|
+
7. **Implementation Hints** — Known patterns, libraries, or approaches relevant to this tech stack
|
|
29
|
+
|
|
30
|
+
### For Subtasks
|
|
31
|
+
|
|
32
|
+
A Subtask is an atomic unit of work (1–4 hours) derived from a Task. The context.md must include:
|
|
33
|
+
|
|
34
|
+
1. **Purpose** — One sentence: what exactly this subtask implements
|
|
35
|
+
2. **Implementation Detail** — Step-by-step what to build:
|
|
36
|
+
- Specific functions/methods to write
|
|
37
|
+
- Exact field names, endpoint paths, table columns
|
|
38
|
+
- Configuration values or constants to set
|
|
39
|
+
- Files to create or modify
|
|
40
|
+
3. **Acceptance Criteria** — The subtask's acceptance criteria, made concrete
|
|
41
|
+
4. **Definition of Done** — Checklist of verifiable completion criteria
|
|
42
|
+
5. **Context from Parent Task** — A brief summary of the parent task's scope so the developer has orientation
|
|
43
|
+
|
|
44
|
+
## Output Format
|
|
45
|
+
|
|
46
|
+
Return JSON with exactly two fields:
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"contextMarkdown": "# Task Name\n\n...",
|
|
51
|
+
"tokenCount": 800
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
- `contextMarkdown`: The complete context.md content as a markdown string. Escape all double quotes as `\"`, all newlines as `\n`, all backslashes as `\\`.
|
|
56
|
+
- `tokenCount`: Estimated token count of the `contextMarkdown` content (approximate: characters ÷ 4, rounded to nearest 50).
|
|
57
|
+
|
|
58
|
+
## Quality Standards
|
|
59
|
+
|
|
60
|
+
The context.md is **implementation-ready** when a developer can answer YES to all of these:
|
|
61
|
+
|
|
62
|
+
- [ ] I know exactly which files to create or modify
|
|
63
|
+
- [ ] I know the exact API request/response structure (if applicable)
|
|
64
|
+
- [ ] I know which database tables and columns to use (if applicable)
|
|
65
|
+
- [ ] I know all the business rules I must enforce
|
|
66
|
+
- [ ] I know all the error cases and how to handle them
|
|
67
|
+
- [ ] I know the acceptance criteria and can write a test for each one
|
|
68
|
+
|
|
69
|
+
If you cannot fill in specific details from the provided context, use explicit placeholders like `{TABLE_NAME}` or `{ENDPOINT_PATH}` rather than vague statements — this signals to the developer what they need to clarify.
|
|
70
|
+
|
|
71
|
+
## Example Output
|
|
72
|
+
|
|
73
|
+
**Input (task):**
|
|
74
|
+
```
|
|
75
|
+
Task: Backend API — User Login
|
|
76
|
+
Story: User can log in with email and password
|
|
77
|
+
Story Acceptance Criteria:
|
|
78
|
+
- POST /auth/login returns JWT on valid credentials
|
|
79
|
+
- Returns 401 on wrong password, 404 on unknown email
|
|
80
|
+
- Rate limited to 10 attempts per 15 minutes per IP
|
|
81
|
+
Epic: Authentication & Access Control
|
|
82
|
+
Tech stack: Node.js/Express, PostgreSQL, Redis
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**Output:**
|
|
86
|
+
```json
|
|
87
|
+
{
|
|
88
|
+
"contextMarkdown": "# Backend API — User Login\n\nImplements the Express route and business logic for email/password authentication, returning a signed JWT on success.\n\n## Technical Scope\n\nTouches: `src/routes/auth.js`, `src/services/AuthService.js`, `src/middleware/rateLimiter.js`\n\n## API Contract\n\n**POST /auth/login**\n\nRequest:\n```json\n{ \"email\": \"string\", \"password\": \"string\" }\n```\nResponse (200):\n```json\n{ \"token\": \"<jwt>\", \"expiresIn\": 3600 }\n```\n\n**Error Responses:**\n| Status | Body | Condition |\n|--------|------|-----------|\n| 401 | `{\"error\":\"Invalid credentials\"}` | Wrong password |\n| 404 | `{\"error\":\"User not found\"}` | Unknown email |\n| 429 | `{\"error\":\"Too many attempts\"}` | Rate limit exceeded |\n\n## Database\n\nTable: `users` — fields: `id`, `email`, `password_hash` (bcrypt, cost 12), `is_locked`, `failed_attempts`\n\n## Rate Limiting\n\nRedis key: `ratelimit:login:{ip}` — max 10 requests per 900s sliding window. Use `express-rate-limit` with Redis store.\n\n## Business Rules\n\n1. Compare password with `bcrypt.compare()` — never store or log plain text\n2. Increment `failed_attempts` on wrong password; lock account after 5\n3. JWT payload: `{ sub: user.id, email: user.email, role: user.role }`, signed with `JWT_SECRET`, TTL 1h\n\n## Acceptance Criteria\n\n- [ ] POST /auth/login returns 200 + JWT for valid credentials\n- [ ] Returns 401 for wrong password (do not reveal which field is wrong)\n- [ ] Returns 404 only if email does not exist in DB\n- [ ] Rate limit: 11th request within 15 min → 429\n- [ ] Timing-safe comparison (use constant-time bcrypt, no early exit)\n",
|
|
89
|
+
"tokenCount": 450
|
|
90
|
+
}
|
|
91
|
+
```
|