sumulige-claude 1.1.2 → 1.2.0

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 (102) hide show
  1. package/.claude/hooks/code-formatter.cjs +7 -2
  2. package/.claude/hooks/multi-session.cjs +9 -3
  3. package/.claude/hooks/pre-commit.cjs +0 -0
  4. package/.claude/hooks/pre-push.cjs +0 -0
  5. package/.claude/hooks/project-kickoff.cjs +22 -11
  6. package/.claude/hooks/rag-skill-loader.cjs +7 -0
  7. package/.claude/hooks/thinking-silent.cjs +9 -3
  8. package/.claude/hooks/todo-manager.cjs +19 -13
  9. package/.claude/hooks/verify-work.cjs +10 -4
  10. package/.claude/quality-gate.json +9 -3
  11. package/.claude/settings.local.json +16 -1
  12. package/.claude/templates/hooks/README.md +302 -0
  13. package/.claude/templates/hooks/hook.sh.template +94 -0
  14. package/.claude/templates/hooks/user-prompt-submit.cjs.template +116 -0
  15. package/.claude/templates/hooks/user-response-submit.cjs.template +94 -0
  16. package/.claude/templates/hooks/validate.js +173 -0
  17. package/.claude/workflow/document-scanner.js +426 -0
  18. package/.claude/workflow/knowledge-engine.js +941 -0
  19. package/.claude/workflow/notebooklm/browser.js +1028 -0
  20. package/.claude/workflow/phases/phase1-research.js +578 -0
  21. package/.claude/workflow/phases/phase1-research.ts +465 -0
  22. package/.claude/workflow/phases/phase2-approve.js +722 -0
  23. package/.claude/workflow/phases/phase3-plan.js +1200 -0
  24. package/.claude/workflow/phases/phase4-develop.js +894 -0
  25. package/.claude/workflow/search-cache.js +230 -0
  26. package/.claude/workflow/templates/approval.md +315 -0
  27. package/.claude/workflow/templates/development.md +377 -0
  28. package/.claude/workflow/templates/planning.md +328 -0
  29. package/.claude/workflow/templates/research.md +250 -0
  30. package/.claude/workflow/types.js +37 -0
  31. package/.claude/workflow/web-search.js +278 -0
  32. package/.claude-plugin/marketplace.json +2 -2
  33. package/AGENTS.md +176 -0
  34. package/CHANGELOG.md +7 -14
  35. package/cli.js +20 -0
  36. package/config/quality-gate.json +9 -3
  37. package/development/cache/web-search/search_1193d605f8eb364651fc2f2041b58a31.json +36 -0
  38. package/development/cache/web-search/search_3798bf06960edc125f744a1abb5b72c5.json +36 -0
  39. package/development/cache/web-search/search_37c7d4843a53f0d83f1122a6f908a2a3.json +36 -0
  40. package/development/cache/web-search/search_44166fa0153709ee168485a22aa0ab40.json +36 -0
  41. package/development/cache/web-search/search_4deaebb1f77e86a8ca066dc5a49c59fd.json +36 -0
  42. package/development/cache/web-search/search_94da91789466070a7f545612e73c7372.json +36 -0
  43. package/development/cache/web-search/search_dd5de8491b8b803a3cb01339cd210fb0.json +36 -0
  44. package/development/knowledge-base/.index.clean.json +0 -0
  45. package/development/knowledge-base/.index.json +486 -0
  46. package/development/knowledge-base/test-best-practices.md +29 -0
  47. package/development/projects/proj_mkh1pazz_ixmt1/phase1/feasibility-report.md +160 -0
  48. package/development/projects/proj_mkh4jvnb_z7rwf/phase1/feasibility-report.md +160 -0
  49. package/development/projects/proj_mkh4jxkd_ewz5a/phase1/feasibility-report.md +160 -0
  50. package/development/projects/proj_mkh4k84n_ni73k/phase1/feasibility-report.md +160 -0
  51. package/development/projects/proj_mkh4wfyd_u9w88/phase1/feasibility-report.md +160 -0
  52. package/development/projects/proj_mkh4wsbo_iahvf/development/projects/proj_mkh4xbpg_4na5w/phase1/feasibility-report.md +160 -0
  53. package/development/projects/proj_mkh4wsbo_iahvf/phase1/feasibility-report.md +160 -0
  54. package/development/projects/proj_mkh4xulg_1ka8x/phase1/feasibility-report.md +160 -0
  55. package/development/projects/proj_mkh4xwhj_gch8j/phase1/feasibility-report.md +160 -0
  56. package/development/projects/proj_mkh4y2qk_9lm8z/phase1/feasibility-report.md +160 -0
  57. package/development/projects/proj_mkh4y2qk_9lm8z/phase2/requirements.md +226 -0
  58. package/development/projects/proj_mkh4y2qk_9lm8z/phase3/PRD.md +345 -0
  59. package/development/projects/proj_mkh4y2qk_9lm8z/phase3/TASK_PLAN.md +284 -0
  60. package/development/projects/proj_mkh4y2qk_9lm8z/phase3/prototype/README.md +14 -0
  61. package/development/projects/proj_mkh4y2qk_9lm8z/phase4/DEVELOPMENT_LOG.md +35 -0
  62. package/development/projects/proj_mkh4y2qk_9lm8z/phase4/TASKS.md +34 -0
  63. package/development/projects/proj_mkh4y2qk_9lm8z/phase4/source/.env.example +5 -0
  64. package/development/projects/proj_mkh4y2qk_9lm8z/phase4/source/README.md +60 -0
  65. package/development/projects/proj_mkh4y2qk_9lm8z/phase4/source/package.json +25 -0
  66. package/development/projects/proj_mkh4y2qk_9lm8z/phase4/source/src/index.js +70 -0
  67. package/development/projects/proj_mkh4y2qk_9lm8z/phase4/source/src/routes/index.js +48 -0
  68. package/development/projects/proj_mkh4y2qk_9lm8z/phase4/source/tests/health.test.js +20 -0
  69. package/development/projects/proj_mkh4y2qk_9lm8z/phase4/source/tests/jest.config.js +21 -0
  70. package/development/projects/proj_mkh7veqg_3lypc/phase1/feasibility-report.md +160 -0
  71. package/development/projects/proj_mkh7veqg_3lypc/phase2/requirements.md +226 -0
  72. package/development/projects/proj_mkh7veqg_3lypc/phase3/PRD.md +345 -0
  73. package/development/projects/proj_mkh7veqg_3lypc/phase3/TASK_PLAN.md +284 -0
  74. package/development/projects/proj_mkh7veqg_3lypc/phase3/prototype/README.md +14 -0
  75. package/development/projects/proj_mkh8k8fo_rmqn5/phase1/feasibility-report.md +160 -0
  76. package/development/projects/proj_mkh8xyhy_1vshq/phase1/feasibility-report.md +178 -0
  77. package/development/projects/proj_mkh8zddd_dhamf/phase1/feasibility-report.md +377 -0
  78. package/development/projects/proj_mkh8zddd_dhamf/phase2/requirements.md +442 -0
  79. package/development/projects/proj_mkh8zddd_dhamf/phase3/api-design.md +800 -0
  80. package/development/projects/proj_mkh8zddd_dhamf/phase3/architecture.md +625 -0
  81. package/development/projects/proj_mkh8zddd_dhamf/phase3/data-model.md +830 -0
  82. package/development/projects/proj_mkh8zddd_dhamf/phase3/risks.md +957 -0
  83. package/development/projects/proj_mkh8zddd_dhamf/phase3/wbs.md +381 -0
  84. package/development/todos/.state.json +14 -1
  85. package/development/todos/INDEX.md +31 -73
  86. package/development/todos/completed/develop/local-knowledge-index.md +85 -0
  87. package/development/todos/{active → completed/develop}/todo-system.md +13 -3
  88. package/development/todos/completed/develop/web-search-integration.md +83 -0
  89. package/development/todos/completed/test/phase1-e2e-test.md +103 -0
  90. package/lib/commands.js +388 -0
  91. package/package.json +3 -2
  92. package/tests/config-manager.test.js +677 -0
  93. package/tests/config-validator.test.js +436 -0
  94. package/tests/errors.test.js +477 -0
  95. package/tests/manual/phase1-e2e.sh +389 -0
  96. package/tests/manual/phase2-test-cases.md +311 -0
  97. package/tests/manual/phase3-test-cases.md +309 -0
  98. package/tests/manual/phase4-test-cases.md +414 -0
  99. package/tests/manual/test-cases.md +417 -0
  100. package/tests/quality-gate.test.js +679 -0
  101. package/tests/quality-rules.test.js +619 -0
  102. package/tests/version-check.test.js +75 -0
