@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.
Files changed (339) hide show
  1. package/bin/build.js +230 -0
  2. package/bin/index.js +598 -0
  3. package/commands/debug.md +830 -0
  4. package/commands/debug.tmpl +257 -0
  5. package/commands/define-product.md +652 -0
  6. package/commands/define-product.tmpl +158 -0
  7. package/commands/dev-gen-test.md +1010 -0
  8. package/commands/dev-gen-test.tmpl +490 -0
  9. package/commands/dev-run-test.md +744 -0
  10. package/commands/dev-run-test.tmpl +224 -0
  11. package/commands/dev-smoke-test.md +711 -0
  12. package/commands/dev-smoke-test.tmpl +217 -0
  13. package/commands/fix-bug.md +744 -0
  14. package/commands/fix-bug.tmpl +171 -0
  15. package/commands/generate-bdd.md +1054 -0
  16. package/commands/generate-bdd.tmpl +534 -0
  17. package/commands/generate-code.md +869 -0
  18. package/commands/generate-code.tmpl +349 -0
  19. package/commands/generate-design-spec.md +958 -0
  20. package/commands/generate-design-spec.tmpl +464 -0
  21. package/commands/generate-prd.md +748 -0
  22. package/commands/generate-prd.tmpl +254 -0
  23. package/commands/generate-spec-manifest.md +658 -0
  24. package/commands/generate-spec-manifest.tmpl +164 -0
  25. package/commands/generate-tech-docs.md +849 -0
  26. package/commands/generate-tech-docs.tmpl +355 -0
  27. package/commands/learn.md +636 -0
  28. package/commands/learn.tmpl +63 -0
  29. package/commands/map-testids.md +575 -0
  30. package/commands/map-testids.tmpl +81 -0
  31. package/commands/propose-scenario.md +623 -0
  32. package/commands/propose-scenario.tmpl +129 -0
  33. package/commands/qc-analyze.md +580 -0
  34. package/commands/qc-analyze.tmpl +86 -0
  35. package/commands/qc-design-test.md +562 -0
  36. package/commands/qc-design-test.tmpl +68 -0
  37. package/commands/qc-plan.md +543 -0
  38. package/commands/qc-plan.tmpl +49 -0
  39. package/commands/qc-report.md +554 -0
  40. package/commands/qc-report.tmpl +60 -0
  41. package/commands/qc-review.md +547 -0
  42. package/commands/qc-review.tmpl +53 -0
  43. package/commands/qc-run-test.md +604 -0
  44. package/commands/qc-run-test.tmpl +84 -0
  45. package/commands/refine-prd.md +772 -0
  46. package/commands/refine-prd.tmpl +140 -0
  47. package/commands/report-bug.md +639 -0
  48. package/commands/report-bug.tmpl +145 -0
  49. package/commands/review-code.md +677 -0
  50. package/commands/review-code.tmpl +104 -0
  51. package/commands/review-context.md +1047 -0
  52. package/commands/review-context.tmpl +415 -0
  53. package/commands/review-tech-docs.md +811 -0
  54. package/commands/review-tech-docs.tmpl +317 -0
  55. package/commands/setup-ai-first.md +545 -0
  56. package/commands/setup-ai-first.tmpl +358 -0
  57. package/commands/sync.md +451 -0
  58. package/commands/sync.tmpl +351 -0
  59. package/commands/update-framework.md +251 -0
  60. package/commands/update-framework.tmpl +151 -0
  61. package/commands/validate-traces.md +842 -0
  62. package/commands/validate-traces.tmpl +348 -0
  63. package/core/FRAMEWORK_VERSION +1 -0
  64. package/core/commands/debug.md +830 -0
  65. package/core/commands/define-product.md +652 -0
  66. package/core/commands/dev-gen-test.md +1010 -0
  67. package/core/commands/dev-run-test.md +744 -0
  68. package/core/commands/dev-smoke-test.md +711 -0
  69. package/core/commands/fix-bug.md +744 -0
  70. package/core/commands/generate-bdd.md +1054 -0
  71. package/core/commands/generate-code.md +869 -0
  72. package/core/commands/generate-design-spec.md +958 -0
  73. package/core/commands/generate-prd.md +748 -0
  74. package/core/commands/generate-spec-manifest.md +658 -0
  75. package/core/commands/generate-tech-docs.md +849 -0
  76. package/core/commands/learn.md +636 -0
  77. package/core/commands/map-testids.md +575 -0
  78. package/core/commands/propose-scenario.md +623 -0
  79. package/core/commands/qc-analyze.md +580 -0
  80. package/core/commands/qc-design-test.md +562 -0
  81. package/core/commands/qc-plan.md +543 -0
  82. package/core/commands/qc-report.md +554 -0
  83. package/core/commands/qc-review.md +547 -0
  84. package/core/commands/qc-run-test.md +604 -0
  85. package/core/commands/refine-prd.md +772 -0
  86. package/core/commands/report-bug.md +639 -0
  87. package/core/commands/review-code.md +677 -0
  88. package/core/commands/review-context.md +1047 -0
  89. package/core/commands/review-tech-docs.md +811 -0
  90. package/core/commands/setup-ai-first.md +545 -0
  91. package/core/commands/sync.md +451 -0
  92. package/core/commands/update-framework.md +251 -0
  93. package/core/commands/validate-traces.md +842 -0
  94. package/core/hooks/data-guard.js +141 -0
  95. package/core/hooks/settings.json +18 -0
  96. package/core/modules/android-compose/module.yaml +13 -0
  97. package/core/modules/android-compose/stack-profile.yaml +57 -0
  98. package/core/modules/angular/architecture-snippets/component-patterns.md +187 -0
  99. package/core/modules/angular/module.yaml +6 -0
  100. package/core/modules/angular/stack-profile.yaml +38 -0
  101. package/core/modules/context-engineering/architecture-snippets/context-design.md +119 -0
  102. package/core/modules/context-engineering/module.yaml +9 -0
  103. package/core/modules/context-engineering/stack-profile.yaml +61 -0
  104. package/core/modules/dotnet/architecture-snippets/clean-arch.md +160 -0
  105. package/core/modules/dotnet/module.yaml +6 -0
  106. package/core/modules/dotnet/stack-profile.yaml +50 -0
  107. package/core/modules/flutter/module.yaml +14 -0
  108. package/core/modules/flutter/stack-profile.yaml +59 -0
  109. package/core/modules/golang/architecture-snippets/domain-layout.md +283 -0
  110. package/core/modules/golang/module.yaml +6 -0
  111. package/core/modules/golang/stack-profile.yaml +40 -0
  112. package/core/modules/ios-swiftui/module.yaml +13 -0
  113. package/core/modules/ios-swiftui/stack-profile.yaml +55 -0
  114. package/core/modules/java-spring/architecture-snippets/layered-arch.md +201 -0
  115. package/core/modules/java-spring/module.yaml +15 -0
  116. package/core/modules/java-spring/stack-profile.yaml +28 -0
  117. package/core/modules/nextjs/architecture-snippets/app-router-patterns.md +269 -0
  118. package/core/modules/nextjs/module.yaml +14 -0
  119. package/core/modules/nextjs/stack-profile.yaml +74 -0
  120. package/core/modules/nuxt/module.yaml +14 -0
  121. package/core/modules/nuxt/stack-profile.yaml +58 -0
  122. package/core/modules/php-laravel/architecture-snippets/service-repository.md +302 -0
  123. package/core/modules/php-laravel/module.yaml +15 -0
  124. package/core/modules/php-laravel/stack-profile.yaml +56 -0
  125. package/core/modules/qc-playwright/stack-profile.yaml +66 -0
  126. package/core/modules/react/architecture-snippets/hooks-query-patterns.md +254 -0
  127. package/core/modules/react/module.yaml +14 -0
  128. package/core/modules/react/stack-profile.yaml +63 -0
  129. package/core/modules/react-native/module.yaml +14 -0
  130. package/core/modules/react-native/stack-profile.yaml +56 -0
  131. package/core/modules/vue/module.yaml +14 -0
  132. package/core/modules/vue/stack-profile.yaml +65 -0
  133. package/core/rules/data-protection.md +80 -0
  134. package/core/rules/workflow.md +44 -0
  135. package/core/skills/code/SKILL.md +770 -0
  136. package/core/skills/debug/SKILL.md +869 -0
  137. package/core/skills/design-spec/SKILL.md +589 -0
  138. package/core/skills/discovery/SKILL.md +554 -0
  139. package/core/skills/prd/SKILL.md +562 -0
  140. package/core/skills/qc/qa-analyst/DOC_GAPS.template.md +63 -0
  141. package/core/skills/qc/qa-analyst/acceptance-criteria.md +60 -0
  142. package/core/skills/qc/qa-analyst/business-rules.md +59 -0
  143. package/core/skills/qc/qa-analyst/data-flow.md +64 -0
  144. package/core/skills/qc/qa-analyst/spec-breakdown.md +61 -0
  145. package/core/skills/qc/qa-designer/e2e/journey.md +41 -0
  146. package/core/skills/qc/qa-designer/exploratory/charter.md +68 -0
  147. package/core/skills/qc/qa-designer/exploratory/explore-to-functional.md +43 -0
  148. package/core/skills/qc/qa-designer/functional/api.md +45 -0
  149. package/core/skills/qc/qa-designer/functional/gui-feature.md +46 -0
  150. package/core/skills/qc/qa-designer/functional/gui-screen.md +52 -0
  151. package/core/skills/qc/qa-designer/integration/api.md +42 -0
  152. package/core/skills/qc/qa-designer/integration/db.md +39 -0
  153. package/core/skills/qc/qa-designer/integration/gui.md +40 -0
  154. package/core/skills/qc/qa-designer/integration/kafka.md +40 -0
  155. package/core/skills/qc/qa-designer/non-functional.md +40 -0
  156. package/core/skills/qc/qa-planner/test-plan.md +120 -0
  157. package/core/skills/qc/qa-reviewer/script/e2e.md +87 -0
  158. package/core/skills/qc/qa-reviewer/script/exploratory.md +45 -0
  159. package/core/skills/qc/qa-reviewer/script/functional.md +101 -0
  160. package/core/skills/qc/qa-reviewer/script/integration.md +91 -0
  161. package/core/skills/qc/qa-reviewer/script/non-functional.md +126 -0
  162. package/core/skills/qc/qa-reviewer/test-case/e2e.md +73 -0
  163. package/core/skills/qc/qa-reviewer/test-case/exploratory.md +43 -0
  164. package/core/skills/qc/qa-reviewer/test-case/functional.md +76 -0
  165. package/core/skills/qc/qa-reviewer/test-case/integration.md +69 -0
  166. package/core/skills/qc/qa-reviewer/test-case/non-functional.md +73 -0
  167. package/core/skills/qc/qa-runner/e2e.md +49 -0
  168. package/core/skills/qc/qa-runner/exploratory/session.md +36 -0
  169. package/core/skills/qc/qa-runner/functional/api.md +35 -0
  170. package/core/skills/qc/qa-runner/functional/gui-feature.md +51 -0
  171. package/core/skills/qc/qa-runner/functional/gui-screen.md +55 -0
  172. package/core/skills/qc/qa-runner/integration.md +47 -0
  173. package/core/skills/qc/qa-runner/non-functional.md +49 -0
  174. package/core/skills/qc/qa-runner/report/report.md +37 -0
  175. package/core/skills/setup-ai-first/SKILL.md +216 -0
  176. package/core/skills/spec/SKILL.md +461 -0
  177. package/core/skills/test/SKILL.md +1297 -0
  178. package/core/steps/capture-lesson.md +79 -0
  179. package/core/steps/context-loader.md +307 -0
  180. package/core/steps/gate.md +87 -0
  181. package/core/steps/report-footer.md +100 -0
  182. package/core/steps/review-fanout.md +138 -0
  183. package/core/steps/spawn-agent.md +124 -0
  184. package/core/steps/trace-mirror.md +26 -0
  185. package/core/templates/architecture.template.md +113 -0
  186. package/core/templates/design-spec.template.md +217 -0
  187. package/core/templates/feature.template +259 -0
  188. package/core/templates/platform-guide.template.md +145 -0
  189. package/core/templates/prd.template.md +327 -0
  190. package/core/templates/product-definition.template.md +168 -0
  191. package/core/templates/project-context.yaml +161 -0
  192. package/docs/01-getting-started/README.md +19 -0
  193. package/docs/01-getting-started/core-concepts.md +102 -0
  194. package/docs/01-getting-started/installation.md +156 -0
  195. package/docs/01-getting-started/quickstart.md +85 -0
  196. package/docs/02-guides/README.md +26 -0
  197. package/docs/02-guides/developer/README.md +46 -0
  198. package/docs/02-guides/developer/bdd-and-trace.md +125 -0
  199. package/docs/02-guides/developer/commands.md +76 -0
  200. package/docs/02-guides/developer/pr-checklist.md +15 -0
  201. package/docs/02-guides/developer/scenarios.md +460 -0
  202. package/docs/02-guides/developer/workflow.md +121 -0
  203. package/docs/02-guides/product-owner/README.md +79 -0
  204. package/docs/02-guides/product-owner/commands.md +30 -0
  205. package/docs/02-guides/product-owner/handoff-checklist.md +42 -0
  206. package/docs/02-guides/product-owner/prd-writing-rules.md +45 -0
  207. package/docs/02-guides/product-owner/scenarios.md +436 -0
  208. package/docs/02-guides/tester/README.md +75 -0
  209. package/docs/02-guides/tester/bug-reporting.md +117 -0
  210. package/docs/02-guides/tester/qc-automation.md +165 -0
  211. package/docs/02-guides/tester/reading-specs.md +79 -0
  212. package/docs/02-guides/tester/scenarios.md +186 -0
  213. package/docs/02-guides/tester/spec-manifest.md +130 -0
  214. package/docs/02-guides/tester/test-checklist.md +31 -0
  215. package/docs/02-guides/tester/workflow.md +77 -0
  216. package/docs/03-concepts/README.md +19 -0
  217. package/docs/03-concepts/architecture.md +248 -0
  218. package/docs/03-concepts/pipeline.md +274 -0
  219. package/docs/03-concepts/traceability.md +149 -0
  220. package/docs/04-operations/README.md +33 -0
  221. package/docs/04-operations/bug-flow.md +362 -0
  222. package/docs/04-operations/publishing.md +137 -0
  223. package/docs/04-operations/sync-and-update.md +522 -0
  224. package/docs/05-reference/README.md +32 -0
  225. package/docs/05-reference/command-cheatsheet.md +147 -0
  226. package/docs/05-reference/commands.md +232 -0
  227. package/docs/05-reference/modules.md +110 -0
  228. package/docs/05-reference/trace-schema.md +153 -0
  229. package/docs/README.md +49 -0
  230. package/hooks/data-guard.js +141 -0
  231. package/hooks/settings.json +18 -0
  232. package/modules/android-compose/module.yaml +13 -0
  233. package/modules/android-compose/stack-profile.yaml +57 -0
  234. package/modules/angular/architecture-snippets/component-patterns.md +187 -0
  235. package/modules/angular/module.yaml +6 -0
  236. package/modules/angular/stack-profile.yaml +38 -0
  237. package/modules/context-engineering/architecture-snippets/context-design.md +119 -0
  238. package/modules/context-engineering/module.yaml +9 -0
  239. package/modules/context-engineering/stack-profile.yaml +61 -0
  240. package/modules/dotnet/architecture-snippets/clean-arch.md +160 -0
  241. package/modules/dotnet/module.yaml +6 -0
  242. package/modules/dotnet/stack-profile.yaml +50 -0
  243. package/modules/flutter/module.yaml +14 -0
  244. package/modules/flutter/stack-profile.yaml +59 -0
  245. package/modules/golang/architecture-snippets/domain-layout.md +283 -0
  246. package/modules/golang/module.yaml +6 -0
  247. package/modules/golang/stack-profile.yaml +40 -0
  248. package/modules/ios-swiftui/module.yaml +13 -0
  249. package/modules/ios-swiftui/stack-profile.yaml +55 -0
  250. package/modules/java-spring/architecture-snippets/layered-arch.md +201 -0
  251. package/modules/java-spring/module.yaml +15 -0
  252. package/modules/java-spring/stack-profile.yaml +28 -0
  253. package/modules/nextjs/architecture-snippets/app-router-patterns.md +269 -0
  254. package/modules/nextjs/module.yaml +14 -0
  255. package/modules/nextjs/stack-profile.yaml +74 -0
  256. package/modules/nuxt/module.yaml +14 -0
  257. package/modules/nuxt/stack-profile.yaml +58 -0
  258. package/modules/php-laravel/architecture-snippets/service-repository.md +302 -0
  259. package/modules/php-laravel/module.yaml +15 -0
  260. package/modules/php-laravel/stack-profile.yaml +56 -0
  261. package/modules/qc-playwright/stack-profile.yaml +66 -0
  262. package/modules/react/architecture-snippets/hooks-query-patterns.md +254 -0
  263. package/modules/react/module.yaml +14 -0
  264. package/modules/react/stack-profile.yaml +63 -0
  265. package/modules/react-native/module.yaml +14 -0
  266. package/modules/react-native/stack-profile.yaml +56 -0
  267. package/modules/vue/module.yaml +14 -0
  268. package/modules/vue/stack-profile.yaml +65 -0
  269. package/package.json +49 -0
  270. package/rules/data-protection.md +80 -0
  271. package/rules/workflow.md +44 -0
  272. package/scripts/init.sh +49 -0
  273. package/scripts/migrate-specs.js +256 -0
  274. package/scripts/upgrade.sh +94 -0
  275. package/skills/code/SKILL.md +770 -0
  276. package/skills/code/SKILL.tmpl +176 -0
  277. package/skills/debug/SKILL.md +869 -0
  278. package/skills/debug/SKILL.tmpl +262 -0
  279. package/skills/design-spec/SKILL.md +589 -0
  280. package/skills/design-spec/SKILL.tmpl +95 -0
  281. package/skills/discovery/SKILL.md +554 -0
  282. package/skills/discovery/SKILL.tmpl +147 -0
  283. package/skills/prd/SKILL.md +562 -0
  284. package/skills/prd/SKILL.tmpl +188 -0
  285. package/skills/qc/qa-analyst/DOC_GAPS.template.md +63 -0
  286. package/skills/qc/qa-analyst/acceptance-criteria.md +60 -0
  287. package/skills/qc/qa-analyst/business-rules.md +59 -0
  288. package/skills/qc/qa-analyst/data-flow.md +64 -0
  289. package/skills/qc/qa-analyst/spec-breakdown.md +61 -0
  290. package/skills/qc/qa-designer/e2e/journey.md +41 -0
  291. package/skills/qc/qa-designer/exploratory/charter.md +68 -0
  292. package/skills/qc/qa-designer/exploratory/explore-to-functional.md +43 -0
  293. package/skills/qc/qa-designer/functional/api.md +45 -0
  294. package/skills/qc/qa-designer/functional/gui-feature.md +46 -0
  295. package/skills/qc/qa-designer/functional/gui-screen.md +52 -0
  296. package/skills/qc/qa-designer/integration/api.md +42 -0
  297. package/skills/qc/qa-designer/integration/db.md +39 -0
  298. package/skills/qc/qa-designer/integration/gui.md +40 -0
  299. package/skills/qc/qa-designer/integration/kafka.md +40 -0
  300. package/skills/qc/qa-designer/non-functional.md +40 -0
  301. package/skills/qc/qa-planner/test-plan.md +120 -0
  302. package/skills/qc/qa-reviewer/script/e2e.md +87 -0
  303. package/skills/qc/qa-reviewer/script/exploratory.md +45 -0
  304. package/skills/qc/qa-reviewer/script/functional.md +101 -0
  305. package/skills/qc/qa-reviewer/script/integration.md +91 -0
  306. package/skills/qc/qa-reviewer/script/non-functional.md +126 -0
  307. package/skills/qc/qa-reviewer/test-case/e2e.md +73 -0
  308. package/skills/qc/qa-reviewer/test-case/exploratory.md +43 -0
  309. package/skills/qc/qa-reviewer/test-case/functional.md +76 -0
  310. package/skills/qc/qa-reviewer/test-case/integration.md +69 -0
  311. package/skills/qc/qa-reviewer/test-case/non-functional.md +73 -0
  312. package/skills/qc/qa-runner/e2e.md +49 -0
  313. package/skills/qc/qa-runner/exploratory/session.md +36 -0
  314. package/skills/qc/qa-runner/functional/api.md +35 -0
  315. package/skills/qc/qa-runner/functional/gui-feature.md +51 -0
  316. package/skills/qc/qa-runner/functional/gui-screen.md +55 -0
  317. package/skills/qc/qa-runner/integration.md +47 -0
  318. package/skills/qc/qa-runner/non-functional.md +49 -0
  319. package/skills/qc/qa-runner/report/report.md +37 -0
  320. package/skills/setup-ai-first/SKILL.md +216 -0
  321. package/skills/setup-ai-first/SKILL.tmpl +116 -0
  322. package/skills/spec/SKILL.md +461 -0
  323. package/skills/spec/SKILL.tmpl +174 -0
  324. package/skills/test/SKILL.md +1297 -0
  325. package/skills/test/SKILL.tmpl +296 -0
  326. package/steps/capture-lesson.md +79 -0
  327. package/steps/context-loader.md +307 -0
  328. package/steps/gate.md +87 -0
  329. package/steps/report-footer.md +100 -0
  330. package/steps/review-fanout.md +138 -0
  331. package/steps/spawn-agent.md +124 -0
  332. package/steps/trace-mirror.md +26 -0
  333. package/templates/architecture.template.md +113 -0
  334. package/templates/design-spec.template.md +217 -0
  335. package/templates/feature.template +259 -0
  336. package/templates/platform-guide.template.md +145 -0
  337. package/templates/prd.template.md +327 -0
  338. package/templates/product-definition.template.md +168 -0
  339. 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