@anhth2/spec-driven-dev-plugin 0.6.0 → 0.8.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.
- package/bin/index.js +285 -11
- package/commands/debug.md +233 -11
- package/commands/debug.tmpl +170 -6
- package/commands/define-product.md +68 -6
- package/commands/define-product.tmpl +5 -1
- package/commands/fix-bug.md +111 -11
- package/commands/fix-bug.tmpl +48 -6
- package/commands/generate-bdd.md +86 -9
- package/commands/generate-bdd.tmpl +23 -4
- package/commands/generate-code.md +146 -19
- package/commands/generate-code.tmpl +83 -14
- package/commands/generate-design-spec.md +754 -0
- package/commands/generate-design-spec.tmpl +399 -0
- package/commands/generate-prd.md +91 -7
- package/commands/generate-prd.tmpl +28 -2
- package/commands/generate-spec-manifest.md +519 -0
- package/commands/generate-spec-manifest.tmpl +164 -0
- package/commands/generate-tech-docs.md +122 -9
- package/commands/generate-tech-docs.tmpl +59 -4
- package/commands/generate-tests.md +491 -37
- package/commands/generate-tests.tmpl +428 -32
- package/commands/refine-prd.md +76 -8
- package/commands/refine-prd.tmpl +13 -3
- package/commands/review-code.md +94 -6
- package/commands/review-code.tmpl +31 -1
- package/commands/review-context.md +118 -12
- package/commands/review-context.tmpl +55 -7
- package/commands/review-tech-docs.md +76 -9
- package/commands/review-tech-docs.tmpl +13 -4
- package/commands/run-tests.md +196 -18
- package/commands/run-tests.tmpl +133 -13
- package/commands/setup-ai-first.md +192 -6
- package/commands/setup-ai-first.tmpl +136 -5
- package/commands/smoke-test.md +228 -22
- package/commands/smoke-test.tmpl +165 -17
- package/commands/validate-traces.md +77 -8
- package/commands/validate-traces.tmpl +14 -3
- package/core/FRAMEWORK_VERSION +1 -1
- package/core/commands/debug.md +233 -11
- package/core/commands/define-product.md +68 -6
- package/core/commands/fix-bug.md +111 -11
- package/core/commands/generate-bdd.md +86 -9
- package/core/commands/generate-code.md +146 -19
- package/core/commands/generate-design-spec.md +754 -0
- package/core/commands/generate-prd.md +91 -7
- package/core/commands/generate-spec-manifest.md +519 -0
- package/core/commands/generate-tech-docs.md +122 -9
- package/core/commands/generate-tests.md +491 -37
- package/core/commands/refine-prd.md +76 -8
- package/core/commands/review-code.md +94 -6
- package/core/commands/review-context.md +118 -12
- package/core/commands/review-tech-docs.md +76 -9
- package/core/commands/run-tests.md +196 -18
- package/core/commands/setup-ai-first.md +192 -6
- package/core/commands/smoke-test.md +228 -22
- package/core/commands/validate-traces.md +77 -8
- package/core/skills/code/SKILL.md +68 -8
- package/core/skills/debug/SKILL.md +72 -10
- package/core/skills/design-spec/SKILL.md +450 -0
- package/core/skills/discovery/SKILL.md +62 -4
- package/core/skills/prd/SKILL.md +12 -8
- package/core/skills/setup-ai-first/SKILL.md +5 -3
- package/core/skills/spec/SKILL.md +11 -7
- package/core/skills/test/SKILL.md +130 -12
- package/core/steps/context-loader.md +57 -1
- package/core/steps/gate.md +1 -1
- package/core/steps/report-footer.md +5 -3
- package/core/steps/spawn-agent.md +3 -1
- package/core/templates/design-spec.template.md +209 -0
- package/core/templates/project-context.yaml +29 -0
- package/package.json +1 -1
- package/skills/code/SKILL.md +68 -8
- package/skills/debug/SKILL.md +72 -10
- package/skills/design-spec/SKILL.md +450 -0
- package/skills/design-spec/SKILL.tmpl +95 -0
- package/skills/discovery/SKILL.md +62 -4
- package/skills/prd/SKILL.md +12 -8
- package/skills/setup-ai-first/SKILL.md +5 -3
- package/skills/spec/SKILL.md +11 -7
- package/skills/test/SKILL.md +130 -12
- package/steps/context-loader.md +57 -1
- package/steps/gate.md +1 -1
- package/steps/report-footer.md +5 -3
- package/steps/spawn-agent.md +3 -1
- package/templates/design-spec.template.md +209 -0
- package/templates/project-context.yaml +29 -0
|
@@ -31,7 +31,7 @@ Display and wait for response:
|
|
|
31
31
|
```
|
|
32
32
|
⚙️ MODEL CHECK
|
|
33
33
|
──────────────────────────────────────────────────────────────────
|
|
34
|
-
Recommended : claude-opus-4
|
|
34
|
+
Recommended : claude-opus-4 (or latest Opus model)
|
|
35
35
|
Why needed : Spec analysis, architecture review, code generation
|
|
36
36
|
require deep reasoning. Smaller models miss edge cases.
|
|
37
37
|
|
|
@@ -131,6 +131,7 @@ Read `.agent/project-context.yaml`. Extract and store:
|
|
|
131
131
|
- `paths.core_entities` → path to core-entities.md
|
|
132
132
|
- `paths.tech_docs_dir` → technical documentation root
|
|
133
133
|
- `paths.trace_dir` → trace state directory
|
|
134
|
+
- `paths.design_spec_dir` → Design Spec documents root (FE/App only)
|
|
134
135
|
|
|
135
136
|
If `paths` section is absent, use these defaults:
|
|
136
137
|
- `specs_dir` = `specs/bdd`
|
|
@@ -140,13 +141,46 @@ If `paths` section is absent, use these defaults:
|
|
|
140
141
|
- `domain_knowledge_dir` = `specs/domain-knowledge`
|
|
141
142
|
- `business_dictionary` = `specs/domain-knowledge/business-dictionary.md`
|
|
142
143
|
- `core_entities` = `specs/domain-knowledge/core-entities.md`
|
|
143
|
-
- `tech_docs_dir` = `tech-docs`
|
|
144
|
+
- `tech_docs_dir` = `specs/tech-docs`
|
|
144
145
|
- `trace_dir` = `.trace`
|
|
146
|
+
- `design_spec_dir` = `specs/design-spec`
|
|
145
147
|
|
|
146
148
|
If `tech_stack.module` is set, also load `.agent/modules/{module}/stack-profile.yaml` if it exists.
|
|
147
149
|
|
|
148
150
|
---
|
|
149
151
|
|
|
152
|
+
## Step 1.5 — [SERVICE ROUTING] Resolve service paths (umbrella mode)
|
|
153
|
+
|
|
154
|
+
*Skip this step entirely if `setup.mode` is not `"umbrella"` and `services` section is absent from project-context.yaml.*
|
|
155
|
+
|
|
156
|
+
If `services` section is present:
|
|
157
|
+
|
|
158
|
+
**1. Detect active domain** (in priority order):
|
|
159
|
+
- Read `@trace.domain` from target file frontmatter (if Gate loaded a target file)
|
|
160
|
+
- Extract from target file path: segment immediately after `prd_dir` base path
|
|
161
|
+
*(e.g., `specs/prd/user/FEAT-01.md` → domain = `user`)*
|
|
162
|
+
- If `$ARGUMENTS` contains a path, extract the segment after `prd_dir`
|
|
163
|
+
|
|
164
|
+
**2. Route to service** — if active domain matches a key in `services`:
|
|
165
|
+
- Override `paths.specs_dir` → `services.{domain}.specs_dir`
|
|
166
|
+
- Override `paths.tech_docs_dir` → `services.{domain}.tech_docs_dir`
|
|
167
|
+
- Store `active_service` = `services.{domain}.path`
|
|
168
|
+
- Store `active_service_module` = `services.{domain}.module`
|
|
169
|
+
- If service has its own `module` → use it as `active_module` (overrides `tech_stack.module`)
|
|
170
|
+
|
|
171
|
+
**3. Fallback** — if domain not detected or no matching service key:
|
|
172
|
+
- Keep default paths from Step 1
|
|
173
|
+
- Set `active_service = unresolved`
|
|
174
|
+
|
|
175
|
+
**4. Spec source auto-override** — if `setup.spec_source` is set AND the corresponding path was not already explicitly set in `paths:`:
|
|
176
|
+
- Override `paths.prd_dir` → `{spec_source}/specs/prd`
|
|
177
|
+
- Override `paths.design_spec_dir` → `{spec_source}/specs/design-spec`
|
|
178
|
+
- Override `paths.domain_knowledge_dir` → `{spec_source}/specs/domain-knowledge`
|
|
179
|
+
- Override `paths.business_dictionary` → `{spec_source}/specs/domain-knowledge/business-dictionary.md`
|
|
180
|
+
- Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
150
184
|
## Step 2 — [PROJECT-CONFIG] Load module stack profile (conditional)
|
|
151
185
|
|
|
152
186
|
If `tech_stack.module` is set, read `.agent/modules/{module}/stack-profile.yaml`.
|
|
@@ -217,6 +251,26 @@ If the file does not exist → skip silently.
|
|
|
217
251
|
|
|
218
252
|
---
|
|
219
253
|
|
|
254
|
+
## Step 6.5 — [PLATFORM] Derive active_module and platform_type
|
|
255
|
+
|
|
256
|
+
Using `tech_stack.module` loaded in Step 1, derive and store two variables for use by all downstream commands:
|
|
257
|
+
|
|
258
|
+
```
|
|
259
|
+
active_module = tech_stack.module (e.g. "java-spring", "react", "flutter")
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
| `platform_type` | Modules |
|
|
263
|
+
|---|---|
|
|
264
|
+
| `backend` | `java-spring`, `golang`, `dotnet`, `php-laravel`, `context-engineering` |
|
|
265
|
+
| `web-frontend` | `react`, `nextjs`, `vue`, `nuxt`, `angular` |
|
|
266
|
+
| `mobile` | `flutter`, `react-native`, `ios-swiftui`, `android-compose` |
|
|
267
|
+
|
|
268
|
+
If `tech_stack.module` is blank or not recognized → set `platform_type = "unknown"` and flag as ⚠️ in the Step 7 recap.
|
|
269
|
+
|
|
270
|
+
These two variables (`active_module`, `platform_type`) are the canonical source for all branching logic in commands that need platform-specific behavior (generate-tests, debug, fix-bug, smoke-test).
|
|
271
|
+
|
|
272
|
+
---
|
|
273
|
+
|
|
220
274
|
## Step 7 — [RECAP] Working Memory Recap (anti-lost-in-middle)
|
|
221
275
|
|
|
222
276
|
After loading all context, synthesize and output a compact summary block.
|
|
@@ -227,10 +281,12 @@ Output exactly this block:
|
|
|
227
281
|
```
|
|
228
282
|
[CTX LOADED]
|
|
229
283
|
Stack : {language} / {framework} / {database}
|
|
284
|
+
Platform : {active_module} ({platform_type})
|
|
230
285
|
Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
|
|
231
286
|
Ticket : {ticket_prefix}-
|
|
232
287
|
Dict : {loaded — N canonical terms, M banned terms | missing}
|
|
233
288
|
Entities : {loaded — EntityA, EntityB, EntityC | missing}
|
|
289
|
+
Service : {active_service} ({active_service_module}) | single-service
|
|
234
290
|
Status : {FULL | PARTIAL — missing: CLAUDE.md / business-dict / core-entities | MINIMAL}
|
|
235
291
|
```
|
|
236
292
|
|
|
@@ -324,21 +380,23 @@ Suggest the logical next command based on workflow phase:
|
|
|
324
380
|
|
|
325
381
|
| Current command | Suggest next |
|
|
326
382
|
|-------------------------|-----------------------------------------------|
|
|
383
|
+
| /setup-ai-first | `/define-product` to start your first feature |
|
|
327
384
|
| /define-product | `/generate-prd {product-definition-file}` |
|
|
328
385
|
| /generate-prd | `/refine-prd {prd-file}` then `/review-context {prd-file}` |
|
|
329
386
|
| /refine-prd | Open Review Board → update PRD → `/review-context {prd-file}` |
|
|
330
|
-
| /review-context (PRD) | `/generate-
|
|
387
|
+
| /review-context (PRD) | FE/App: `/generate-design-spec {prd-file}` (then BDD after sign-off); BE: `/generate-bdd {prd-file}` directly; fix PRD if NEEDS_FIX |
|
|
388
|
+
| /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
331
389
|
| /generate-bdd | `/review-context {feature-file}` to verify coverage |
|
|
332
390
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
|
|
333
391
|
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
334
392
|
| /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
|
|
335
|
-
| /generate-code | `/generate-tests {UC-ID}`
|
|
393
|
+
| /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/generate-tests {UC-ID}` |
|
|
336
394
|
| /generate-tests | `/run-tests {UC-ID}` |
|
|
337
395
|
| /run-tests (passing) | `/review-code {UC-ID}` |
|
|
338
396
|
| /run-tests (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
|
|
339
397
|
| /review-code | `/smoke-test {UC-ID}` or create PR |
|
|
340
398
|
| /smoke-test | Create PR and link to ticket |
|
|
341
|
-
| /validate-traces | `/generate-code {UC-ID}
|
|
399
|
+
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/generate-tests {UC-ID}`; all OK → create PR |
|
|
342
400
|
| /fix-bug | Create PR and link to ticket |
|
|
343
401
|
| /debug | `/fix-bug {ticket-id}` if fix needed |
|
|
344
402
|
|
|
@@ -355,7 +413,9 @@ Next : {suggested command with example arguments}
|
|
|
355
413
|
/refine-prd Complete — {PRD name}
|
|
356
414
|
Findings: {total} | 🔴 Critical: {N} | 🟡 Major: {N} | 🟢 Minor: {N}
|
|
357
415
|
Review: {paths.refinement_dir}/{prd-slug}-findings.yaml
|
|
358
|
-
Next: Open in Review Board (right-click file) → Update PRD
|
|
416
|
+
Next: Open in Review Board (right-click file) → Update PRD
|
|
417
|
+
→ /review-context {prd-file} ← verify PRD quality before generating BDD
|
|
418
|
+
→ /generate-bdd {prd-file}
|
|
359
419
|
```
|
|
360
420
|
|
|
361
421
|
---
|
|
@@ -374,9 +434,16 @@ Next: Open in Review Board (right-click file) → Update PRD → /generate-bdd
|
|
|
374
434
|
|
|
375
435
|
For each accepted finding, in order of severity (critical → major → minor):
|
|
376
436
|
- Navigate to the PRD section indicated by `finding.section`.
|
|
377
|
-
- Apply `finding.suggestion`
|
|
437
|
+
- Apply `finding.suggestion`. For `status: "modified"` findings, the human has already edited `finding.suggestion` in the Review Board — that edited value IS the fix to apply.
|
|
378
438
|
- Do not alter any sections not referenced by an accepted finding.
|
|
379
439
|
|
|
440
|
+
### Phase 2.5 — Update findings file
|
|
441
|
+
|
|
442
|
+
For each finding that was applied (status was `accepted` or `modified`):
|
|
443
|
+
- Set `status: "applied"` in `{paths.refinement_dir}/{prd-slug}-findings.yaml`.
|
|
444
|
+
|
|
445
|
+
Update `summary.status: "applied"` in the findings file.
|
|
446
|
+
|
|
380
447
|
### Phase 3 — Bump version & write changelog entry
|
|
381
448
|
|
|
382
449
|
1. Read current `| **Version** |` value from PRD metadata table.
|
|
@@ -404,5 +471,6 @@ Changes :
|
|
|
404
471
|
- {change 2}
|
|
405
472
|
|
|
406
473
|
⚠️ BDD may be outdated. Run:
|
|
407
|
-
/
|
|
474
|
+
/review-context {prd-file} ← verify PRD quality first
|
|
475
|
+
→ /generate-bdd {prd-file}
|
|
408
476
|
```
|
|
@@ -33,7 +33,7 @@ Display and wait for response:
|
|
|
33
33
|
```
|
|
34
34
|
⚙️ MODEL CHECK
|
|
35
35
|
──────────────────────────────────────────────────────────────────
|
|
36
|
-
Recommended : claude-opus-4
|
|
36
|
+
Recommended : claude-opus-4 (or latest Opus model)
|
|
37
37
|
Why needed : Spec analysis, architecture review, code generation
|
|
38
38
|
require deep reasoning. Smaller models miss edge cases.
|
|
39
39
|
|
|
@@ -133,6 +133,7 @@ Read `.agent/project-context.yaml`. Extract and store:
|
|
|
133
133
|
- `paths.core_entities` → path to core-entities.md
|
|
134
134
|
- `paths.tech_docs_dir` → technical documentation root
|
|
135
135
|
- `paths.trace_dir` → trace state directory
|
|
136
|
+
- `paths.design_spec_dir` → Design Spec documents root (FE/App only)
|
|
136
137
|
|
|
137
138
|
If `paths` section is absent, use these defaults:
|
|
138
139
|
- `specs_dir` = `specs/bdd`
|
|
@@ -142,13 +143,46 @@ If `paths` section is absent, use these defaults:
|
|
|
142
143
|
- `domain_knowledge_dir` = `specs/domain-knowledge`
|
|
143
144
|
- `business_dictionary` = `specs/domain-knowledge/business-dictionary.md`
|
|
144
145
|
- `core_entities` = `specs/domain-knowledge/core-entities.md`
|
|
145
|
-
- `tech_docs_dir` = `tech-docs`
|
|
146
|
+
- `tech_docs_dir` = `specs/tech-docs`
|
|
146
147
|
- `trace_dir` = `.trace`
|
|
148
|
+
- `design_spec_dir` = `specs/design-spec`
|
|
147
149
|
|
|
148
150
|
If `tech_stack.module` is set, also load `.agent/modules/{module}/stack-profile.yaml` if it exists.
|
|
149
151
|
|
|
150
152
|
---
|
|
151
153
|
|
|
154
|
+
## Step 1.5 — [SERVICE ROUTING] Resolve service paths (umbrella mode)
|
|
155
|
+
|
|
156
|
+
*Skip this step entirely if `setup.mode` is not `"umbrella"` and `services` section is absent from project-context.yaml.*
|
|
157
|
+
|
|
158
|
+
If `services` section is present:
|
|
159
|
+
|
|
160
|
+
**1. Detect active domain** (in priority order):
|
|
161
|
+
- Read `@trace.domain` from target file frontmatter (if Gate loaded a target file)
|
|
162
|
+
- Extract from target file path: segment immediately after `prd_dir` base path
|
|
163
|
+
*(e.g., `specs/prd/user/FEAT-01.md` → domain = `user`)*
|
|
164
|
+
- If `$ARGUMENTS` contains a path, extract the segment after `prd_dir`
|
|
165
|
+
|
|
166
|
+
**2. Route to service** — if active domain matches a key in `services`:
|
|
167
|
+
- Override `paths.specs_dir` → `services.{domain}.specs_dir`
|
|
168
|
+
- Override `paths.tech_docs_dir` → `services.{domain}.tech_docs_dir`
|
|
169
|
+
- Store `active_service` = `services.{domain}.path`
|
|
170
|
+
- Store `active_service_module` = `services.{domain}.module`
|
|
171
|
+
- If service has its own `module` → use it as `active_module` (overrides `tech_stack.module`)
|
|
172
|
+
|
|
173
|
+
**3. Fallback** — if domain not detected or no matching service key:
|
|
174
|
+
- Keep default paths from Step 1
|
|
175
|
+
- Set `active_service = unresolved`
|
|
176
|
+
|
|
177
|
+
**4. Spec source auto-override** — if `setup.spec_source` is set AND the corresponding path was not already explicitly set in `paths:`:
|
|
178
|
+
- Override `paths.prd_dir` → `{spec_source}/specs/prd`
|
|
179
|
+
- Override `paths.design_spec_dir` → `{spec_source}/specs/design-spec`
|
|
180
|
+
- Override `paths.domain_knowledge_dir` → `{spec_source}/specs/domain-knowledge`
|
|
181
|
+
- Override `paths.business_dictionary` → `{spec_source}/specs/domain-knowledge/business-dictionary.md`
|
|
182
|
+
- Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
152
186
|
## Step 2 — [PROJECT-CONFIG] Load module stack profile (conditional)
|
|
153
187
|
|
|
154
188
|
If `tech_stack.module` is set, read `.agent/modules/{module}/stack-profile.yaml`.
|
|
@@ -219,6 +253,26 @@ If the file does not exist → skip silently.
|
|
|
219
253
|
|
|
220
254
|
---
|
|
221
255
|
|
|
256
|
+
## Step 6.5 — [PLATFORM] Derive active_module and platform_type
|
|
257
|
+
|
|
258
|
+
Using `tech_stack.module` loaded in Step 1, derive and store two variables for use by all downstream commands:
|
|
259
|
+
|
|
260
|
+
```
|
|
261
|
+
active_module = tech_stack.module (e.g. "java-spring", "react", "flutter")
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
| `platform_type` | Modules |
|
|
265
|
+
|---|---|
|
|
266
|
+
| `backend` | `java-spring`, `golang`, `dotnet`, `php-laravel`, `context-engineering` |
|
|
267
|
+
| `web-frontend` | `react`, `nextjs`, `vue`, `nuxt`, `angular` |
|
|
268
|
+
| `mobile` | `flutter`, `react-native`, `ios-swiftui`, `android-compose` |
|
|
269
|
+
|
|
270
|
+
If `tech_stack.module` is blank or not recognized → set `platform_type = "unknown"` and flag as ⚠️ in the Step 7 recap.
|
|
271
|
+
|
|
272
|
+
These two variables (`active_module`, `platform_type`) are the canonical source for all branching logic in commands that need platform-specific behavior (generate-tests, debug, fix-bug, smoke-test).
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
222
276
|
## Step 7 — [RECAP] Working Memory Recap (anti-lost-in-middle)
|
|
223
277
|
|
|
224
278
|
After loading all context, synthesize and output a compact summary block.
|
|
@@ -229,10 +283,12 @@ Output exactly this block:
|
|
|
229
283
|
```
|
|
230
284
|
[CTX LOADED]
|
|
231
285
|
Stack : {language} / {framework} / {database}
|
|
286
|
+
Platform : {active_module} ({platform_type})
|
|
232
287
|
Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
|
|
233
288
|
Ticket : {ticket_prefix}-
|
|
234
289
|
Dict : {loaded — N canonical terms, M banned terms | missing}
|
|
235
290
|
Entities : {loaded — EntityA, EntityB, EntityC | missing}
|
|
291
|
+
Service : {active_service} ({active_service_module}) | single-service
|
|
236
292
|
Status : {FULL | PARTIAL — missing: CLAUDE.md / business-dict / core-entities | MINIMAL}
|
|
237
293
|
```
|
|
238
294
|
|
|
@@ -254,6 +310,26 @@ After completing all steps, you have loaded:
|
|
|
254
310
|
Proceed to the next step of the calling command.
|
|
255
311
|
|
|
256
312
|
|
|
313
|
+
---
|
|
314
|
+
|
|
315
|
+
## Pre-Review Scan
|
|
316
|
+
|
|
317
|
+
*(Separate from the Gate CHECKPOINT — this lists the actual files and scenarios in scope.)*
|
|
318
|
+
|
|
319
|
+
Scan for implementation files and scenarios, then display:
|
|
320
|
+
|
|
321
|
+
```
|
|
322
|
+
Review Scope — {UC-ID}
|
|
323
|
+
──────────────────────────────────────
|
|
324
|
+
UC : {UC-ID}
|
|
325
|
+
Files : {list of files tagged @trace.implements={UC-ID}}
|
|
326
|
+
Scenarios : {N} scenarios in .feature file
|
|
327
|
+
|
|
328
|
+
Proceed with review? (Y/N)
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
Wait for explicit "Y" before proceeding.
|
|
332
|
+
|
|
257
333
|
---
|
|
258
334
|
|
|
259
335
|
## Review Dimensions
|
|
@@ -262,7 +338,7 @@ Proceed to the next step of the calling command.
|
|
|
262
338
|
- [ ] Every controller endpoint has `@trace.implements` tag?
|
|
263
339
|
- [ ] Every test file has `@trace.verifies` tag?
|
|
264
340
|
- [ ] No `@trace` tags on wrong layers?
|
|
265
|
-
- [ ] `{paths.trace_dir}/{UC-ID}.tsv` up to date?
|
|
341
|
+
- [ ] `{paths.trace_dir}/{UC-ID}.tsv` up to date? (if stale → run `/validate-traces {UC-ID}` first, then re-run this review)
|
|
266
342
|
|
|
267
343
|
### 2. Layer Architecture (from CLAUDE.md §2)
|
|
268
344
|
- [ ] Each class in the correct layer?
|
|
@@ -310,21 +386,23 @@ Suggest the logical next command based on workflow phase:
|
|
|
310
386
|
|
|
311
387
|
| Current command | Suggest next |
|
|
312
388
|
|-------------------------|-----------------------------------------------|
|
|
389
|
+
| /setup-ai-first | `/define-product` to start your first feature |
|
|
313
390
|
| /define-product | `/generate-prd {product-definition-file}` |
|
|
314
391
|
| /generate-prd | `/refine-prd {prd-file}` then `/review-context {prd-file}` |
|
|
315
392
|
| /refine-prd | Open Review Board → update PRD → `/review-context {prd-file}` |
|
|
316
|
-
| /review-context (PRD) | `/generate-
|
|
393
|
+
| /review-context (PRD) | FE/App: `/generate-design-spec {prd-file}` (then BDD after sign-off); BE: `/generate-bdd {prd-file}` directly; fix PRD if NEEDS_FIX |
|
|
394
|
+
| /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
317
395
|
| /generate-bdd | `/review-context {feature-file}` to verify coverage |
|
|
318
396
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
|
|
319
397
|
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
320
398
|
| /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
|
|
321
|
-
| /generate-code | `/generate-tests {UC-ID}`
|
|
399
|
+
| /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/generate-tests {UC-ID}` |
|
|
322
400
|
| /generate-tests | `/run-tests {UC-ID}` |
|
|
323
401
|
| /run-tests (passing) | `/review-code {UC-ID}` |
|
|
324
402
|
| /run-tests (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
|
|
325
403
|
| /review-code | `/smoke-test {UC-ID}` or create PR |
|
|
326
404
|
| /smoke-test | Create PR and link to ticket |
|
|
327
|
-
| /validate-traces | `/generate-code {UC-ID}
|
|
405
|
+
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/generate-tests {UC-ID}`; all OK → create PR |
|
|
328
406
|
| /fix-bug | Create PR and link to ticket |
|
|
329
407
|
| /debug | `/fix-bug {ticket-id}` if fix needed |
|
|
330
408
|
|
|
@@ -350,5 +428,15 @@ Critical: {X} | Major: {Y} | Minor: {Z}
|
|
|
350
428
|
### Minor
|
|
351
429
|
| # | File | Line | Issue | Suggested Fix |
|
|
352
430
|
|
|
431
|
+
Output Artifacts: none (read-only)
|
|
432
|
+
|
|
353
433
|
Verdict: APPROVED ✅ | NEEDS_FIX ❌
|
|
434
|
+
|
|
435
|
+
If APPROVED ✅:
|
|
436
|
+
Next: /generate-tests {UC-ID}
|
|
437
|
+
|
|
438
|
+
If NEEDS_FIX ❌:
|
|
439
|
+
- Small fix (1–3 lines, no logic change) → fix inline → re-run /review-code {UC-ID}
|
|
440
|
+
- Logic / architecture issue → /fix-bug {TICKET_ID}
|
|
441
|
+
- Spec mismatch (code ≠ scenario) → /generate-code {feature-file} (re-gen affected UC)
|
|
354
442
|
```
|
|
@@ -34,7 +34,7 @@ Display and wait for response:
|
|
|
34
34
|
```
|
|
35
35
|
⚙️ MODEL CHECK
|
|
36
36
|
──────────────────────────────────────────────────────────────────
|
|
37
|
-
Recommended : claude-opus-4
|
|
37
|
+
Recommended : claude-opus-4 (or latest Opus model)
|
|
38
38
|
Why needed : Spec analysis, architecture review, code generation
|
|
39
39
|
require deep reasoning. Smaller models miss edge cases.
|
|
40
40
|
|
|
@@ -138,6 +138,7 @@ Read `.agent/project-context.yaml`. Extract and store:
|
|
|
138
138
|
- `paths.core_entities` → path to core-entities.md
|
|
139
139
|
- `paths.tech_docs_dir` → technical documentation root
|
|
140
140
|
- `paths.trace_dir` → trace state directory
|
|
141
|
+
- `paths.design_spec_dir` → Design Spec documents root (FE/App only)
|
|
141
142
|
|
|
142
143
|
If `paths` section is absent, use these defaults:
|
|
143
144
|
- `specs_dir` = `specs/bdd`
|
|
@@ -147,13 +148,46 @@ If `paths` section is absent, use these defaults:
|
|
|
147
148
|
- `domain_knowledge_dir` = `specs/domain-knowledge`
|
|
148
149
|
- `business_dictionary` = `specs/domain-knowledge/business-dictionary.md`
|
|
149
150
|
- `core_entities` = `specs/domain-knowledge/core-entities.md`
|
|
150
|
-
- `tech_docs_dir` = `tech-docs`
|
|
151
|
+
- `tech_docs_dir` = `specs/tech-docs`
|
|
151
152
|
- `trace_dir` = `.trace`
|
|
153
|
+
- `design_spec_dir` = `specs/design-spec`
|
|
152
154
|
|
|
153
155
|
If `tech_stack.module` is set, also load `.agent/modules/{module}/stack-profile.yaml` if it exists.
|
|
154
156
|
|
|
155
157
|
---
|
|
156
158
|
|
|
159
|
+
## Step 1.5 — [SERVICE ROUTING] Resolve service paths (umbrella mode)
|
|
160
|
+
|
|
161
|
+
*Skip this step entirely if `setup.mode` is not `"umbrella"` and `services` section is absent from project-context.yaml.*
|
|
162
|
+
|
|
163
|
+
If `services` section is present:
|
|
164
|
+
|
|
165
|
+
**1. Detect active domain** (in priority order):
|
|
166
|
+
- Read `@trace.domain` from target file frontmatter (if Gate loaded a target file)
|
|
167
|
+
- Extract from target file path: segment immediately after `prd_dir` base path
|
|
168
|
+
*(e.g., `specs/prd/user/FEAT-01.md` → domain = `user`)*
|
|
169
|
+
- If `$ARGUMENTS` contains a path, extract the segment after `prd_dir`
|
|
170
|
+
|
|
171
|
+
**2. Route to service** — if active domain matches a key in `services`:
|
|
172
|
+
- Override `paths.specs_dir` → `services.{domain}.specs_dir`
|
|
173
|
+
- Override `paths.tech_docs_dir` → `services.{domain}.tech_docs_dir`
|
|
174
|
+
- Store `active_service` = `services.{domain}.path`
|
|
175
|
+
- Store `active_service_module` = `services.{domain}.module`
|
|
176
|
+
- If service has its own `module` → use it as `active_module` (overrides `tech_stack.module`)
|
|
177
|
+
|
|
178
|
+
**3. Fallback** — if domain not detected or no matching service key:
|
|
179
|
+
- Keep default paths from Step 1
|
|
180
|
+
- Set `active_service = unresolved`
|
|
181
|
+
|
|
182
|
+
**4. Spec source auto-override** — if `setup.spec_source` is set AND the corresponding path was not already explicitly set in `paths:`:
|
|
183
|
+
- Override `paths.prd_dir` → `{spec_source}/specs/prd`
|
|
184
|
+
- Override `paths.design_spec_dir` → `{spec_source}/specs/design-spec`
|
|
185
|
+
- Override `paths.domain_knowledge_dir` → `{spec_source}/specs/domain-knowledge`
|
|
186
|
+
- Override `paths.business_dictionary` → `{spec_source}/specs/domain-knowledge/business-dictionary.md`
|
|
187
|
+
- Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
157
191
|
## Step 2 — [PROJECT-CONFIG] Load module stack profile (conditional)
|
|
158
192
|
|
|
159
193
|
If `tech_stack.module` is set, read `.agent/modules/{module}/stack-profile.yaml`.
|
|
@@ -224,6 +258,26 @@ If the file does not exist → skip silently.
|
|
|
224
258
|
|
|
225
259
|
---
|
|
226
260
|
|
|
261
|
+
## Step 6.5 — [PLATFORM] Derive active_module and platform_type
|
|
262
|
+
|
|
263
|
+
Using `tech_stack.module` loaded in Step 1, derive and store two variables for use by all downstream commands:
|
|
264
|
+
|
|
265
|
+
```
|
|
266
|
+
active_module = tech_stack.module (e.g. "java-spring", "react", "flutter")
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
| `platform_type` | Modules |
|
|
270
|
+
|---|---|
|
|
271
|
+
| `backend` | `java-spring`, `golang`, `dotnet`, `php-laravel`, `context-engineering` |
|
|
272
|
+
| `web-frontend` | `react`, `nextjs`, `vue`, `nuxt`, `angular` |
|
|
273
|
+
| `mobile` | `flutter`, `react-native`, `ios-swiftui`, `android-compose` |
|
|
274
|
+
|
|
275
|
+
If `tech_stack.module` is blank or not recognized → set `platform_type = "unknown"` and flag as ⚠️ in the Step 7 recap.
|
|
276
|
+
|
|
277
|
+
These two variables (`active_module`, `platform_type`) are the canonical source for all branching logic in commands that need platform-specific behavior (generate-tests, debug, fix-bug, smoke-test).
|
|
278
|
+
|
|
279
|
+
---
|
|
280
|
+
|
|
227
281
|
## Step 7 — [RECAP] Working Memory Recap (anti-lost-in-middle)
|
|
228
282
|
|
|
229
283
|
After loading all context, synthesize and output a compact summary block.
|
|
@@ -234,10 +288,12 @@ Output exactly this block:
|
|
|
234
288
|
```
|
|
235
289
|
[CTX LOADED]
|
|
236
290
|
Stack : {language} / {framework} / {database}
|
|
291
|
+
Platform : {active_module} ({platform_type})
|
|
237
292
|
Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Service → Repository}
|
|
238
293
|
Ticket : {ticket_prefix}-
|
|
239
294
|
Dict : {loaded — N canonical terms, M banned terms | missing}
|
|
240
295
|
Entities : {loaded — EntityA, EntityB, EntityC | missing}
|
|
296
|
+
Service : {active_service} ({active_service_module}) | single-service
|
|
241
297
|
Status : {FULL | PARTIAL — missing: CLAUDE.md / business-dict / core-entities | MINIMAL}
|
|
242
298
|
```
|
|
243
299
|
|
|
@@ -280,6 +336,44 @@ Derive the output findings filename:
|
|
|
280
336
|
|
|
281
337
|
## PRD Review Mode
|
|
282
338
|
|
|
339
|
+
### P0 — Umbrella Routing Check (umbrella mode only)
|
|
340
|
+
|
|
341
|
+
*Skip this check entirely if `setup.mode` is not `"umbrella"` (i.e., `services` section absent from project-context.yaml).*
|
|
342
|
+
|
|
343
|
+
When `setup.mode = umbrella`, the PRD must have correct routing metadata so context-loader Step 1.5 can direct generated output to the right service submodule. Run these checks **before P1–P5**:
|
|
344
|
+
|
|
345
|
+
**P0.1 — `@trace.domain` presence**
|
|
346
|
+
- Read the PRD frontmatter block (lines starting with `@trace.` at top of file)
|
|
347
|
+
- If `@trace.domain` is **absent** → **critical** finding:
|
|
348
|
+
- `finding`: "`@trace.domain` is missing. Dev team's umbrella routing depends on this field to route BDD and code output to the correct service submodule."
|
|
349
|
+
- `suggestion`: "Add `@trace.domain: {domain}` to the PRD frontmatter. Use one of the domain keys defined in the umbrella's `project-context.yaml` services section."
|
|
350
|
+
- `auto_fixable: false` — PO must confirm the correct domain name
|
|
351
|
+
|
|
352
|
+
**P0.2 — `@trace.domain` matches a service key**
|
|
353
|
+
- If `@trace.domain` is present, check if its value matches any key in the `services` section of project-context.yaml
|
|
354
|
+
- If **no match found** → **critical** finding:
|
|
355
|
+
- `finding`: "`@trace.domain: {value}` does not match any key in the umbrella's `services` config. Routing will fall back to default paths and BDD may be generated to the wrong location."
|
|
356
|
+
- `suggestion`: "Either update `@trace.domain` to match an existing service key ({list known keys}), or add a new entry to `services` in project-context.yaml for domain `{value}`."
|
|
357
|
+
- `auto_fixable: false`
|
|
358
|
+
- If `services` section is not yet configured (empty/placeholder) → **major** finding:
|
|
359
|
+
- `finding`: "Umbrella `services` section is not yet configured. Cannot verify domain routing."
|
|
360
|
+
- `suggestion`: "Update `.agent/project-context.yaml` services section with domain-to-submodule mapping before generating BDD."
|
|
361
|
+
- `auto_fixable: false`
|
|
362
|
+
|
|
363
|
+
**P0.3 — `@trace.status` check**
|
|
364
|
+
- If `@trace.status` is absent → **minor**, `auto_fixable: true` (add `@trace.status: draft`)
|
|
365
|
+
- If `@trace.status: draft` → **major**, `auto_fixable: false`:
|
|
366
|
+
- `finding`: "PRD status is `draft`. Dev team should not generate BDD from an unapproved PRD."
|
|
367
|
+
- `suggestion`: "PO/SA should review and update status to `approved` before dev team proceeds."
|
|
368
|
+
|
|
369
|
+
> **P0 is a gate check:** If P0.1 or P0.2 yields a critical finding, display a warning before proceeding:
|
|
370
|
+
> ```
|
|
371
|
+
> ⚠️ ROUTING WARNING: @trace.domain issue detected.
|
|
372
|
+
> BDD/code generated from this PRD may land in the wrong service submodule.
|
|
373
|
+
> Resolve P0 findings before running /generate-bdd.
|
|
374
|
+
> ```
|
|
375
|
+
> Then continue with P1–P5 (do not abort — PO may be reviewing early-stage PRDs).
|
|
376
|
+
|
|
283
377
|
### P1 — Terminology Check (Business Dictionary)
|
|
284
378
|
|
|
285
379
|
Load `{paths.business_dictionary}`.
|
|
@@ -379,14 +473,15 @@ Using `{paths.business_dictionary}` and `{paths.core_entities}`:
|
|
|
379
473
|
### B4 — Compliance Checks (C.1–C.5)
|
|
380
474
|
|
|
381
475
|
- [ ] C.1 Wireframe Coverage: every screen component/action has ≥1 SC → finding per missing item
|
|
382
|
-
- [ ] C.2 PRD Traceability:
|
|
476
|
+
- [ ] C.2 PRD Traceability: covered fully by B1 — do NOT create new findings here; deduplicate against B1 findings
|
|
383
477
|
- [ ] C.3 Business Dictionary terms used → same as B2
|
|
384
478
|
- [ ] C.4 Banned Terms: 0 banned terms → **critical**, auto-fixable
|
|
385
479
|
- [ ] C.5 NHÓM Grouping: if ≥3 SCs, grouped by business theme → **major**, auto-fixable
|
|
386
480
|
|
|
387
481
|
### B5 — Metadata & Structural Check
|
|
388
482
|
|
|
389
|
-
- [ ] File header has all `@trace.*` fields → **minor
|
|
483
|
+
- [ ] File header has all required `@trace.*` fields — check each explicitly: `@trace.id`, `@trace.title`, `@trace.revision`, `@trace.domain`, `@trace.service`, `@trace.module`, `@trace.status`, `@trace.author`, `@trace.created_at`, `@trace.prd`, `@trace.prd_version`, `@trace.bdd_version`, `@trace.business_rules`, `@trace.dataset` → **minor** per missing field, auto-fixable
|
|
484
|
+
- Note: `@trace.revision` is always `1` (static field — see generate-bdd.tmpl). Only check for presence; do NOT flag value as stale.
|
|
390
485
|
- [ ] Every scenario has `# @trace.scenario`, `# @trace.sc_version`, `# @trace.business_rules`, `# Side-effects:` → **minor**, auto-fixable
|
|
391
486
|
- [ ] Coverage Matrix at end of file → **major**, auto-fixable (AI regenerates)
|
|
392
487
|
- [ ] Pre-merge Checklist at end of file → **minor**, auto-fixable
|
|
@@ -467,21 +562,23 @@ Suggest the logical next command based on workflow phase:
|
|
|
467
562
|
|
|
468
563
|
| Current command | Suggest next |
|
|
469
564
|
|-------------------------|-----------------------------------------------|
|
|
565
|
+
| /setup-ai-first | `/define-product` to start your first feature |
|
|
470
566
|
| /define-product | `/generate-prd {product-definition-file}` |
|
|
471
567
|
| /generate-prd | `/refine-prd {prd-file}` then `/review-context {prd-file}` |
|
|
472
568
|
| /refine-prd | Open Review Board → update PRD → `/review-context {prd-file}` |
|
|
473
|
-
| /review-context (PRD) | `/generate-
|
|
569
|
+
| /review-context (PRD) | FE/App: `/generate-design-spec {prd-file}` (then BDD after sign-off); BE: `/generate-bdd {prd-file}` directly; fix PRD if NEEDS_FIX |
|
|
570
|
+
| /generate-design-spec | Designer review → Figma links confirmed → PO + Designer sign-off → `/generate-bdd {prd-file}` |
|
|
474
571
|
| /generate-bdd | `/review-context {feature-file}` to verify coverage |
|
|
475
572
|
| /review-context (BDD) | `/generate-tech-docs {UC-ID}` if APPROVED; regenerate if NEEDS_FIX |
|
|
476
573
|
| /generate-tech-docs | `/review-tech-docs {tech-design-file}` |
|
|
477
574
|
| /review-tech-docs | `/generate-code {feature-file}` if APPROVED; fix doc if NEEDS_FIX |
|
|
478
|
-
| /generate-code | `/generate-tests {UC-ID}`
|
|
575
|
+
| /generate-code | First gen → `/review-code {UC-ID}`; re-gen → `/generate-tests {UC-ID}` |
|
|
479
576
|
| /generate-tests | `/run-tests {UC-ID}` |
|
|
480
577
|
| /run-tests (passing) | `/review-code {UC-ID}` |
|
|
481
578
|
| /run-tests (failing) | `/fix-bug {ticket-id}` or `/debug {error}` |
|
|
482
579
|
| /review-code | `/smoke-test {UC-ID}` or create PR |
|
|
483
580
|
| /smoke-test | Create PR and link to ticket |
|
|
484
|
-
| /validate-traces | `/generate-code {UC-ID}
|
|
581
|
+
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/generate-tests {UC-ID}`; all OK → create PR |
|
|
485
582
|
| /fix-bug | Create PR and link to ticket |
|
|
486
583
|
| /debug | `/fix-bug {ticket-id}` if fix needed |
|
|
487
584
|
|
|
@@ -500,7 +597,9 @@ Mode: {PRD | BDD}
|
|
|
500
597
|
Findings: {total} | 🔴 Critical: {N} | 🟡 Major: {N} | 🟢 Minor: {N}
|
|
501
598
|
Auto-fixable: {N} | Needs human decision: {N}
|
|
502
599
|
|
|
503
|
-
Findings file:
|
|
600
|
+
Findings file:
|
|
601
|
+
{If PRD}: {paths.refinement_dir}/{prd-slug}-review-context-findings.yaml
|
|
602
|
+
{If BDD}: {paths.refinement_dir}/{uc-id}-review-bdd-findings.yaml
|
|
504
603
|
|
|
505
604
|
Next options:
|
|
506
605
|
A) Quick fix : /review-context --fix {target-file}
|
|
@@ -536,6 +635,7 @@ For each finding where `auto_fixable: true`, in order (critical → major → mi
|
|
|
536
635
|
|
|
537
636
|
| check_id | What to apply |
|
|
538
637
|
|----------|--------------|
|
|
638
|
+
| P0.3 (Missing status) | Add `@trace.status: draft` to frontmatter |
|
|
539
639
|
| P1 (Banned term) | Replace every banned term occurrence with canonical term |
|
|
540
640
|
| P4 (Structure) | Add missing section/metadata skeleton |
|
|
541
641
|
|
|
@@ -557,7 +657,7 @@ After applying each finding, mark it `status: "applied_automatically"` in the fi
|
|
|
557
657
|
|
|
558
658
|
### Phase 3 — Version bump
|
|
559
659
|
|
|
560
|
-
- **PRD**: if ≥1 finding applied → bump minor version, add Changelog entry:
|
|
660
|
+
- **PRD**: if ≥1 finding applied → bump **minor** version (auto-fix only applies P1 banned-term replacements and P4 skeleton additions — never alters UC structure or BR content, so minor bump is always correct), add Changelog entry:
|
|
561
661
|
`Auto-fix: applied {N} auto-fixable review-context findings`
|
|
562
662
|
- **BDD**: if ≥1 finding applied → increment `@trace.bdd_version` by 0.1
|
|
563
663
|
|
|
@@ -577,7 +677,9 @@ Still pending (needs human decision): {N}
|
|
|
577
677
|
{If PRD}: Version bumped: {old} → {new}
|
|
578
678
|
{If BDD}: bdd_version: {old} → {new}
|
|
579
679
|
|
|
580
|
-
Findings file:
|
|
680
|
+
Findings file:
|
|
681
|
+
{If PRD}: {paths.refinement_dir}/{prd-slug}-review-context-findings.yaml
|
|
682
|
+
{If BDD}: {paths.refinement_dir}/{uc-id}-review-bdd-findings.yaml
|
|
581
683
|
Re-run /review-context {file} to confirm 0 remaining critical findings.
|
|
582
684
|
```
|
|
583
685
|
|
|
@@ -596,8 +698,10 @@ Open findings file in Review Board → then run: /review-context --resume {file}
|
|
|
596
698
|
|
|
597
699
|
### Phase 1 — Read accepted findings
|
|
598
700
|
|
|
599
|
-
1. Derive findings filename from target file
|
|
600
|
-
|
|
701
|
+
1. Derive findings filename from target file using the same rule as Detect Review Mode:
|
|
702
|
+
- PRD: `{paths.refinement_dir}/{prd-slug}-review-context-findings.yaml`
|
|
703
|
+
- BDD: `{paths.refinement_dir}/{uc-id}-review-bdd-findings.yaml`
|
|
704
|
+
2. Read the findings file.
|
|
601
705
|
3. Collect findings where `status: "accepted"` or `status: "modified"`.
|
|
602
706
|
4. If none → report "No accepted findings. File unchanged." and stop.
|
|
603
707
|
|
|
@@ -608,6 +712,7 @@ Apply in order: critical → major → minor.
|
|
|
608
712
|
**For PRD findings:**
|
|
609
713
|
| check_id | What to do |
|
|
610
714
|
|----------|-----------|
|
|
715
|
+
| P0.3 (Missing status) | Add `@trace.status: draft` to frontmatter |
|
|
611
716
|
| P1 (Banned term) | Replace every occurrence of banned term with canonical term |
|
|
612
717
|
| P2 (Ambiguity) | Apply the fix stated in `suggestion` or `modified` note |
|
|
613
718
|
| P3 (Conflict) | Apply the resolution stated in the modified note |
|
|
@@ -627,6 +732,7 @@ Apply in order: critical → major → minor.
|
|
|
627
732
|
| B6 (Side effects) | Add missing `And <side-effect>` to Then block |
|
|
628
733
|
|
|
629
734
|
→ After applying, increment `@trace.bdd_version` in file header by 0.1.
|
|
735
|
+
→ Also update `{paths.trace_dir}/{UC-ID}.tsv`: set `bdd_version` column to the new `@trace.bdd_version` value for all rows, and set `last_updated` to today's date.
|
|
630
736
|
|
|
631
737
|
### Phase 3 — Report
|
|
632
738
|
|