@anhth2/spec-driven-dev-plugin 0.8.0 → 0.9.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/ARCHITECTURE.md +6 -2
- package/commands/debug.md +152 -0
- package/commands/debug.tmpl +16 -0
- package/commands/define-product.md +57 -0
- package/commands/fix-bug.md +153 -0
- package/commands/fix-bug.tmpl +17 -0
- package/commands/generate-bdd.md +277 -13
- package/commands/generate-bdd.tmpl +220 -13
- package/commands/generate-code.md +154 -2
- package/commands/generate-code.tmpl +97 -2
- package/commands/generate-design-spec.md +57 -0
- package/commands/generate-prd.md +75 -0
- package/commands/generate-prd.tmpl +18 -0
- package/commands/generate-spec-manifest.md +57 -0
- package/commands/generate-tech-docs.md +79 -1
- package/commands/generate-tech-docs.tmpl +22 -1
- package/commands/generate-tests.md +57 -0
- package/commands/learn.md +554 -0
- package/commands/learn.tmpl +63 -0
- package/commands/propose-scenario.md +521 -0
- package/commands/propose-scenario.tmpl +109 -0
- package/commands/refine-prd.md +57 -0
- package/commands/report-bug.md +543 -0
- package/commands/report-bug.tmpl +131 -0
- package/commands/review-code.md +153 -0
- package/commands/review-code.tmpl +17 -0
- package/commands/review-context.md +57 -0
- package/commands/review-tech-docs.md +139 -4
- package/commands/review-tech-docs.tmpl +82 -4
- package/commands/run-tests.md +82 -0
- package/commands/run-tests.tmpl +25 -0
- package/commands/setup-ai-first.md +15 -5
- package/commands/setup-ai-first.tmpl +10 -5
- package/commands/smoke-test.md +57 -0
- package/commands/sync.md +405 -0
- package/commands/sync.tmpl +345 -0
- package/commands/update-framework.md +211 -0
- package/commands/update-framework.tmpl +151 -0
- package/commands/validate-traces.md +115 -2
- package/commands/validate-traces.tmpl +58 -2
- package/core/FRAMEWORK_VERSION +1 -1
- package/core/commands/debug.md +152 -0
- package/core/commands/define-product.md +57 -0
- package/core/commands/fix-bug.md +153 -0
- package/core/commands/generate-bdd.md +277 -13
- package/core/commands/generate-code.md +154 -2
- package/core/commands/generate-design-spec.md +57 -0
- package/core/commands/generate-prd.md +75 -0
- package/core/commands/generate-spec-manifest.md +57 -0
- package/core/commands/generate-tech-docs.md +79 -1
- package/core/commands/generate-tests.md +57 -0
- package/core/commands/learn.md +554 -0
- package/core/commands/propose-scenario.md +521 -0
- package/core/commands/refine-prd.md +57 -0
- package/core/commands/report-bug.md +543 -0
- package/core/commands/review-code.md +153 -0
- package/core/commands/review-context.md +57 -0
- package/core/commands/review-tech-docs.md +139 -4
- package/core/commands/run-tests.md +82 -0
- package/core/commands/setup-ai-first.md +15 -5
- package/core/commands/smoke-test.md +57 -0
- package/core/commands/sync.md +405 -0
- package/core/commands/update-framework.md +211 -0
- package/core/commands/validate-traces.md +115 -2
- package/core/skills/code/SKILL.md +62 -0
- package/core/skills/debug/SKILL.md +67 -0
- package/core/skills/design-spec/SKILL.md +57 -0
- package/core/skills/discovery/SKILL.md +57 -0
- package/core/skills/prd/SKILL.md +10 -0
- package/core/skills/setup-ai-first/SKILL.md +5 -0
- package/core/skills/spec/SKILL.md +10 -0
- package/core/skills/test/SKILL.md +119 -0
- package/core/steps/capture-lesson.md +79 -0
- package/core/steps/context-loader.md +52 -0
- package/core/steps/report-footer.md +5 -0
- package/core/templates/project-context.yaml +11 -0
- package/package.json +1 -1
- package/skills/code/SKILL.md +62 -0
- package/skills/debug/SKILL.md +67 -0
- package/skills/design-spec/SKILL.md +57 -0
- package/skills/discovery/SKILL.md +57 -0
- package/skills/prd/SKILL.md +10 -0
- package/skills/setup-ai-first/SKILL.md +5 -0
- package/skills/spec/SKILL.md +10 -0
- package/skills/test/SKILL.md +119 -0
- package/steps/capture-lesson.md +79 -0
- package/steps/context-loader.md +52 -0
- package/steps/report-footer.md +5 -0
- package/templates/project-context.yaml +11 -0
|
@@ -178,6 +178,37 @@ If `services` section is present:
|
|
|
178
178
|
- Override `paths.domain_knowledge_dir` → `{spec_source}/specs/domain-knowledge`
|
|
179
179
|
- Override `paths.business_dictionary` → `{spec_source}/specs/domain-knowledge/business-dictionary.md`
|
|
180
180
|
- Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
|
|
181
|
+
- Override `paths.bug_reports_dir` → `{spec_source}/feedback/bug-reports`
|
|
182
|
+
- Override `paths.bdd_proposals_dir` → `{spec_source}/feedback/bdd-proposals`
|
|
183
|
+
|
|
184
|
+
> **Why under `spec_source`:** tester feedback (`/report-bug`, `/propose-scenario`) must land in the **shared spec repo** so PO/Dev see it when they `/sync`. In single-service mode (no `spec_source`), these default to `feedback/bug-reports` and `feedback/bdd-proposals` at repo root — still shared, same repo.
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## Step 1.6 — [SERVICE CONVENTIONS] Load service-specific conventions (umbrella mode)
|
|
189
|
+
|
|
190
|
+
*Skip this step entirely if `active_service` is `"unresolved"` or context is single-service mode.*
|
|
191
|
+
|
|
192
|
+
When `active_service` has been resolved to a real path in Step 1.5 (e.g., `user-service/`):
|
|
193
|
+
|
|
194
|
+
**1. Locate service config** — try in priority order:
|
|
195
|
+
- `{active_service}/.agent/project-context.yaml`
|
|
196
|
+
- `{active_service}/project-context.yaml`
|
|
197
|
+
|
|
198
|
+
**2. If found, override with service-specific values:**
|
|
199
|
+
|
|
200
|
+
| Variable | Source |
|
|
201
|
+
|----------|--------|
|
|
202
|
+
| `conventions.test_command` | service's `conventions.test_command` |
|
|
203
|
+
| `conventions.build_command` | service's `conventions.build_command` |
|
|
204
|
+
| `paths.trace_dir` | `{active_service}/{service paths.trace_dir}` — default: `{active_service}/.trace` |
|
|
205
|
+
| `paths.specs_dir` | `{active_service}/{service paths.specs_dir}` (if set in service config, else keep Step 1.5 override) |
|
|
206
|
+
|
|
207
|
+
**3. Store** `service_root = {active_service}` as the working directory anchor for all downstream commands:
|
|
208
|
+
- Shell commands (`/run-tests`, `/generate-tests`) run **from within** `service_root`
|
|
209
|
+
- File write operations (test files, trace TSVs) use paths **relative to** `service_root`
|
|
210
|
+
|
|
211
|
+
**4. If service config not found** — keep umbrella defaults, still set `service_root = {active_service}` (path anchor is always needed even without a config override).
|
|
181
212
|
|
|
182
213
|
---
|
|
183
214
|
|
|
@@ -271,6 +302,25 @@ These two variables (`active_module`, `platform_type`) are the canonical source
|
|
|
271
302
|
|
|
272
303
|
---
|
|
273
304
|
|
|
305
|
+
## Step 6.7 — [GUARDRAILS] Load Project Lessons (conditional)
|
|
306
|
+
|
|
307
|
+
*Accumulated mistakes the AI must not repeat in this project. These are added over time via `/learn`
|
|
308
|
+
or accepted during `/review-code`, `/fix-bug`, `/debug`.*
|
|
309
|
+
|
|
310
|
+
Resolve the lessons file path:
|
|
311
|
+
- Use `paths.lessons_file` if set (may be service-overridden in umbrella mode, Step 1.6)
|
|
312
|
+
- Else default `specs/domain-knowledge/lessons-learned.md`
|
|
313
|
+
- In umbrella/service mode (when `service_root` is set), if `paths.lessons_file` is unset, default to `{service_root}/.agent/project-lessons.md`
|
|
314
|
+
|
|
315
|
+
If the file exists, read it and store ALL lessons as **ACTIVE GUARDRAILS** for the session:
|
|
316
|
+
- Treat each lesson's **Rule** as a hard constraint — same priority as CLAUDE.md coding standards (Step 3).
|
|
317
|
+
- Before generating or modifying any artifact (PRD, BDD, tech-doc, code, test), check the output against every lesson whose `category` matches the current command AND whose `scope` matches the target (domain / file).
|
|
318
|
+
- If a generated output would violate a lesson → correct it **before** presenting, and note which lesson (`L-NNN`) was applied.
|
|
319
|
+
|
|
320
|
+
If the file does not exist → skip silently (no lessons captured yet).
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
274
324
|
## Step 7 — [RECAP] Working Memory Recap (anti-lost-in-middle)
|
|
275
325
|
|
|
276
326
|
After loading all context, synthesize and output a compact summary block.
|
|
@@ -286,7 +336,9 @@ Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Ser
|
|
|
286
336
|
Ticket : {ticket_prefix}-
|
|
287
337
|
Dict : {loaded — N canonical terms, M banned terms | missing}
|
|
288
338
|
Entities : {loaded — EntityA, EntityB, EntityC | missing}
|
|
339
|
+
Lessons : {loaded — N guardrails | none yet}
|
|
289
340
|
Service : {active_service} ({active_service_module}) | single-service
|
|
341
|
+
Svc Root : {service_root} — conventions + trace_dir loaded from service config | —
|
|
290
342
|
Status : {FULL | PARTIAL — missing: CLAUDE.md / business-dict / core-entities | MINIMAL}
|
|
291
343
|
```
|
|
292
344
|
|
|
@@ -330,6 +382,39 @@ Read:
|
|
|
330
382
|
|
|
331
383
|
---
|
|
332
384
|
|
|
385
|
+
## Phase Detection
|
|
386
|
+
|
|
387
|
+
Parse `$ARGUMENTS` for a `--phase` flag:
|
|
388
|
+
|
|
389
|
+
| Flag | Meaning |
|
|
390
|
+
|---|---|
|
|
391
|
+
| `--phase=ui` | FE Phase 1 — generate UI + mock API layer from System BDD contract |
|
|
392
|
+
| `--phase=integration` | FE Phase 2 — replace mock adapter with real API calls from tech docs |
|
|
393
|
+
| *(none)* | Default — full implementation (BE or full-stack without mock split) |
|
|
394
|
+
|
|
395
|
+
**If `--phase` is set — confirm platform:**
|
|
396
|
+
Read `@trace.platform` from the feature file header.
|
|
397
|
+
- If `system` → warn: "`--phase` flag is not applicable for system BDD (BE-facing). Proceeding with default mode." Treat as no flag.
|
|
398
|
+
- If `web` or `app` → continue with phase logic below.
|
|
399
|
+
|
|
400
|
+
**If `--phase=ui`:**
|
|
401
|
+
Load System BDD for this UC: find `{specs_dir}/{domain}/system/{TICKET-ID}*.feature`.
|
|
402
|
+
Extract all `Then` clauses → collect implied response shapes and error states.
|
|
403
|
+
If System BDD not found → warn: "System BDD not found — mock layer will use placeholder fixtures." Continue.
|
|
404
|
+
|
|
405
|
+
**If `--phase=integration`:**
|
|
406
|
+
Read tech-doc `@trace.status` from `{paths.tech_docs_dir}/{domain}/{UC-ID}-tech-design.md`.
|
|
407
|
+
If `draft` or `in-review` → warn:
|
|
408
|
+
```
|
|
409
|
+
⚠ Tech docs for {UC-ID} are {status}.
|
|
410
|
+
BE may not have a stable API contract yet.
|
|
411
|
+
Proceeding — ensure BE endpoint is deployed or confirm contract manually.
|
|
412
|
+
```
|
|
413
|
+
Locate existing mock adapter from `--phase=ui` run (search for `{UC-ID}MockApiAdapter` in `{paths.src_dir}/{domain}/`).
|
|
414
|
+
If not found → warn: "Mock adapter not found — generating real API adapter from scratch using tech-doc contract."
|
|
415
|
+
|
|
416
|
+
---
|
|
417
|
+
|
|
333
418
|
## Read Trace State
|
|
334
419
|
|
|
335
420
|
Read `{paths.trace_dir}/{UC-ID}.tsv` if it exists. For each scenario row, note its current `status`:
|
|
@@ -374,6 +459,7 @@ Ticket : {TICKET_ID if known}
|
|
|
374
459
|
Domain : {domain}
|
|
375
460
|
UC : {UC-ID} only ← other feature files in this folder are NOT read
|
|
376
461
|
Tech : {language} / {framework}
|
|
462
|
+
Phase : {UI — mock layer | Integration — real API | Default — full} ← omit if no --phase flag
|
|
377
463
|
Scenarios: {N} total ({X} new, {Y} drifted, {Z} synced-skip)
|
|
378
464
|
Layer : {from CLAUDE.md §2}
|
|
379
465
|
|
|
@@ -420,6 +506,53 @@ DTOs → Entity/Model → Repository → Service interface → Service impl →
|
|
|
420
506
|
|
|
421
507
|
> **Entry-point rule:** `@trace.implements` must appear on the **entry-point layer** as defined in `CLAUDE.md §2`. For REST APIs → Controller. For event-driven modules → event handler / consumer class. For context-engineering → the prompt orchestration function. Never put it only on an inner layer.
|
|
422
508
|
|
|
509
|
+
## Mock API Layer (`--phase=ui` only)
|
|
510
|
+
|
|
511
|
+
*Skip this section entirely if `--phase` is not `ui`.*
|
|
512
|
+
|
|
513
|
+
Using the System BDD `Then` clauses loaded in Phase Detection:
|
|
514
|
+
|
|
515
|
+
1. **Extract fixture data** per scenario — success responses + error responses.
|
|
516
|
+
2. **Generate mock adapter** at `{paths.src_dir}/{domain}/{UC-ID}MockApiAdapter.{ext}`:
|
|
517
|
+
- Implements interface `{UC-ID}ApiPort` (same interface the real adapter will implement)
|
|
518
|
+
- Each method returns fixture data matching the BDD `Then` clause
|
|
519
|
+
- Include both success and error states (map to error scenarios in BDD)
|
|
520
|
+
- Traceability tags:
|
|
521
|
+
```
|
|
522
|
+
@trace.mock_for={UC-ID}
|
|
523
|
+
@trace.system_bdd={paths.specs_dir}/{domain}/system/{UC-ID}*.feature
|
|
524
|
+
```
|
|
525
|
+
3. **Wire into service/hook layer** via environment flag or DI:
|
|
526
|
+
```
|
|
527
|
+
const adapter = IS_MOCK ? new {UC-ID}MockApiAdapter() : new {UC-ID}ApiAdapter()
|
|
528
|
+
```
|
|
529
|
+
- `IS_MOCK` defaults to `true` in development/test env until real adapter is generated.
|
|
530
|
+
|
|
531
|
+
> Tester uses the mock adapter to test all FE scenarios without waiting for BE.
|
|
532
|
+
> Mock fixture data is derived directly from System BDD — BDD is the source of truth.
|
|
533
|
+
|
|
534
|
+
---
|
|
535
|
+
|
|
536
|
+
## Integration Phase (`--phase=integration` only)
|
|
537
|
+
|
|
538
|
+
*Skip this section entirely if `--phase` is not `integration`.*
|
|
539
|
+
|
|
540
|
+
1. **Read tech-doc API contract** from `{paths.tech_docs_dir}/{domain}/{UC-ID}-tech-design.md` — extract endpoints, request/response shapes, error codes.
|
|
541
|
+
2. **Read existing mock adapter** interface (`{UC-ID}ApiPort`) from the `--phase=ui` output.
|
|
542
|
+
3. **Generate real API adapter** at `{paths.src_dir}/{domain}/{UC-ID}ApiAdapter.{ext}`:
|
|
543
|
+
- Implements the same `{UC-ID}ApiPort` interface as mock adapter
|
|
544
|
+
- Makes real HTTP calls to endpoints from tech-doc contract
|
|
545
|
+
- Maps response fields to the same shapes the mock adapter returned
|
|
546
|
+
- Traceability tags:
|
|
547
|
+
```
|
|
548
|
+
@trace.implements={UC-ID}-SC{N}
|
|
549
|
+
@trace.tech_doc_revision={read from tech-doc header}
|
|
550
|
+
```
|
|
551
|
+
4. **Flip wire-up**: switch DI binding / env flag so service/hook uses `{UC-ID}ApiAdapter` (real) instead of mock.
|
|
552
|
+
5. **Do NOT delete mock adapter** — keep it for unit testing.
|
|
553
|
+
|
|
554
|
+
---
|
|
555
|
+
|
|
423
556
|
## Self-Review (3 rounds)
|
|
424
557
|
- [ ] Every scenario has a corresponding endpoint
|
|
425
558
|
- [ ] @trace.implements on every endpoint
|
|
@@ -442,6 +575,7 @@ Update `{paths.trace_dir}/{UC-ID}.tsv` — for each implemented scenario, find t
|
|
|
442
575
|
| `implemented_by` | `{ControllerClass}.{methodName}` |
|
|
443
576
|
| `bdd_version` | `@trace.bdd_version` from `.feature` header |
|
|
444
577
|
| `tech_doc_revision` | `@trace.revision` from tech-doc header, or `—` if no tech-doc |
|
|
578
|
+
| `fe_phase` | `ui` if `--phase=ui` \| `integrated` if `--phase=integration` \| `—` if no phase flag |
|
|
445
579
|
| `last_updated` | today `YYYY-MM-DD` |
|
|
446
580
|
|
|
447
581
|
Leave all other columns (`sc_title`, `spec_ver`, `prd_version`, `prd_status`, `uc_status`, `test_count`, `test_classes`) unchanged.
|
|
@@ -502,6 +636,11 @@ Suggest the logical next command based on workflow phase:
|
|
|
502
636
|
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/generate-tests {UC-ID}`; all OK → create PR |
|
|
503
637
|
| /fix-bug | Create PR and link to ticket |
|
|
504
638
|
| /debug | `/fix-bug {ticket-id}` if fix needed |
|
|
639
|
+
| /report-bug | Send to dev (`/fix-bug {BUG-ID}`); if coverage gap → `/propose-scenario {UC-ID}` |
|
|
640
|
+
| /propose-scenario | Notify PO/Dev to review the proposal in `feedback/bdd-proposals/` |
|
|
641
|
+
| /learn | Continue working — lesson applies on next command |
|
|
642
|
+
| /sync | `/validate-traces` for full coverage; act on any `📥 tester feedback` surfaced |
|
|
643
|
+
| /update-framework | Review `git diff .agent/`, commit; `/sync` for project content |
|
|
505
644
|
|
|
506
645
|
Format the footer as:
|
|
507
646
|
```
|
|
@@ -516,7 +655,20 @@ Next : {suggested command with example arguments}
|
|
|
516
655
|
/generate-code Complete — {UC-ID}
|
|
517
656
|
Files: created={N}, extended={M}, skipped={K} | Build: SUCCESS
|
|
518
657
|
Branch: feature/{TICKET_ID}-{slug}
|
|
658
|
+
Phase : {UI (mock layer) | Integration (real API) | Default (full)}
|
|
659
|
+
fe_phase : {ui | integrated | —}
|
|
660
|
+
|
|
519
661
|
Next:
|
|
520
|
-
|
|
521
|
-
|
|
662
|
+
--phase=ui done:
|
|
663
|
+
→ Notify tester: FE is testable via mock adapter
|
|
664
|
+
→ Collect BE sign-offs → /review-tech-docs {tech-design-file}
|
|
665
|
+
→ When BE ready → /generate-code {feature-file} --phase=integration
|
|
666
|
+
|
|
667
|
+
--phase=integration done:
|
|
668
|
+
→ /review-code {UC-ID} ← code review required
|
|
669
|
+
→ /generate-tests {UC-ID} ← integration test suite
|
|
670
|
+
|
|
671
|
+
Default (no phase flag):
|
|
672
|
+
→ /review-code {UC-ID} ← code review required before tests
|
|
673
|
+
→ /generate-tests {UC-ID}
|
|
522
674
|
```
|
|
@@ -178,6 +178,37 @@ If `services` section is present:
|
|
|
178
178
|
- Override `paths.domain_knowledge_dir` → `{spec_source}/specs/domain-knowledge`
|
|
179
179
|
- Override `paths.business_dictionary` → `{spec_source}/specs/domain-knowledge/business-dictionary.md`
|
|
180
180
|
- Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
|
|
181
|
+
- Override `paths.bug_reports_dir` → `{spec_source}/feedback/bug-reports`
|
|
182
|
+
- Override `paths.bdd_proposals_dir` → `{spec_source}/feedback/bdd-proposals`
|
|
183
|
+
|
|
184
|
+
> **Why under `spec_source`:** tester feedback (`/report-bug`, `/propose-scenario`) must land in the **shared spec repo** so PO/Dev see it when they `/sync`. In single-service mode (no `spec_source`), these default to `feedback/bug-reports` and `feedback/bdd-proposals` at repo root — still shared, same repo.
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## Step 1.6 — [SERVICE CONVENTIONS] Load service-specific conventions (umbrella mode)
|
|
189
|
+
|
|
190
|
+
*Skip this step entirely if `active_service` is `"unresolved"` or context is single-service mode.*
|
|
191
|
+
|
|
192
|
+
When `active_service` has been resolved to a real path in Step 1.5 (e.g., `user-service/`):
|
|
193
|
+
|
|
194
|
+
**1. Locate service config** — try in priority order:
|
|
195
|
+
- `{active_service}/.agent/project-context.yaml`
|
|
196
|
+
- `{active_service}/project-context.yaml`
|
|
197
|
+
|
|
198
|
+
**2. If found, override with service-specific values:**
|
|
199
|
+
|
|
200
|
+
| Variable | Source |
|
|
201
|
+
|----------|--------|
|
|
202
|
+
| `conventions.test_command` | service's `conventions.test_command` |
|
|
203
|
+
| `conventions.build_command` | service's `conventions.build_command` |
|
|
204
|
+
| `paths.trace_dir` | `{active_service}/{service paths.trace_dir}` — default: `{active_service}/.trace` |
|
|
205
|
+
| `paths.specs_dir` | `{active_service}/{service paths.specs_dir}` (if set in service config, else keep Step 1.5 override) |
|
|
206
|
+
|
|
207
|
+
**3. Store** `service_root = {active_service}` as the working directory anchor for all downstream commands:
|
|
208
|
+
- Shell commands (`/run-tests`, `/generate-tests`) run **from within** `service_root`
|
|
209
|
+
- File write operations (test files, trace TSVs) use paths **relative to** `service_root`
|
|
210
|
+
|
|
211
|
+
**4. If service config not found** — keep umbrella defaults, still set `service_root = {active_service}` (path anchor is always needed even without a config override).
|
|
181
212
|
|
|
182
213
|
---
|
|
183
214
|
|
|
@@ -271,6 +302,25 @@ These two variables (`active_module`, `platform_type`) are the canonical source
|
|
|
271
302
|
|
|
272
303
|
---
|
|
273
304
|
|
|
305
|
+
## Step 6.7 — [GUARDRAILS] Load Project Lessons (conditional)
|
|
306
|
+
|
|
307
|
+
*Accumulated mistakes the AI must not repeat in this project. These are added over time via `/learn`
|
|
308
|
+
or accepted during `/review-code`, `/fix-bug`, `/debug`.*
|
|
309
|
+
|
|
310
|
+
Resolve the lessons file path:
|
|
311
|
+
- Use `paths.lessons_file` if set (may be service-overridden in umbrella mode, Step 1.6)
|
|
312
|
+
- Else default `specs/domain-knowledge/lessons-learned.md`
|
|
313
|
+
- In umbrella/service mode (when `service_root` is set), if `paths.lessons_file` is unset, default to `{service_root}/.agent/project-lessons.md`
|
|
314
|
+
|
|
315
|
+
If the file exists, read it and store ALL lessons as **ACTIVE GUARDRAILS** for the session:
|
|
316
|
+
- Treat each lesson's **Rule** as a hard constraint — same priority as CLAUDE.md coding standards (Step 3).
|
|
317
|
+
- Before generating or modifying any artifact (PRD, BDD, tech-doc, code, test), check the output against every lesson whose `category` matches the current command AND whose `scope` matches the target (domain / file).
|
|
318
|
+
- If a generated output would violate a lesson → correct it **before** presenting, and note which lesson (`L-NNN`) was applied.
|
|
319
|
+
|
|
320
|
+
If the file does not exist → skip silently (no lessons captured yet).
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
274
324
|
## Step 7 — [RECAP] Working Memory Recap (anti-lost-in-middle)
|
|
275
325
|
|
|
276
326
|
After loading all context, synthesize and output a compact summary block.
|
|
@@ -286,7 +336,9 @@ Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Ser
|
|
|
286
336
|
Ticket : {ticket_prefix}-
|
|
287
337
|
Dict : {loaded — N canonical terms, M banned terms | missing}
|
|
288
338
|
Entities : {loaded — EntityA, EntityB, EntityC | missing}
|
|
339
|
+
Lessons : {loaded — N guardrails | none yet}
|
|
289
340
|
Service : {active_service} ({active_service_module}) | single-service
|
|
341
|
+
Svc Root : {service_root} — conventions + trace_dir loaded from service config | —
|
|
290
342
|
Status : {FULL | PARTIAL — missing: CLAUDE.md / business-dict / core-entities | MINIMAL}
|
|
291
343
|
```
|
|
292
344
|
|
|
@@ -733,6 +785,11 @@ Suggest the logical next command based on workflow phase:
|
|
|
733
785
|
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/generate-tests {UC-ID}`; all OK → create PR |
|
|
734
786
|
| /fix-bug | Create PR and link to ticket |
|
|
735
787
|
| /debug | `/fix-bug {ticket-id}` if fix needed |
|
|
788
|
+
| /report-bug | Send to dev (`/fix-bug {BUG-ID}`); if coverage gap → `/propose-scenario {UC-ID}` |
|
|
789
|
+
| /propose-scenario | Notify PO/Dev to review the proposal in `feedback/bdd-proposals/` |
|
|
790
|
+
| /learn | Continue working — lesson applies on next command |
|
|
791
|
+
| /sync | `/validate-traces` for full coverage; act on any `📥 tester feedback` surfaced |
|
|
792
|
+
| /update-framework | Review `git diff .agent/`, commit; `/sync` for project content |
|
|
736
793
|
|
|
737
794
|
Format the footer as:
|
|
738
795
|
```
|
|
@@ -178,6 +178,37 @@ If `services` section is present:
|
|
|
178
178
|
- Override `paths.domain_knowledge_dir` → `{spec_source}/specs/domain-knowledge`
|
|
179
179
|
- Override `paths.business_dictionary` → `{spec_source}/specs/domain-knowledge/business-dictionary.md`
|
|
180
180
|
- Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
|
|
181
|
+
- Override `paths.bug_reports_dir` → `{spec_source}/feedback/bug-reports`
|
|
182
|
+
- Override `paths.bdd_proposals_dir` → `{spec_source}/feedback/bdd-proposals`
|
|
183
|
+
|
|
184
|
+
> **Why under `spec_source`:** tester feedback (`/report-bug`, `/propose-scenario`) must land in the **shared spec repo** so PO/Dev see it when they `/sync`. In single-service mode (no `spec_source`), these default to `feedback/bug-reports` and `feedback/bdd-proposals` at repo root — still shared, same repo.
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## Step 1.6 — [SERVICE CONVENTIONS] Load service-specific conventions (umbrella mode)
|
|
189
|
+
|
|
190
|
+
*Skip this step entirely if `active_service` is `"unresolved"` or context is single-service mode.*
|
|
191
|
+
|
|
192
|
+
When `active_service` has been resolved to a real path in Step 1.5 (e.g., `user-service/`):
|
|
193
|
+
|
|
194
|
+
**1. Locate service config** — try in priority order:
|
|
195
|
+
- `{active_service}/.agent/project-context.yaml`
|
|
196
|
+
- `{active_service}/project-context.yaml`
|
|
197
|
+
|
|
198
|
+
**2. If found, override with service-specific values:**
|
|
199
|
+
|
|
200
|
+
| Variable | Source |
|
|
201
|
+
|----------|--------|
|
|
202
|
+
| `conventions.test_command` | service's `conventions.test_command` |
|
|
203
|
+
| `conventions.build_command` | service's `conventions.build_command` |
|
|
204
|
+
| `paths.trace_dir` | `{active_service}/{service paths.trace_dir}` — default: `{active_service}/.trace` |
|
|
205
|
+
| `paths.specs_dir` | `{active_service}/{service paths.specs_dir}` (if set in service config, else keep Step 1.5 override) |
|
|
206
|
+
|
|
207
|
+
**3. Store** `service_root = {active_service}` as the working directory anchor for all downstream commands:
|
|
208
|
+
- Shell commands (`/run-tests`, `/generate-tests`) run **from within** `service_root`
|
|
209
|
+
- File write operations (test files, trace TSVs) use paths **relative to** `service_root`
|
|
210
|
+
|
|
211
|
+
**4. If service config not found** — keep umbrella defaults, still set `service_root = {active_service}` (path anchor is always needed even without a config override).
|
|
181
212
|
|
|
182
213
|
---
|
|
183
214
|
|
|
@@ -271,6 +302,25 @@ These two variables (`active_module`, `platform_type`) are the canonical source
|
|
|
271
302
|
|
|
272
303
|
---
|
|
273
304
|
|
|
305
|
+
## Step 6.7 — [GUARDRAILS] Load Project Lessons (conditional)
|
|
306
|
+
|
|
307
|
+
*Accumulated mistakes the AI must not repeat in this project. These are added over time via `/learn`
|
|
308
|
+
or accepted during `/review-code`, `/fix-bug`, `/debug`.*
|
|
309
|
+
|
|
310
|
+
Resolve the lessons file path:
|
|
311
|
+
- Use `paths.lessons_file` if set (may be service-overridden in umbrella mode, Step 1.6)
|
|
312
|
+
- Else default `specs/domain-knowledge/lessons-learned.md`
|
|
313
|
+
- In umbrella/service mode (when `service_root` is set), if `paths.lessons_file` is unset, default to `{service_root}/.agent/project-lessons.md`
|
|
314
|
+
|
|
315
|
+
If the file exists, read it and store ALL lessons as **ACTIVE GUARDRAILS** for the session:
|
|
316
|
+
- Treat each lesson's **Rule** as a hard constraint — same priority as CLAUDE.md coding standards (Step 3).
|
|
317
|
+
- Before generating or modifying any artifact (PRD, BDD, tech-doc, code, test), check the output against every lesson whose `category` matches the current command AND whose `scope` matches the target (domain / file).
|
|
318
|
+
- If a generated output would violate a lesson → correct it **before** presenting, and note which lesson (`L-NNN`) was applied.
|
|
319
|
+
|
|
320
|
+
If the file does not exist → skip silently (no lessons captured yet).
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
274
324
|
## Step 7 — [RECAP] Working Memory Recap (anti-lost-in-middle)
|
|
275
325
|
|
|
276
326
|
After loading all context, synthesize and output a compact summary block.
|
|
@@ -286,7 +336,9 @@ Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Ser
|
|
|
286
336
|
Ticket : {ticket_prefix}-
|
|
287
337
|
Dict : {loaded — N canonical terms, M banned terms | missing}
|
|
288
338
|
Entities : {loaded — EntityA, EntityB, EntityC | missing}
|
|
339
|
+
Lessons : {loaded — N guardrails | none yet}
|
|
289
340
|
Service : {active_service} ({active_service_module}) | single-service
|
|
341
|
+
Svc Root : {service_root} — conventions + trace_dir loaded from service config | —
|
|
290
342
|
Status : {FULL | PARTIAL — missing: CLAUDE.md / business-dict / core-entities | MINIMAL}
|
|
291
343
|
```
|
|
292
344
|
|
|
@@ -384,6 +436,7 @@ Write `{paths.prd_dir}/{domain}/{TICKET-ID}-{slug}.md` using the structure below
|
|
|
384
436
|
| **Domain** | {domain} |
|
|
385
437
|
| **Created** | {YYYY-MM-DD} |
|
|
386
438
|
| **Updated** | {YYYY-MM-DD} |
|
|
439
|
+
| **API Source** | *(bỏ trống nếu greenfield — thêm `existing` nếu API đã tồn tại trên hệ thống)* |
|
|
387
440
|
|
|
388
441
|
---
|
|
389
442
|
|
|
@@ -468,6 +521,23 @@ flowchart TD
|
|
|
468
521
|
|
|
469
522
|
- {[TICKET-ID](./TICKET-ID-slug.md) — relationship description}
|
|
470
523
|
|
|
524
|
+
## Existing API Contract *(chỉ điền khi API Source = existing)*
|
|
525
|
+
|
|
526
|
+
> API đã tồn tại trên hệ thống. PO ghi lại contract để BDD generation dùng trực tiếp —
|
|
527
|
+
> không cần tổng hợp từ FE/App BDD, không cần T7 sign-off gate.
|
|
528
|
+
|
|
529
|
+
| Method | Path | Auth | Request | Response |
|
|
530
|
+
|--------|------|------|---------|----------|
|
|
531
|
+
| {GET/POST/PUT/DELETE} | {/api/v1/path} | {Bearer / none} | `{ field: type }` | `{ field: type }` |
|
|
532
|
+
|
|
533
|
+
**Error responses:**
|
|
534
|
+
|
|
535
|
+
| HTTP Status | Error Code | Khi nào xảy ra |
|
|
536
|
+
|-------------|------------|----------------|
|
|
537
|
+
| {4xx/5xx} | {ERR_CODE} | {condition} |
|
|
538
|
+
|
|
539
|
+
---
|
|
540
|
+
|
|
471
541
|
## AI Assumptions
|
|
472
542
|
|
|
473
543
|
> Assumptions AI made when information was incomplete. Needs PO review and confirmation.
|
|
@@ -551,6 +621,11 @@ Suggest the logical next command based on workflow phase:
|
|
|
551
621
|
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/generate-tests {UC-ID}`; all OK → create PR |
|
|
552
622
|
| /fix-bug | Create PR and link to ticket |
|
|
553
623
|
| /debug | `/fix-bug {ticket-id}` if fix needed |
|
|
624
|
+
| /report-bug | Send to dev (`/fix-bug {BUG-ID}`); if coverage gap → `/propose-scenario {UC-ID}` |
|
|
625
|
+
| /propose-scenario | Notify PO/Dev to review the proposal in `feedback/bdd-proposals/` |
|
|
626
|
+
| /learn | Continue working — lesson applies on next command |
|
|
627
|
+
| /sync | `/validate-traces` for full coverage; act on any `📥 tester feedback` surfaced |
|
|
628
|
+
| /update-framework | Review `git diff .agent/`, commit; `/sync` for project content |
|
|
554
629
|
|
|
555
630
|
Format the footer as:
|
|
556
631
|
```
|
|
@@ -183,6 +183,37 @@ If `services` section is present:
|
|
|
183
183
|
- Override `paths.domain_knowledge_dir` → `{spec_source}/specs/domain-knowledge`
|
|
184
184
|
- Override `paths.business_dictionary` → `{spec_source}/specs/domain-knowledge/business-dictionary.md`
|
|
185
185
|
- Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
|
|
186
|
+
- Override `paths.bug_reports_dir` → `{spec_source}/feedback/bug-reports`
|
|
187
|
+
- Override `paths.bdd_proposals_dir` → `{spec_source}/feedback/bdd-proposals`
|
|
188
|
+
|
|
189
|
+
> **Why under `spec_source`:** tester feedback (`/report-bug`, `/propose-scenario`) must land in the **shared spec repo** so PO/Dev see it when they `/sync`. In single-service mode (no `spec_source`), these default to `feedback/bug-reports` and `feedback/bdd-proposals` at repo root — still shared, same repo.
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## Step 1.6 — [SERVICE CONVENTIONS] Load service-specific conventions (umbrella mode)
|
|
194
|
+
|
|
195
|
+
*Skip this step entirely if `active_service` is `"unresolved"` or context is single-service mode.*
|
|
196
|
+
|
|
197
|
+
When `active_service` has been resolved to a real path in Step 1.5 (e.g., `user-service/`):
|
|
198
|
+
|
|
199
|
+
**1. Locate service config** — try in priority order:
|
|
200
|
+
- `{active_service}/.agent/project-context.yaml`
|
|
201
|
+
- `{active_service}/project-context.yaml`
|
|
202
|
+
|
|
203
|
+
**2. If found, override with service-specific values:**
|
|
204
|
+
|
|
205
|
+
| Variable | Source |
|
|
206
|
+
|----------|--------|
|
|
207
|
+
| `conventions.test_command` | service's `conventions.test_command` |
|
|
208
|
+
| `conventions.build_command` | service's `conventions.build_command` |
|
|
209
|
+
| `paths.trace_dir` | `{active_service}/{service paths.trace_dir}` — default: `{active_service}/.trace` |
|
|
210
|
+
| `paths.specs_dir` | `{active_service}/{service paths.specs_dir}` (if set in service config, else keep Step 1.5 override) |
|
|
211
|
+
|
|
212
|
+
**3. Store** `service_root = {active_service}` as the working directory anchor for all downstream commands:
|
|
213
|
+
- Shell commands (`/run-tests`, `/generate-tests`) run **from within** `service_root`
|
|
214
|
+
- File write operations (test files, trace TSVs) use paths **relative to** `service_root`
|
|
215
|
+
|
|
216
|
+
**4. If service config not found** — keep umbrella defaults, still set `service_root = {active_service}` (path anchor is always needed even without a config override).
|
|
186
217
|
|
|
187
218
|
---
|
|
188
219
|
|
|
@@ -276,6 +307,25 @@ These two variables (`active_module`, `platform_type`) are the canonical source
|
|
|
276
307
|
|
|
277
308
|
---
|
|
278
309
|
|
|
310
|
+
## Step 6.7 — [GUARDRAILS] Load Project Lessons (conditional)
|
|
311
|
+
|
|
312
|
+
*Accumulated mistakes the AI must not repeat in this project. These are added over time via `/learn`
|
|
313
|
+
or accepted during `/review-code`, `/fix-bug`, `/debug`.*
|
|
314
|
+
|
|
315
|
+
Resolve the lessons file path:
|
|
316
|
+
- Use `paths.lessons_file` if set (may be service-overridden in umbrella mode, Step 1.6)
|
|
317
|
+
- Else default `specs/domain-knowledge/lessons-learned.md`
|
|
318
|
+
- In umbrella/service mode (when `service_root` is set), if `paths.lessons_file` is unset, default to `{service_root}/.agent/project-lessons.md`
|
|
319
|
+
|
|
320
|
+
If the file exists, read it and store ALL lessons as **ACTIVE GUARDRAILS** for the session:
|
|
321
|
+
- Treat each lesson's **Rule** as a hard constraint — same priority as CLAUDE.md coding standards (Step 3).
|
|
322
|
+
- Before generating or modifying any artifact (PRD, BDD, tech-doc, code, test), check the output against every lesson whose `category` matches the current command AND whose `scope` matches the target (domain / file).
|
|
323
|
+
- If a generated output would violate a lesson → correct it **before** presenting, and note which lesson (`L-NNN`) was applied.
|
|
324
|
+
|
|
325
|
+
If the file does not exist → skip silently (no lessons captured yet).
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
279
329
|
## Step 7 — [RECAP] Working Memory Recap (anti-lost-in-middle)
|
|
280
330
|
|
|
281
331
|
After loading all context, synthesize and output a compact summary block.
|
|
@@ -291,7 +341,9 @@ Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Ser
|
|
|
291
341
|
Ticket : {ticket_prefix}-
|
|
292
342
|
Dict : {loaded — N canonical terms, M banned terms | missing}
|
|
293
343
|
Entities : {loaded — EntityA, EntityB, EntityC | missing}
|
|
344
|
+
Lessons : {loaded — N guardrails | none yet}
|
|
294
345
|
Service : {active_service} ({active_service_module}) | single-service
|
|
346
|
+
Svc Root : {service_root} — conventions + trace_dir loaded from service config | —
|
|
295
347
|
Status : {FULL | PARTIAL — missing: CLAUDE.md / business-dict / core-entities | MINIMAL}
|
|
296
348
|
```
|
|
297
349
|
|
|
@@ -485,6 +537,11 @@ Suggest the logical next command based on workflow phase:
|
|
|
485
537
|
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/generate-tests {UC-ID}`; all OK → create PR |
|
|
486
538
|
| /fix-bug | Create PR and link to ticket |
|
|
487
539
|
| /debug | `/fix-bug {ticket-id}` if fix needed |
|
|
540
|
+
| /report-bug | Send to dev (`/fix-bug {BUG-ID}`); if coverage gap → `/propose-scenario {UC-ID}` |
|
|
541
|
+
| /propose-scenario | Notify PO/Dev to review the proposal in `feedback/bdd-proposals/` |
|
|
542
|
+
| /learn | Continue working — lesson applies on next command |
|
|
543
|
+
| /sync | `/validate-traces` for full coverage; act on any `📥 tester feedback` surfaced |
|
|
544
|
+
| /update-framework | Review `git diff .agent/`, commit; `/sync` for project content |
|
|
488
545
|
|
|
489
546
|
Format the footer as:
|
|
490
547
|
```
|
|
@@ -199,6 +199,37 @@ If `services` section is present:
|
|
|
199
199
|
- Override `paths.domain_knowledge_dir` → `{spec_source}/specs/domain-knowledge`
|
|
200
200
|
- Override `paths.business_dictionary` → `{spec_source}/specs/domain-knowledge/business-dictionary.md`
|
|
201
201
|
- Override `paths.core_entities` → `{spec_source}/specs/domain-knowledge/core-entities.md`
|
|
202
|
+
- Override `paths.bug_reports_dir` → `{spec_source}/feedback/bug-reports`
|
|
203
|
+
- Override `paths.bdd_proposals_dir` → `{spec_source}/feedback/bdd-proposals`
|
|
204
|
+
|
|
205
|
+
> **Why under `spec_source`:** tester feedback (`/report-bug`, `/propose-scenario`) must land in the **shared spec repo** so PO/Dev see it when they `/sync`. In single-service mode (no `spec_source`), these default to `feedback/bug-reports` and `feedback/bdd-proposals` at repo root — still shared, same repo.
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## Step 1.6 — [SERVICE CONVENTIONS] Load service-specific conventions (umbrella mode)
|
|
210
|
+
|
|
211
|
+
*Skip this step entirely if `active_service` is `"unresolved"` or context is single-service mode.*
|
|
212
|
+
|
|
213
|
+
When `active_service` has been resolved to a real path in Step 1.5 (e.g., `user-service/`):
|
|
214
|
+
|
|
215
|
+
**1. Locate service config** — try in priority order:
|
|
216
|
+
- `{active_service}/.agent/project-context.yaml`
|
|
217
|
+
- `{active_service}/project-context.yaml`
|
|
218
|
+
|
|
219
|
+
**2. If found, override with service-specific values:**
|
|
220
|
+
|
|
221
|
+
| Variable | Source |
|
|
222
|
+
|----------|--------|
|
|
223
|
+
| `conventions.test_command` | service's `conventions.test_command` |
|
|
224
|
+
| `conventions.build_command` | service's `conventions.build_command` |
|
|
225
|
+
| `paths.trace_dir` | `{active_service}/{service paths.trace_dir}` — default: `{active_service}/.trace` |
|
|
226
|
+
| `paths.specs_dir` | `{active_service}/{service paths.specs_dir}` (if set in service config, else keep Step 1.5 override) |
|
|
227
|
+
|
|
228
|
+
**3. Store** `service_root = {active_service}` as the working directory anchor for all downstream commands:
|
|
229
|
+
- Shell commands (`/run-tests`, `/generate-tests`) run **from within** `service_root`
|
|
230
|
+
- File write operations (test files, trace TSVs) use paths **relative to** `service_root`
|
|
231
|
+
|
|
232
|
+
**4. If service config not found** — keep umbrella defaults, still set `service_root = {active_service}` (path anchor is always needed even without a config override).
|
|
202
233
|
|
|
203
234
|
---
|
|
204
235
|
|
|
@@ -292,6 +323,25 @@ These two variables (`active_module`, `platform_type`) are the canonical source
|
|
|
292
323
|
|
|
293
324
|
---
|
|
294
325
|
|
|
326
|
+
## Step 6.7 — [GUARDRAILS] Load Project Lessons (conditional)
|
|
327
|
+
|
|
328
|
+
*Accumulated mistakes the AI must not repeat in this project. These are added over time via `/learn`
|
|
329
|
+
or accepted during `/review-code`, `/fix-bug`, `/debug`.*
|
|
330
|
+
|
|
331
|
+
Resolve the lessons file path:
|
|
332
|
+
- Use `paths.lessons_file` if set (may be service-overridden in umbrella mode, Step 1.6)
|
|
333
|
+
- Else default `specs/domain-knowledge/lessons-learned.md`
|
|
334
|
+
- In umbrella/service mode (when `service_root` is set), if `paths.lessons_file` is unset, default to `{service_root}/.agent/project-lessons.md`
|
|
335
|
+
|
|
336
|
+
If the file exists, read it and store ALL lessons as **ACTIVE GUARDRAILS** for the session:
|
|
337
|
+
- Treat each lesson's **Rule** as a hard constraint — same priority as CLAUDE.md coding standards (Step 3).
|
|
338
|
+
- Before generating or modifying any artifact (PRD, BDD, tech-doc, code, test), check the output against every lesson whose `category` matches the current command AND whose `scope` matches the target (domain / file).
|
|
339
|
+
- If a generated output would violate a lesson → correct it **before** presenting, and note which lesson (`L-NNN`) was applied.
|
|
340
|
+
|
|
341
|
+
If the file does not exist → skip silently (no lessons captured yet).
|
|
342
|
+
|
|
343
|
+
---
|
|
344
|
+
|
|
295
345
|
## Step 7 — [RECAP] Working Memory Recap (anti-lost-in-middle)
|
|
296
346
|
|
|
297
347
|
After loading all context, synthesize and output a compact summary block.
|
|
@@ -307,7 +357,9 @@ Layers : {layer order from CLAUDE.md §2, e.g., Controller → Facade → Ser
|
|
|
307
357
|
Ticket : {ticket_prefix}-
|
|
308
358
|
Dict : {loaded — N canonical terms, M banned terms | missing}
|
|
309
359
|
Entities : {loaded — EntityA, EntityB, EntityC | missing}
|
|
360
|
+
Lessons : {loaded — N guardrails | none yet}
|
|
310
361
|
Service : {active_service} ({active_service_module}) | single-service
|
|
362
|
+
Svc Root : {service_root} — conventions + trace_dir loaded from service config | —
|
|
311
363
|
Status : {FULL | PARTIAL — missing: CLAUDE.md / business-dict / core-entities | MINIMAL}
|
|
312
364
|
```
|
|
313
365
|
|
|
@@ -329,6 +381,22 @@ After completing all steps, you have loaded:
|
|
|
329
381
|
Proceed to the next step of the calling command.
|
|
330
382
|
|
|
331
383
|
|
|
384
|
+
---
|
|
385
|
+
|
|
386
|
+
## Brownfield Check
|
|
387
|
+
|
|
388
|
+
Read the source `.feature` file header for `@trace.api_source`.
|
|
389
|
+
Also check the source PRD Metadata table for `| **API Source** | existing |`.
|
|
390
|
+
|
|
391
|
+
| Value | Mode |
|
|
392
|
+
|-------|------|
|
|
393
|
+
| `existing` | **Reverse-document** — API đã tồn tại; mô tả lại as-is, note gaps, không cần design mới |
|
|
394
|
+
| absent / other | **Greenfield** — thiết kế API từ đầu |
|
|
395
|
+
|
|
396
|
+
Store `active_mode = {reverse-document | greenfield}`.
|
|
397
|
+
|
|
398
|
+
If `active_mode = reverse-document` → load bảng "Existing API Contract" từ PRD làm input cho §2.
|
|
399
|
+
|
|
332
400
|
---
|
|
333
401
|
|
|
334
402
|
## CHECKPOINT — Tech Design Plan
|
|
@@ -341,13 +409,14 @@ Tech Design Plan — {UC-ID}
|
|
|
341
409
|
UC : {UC-ID} — {feature title}
|
|
342
410
|
Service : {trace.service}
|
|
343
411
|
Module : {trace.module}
|
|
412
|
+
Mode : {Reverse-document (API đã tồn tại) | Greenfield (thiết kế mới)}
|
|
344
413
|
Scenarios: {N} scenarios
|
|
345
414
|
BDD ver : {trace.bdd_version}
|
|
346
415
|
Output : {paths.tech_docs_dir}/{domain}/{UC-ID}-tech-design.md
|
|
347
416
|
|
|
348
417
|
Sections to generate:
|
|
349
418
|
§1 Overview
|
|
350
|
-
§2 API Endpoints ({
|
|
419
|
+
§2 API Endpoints ({Reverse-document: mô tả lại từ PRD contract | Greenfield: infer từ scenarios})
|
|
351
420
|
§3 Data Model ({entities from core-entities.md relevant to this UC})
|
|
352
421
|
§4 Service Flow
|
|
353
422
|
§5 Business Rules ({N} BRs from feature header)
|
|
@@ -379,11 +448,15 @@ Write `{paths.tech_docs_dir}/{domain}/{UC-ID}-tech-design.md`:
|
|
|
379
448
|
@trace.bdd_version: {read @trace.bdd_version from the .feature file header}
|
|
380
449
|
@trace.revision: 1
|
|
381
450
|
@trace.status: draft
|
|
451
|
+
@trace.api_source: {existing | —}
|
|
382
452
|
@trace.generated_at: {YYYY-MM-DD}
|
|
383
453
|
---
|
|
384
454
|
|
|
385
455
|
## §1. Overview
|
|
386
456
|
## §2. API Endpoints
|
|
457
|
+
*Greenfield:* endpoints được infer từ BDD scenarios — thiết kế mới.
|
|
458
|
+
*Reverse-document:* mô tả lại API đã tồn tại từ bảng "Existing API Contract" trong PRD.
|
|
459
|
+
Ghi chú gaps nếu contract thực tế khác với BDD expectations.
|
|
387
460
|
| Method | Path | Auth/Role | Request | Response |
|
|
388
461
|
## §3. Data Model
|
|
389
462
|
Key entities and relationships.
|
|
@@ -456,6 +529,11 @@ Suggest the logical next command based on workflow phase:
|
|
|
456
529
|
| /validate-traces | DRIFT/UNTRACKED → `/generate-code {UC-ID}`; GAP → `/generate-tests {UC-ID}`; all OK → create PR |
|
|
457
530
|
| /fix-bug | Create PR and link to ticket |
|
|
458
531
|
| /debug | `/fix-bug {ticket-id}` if fix needed |
|
|
532
|
+
| /report-bug | Send to dev (`/fix-bug {BUG-ID}`); if coverage gap → `/propose-scenario {UC-ID}` |
|
|
533
|
+
| /propose-scenario | Notify PO/Dev to review the proposal in `feedback/bdd-proposals/` |
|
|
534
|
+
| /learn | Continue working — lesson applies on next command |
|
|
535
|
+
| /sync | `/validate-traces` for full coverage; act on any `📥 tester feedback` surfaced |
|
|
536
|
+
| /update-framework | Review `git diff .agent/`, commit; `/sync` for project content |
|
|
459
537
|
|
|
460
538
|
Format the footer as:
|
|
461
539
|
```
|