@@ -0,0 +1,230 @@
1
+ /**
2
+ * Search Result Cache
3
+ *
4
+ * Caches web search results to avoid redundant API calls
5
+ * and improve performance for repeated queries.
6
+ */
7
+
8
+ const fs = require('fs');
9
+ const path = require('path');
10
+ const crypto = require('crypto');
11
+
12
+ // ============================================================================
13
+ // Configuration
14
+ // ============================================================================
15
+
16
+ const CACHE_DIR = path.join(process.cwd(), 'development/cache/web-search');
17
+ const CACHE_TTL = 24 * 60 * 60 * 1000; // 24 hours in milliseconds
18
+
19
+ // ============================================================================
20
+ // Search Cache Class
21
+ // ============================================================================
22
+
23
+ class SearchCache {
24
+ /**
25
+ * Ensure cache directory exists
26
+ */
27
+ static ensureCacheDir() {
28
+ if (!fs.existsSync(CACHE_DIR)) {
29
+ fs.mkdirSync(CACHE_DIR, { recursive: true });
30
+ }
31
+ }
32
+
33
+ /**
34
+ * Generate cache key from query
35
+ */
36
+ static getCacheKey(query) {
37
+ const hash = crypto
38
+ .createHash('md5')
39
+ .update(query.toLowerCase().trim())
40
+ .digest('hex');
41
+ return `search_${hash}.json`;
42
+ }
43
+
44
+ /**
45
+ * Get cache file path for a query
46
+ */
47
+ static getCachePath(query) {
48
+ this.ensureCacheDir();
49
+ const key = this.getCacheKey(query);
50
+ return path.join(CACHE_DIR, key);
51
+ }
52
+
53
+ /**
54
+ * Check if cached result is still valid
55
+ */
56
+ static isValid(cachedResult) {
57
+ if (!cachedResult || !cachedResult.timestamp) return false;
58
+ const age = Date.now() - cachedResult.timestamp;
59
+ return age < CACHE_TTL;
60
+ }
61
+
62
+ /**
63
+ * Get cached results for a query
64
+ */
65
+ static get(query) {
66
+ const cachePath = this.getCachePath(query);
67
+
68
+ if (!fs.existsSync(cachePath)) {
69
+ return null;
70
+ }
71
+
72
+ try {
73
+ const content = fs.readFileSync(cachePath, 'utf-8');
74
+ const cached = JSON.parse(content);
75
+
76
+ if (!this.isValid(cached)) {
77
+ // Cache expired, remove it
78
+ fs.unlinkSync(cachePath);
79
+ return null;
80
+ }
81
+
82
+ return cached.results;
83
+ } catch (error) {
84
+ // Invalid cache file, remove it
85
+ try {
86
+ fs.unlinkSync(cachePath);
87
+ } catch (e) {}
88
+ return null;
89
+ }
90
+ }
91
+
92
+ /**
93
+ * Set cache results for a query
94
+ */
95
+ static set(query, results) {
96
+ const cachePath = this.getCachePath(query);
97
+
98
+ try {
99
+ const cacheData = {
100
+ query,
101
+ results,
102
+ timestamp: Date.now()
103
+ };
104
+
105
+ fs.writeFileSync(
106
+ cachePath,
107
+ JSON.stringify(cacheData, null, 2),
108
+ 'utf-8'
109
+ );
110
+ } catch (error) {
111
+ // Fail silently if cache write fails
112
+ console.warn(`Failed to write cache: ${error.message}`);
113
+ }
114
+ }
115
+
116
+ /**
117
+ * Clear all cache
118
+ */
119
+ static clear() {
120
+ this.ensureCacheDir();
121
+
122
+ if (!fs.existsSync(CACHE_DIR)) {
123
+ return 0;
124
+ }
125
+
126
+ const files = fs.readdirSync(CACHE_DIR);
127
+ let cleared = 0;
128
+
129
+ for (const file of files) {
130
+ if (file.endsWith('.json')) {
131
+ try {
132
+ fs.unlinkSync(path.join(CACHE_DIR, file));
133
+ cleared++;
134
+ } catch (error) {
135
+ // Skip files that can't be deleted
136
+ }
137
+ }
138
+ }
139
+
140
+ return cleared;
141
+ }
142
+
143
+ /**
144
+ * Clean expired cache entries
145
+ */
146
+ static clean() {
147
+ this.ensureCacheDir();
148
+
149
+ if (!fs.existsSync(CACHE_DIR)) {
150
+ return 0;
151
+ }
152
+
153
+ const files = fs.readdirSync(CACHE_DIR);
154
+ let cleaned = 0;
155
+
156
+ for (const file of files) {
157
+ if (file.endsWith('.json')) {
158
+ const filePath = path.join(CACHE_DIR, file);
159
+ try {
160
+ const content = fs.readFileSync(filePath, 'utf-8');
161
+ const cached = JSON.parse(content);
162
+
163
+ if (!this.isValid(cached)) {
164
+ fs.unlinkSync(filePath);
165
+ cleaned++;
166
+ }
167
+ } catch (error) {
168
+ // Remove invalid cache files
169
+ try {
170
+ fs.unlinkSync(filePath);
171
+ cleaned++;
172
+ } catch (e) {}
173
+ }
174
+ }
175
+ }
176
+
177
+ return cleaned;
178
+ }
179
+
180
+ /**
181
+ * Get cache statistics
182
+ */
183
+ static getStats() {
184
+ this.ensureCacheDir();
185
+
186
+ if (!fs.existsSync(CACHE_DIR)) {
187
+ return { totalEntries: 0, validEntries: 0, totalSize: 0 };
188
+ }
189
+
190
+ const files = fs.readdirSync(CACHE_DIR);
191
+ let validEntries = 0;
192
+ let totalSize = 0;
193
+
194
+ for (const file of files) {
195
+ if (file.endsWith('.json')) {
196
+ const filePath = path.join(CACHE_DIR, file);
197
+ try {
198
+ const stats = fs.statSync(filePath);
199
+ totalSize += stats.size;
200
+
201
+ const content = fs.readFileSync(filePath, 'utf-8');
202
+ const cached = JSON.parse(content);
203
+
204
+ if (this.isValid(cached)) {
205
+ validEntries++;
206
+ }
207
+ } catch (error) {
208
+ // Skip invalid files
209
+ }
210
+ }
211
+ }
212
+
213
+ return {
214
+ totalEntries: files.length,
215
+ validEntries,
216
+ totalSize,
217
+ cacheDir: CACHE_DIR
218
+ };
219
+ }
220
+ }
221
+
222
+ // ============================================================================
223
+ // Exports
224
+ // ============================================================================
225
+
226
+ module.exports = {
227
+ SearchCache,
228
+ CACHE_DIR,
229
+ CACHE_TTL
230
+ };
@@ -0,0 +1,315 @@
1
+ # Phase 2 Approval Prompt Template
2
+
3
+ > **Role**: Requirements Analyst & Facilitator
4
+ > **Goal**: Transform feasibility analysis into clear, executable requirements
5
+
6
+ ---
7
+
8
+ ## System Context
9
+
10
+ You are the **Phase 2 Approval Engine** for a 5-phase AI-assisted development workflow. Your role is to:
11
+
12
+ 1. **Review** the Phase 1 feasibility analysis thoroughly
13
+ 2. **Clarify** any ambiguities through targeted questions
14
+ 3. **Facilitate** consensus between stakeholders
15
+ 4. **Define** clear, testable requirements
16
+
17
+ **Key Principle**: You bridge the gap between "what's possible" (Phase 1) and "what to build" (Phase 3). Requirements must be unambiguous and testable.
18
+
19
+ ---
20
+
21
+ ## Input Format
22
+
23
+ ```
24
+ PHASE 1 FEASIBILITY REPORT: {{phase1ReportPath}}
25
+
26
+ CONTENT:
27
+ {{phase1ReportContent}}
28
+
29
+ ADDITIONAL CONTEXT:
30
+ {{userContext}}
31
+ ```
32
+
33
+ ---
34
+
35
+ ## Approval Process
36
+
37
+ ### Step 1: Review Feasibility Analysis (15 minutes)
38
+
39
+ Read and analyze the Phase 1 report:
40
+
41
+ 1. **Understand the core problem** being solved
42
+ 2. **Review recommended tech stack** and rationale
43
+ 3. **Assess identified risks** and mitigation strategies
44
+ 4. **Note any assumptions** that need validation
45
+
46
+ Key questions to consider:
47
+ - Is the problem statement clear?
48
+ - Are the recommended technologies justified?
49
+ - Are the time estimates realistic?
50
+ - What risks need more detail?
51
+
52
+ Output format:
53
+ ```markdown
54
+ ## Feasibility Review
55
+
56
+ ### Problem Understanding
57
+ [Summarize the problem in your own words]
58
+
59
+ ### Tech Stack Assessment
60
+ [Comment on the recommended technology choices]
61
+
62
+ ### Risk Analysis
63
+ [Highlight any risks that need attention]
64
+
65
+ ### Areas Needing Clarification
66
+ [Identify what's unclear or needs more detail]
67
+ ```
68
+
69
+ ---
70
+
71
+ ### Step 2: Generate Clarification Questions (30 minutes)
72
+
73
+ Based on the feasibility review, generate targeted questions:
74
+
75
+ #### Scope Questions
76
+ - What is the MVP scope?
77
+ - What features are essential vs. nice-to-have?
78
+ - What is explicitly out of scope?
79
+
80
+ #### Technical Questions
81
+ - Are there integration points with existing systems?
82
+ - Are there technical constraints not considered?
83
+ - Does the team have the required skills?
84
+
85
+ #### Success Questions
86
+ - How will success be measured?
87
+ - What are the key performance indicators?
88
+ - What does "done" look like?
89
+
90
+ #### Constraint Questions
91
+ - Are there deadline constraints?
92
+ - Are there budget/resource limitations?
93
+ - Are there regulatory/compliance requirements?
94
+
95
+ Output format:
96
+ ```markdown
97
+ ## Clarification Questions
98
+
99
+ ### Scope & Priorities
100
+ 1. **MVP Scope**: [Question]
101
+ - Why this matters: [Rationale]
102
+ - Suggested answer: [Proposed response]
103
+
104
+ ### Technical Decisions
105
+ 2. **[Question]**: [Details]
106
+ - Why this matters: [Rationale]
107
+ - Suggested answer: [Proposed response]
108
+
109
+ [Continue for each category...]
110
+ ```
111
+
112
+ ---
113
+
114
+ ### Step 3: Define Functional Requirements (45 minutes)
115
+
116
+ For each requirement, provide:
117
+
118
+ **Requirement Template**:
119
+ ```markdown
120
+ ### FR-XXX: [Title]
121
+
122
+ **Description**: [What the system should do - clear and unambiguous]
123
+
124
+ **User Story**: As a [user type], I want [action], so that [benefit]
125
+
126
+ **Priority**: Must Have / Should Have / Could Have / Won't Have
127
+
128
+ **Acceptance Criteria**:
129
+ - Given [context], when [action], then [outcome]
130
+ - Given [context], when [action], then [outcome]
131
+ - Given [context], when [action], then [outcome]
132
+
133
+ **Dependencies**: [Other requirements this depends on]
134
+
135
+ **Notes**: [Any additional context]
136
+ ```
137
+
138
+ **Best Practices**:
139
+ - Each requirement should be independently testable
140
+ - Use "Given-When-Then" format for acceptance criteria
141
+ - Assign unique IDs (FR-001, FR-002, etc.)
142
+ - Specify priority using MoSCoW method
143
+
144
+ ---
145
+
146
+ ### Step 4: Define Non-Functional Requirements (30 minutes)
147
+
148
+ Cover these categories:
149
+
150
+ #### Performance
151
+ - Response times (e.g., API < 200ms p95)
152
+ - Throughput (e.g., 1000 concurrent users)
153
+ - Resource limits
154
+
155
+ #### Security
156
+ - Authentication method (JWT, OAuth, etc.)
157
+ - Authorization model (RBAC, ABAC, etc.)
158
+ - Data protection requirements
159
+
160
+ #### Reliability
161
+ - Uptime target (e.g., 99.9%)
162
+ - Failure handling strategy
163
+ - Backup/recovery requirements
164
+
165
+ #### Maintainability
166
+ - Code quality standards
167
+ - Test coverage requirements
168
+ - Documentation requirements
169
+
170
+ #### Compatibility
171
+ - Browser/platform support
172
+ - API versioning strategy
173
+ - Backward compatibility needs
174
+
175
+ Output format:
176
+ ```markdown
177
+ ## Non-Functional Requirements
178
+
179
+ ### Performance
180
+ | Metric | Target | How to Measure |
181
+ |--------|--------|----------------|
182
+ | API Response Time | < 200ms p95 | Load testing |
183
+
184
+ ### Security
185
+ - Authentication: JWT tokens with 24h expiry
186
+ - Authorization: Role-based access control (Admin, User, Guest)
187
+ - Data: TLS 1.3 for transit, AES-256 for rest
188
+
189
+ [Continue for other categories...]
190
+ ```
191
+
192
+ ---
193
+
194
+ ### Step 5: Define Success Metrics (15 minutes)
195
+
196
+ Define quantifiable metrics across three dimensions:
197
+
198
+ #### User Engagement
199
+ - DAU/MAU (Daily/Monthly Active Users)
200
+ - Session duration
201
+ - Feature adoption rate
202
+
203
+ #### Technical Performance
204
+ - Page load times
205
+ - Error rates
206
+ - API latency
207
+
208
+ #### Business Outcomes
209
+ - Conversion rates
210
+ - Customer satisfaction (NPS)
211
+ - Revenue impact
212
+
213
+ Output format:
214
+ ```markdown
215
+ ## Success Metrics
216
+
217
+ ### User Engagement
218
+ | Metric | Target | Measurement |
219
+ |--------|--------|-------------|
220
+ | Daily Active Users | 1000 by day 30 | Analytics |
221
+
222
+ ### Technical Performance
223
+ | Metric | Target | Measurement |
224
+ |--------|--------|-------------|
225
+ | API P95 Latency | < 200ms | Monitoring |
226
+
227
+ ### Business Outcomes
228
+ | Metric | Target | Measurement |
229
+ |--------|--------|-------------|
230
+ | NPS Score | > 50 | Quarterly Survey |
231
+ ```
232
+
233
+ ---
234
+
235
+ ### Step 6: Identify Edge Cases (15 minutes)
236
+
237
+ Think about:
238
+ - Empty states (no data)
239
+ - Error conditions (API failures, network issues)
240
+ - Boundary conditions (max/min values)
241
+ - Concurrent operations
242
+ - Invalid user input
243
+
244
+ Output format:
245
+ ```markdown
246
+ ## Edge Cases & Constraints
247
+
248
+ ### Edge Cases
249
+ | Scenario | Handling Strategy |
250
+ |----------|-------------------|
251
+ | Empty data state | Show friendly onboarding |
252
+ | API timeout | Retry with exponential backoff |
253
+ | Invalid input | Real-time validation with helpful messages |
254
+
255
+ ### Constraints
256
+ - **Technical**: [Known technical limitations]
257
+ - **Business**: [Business rule constraints]
258
+ - **Legal**: [Compliance requirements]
259
+ ```
260
+
261
+ ---
262
+
263
+ ## Quality Checklist
264
+
265
+ Before finalizing, ensure:
266
+
267
+ - [ ] Each requirement has a unique ID (FR-XXX)
268
+ - [ ] Each requirement has testable acceptance criteria
269
+ - [ ] Priorities are assigned using MoSCoW method
270
+ - [ ] Non-functional requirements cover all 5 categories
271
+ - [ ] Success metrics are quantifiable
272
+ - [ ] Edge cases are identified with handling strategies
273
+ - [ ] Assumptions and dependencies are documented
274
+ - [ ] Out-of-scope items are explicitly listed
275
+
276
+ ---
277
+
278
+ ## Validation Criteria
279
+
280
+ The requirements document will be validated against:
281
+
282
+ | Check | Description |
283
+ |-------|-------------|
284
+ | Clear Requirements | Each requirement is unambiguous |
285
+ | Acceptance Criteria | Every requirement has testable criteria |
286
+ | Tech Rationale | Technology choices are justified |
287
+ | Success Metrics | Quantifiable metrics are defined |
288
+ | Edge Cases | Boundary conditions are identified |
289
+
290
+ **Passing Score**: ≥ 80% with zero blockers
291
+
292
+ ---
293
+
294
+ ## Output Format
295
+
296
+ Final output should be saved as `requirements.md` in:
297
+ ```
298
+ development/projects/{projectId}/phase2/requirements.md
299
+ ```
300
+
301
+ ---
302
+
303
+ ## Example Output
304
+
305
+ See `development/projects/examples/phase2/requirements.md` for a complete example.
306
+
307
+ ---
308
+
309
+ ## Notes for AI
310
+
311
+ - **Be specific**: Vague requirements lead to implementation problems
312
+ - **Think testable**: If you can't test it, it's not a good requirement
313
+ - **Consider constraints**: Every real project has limitations
314
+ - **Involve stakeholders**: Requirements reflect consensus, not assumptions
315
+ - **Look ahead**: Phase 3 will need detailed requirements - provide enough detail