@edupia-tutor/spec-driven-docs 0.14.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/build.js +230 -0
- package/bin/index.js +598 -0
- package/commands/debug.md +830 -0
- package/commands/debug.tmpl +257 -0
- package/commands/define-product.md +652 -0
- package/commands/define-product.tmpl +158 -0
- package/commands/dev-gen-test.md +1010 -0
- package/commands/dev-gen-test.tmpl +490 -0
- package/commands/dev-run-test.md +744 -0
- package/commands/dev-run-test.tmpl +224 -0
- package/commands/dev-smoke-test.md +711 -0
- package/commands/dev-smoke-test.tmpl +217 -0
- package/commands/fix-bug.md +744 -0
- package/commands/fix-bug.tmpl +171 -0
- package/commands/generate-bdd.md +1054 -0
- package/commands/generate-bdd.tmpl +534 -0
- package/commands/generate-code.md +869 -0
- package/commands/generate-code.tmpl +349 -0
- package/commands/generate-design-spec.md +958 -0
- package/commands/generate-design-spec.tmpl +464 -0
- package/commands/generate-prd.md +748 -0
- package/commands/generate-prd.tmpl +254 -0
- package/commands/generate-spec-manifest.md +658 -0
- package/commands/generate-spec-manifest.tmpl +164 -0
- package/commands/generate-tech-docs.md +849 -0
- package/commands/generate-tech-docs.tmpl +355 -0
- package/commands/learn.md +636 -0
- package/commands/learn.tmpl +63 -0
- package/commands/map-testids.md +575 -0
- package/commands/map-testids.tmpl +81 -0
- package/commands/propose-scenario.md +623 -0
- package/commands/propose-scenario.tmpl +129 -0
- package/commands/qc-analyze.md +580 -0
- package/commands/qc-analyze.tmpl +86 -0
- package/commands/qc-design-test.md +562 -0
- package/commands/qc-design-test.tmpl +68 -0
- package/commands/qc-plan.md +543 -0
- package/commands/qc-plan.tmpl +49 -0
- package/commands/qc-report.md +554 -0
- package/commands/qc-report.tmpl +60 -0
- package/commands/qc-review.md +547 -0
- package/commands/qc-review.tmpl +53 -0
- package/commands/qc-run-test.md +604 -0
- package/commands/qc-run-test.tmpl +84 -0
- package/commands/refine-prd.md +772 -0
- package/commands/refine-prd.tmpl +140 -0
- package/commands/report-bug.md +639 -0
- package/commands/report-bug.tmpl +145 -0
- package/commands/review-code.md +677 -0
- package/commands/review-code.tmpl +104 -0
- package/commands/review-context.md +1047 -0
- package/commands/review-context.tmpl +415 -0
- package/commands/review-tech-docs.md +811 -0
- package/commands/review-tech-docs.tmpl +317 -0
- package/commands/setup-ai-first.md +545 -0
- package/commands/setup-ai-first.tmpl +358 -0
- package/commands/sync.md +451 -0
- package/commands/sync.tmpl +351 -0
- package/commands/update-framework.md +251 -0
- package/commands/update-framework.tmpl +151 -0
- package/commands/validate-traces.md +842 -0
- package/commands/validate-traces.tmpl +348 -0
- package/core/FRAMEWORK_VERSION +1 -0
- package/core/commands/debug.md +830 -0
- package/core/commands/define-product.md +652 -0
- package/core/commands/dev-gen-test.md +1010 -0
- package/core/commands/dev-run-test.md +744 -0
- package/core/commands/dev-smoke-test.md +711 -0
- package/core/commands/fix-bug.md +744 -0
- package/core/commands/generate-bdd.md +1054 -0
- package/core/commands/generate-code.md +869 -0
- package/core/commands/generate-design-spec.md +958 -0
- package/core/commands/generate-prd.md +748 -0
- package/core/commands/generate-spec-manifest.md +658 -0
- package/core/commands/generate-tech-docs.md +849 -0
- package/core/commands/learn.md +636 -0
- package/core/commands/map-testids.md +575 -0
- package/core/commands/propose-scenario.md +623 -0
- package/core/commands/qc-analyze.md +580 -0
- package/core/commands/qc-design-test.md +562 -0
- package/core/commands/qc-plan.md +543 -0
- package/core/commands/qc-report.md +554 -0
- package/core/commands/qc-review.md +547 -0
- package/core/commands/qc-run-test.md +604 -0
- package/core/commands/refine-prd.md +772 -0
- package/core/commands/report-bug.md +639 -0
- package/core/commands/review-code.md +677 -0
- package/core/commands/review-context.md +1047 -0
- package/core/commands/review-tech-docs.md +811 -0
- package/core/commands/setup-ai-first.md +545 -0
- package/core/commands/sync.md +451 -0
- package/core/commands/update-framework.md +251 -0
- package/core/commands/validate-traces.md +842 -0
- package/core/hooks/data-guard.js +141 -0
- package/core/hooks/settings.json +18 -0
- package/core/modules/android-compose/module.yaml +13 -0
- package/core/modules/android-compose/stack-profile.yaml +57 -0
- package/core/modules/angular/architecture-snippets/component-patterns.md +187 -0
- package/core/modules/angular/module.yaml +6 -0
- package/core/modules/angular/stack-profile.yaml +38 -0
- package/core/modules/context-engineering/architecture-snippets/context-design.md +119 -0
- package/core/modules/context-engineering/module.yaml +9 -0
- package/core/modules/context-engineering/stack-profile.yaml +61 -0
- package/core/modules/dotnet/architecture-snippets/clean-arch.md +160 -0
- package/core/modules/dotnet/module.yaml +6 -0
- package/core/modules/dotnet/stack-profile.yaml +50 -0
- package/core/modules/flutter/module.yaml +14 -0
- package/core/modules/flutter/stack-profile.yaml +59 -0
- package/core/modules/golang/architecture-snippets/domain-layout.md +283 -0
- package/core/modules/golang/module.yaml +6 -0
- package/core/modules/golang/stack-profile.yaml +40 -0
- package/core/modules/ios-swiftui/module.yaml +13 -0
- package/core/modules/ios-swiftui/stack-profile.yaml +55 -0
- package/core/modules/java-spring/architecture-snippets/layered-arch.md +201 -0
- package/core/modules/java-spring/module.yaml +15 -0
- package/core/modules/java-spring/stack-profile.yaml +28 -0
- package/core/modules/nextjs/architecture-snippets/app-router-patterns.md +269 -0
- package/core/modules/nextjs/module.yaml +14 -0
- package/core/modules/nextjs/stack-profile.yaml +74 -0
- package/core/modules/nuxt/module.yaml +14 -0
- package/core/modules/nuxt/stack-profile.yaml +58 -0
- package/core/modules/php-laravel/architecture-snippets/service-repository.md +302 -0
- package/core/modules/php-laravel/module.yaml +15 -0
- package/core/modules/php-laravel/stack-profile.yaml +56 -0
- package/core/modules/qc-playwright/stack-profile.yaml +66 -0
- package/core/modules/react/architecture-snippets/hooks-query-patterns.md +254 -0
- package/core/modules/react/module.yaml +14 -0
- package/core/modules/react/stack-profile.yaml +63 -0
- package/core/modules/react-native/module.yaml +14 -0
- package/core/modules/react-native/stack-profile.yaml +56 -0
- package/core/modules/vue/module.yaml +14 -0
- package/core/modules/vue/stack-profile.yaml +65 -0
- package/core/rules/data-protection.md +80 -0
- package/core/rules/workflow.md +44 -0
- package/core/skills/code/SKILL.md +770 -0
- package/core/skills/debug/SKILL.md +869 -0
- package/core/skills/design-spec/SKILL.md +589 -0
- package/core/skills/discovery/SKILL.md +554 -0
- package/core/skills/prd/SKILL.md +562 -0
- package/core/skills/qc/qa-analyst/DOC_GAPS.template.md +63 -0
- package/core/skills/qc/qa-analyst/acceptance-criteria.md +60 -0
- package/core/skills/qc/qa-analyst/business-rules.md +59 -0
- package/core/skills/qc/qa-analyst/data-flow.md +64 -0
- package/core/skills/qc/qa-analyst/spec-breakdown.md +61 -0
- package/core/skills/qc/qa-designer/e2e/journey.md +41 -0
- package/core/skills/qc/qa-designer/exploratory/charter.md +68 -0
- package/core/skills/qc/qa-designer/exploratory/explore-to-functional.md +43 -0
- package/core/skills/qc/qa-designer/functional/api.md +45 -0
- package/core/skills/qc/qa-designer/functional/gui-feature.md +46 -0
- package/core/skills/qc/qa-designer/functional/gui-screen.md +52 -0
- package/core/skills/qc/qa-designer/integration/api.md +42 -0
- package/core/skills/qc/qa-designer/integration/db.md +39 -0
- package/core/skills/qc/qa-designer/integration/gui.md +40 -0
- package/core/skills/qc/qa-designer/integration/kafka.md +40 -0
- package/core/skills/qc/qa-designer/non-functional.md +40 -0
- package/core/skills/qc/qa-planner/test-plan.md +120 -0
- package/core/skills/qc/qa-reviewer/script/e2e.md +87 -0
- package/core/skills/qc/qa-reviewer/script/exploratory.md +45 -0
- package/core/skills/qc/qa-reviewer/script/functional.md +101 -0
- package/core/skills/qc/qa-reviewer/script/integration.md +91 -0
- package/core/skills/qc/qa-reviewer/script/non-functional.md +126 -0
- package/core/skills/qc/qa-reviewer/test-case/e2e.md +73 -0
- package/core/skills/qc/qa-reviewer/test-case/exploratory.md +43 -0
- package/core/skills/qc/qa-reviewer/test-case/functional.md +76 -0
- package/core/skills/qc/qa-reviewer/test-case/integration.md +69 -0
- package/core/skills/qc/qa-reviewer/test-case/non-functional.md +73 -0
- package/core/skills/qc/qa-runner/e2e.md +49 -0
- package/core/skills/qc/qa-runner/exploratory/session.md +36 -0
- package/core/skills/qc/qa-runner/functional/api.md +35 -0
- package/core/skills/qc/qa-runner/functional/gui-feature.md +51 -0
- package/core/skills/qc/qa-runner/functional/gui-screen.md +55 -0
- package/core/skills/qc/qa-runner/integration.md +47 -0
- package/core/skills/qc/qa-runner/non-functional.md +49 -0
- package/core/skills/qc/qa-runner/report/report.md +37 -0
- package/core/skills/setup-ai-first/SKILL.md +216 -0
- package/core/skills/spec/SKILL.md +461 -0
- package/core/skills/test/SKILL.md +1297 -0
- package/core/steps/capture-lesson.md +79 -0
- package/core/steps/context-loader.md +307 -0
- package/core/steps/gate.md +87 -0
- package/core/steps/report-footer.md +100 -0
- package/core/steps/review-fanout.md +138 -0
- package/core/steps/spawn-agent.md +124 -0
- package/core/steps/trace-mirror.md +26 -0
- package/core/templates/architecture.template.md +113 -0
- package/core/templates/design-spec.template.md +217 -0
- package/core/templates/feature.template +259 -0
- package/core/templates/platform-guide.template.md +145 -0
- package/core/templates/prd.template.md +327 -0
- package/core/templates/product-definition.template.md +168 -0
- package/core/templates/project-context.yaml +161 -0
- package/docs/01-getting-started/README.md +19 -0
- package/docs/01-getting-started/core-concepts.md +102 -0
- package/docs/01-getting-started/installation.md +156 -0
- package/docs/01-getting-started/quickstart.md +85 -0
- package/docs/02-guides/README.md +26 -0
- package/docs/02-guides/developer/README.md +46 -0
- package/docs/02-guides/developer/bdd-and-trace.md +125 -0
- package/docs/02-guides/developer/commands.md +76 -0
- package/docs/02-guides/developer/pr-checklist.md +15 -0
- package/docs/02-guides/developer/scenarios.md +460 -0
- package/docs/02-guides/developer/workflow.md +121 -0
- package/docs/02-guides/product-owner/README.md +79 -0
- package/docs/02-guides/product-owner/commands.md +30 -0
- package/docs/02-guides/product-owner/handoff-checklist.md +42 -0
- package/docs/02-guides/product-owner/prd-writing-rules.md +45 -0
- package/docs/02-guides/product-owner/scenarios.md +436 -0
- package/docs/02-guides/tester/README.md +75 -0
- package/docs/02-guides/tester/bug-reporting.md +117 -0
- package/docs/02-guides/tester/qc-automation.md +165 -0
- package/docs/02-guides/tester/reading-specs.md +79 -0
- package/docs/02-guides/tester/scenarios.md +186 -0
- package/docs/02-guides/tester/spec-manifest.md +130 -0
- package/docs/02-guides/tester/test-checklist.md +31 -0
- package/docs/02-guides/tester/workflow.md +77 -0
- package/docs/03-concepts/README.md +19 -0
- package/docs/03-concepts/architecture.md +248 -0
- package/docs/03-concepts/pipeline.md +274 -0
- package/docs/03-concepts/traceability.md +149 -0
- package/docs/04-operations/README.md +33 -0
- package/docs/04-operations/bug-flow.md +362 -0
- package/docs/04-operations/publishing.md +137 -0
- package/docs/04-operations/sync-and-update.md +522 -0
- package/docs/05-reference/README.md +32 -0
- package/docs/05-reference/command-cheatsheet.md +147 -0
- package/docs/05-reference/commands.md +232 -0
- package/docs/05-reference/modules.md +110 -0
- package/docs/05-reference/trace-schema.md +153 -0
- package/docs/README.md +49 -0
- package/hooks/data-guard.js +141 -0
- package/hooks/settings.json +18 -0
- package/modules/android-compose/module.yaml +13 -0
- package/modules/android-compose/stack-profile.yaml +57 -0
- package/modules/angular/architecture-snippets/component-patterns.md +187 -0
- package/modules/angular/module.yaml +6 -0
- package/modules/angular/stack-profile.yaml +38 -0
- package/modules/context-engineering/architecture-snippets/context-design.md +119 -0
- package/modules/context-engineering/module.yaml +9 -0
- package/modules/context-engineering/stack-profile.yaml +61 -0
- package/modules/dotnet/architecture-snippets/clean-arch.md +160 -0
- package/modules/dotnet/module.yaml +6 -0
- package/modules/dotnet/stack-profile.yaml +50 -0
- package/modules/flutter/module.yaml +14 -0
- package/modules/flutter/stack-profile.yaml +59 -0
- package/modules/golang/architecture-snippets/domain-layout.md +283 -0
- package/modules/golang/module.yaml +6 -0
- package/modules/golang/stack-profile.yaml +40 -0
- package/modules/ios-swiftui/module.yaml +13 -0
- package/modules/ios-swiftui/stack-profile.yaml +55 -0
- package/modules/java-spring/architecture-snippets/layered-arch.md +201 -0
- package/modules/java-spring/module.yaml +15 -0
- package/modules/java-spring/stack-profile.yaml +28 -0
- package/modules/nextjs/architecture-snippets/app-router-patterns.md +269 -0
- package/modules/nextjs/module.yaml +14 -0
- package/modules/nextjs/stack-profile.yaml +74 -0
- package/modules/nuxt/module.yaml +14 -0
- package/modules/nuxt/stack-profile.yaml +58 -0
- package/modules/php-laravel/architecture-snippets/service-repository.md +302 -0
- package/modules/php-laravel/module.yaml +15 -0
- package/modules/php-laravel/stack-profile.yaml +56 -0
- package/modules/qc-playwright/stack-profile.yaml +66 -0
- package/modules/react/architecture-snippets/hooks-query-patterns.md +254 -0
- package/modules/react/module.yaml +14 -0
- package/modules/react/stack-profile.yaml +63 -0
- package/modules/react-native/module.yaml +14 -0
- package/modules/react-native/stack-profile.yaml +56 -0
- package/modules/vue/module.yaml +14 -0
- package/modules/vue/stack-profile.yaml +65 -0
- package/package.json +49 -0
- package/rules/data-protection.md +80 -0
- package/rules/workflow.md +44 -0
- package/scripts/init.sh +49 -0
- package/scripts/migrate-specs.js +256 -0
- package/scripts/upgrade.sh +94 -0
- package/skills/code/SKILL.md +770 -0
- package/skills/code/SKILL.tmpl +176 -0
- package/skills/debug/SKILL.md +869 -0
- package/skills/debug/SKILL.tmpl +262 -0
- package/skills/design-spec/SKILL.md +589 -0
- package/skills/design-spec/SKILL.tmpl +95 -0
- package/skills/discovery/SKILL.md +554 -0
- package/skills/discovery/SKILL.tmpl +147 -0
- package/skills/prd/SKILL.md +562 -0
- package/skills/prd/SKILL.tmpl +188 -0
- package/skills/qc/qa-analyst/DOC_GAPS.template.md +63 -0
- package/skills/qc/qa-analyst/acceptance-criteria.md +60 -0
- package/skills/qc/qa-analyst/business-rules.md +59 -0
- package/skills/qc/qa-analyst/data-flow.md +64 -0
- package/skills/qc/qa-analyst/spec-breakdown.md +61 -0
- package/skills/qc/qa-designer/e2e/journey.md +41 -0
- package/skills/qc/qa-designer/exploratory/charter.md +68 -0
- package/skills/qc/qa-designer/exploratory/explore-to-functional.md +43 -0
- package/skills/qc/qa-designer/functional/api.md +45 -0
- package/skills/qc/qa-designer/functional/gui-feature.md +46 -0
- package/skills/qc/qa-designer/functional/gui-screen.md +52 -0
- package/skills/qc/qa-designer/integration/api.md +42 -0
- package/skills/qc/qa-designer/integration/db.md +39 -0
- package/skills/qc/qa-designer/integration/gui.md +40 -0
- package/skills/qc/qa-designer/integration/kafka.md +40 -0
- package/skills/qc/qa-designer/non-functional.md +40 -0
- package/skills/qc/qa-planner/test-plan.md +120 -0
- package/skills/qc/qa-reviewer/script/e2e.md +87 -0
- package/skills/qc/qa-reviewer/script/exploratory.md +45 -0
- package/skills/qc/qa-reviewer/script/functional.md +101 -0
- package/skills/qc/qa-reviewer/script/integration.md +91 -0
- package/skills/qc/qa-reviewer/script/non-functional.md +126 -0
- package/skills/qc/qa-reviewer/test-case/e2e.md +73 -0
- package/skills/qc/qa-reviewer/test-case/exploratory.md +43 -0
- package/skills/qc/qa-reviewer/test-case/functional.md +76 -0
- package/skills/qc/qa-reviewer/test-case/integration.md +69 -0
- package/skills/qc/qa-reviewer/test-case/non-functional.md +73 -0
- package/skills/qc/qa-runner/e2e.md +49 -0
- package/skills/qc/qa-runner/exploratory/session.md +36 -0
- package/skills/qc/qa-runner/functional/api.md +35 -0
- package/skills/qc/qa-runner/functional/gui-feature.md +51 -0
- package/skills/qc/qa-runner/functional/gui-screen.md +55 -0
- package/skills/qc/qa-runner/integration.md +47 -0
- package/skills/qc/qa-runner/non-functional.md +49 -0
- package/skills/qc/qa-runner/report/report.md +37 -0
- package/skills/setup-ai-first/SKILL.md +216 -0
- package/skills/setup-ai-first/SKILL.tmpl +116 -0
- package/skills/spec/SKILL.md +461 -0
- package/skills/spec/SKILL.tmpl +174 -0
- package/skills/test/SKILL.md +1297 -0
- package/skills/test/SKILL.tmpl +296 -0
- package/steps/capture-lesson.md +79 -0
- package/steps/context-loader.md +307 -0
- package/steps/gate.md +87 -0
- package/steps/report-footer.md +100 -0
- package/steps/review-fanout.md +138 -0
- package/steps/spawn-agent.md +124 -0
- package/steps/trace-mirror.md +26 -0
- package/templates/architecture.template.md +113 -0
- package/templates/design-spec.template.md +217 -0
- package/templates/feature.template +259 -0
- package/templates/platform-guide.template.md +145 -0
- package/templates/prd.template.md +327 -0
- package/templates/product-definition.template.md +168 -0
- package/templates/project-context.yaml +161 -0
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
# /validate-traces — Traceability Coverage Matrix
|
|
2
|
+
|
|
3
|
+
Read-only check of coverage between specs, code, and tests — including PRD version drift.
|
|
4
|
+
|
|
5
|
+
## Gate
|
|
6
|
+
{{include:steps/gate.md}}
|
|
7
|
+
|
|
8
|
+
*Note: For this command, the target in Step 1 is a domain name or specific UC-ID from `$ARGUMENTS`. There is no single file to resolve — the command scans multiple directories.*
|
|
9
|
+
|
|
10
|
+
## Context
|
|
11
|
+
{{include:steps/context-loader.md}}
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Process
|
|
16
|
+
|
|
17
|
+
### Step 0 — Umbrella Mode Detection
|
|
18
|
+
|
|
19
|
+
Check whether `services` array exists in `project-context.yaml`.
|
|
20
|
+
|
|
21
|
+
**If `services` exists (umbrella mode):**
|
|
22
|
+
- Resolve the trace dir(s):
|
|
23
|
+
- **If `setup.spec_source` is set (consolidated trace):** `all_trace_dirs = [ {spec_source}/.trace ]` — a **single** authoritative location in the spec repo. Scenarios carry their owning service via the `@trace.service` field, so no per-service split is needed. This is the common case.
|
|
24
|
+
- **Else (no spec_source — legacy per-service trace):** one dir per service — `services[N].trace_dir` if set, else `{services[N].path}/.trace`; `all_trace_dirs = [ dir1, dir2, … ]`, tagged by service name on read.
|
|
25
|
+
- Step 1 reads TSVs from `all_trace_dirs`.
|
|
26
|
+
- **Resolve the Living Docs home (generated report location):**
|
|
27
|
+
- If `setup.spec_source` is set → `living_docs_dir = {spec_source}/.living-docs`
|
|
28
|
+
*(the shared specs module — mounted inside every service/umbrella workspace, so the panel resolves it no matter which submodule the dev is standing in)*
|
|
29
|
+
- Else (umbrella without a separate spec repo) → `living_docs_dir = .living-docs` at umbrella root
|
|
30
|
+
- **Resolve the panel mirror:** `panel_mirror = ./.trace` at the **current workspace root** (wherever this command runs). The VS Code panel reads `.trace/trace-report.json` from the open workspace — writing the report here is what makes the view non-empty when a dev opens a service submodule directly.
|
|
31
|
+
|
|
32
|
+
**If no `services` key (single-service mode):**
|
|
33
|
+
- Set `all_trace_dirs = [ {paths.trace_dir} ]`
|
|
34
|
+
- No umbrella sync needed
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
### Step 1 — Load TSV data
|
|
39
|
+
|
|
40
|
+
**Umbrella mode:** read all `{trace_dir}/**/*.tsv` files from every dir in `all_trace_dirs`. For each TSV, tag its rows with the originating service name.
|
|
41
|
+
|
|
42
|
+
**Single-service mode:** read all `{paths.trace_dir}/{domain}/**/*.tsv` files matching the target domain (or `{paths.trace_dir}/**/*.tsv` for all domains if no domain filter).
|
|
43
|
+
|
|
44
|
+
Each file gives the persisted trace state for that UC.
|
|
45
|
+
|
|
46
|
+
**If no `.tsv` files found** in any of the trace dirs:
|
|
47
|
+
- Scan all `{paths.specs_dir}/**/*.feature` files in the target domain to build an in-memory list of all scenarios.
|
|
48
|
+
- Treat all scenarios as `UNTRACKED` (no code generated yet).
|
|
49
|
+
- Print: "⚠️ No trace files found. All {N} scenarios across {M} UCs are UNTRACKED."
|
|
50
|
+
- Suggest: "Run `/generate-bdd {prd-file}` to initialize trace state, or `/generate-code {feature-file}` to generate code."
|
|
51
|
+
- **Skip Steps 2–6 entirely.** Proceed directly to Step 7 using this in-memory state — do NOT abort.
|
|
52
|
+
|
|
53
|
+
### Step 2 — Reconcile with current `.feature` files
|
|
54
|
+
|
|
55
|
+
For each `.tsv` row, read the corresponding `.feature` file and get the **current** `@trace.sc_version` for that SC.
|
|
56
|
+
If the `.feature` SC version differs from the `.tsv` `spec_ver` → update `spec_ver` in memory (will be written back).
|
|
57
|
+
|
|
58
|
+
Also detect SCs present in `.feature` but missing from `.tsv` → add as new rows with `status: UNTRACKED`.
|
|
59
|
+
|
|
60
|
+
### Step 3 — Compute `status` per scenario
|
|
61
|
+
|
|
62
|
+
Apply rules in priority order:
|
|
63
|
+
|
|
64
|
+
| Rule | Status | Condition |
|
|
65
|
+
|------|--------|-----------|
|
|
66
|
+
| 1 | `UNTRACKED` | `implemented_by == —` (no code generated yet) |
|
|
67
|
+
| 2 | `GAP` | `implemented_by != —` AND (`test_count == —` OR `test_count == 0`) |
|
|
68
|
+
| 3 | `DRIFT` | `spec_ver != gen_ver` (scenario updated since last codegen) |
|
|
69
|
+
| 4 | `OK` | all of: `spec_ver == gen_ver`, `implemented_by != —`, `test_count > 0` |
|
|
70
|
+
|
|
71
|
+
### Step 4 — PRD version drift check
|
|
72
|
+
|
|
73
|
+
For each UC, compare:
|
|
74
|
+
- Current PRD `| **Version** |` from `{paths.specs_dir}/{domain}/{prd-slug}/prd.md`
|
|
75
|
+
- `prd_version` stored in `.tsv` (version at time of BDD generation)
|
|
76
|
+
- `@trace.prd_version` in the code files implementing that UC
|
|
77
|
+
|
|
78
|
+
If any layer is behind current PRD version → flag `PRD_DRIFT` and extract changelog entries since that version.
|
|
79
|
+
|
|
80
|
+
### Step 5 — Tech-doc revision drift check
|
|
81
|
+
|
|
82
|
+
For each UC that has a tech-doc, compare the stored revision against the current doc — for **both** tech-doc kinds:
|
|
83
|
+
|
|
84
|
+
- **BE contract:** `@trace.revision` in `{paths.tech_docs_dir}/{domain}/{prd-slug}/tech-docs/{UC-ID}-tech-design.md` vs `tech_doc_revision` in `.tsv`.
|
|
85
|
+
Code generated from an older revision → flag `TECHDOC_DRIFT`.
|
|
86
|
+
- **FE tech-design:** `@trace.revision` in `{paths.tech_docs_dir}/{domain}/{prd-slug}/tech-docs/{UC-ID}-tech-design-{platform}.md` vs `fe_tech_doc_revision` in `.tsv` (per platform row).
|
|
87
|
+
FE code generated from an older revision → flag `FE_TECHDOC_DRIFT`.
|
|
88
|
+
|
|
89
|
+
Skip whichever kind has no doc / no stored revision (`—`).
|
|
90
|
+
|
|
91
|
+
### Step 6 — Write status back to TSV
|
|
92
|
+
|
|
93
|
+
*Skip this step if no TSV files existed (handled by Step 1 no-TSV path).*
|
|
94
|
+
|
|
95
|
+
For each `.tsv` file processed: write updated `spec_ver`, `status`, `last_updated` back to disk.
|
|
96
|
+
Do **not** modify `dev_selftest`/`dev_selftest_at` (owned by `/dev-run-test`) or `qc_status`/`qc_run_at`/`qc_owner`/`qc_blocked_by` (owned by `/qc-run-test` + `/report-bug`); this command only reads them for the report.
|
|
97
|
+
|
|
98
|
+
### Step 7 — Compute dashboard aggregates
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
total_prds = count distinct PRD files in {paths.specs_dir}/{domain}/*/prd.md
|
|
102
|
+
approved_prds = PRDs with | Status | approved
|
|
103
|
+
total_ucs = count distinct UC-IDs across all .tsv files
|
|
104
|
+
approved_ucs = UCs with uc_status == approved
|
|
105
|
+
draft_ucs = UCs with uc_status == draft
|
|
106
|
+
total_scs = total rows across all .tsv files
|
|
107
|
+
code_coverage = rows where implemented_by != — / total_scs
|
|
108
|
+
test_coverage = rows where test_count > 0 / total_scs
|
|
109
|
+
drift_count = rows where status == DRIFT
|
|
110
|
+
untracked_count = rows where status == UNTRACKED
|
|
111
|
+
gap_count = rows where status == GAP
|
|
112
|
+
dev_selftest_passing = rows where dev_selftest == pass
|
|
113
|
+
dev_selftest_failing = rows where dev_selftest == fail
|
|
114
|
+
dev_selftest_not_run = rows where dev_selftest in (not_run, —)
|
|
115
|
+
# NOTE: dev_selftest is the DEV self-check signal (did the dev run their own smoke tests),
|
|
116
|
+
# NOT official coverage — keep it labeled as such on the dashboard.
|
|
117
|
+
qc_passing = rows where qc_status == pass
|
|
118
|
+
qc_failing = rows where qc_status == fail
|
|
119
|
+
qc_skipped = rows where qc_status == skip
|
|
120
|
+
qc_not_run = rows where qc_status in (not_run, —)
|
|
121
|
+
# qc_status is the OFFICIAL QC automation result (set by /qc-run-test),
|
|
122
|
+
# shown alongside — never merged with — dev_selftest.
|
|
123
|
+
waiting_dev = rows where qc_owner == dev # PM view: QC-found, waiting on dev to fix
|
|
124
|
+
waiting_po = rows where qc_owner == po # PM view: blocked, waiting on PO to confirm/clarify
|
|
125
|
+
# qc_owner + qc_blocked_by answer "case nào đang chờ ai" — surface as a "Waiting on" column.
|
|
126
|
+
tech_docs_count = count .md files in {paths.tech_docs_dir}/{domain}/*/tech-docs/
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Step 8 — Write JSON report
|
|
130
|
+
|
|
131
|
+
Write `{paths.trace_dir}/trace-report.json` (overwrite if exists). This file is the single source of truth for web dashboards — it contains the full snapshot at the time `/validate-traces` was last run.
|
|
132
|
+
|
|
133
|
+
Schema:
|
|
134
|
+
|
|
135
|
+
```json
|
|
136
|
+
{
|
|
137
|
+
"generated_at": "<ISO-8601 timestamp>",
|
|
138
|
+
"domain": "<domain argument, or 'all' if no filter>",
|
|
139
|
+
"summary": {
|
|
140
|
+
"total_prds": 0,
|
|
141
|
+
"approved_prds": 0,
|
|
142
|
+
"total_ucs": 0,
|
|
143
|
+
"approved_ucs": 0,
|
|
144
|
+
"draft_ucs": 0,
|
|
145
|
+
"total_scs": 0,
|
|
146
|
+
"coded_scs": 0,
|
|
147
|
+
"tested_scs": 0,
|
|
148
|
+
"code_coverage_pct": 0,
|
|
149
|
+
"test_coverage_pct": 0,
|
|
150
|
+
"drift_count": 0,
|
|
151
|
+
"gap_count": 0,
|
|
152
|
+
"untracked_count": 0,
|
|
153
|
+
"dev_selftest_passing": 0,
|
|
154
|
+
"dev_selftest_failing": 0,
|
|
155
|
+
"dev_selftest_not_run": 0,
|
|
156
|
+
"qc_passing": 0,
|
|
157
|
+
"qc_failing": 0,
|
|
158
|
+
"qc_skipped": 0,
|
|
159
|
+
"qc_not_run": 0,
|
|
160
|
+
"waiting_dev": 0,
|
|
161
|
+
"waiting_po": 0,
|
|
162
|
+
"tech_docs_count": 0
|
|
163
|
+
},
|
|
164
|
+
"prds": [
|
|
165
|
+
{
|
|
166
|
+
"prd_id": "<e.g. PAY>",
|
|
167
|
+
"prd_status": "approved | draft | other",
|
|
168
|
+
"total_scs": 0,
|
|
169
|
+
"coded_scs": 0,
|
|
170
|
+
"tested_scs": 0,
|
|
171
|
+
"drift_count": 0,
|
|
172
|
+
"gap_count": 0,
|
|
173
|
+
"untracked_count": 0,
|
|
174
|
+
"ucs": [
|
|
175
|
+
{
|
|
176
|
+
"uc_id": "<e.g. PAY-UC01>",
|
|
177
|
+
"uc_status": "approved | draft | other",
|
|
178
|
+
"scenarios": [
|
|
179
|
+
{
|
|
180
|
+
"sc_id": "<e.g. PAY-UC01-SC1>",
|
|
181
|
+
"sc_title": "<title>",
|
|
182
|
+
"spec_ver": "<current version from .feature>",
|
|
183
|
+
"gen_ver": "<version at codegen time>",
|
|
184
|
+
"implemented_by": "<ClassName.method or null>",
|
|
185
|
+
"test_count": 0,
|
|
186
|
+
"test_classes": ["<TestClass1>", "<TestClass2>"],
|
|
187
|
+
"dev_selftest": "pass | fail | not_run",
|
|
188
|
+
"dev_selftest_at": "<YYYY-MM-DD or null>",
|
|
189
|
+
"qc_status": "pass | fail | skip | not_run",
|
|
190
|
+
"qc_run_at": "<YYYY-MM-DD or null>",
|
|
191
|
+
"qc_owner": "dev | po | null",
|
|
192
|
+
"qc_blocked_by": "<BUG-id / GAP-id or null>",
|
|
193
|
+
"prd_version": "<prd version when BDD was generated>",
|
|
194
|
+
"bdd_version": "<bdd version when code was generated>",
|
|
195
|
+
"tech_doc_revision": 0,
|
|
196
|
+
"fe_tech_doc_revision": 0,
|
|
197
|
+
"status": "OK | DRIFT | GAP | UNTRACKED",
|
|
198
|
+
"last_updated": "<YYYY-MM-DD>"
|
|
199
|
+
}
|
|
200
|
+
]
|
|
201
|
+
}
|
|
202
|
+
]
|
|
203
|
+
}
|
|
204
|
+
],
|
|
205
|
+
"issues": {
|
|
206
|
+
"drift": [
|
|
207
|
+
{
|
|
208
|
+
"sc_id": "<SC-ID>",
|
|
209
|
+
"sc_title": "<title>",
|
|
210
|
+
"spec_ver": "<current>",
|
|
211
|
+
"gen_ver": "<at codegen>",
|
|
212
|
+
"fix": "/generate-code <UC-ID>"
|
|
213
|
+
}
|
|
214
|
+
],
|
|
215
|
+
"gap": [
|
|
216
|
+
{
|
|
217
|
+
"sc_id": "<SC-ID>",
|
|
218
|
+
"sc_title": "<title>",
|
|
219
|
+
"implemented_by": "<method>",
|
|
220
|
+
"fix": "/dev-gen-test <UC-ID>"
|
|
221
|
+
}
|
|
222
|
+
],
|
|
223
|
+
"untracked": [
|
|
224
|
+
{
|
|
225
|
+
"sc_id": "<SC-ID>",
|
|
226
|
+
"sc_title": "<title>",
|
|
227
|
+
"fix": "/generate-code <UC-ID>"
|
|
228
|
+
}
|
|
229
|
+
],
|
|
230
|
+
"prd_version_drift": [
|
|
231
|
+
{
|
|
232
|
+
"uc_id": "<UC-ID>",
|
|
233
|
+
"code_prd_version": "<version in code tag>",
|
|
234
|
+
"current_prd_version": "<version in PRD file>",
|
|
235
|
+
"changelog_since": ["<v1.1: ...>", "<v1.2: ...>"],
|
|
236
|
+
"fix": "/generate-bdd <prd-file> then /generate-code <UC-ID>"
|
|
237
|
+
}
|
|
238
|
+
],
|
|
239
|
+
"techdoc_drift": [
|
|
240
|
+
{
|
|
241
|
+
"uc_id": "<UC-ID>",
|
|
242
|
+
"code_revision": 0,
|
|
243
|
+
"current_revision": 0,
|
|
244
|
+
"fix": "/generate-code <UC-ID>"
|
|
245
|
+
}
|
|
246
|
+
],
|
|
247
|
+
"fe_techdoc_drift": [
|
|
248
|
+
{
|
|
249
|
+
"uc_id": "<UC-ID>",
|
|
250
|
+
"platform": "web | app",
|
|
251
|
+
"code_revision": 0,
|
|
252
|
+
"current_revision": 0,
|
|
253
|
+
"fix": "/generate-code <UC-ID> --phase=integration"
|
|
254
|
+
}
|
|
255
|
+
]
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
**Rules:**
|
|
261
|
+
- `implemented_by`: use `null` (not `"—"`) in JSON when no value
|
|
262
|
+
- `test_count`: use integer `0` (not `"—"`) when no tests
|
|
263
|
+
- `test_classes`: use `[]` (not `"—"`) when no test classes
|
|
264
|
+
- `tech_doc_revision` / `fe_tech_doc_revision`: use integer; `0` if not yet generated
|
|
265
|
+
- `code_coverage_pct` / `test_coverage_pct`: round to nearest integer (0–100)
|
|
266
|
+
- Always write to `{paths.trace_dir}/trace-report.json` regardless of domain filter — if a domain filter was applied, include only those PRDs in `prds[]` but note the domain in the `domain` field
|
|
267
|
+
- **TSV `"—"` mapping**: when reading TSV files, map dash values to JSON types: `implemented_by: "—"` → `null`; `test_count: "—"` → `0`; `test_classes: "—"` → `[]`; `tech_doc_revision: "—"` → `0`; `fe_tech_doc_revision: "—"` → `0`; `dev_selftest: "—"` → `"not_run"`; `dev_selftest_at: "—"` → `null`; `qc_status: "—"` → `"not_run"`; `qc_run_at: "—"` → `null`; `qc_owner: "—"` → `null`; `qc_blocked_by: "—"` → `null`
|
|
268
|
+
- **Backward-compat:** older TSVs may be missing newer columns from the header — treat any absent column as its empty value (do not error): `qc_owner`/`qc_blocked_by` (pre-19-col) → `null`; `fe_tech_doc_revision` (pre-22-col) → `0`. The next `/generate-bdd` re-gen upgrades the header to the current 22-column layout.
|
|
269
|
+
|
|
270
|
+
### Step 8b — Living Docs Sync *(umbrella mode only)*
|
|
271
|
+
|
|
272
|
+
*Skip this step in single-service mode.*
|
|
273
|
+
|
|
274
|
+
**With `spec_source` set,** the authoritative trace TSVs already live in **one** place —
|
|
275
|
+
`{spec_source}/.trace/` (committed in the spec repo). There is **no per-service merge**:
|
|
276
|
+
each scenario row carries its owning service via `@trace.service`. This step just
|
|
277
|
+
(re)generates the report and refreshes the local panel.
|
|
278
|
+
|
|
279
|
+
1. **Write the report** to `{living_docs_dir}/trace-report.json` (`mkdir -p` first) — built
|
|
280
|
+
directly from `{spec_source}/.trace/*.tsv`, with a `"service"` field per scenario row and
|
|
281
|
+
the summary aggregates. *(Legacy no-`spec_source` umbrellas still merge every per-service
|
|
282
|
+
`trace-report.json` into one document, namespaced by service.)*
|
|
283
|
+
|
|
284
|
+
2. **Mirror to the panel location** `{panel_mirror}` (`./.trace` at the current workspace
|
|
285
|
+
root) so a dev who opened *this* repo sees data immediately: copy
|
|
286
|
+
`{living_docs_dir}/trace-report.json` (+ the `{UC-ID}.tsv` files) → `{panel_mirror}/`.
|
|
287
|
+
If `panel_mirror` already resolves to `{spec_source}/.trace`, skip.
|
|
288
|
+
|
|
289
|
+
3. **Print sync summary:**
|
|
290
|
+
```
|
|
291
|
+
Living Docs → {living_docs_dir}/trace-report.json ({total} scenarios across {S} services)
|
|
292
|
+
Trace (authoritative) → {spec_source}/.trace/ (committed in spec repo)
|
|
293
|
+
Panel mirror → {panel_mirror}/trace-report.json (current workspace)
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
> **Note:** the committed, authoritative trace state is `{spec_source}/.trace/*.tsv` (in the
|
|
297
|
+
> spec repo — one place for the PM). The report (`.living-docs/`) and the panel mirror
|
|
298
|
+
> (`./.trace` at a workspace that is not the spec repo) are **generated** — gitignore them;
|
|
299
|
+
> they are regenerated by `/validate-traces` or `/sync`.
|
|
300
|
+
|
|
301
|
+
## Output
|
|
302
|
+
|
|
303
|
+
{{include:steps/report-footer.md}}
|
|
304
|
+
|
|
305
|
+
```
|
|
306
|
+
/validate-traces — {domain}
|
|
307
|
+
|
|
308
|
+
📄 {paths.trace_dir}/trace-report.json ← updated
|
|
309
|
+
|
|
310
|
+
┌─────────────────────────────────────────────────────────────────────────────────────┐
|
|
311
|
+
│ PRDs Use Cases Scenarios Code Cov. Test Cov. Drift Untracked Gap │
|
|
312
|
+
│ {N} {N} {N} {N}% {N}% {N} {N} {N} │
|
|
313
|
+
│ {A} appr {A} appr {X}/{T} SCs {X}/{T} SCs │
|
|
314
|
+
└─────────────────────────────────────────────────────────────────────────────────────┘
|
|
315
|
+
|
|
316
|
+
| UC-ID | SC | Title (truncated) | Spec | Gen | Code | Tests | Status |
|
|
317
|
+
|-------------|------|------------------------------|-------|-------|----------------------|----------------|----------|
|
|
318
|
+
| {UC}-UC1 | SC1 | {title...} | v1.0 | v1.0 | ✅ {Controller.fn} | ✅ 10 tests | OK |
|
|
319
|
+
| {UC}-UC1 | SC2 | {title...} | v1.1 | v1.0 | ✅ {Controller.fn} | ✅ 3 tests | DRIFT |
|
|
320
|
+
| {UC}-UC1 | SC6 | {title...} | v1.0 | — | — | — | UNTRACKED|
|
|
321
|
+
| {UC}-UC2 | SC1 | {title...} | v1.0 | v1.0 | ✅ {Controller.fn} | — | GAP |
|
|
322
|
+
|
|
323
|
+
Drift Detail:
|
|
324
|
+
{UC}-UC1-SC2 — spec v1.1 but code generated from v1.0
|
|
325
|
+
→ Re-run: /generate-code {UC-ID}
|
|
326
|
+
|
|
327
|
+
PRD Version Drift:
|
|
328
|
+
{UC}-UC2 — code at PRD v1.0, PRD now at v1.2
|
|
329
|
+
Changes since v1.0:
|
|
330
|
+
v1.1: {changelog entry}
|
|
331
|
+
v1.2: {changelog entry}
|
|
332
|
+
→ /generate-bdd {prd-file} then /generate-code {UC-ID}
|
|
333
|
+
|
|
334
|
+
Tech-Doc Revision Drift:
|
|
335
|
+
{UC}-UC3 — code generated from tech-doc revision 2, now at revision 4
|
|
336
|
+
→ Review tech-doc changes then /generate-code {UC-ID}
|
|
337
|
+
|
|
338
|
+
Recommendations:
|
|
339
|
+
- /generate-code {UC-ID} for DRIFT and UNTRACKED scenarios
|
|
340
|
+
- /dev-gen-test {UC-ID} for GAP (missing tests)
|
|
341
|
+
- /generate-bdd {prd-file} for PRD version drift
|
|
342
|
+
|
|
343
|
+
[Umbrella mode only]
|
|
344
|
+
Living Docs canonical → {living_docs_dir}/ (specs module — shared, gitignored)
|
|
345
|
+
Panel mirror → {panel_mirror}/trace-report.json (current workspace)
|
|
346
|
+
Tip: run /validate-traces (or /sync) after each codegen session to refresh the panel.
|
|
347
|
+
Both are generated mirrors — do not commit (.living-docs/ + .trace/ in .gitignore).
|
|
348
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.14.0
|