@educa-corp/sdd-framework 0.3.0 → 0.4.2

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 (126) hide show
  1. package/bin/build.js +9 -0
  2. package/bin/index.js +115 -4
  3. package/bin/self-check.js +236 -0
  4. package/bin/trace-schema.json +692 -0
  5. package/commands/debug.md +82 -17
  6. package/commands/define-product.md +82 -17
  7. package/commands/dev-gen-test.md +82 -17
  8. package/commands/dev-run-test.md +84 -18
  9. package/commands/dev-run-test.tmpl +2 -1
  10. package/commands/dev-smoke-test.md +82 -17
  11. package/commands/fix-bug.md +137 -20
  12. package/commands/fix-bug.tmpl +29 -3
  13. package/commands/generate-architecture.md +82 -17
  14. package/commands/generate-bdd.md +187 -44
  15. package/commands/generate-bdd.tmpl +92 -17
  16. package/commands/generate-code.md +115 -20
  17. package/commands/generate-code.tmpl +33 -3
  18. package/commands/generate-design-spec.md +82 -17
  19. package/commands/generate-prd.md +82 -17
  20. package/commands/generate-spec-manifest.md +82 -17
  21. package/commands/generate-tech-docs.md +85 -20
  22. package/commands/generate-tech-docs.tmpl +2 -2
  23. package/commands/learn.md +82 -17
  24. package/commands/map-testids.md +82 -17
  25. package/commands/propose-scenario.md +102 -19
  26. package/commands/propose-scenario.tmpl +20 -2
  27. package/commands/qc-analyze.md +82 -17
  28. package/commands/qc-design-test.md +82 -17
  29. package/commands/qc-plan.md +82 -17
  30. package/commands/qc-report.md +82 -17
  31. package/commands/qc-review.md +82 -17
  32. package/commands/qc-run-test.md +104 -19
  33. package/commands/qc-run-test.tmpl +22 -2
  34. package/commands/refine-prd.md +82 -17
  35. package/commands/report-bug.md +82 -17
  36. package/commands/review-code.md +122 -19
  37. package/commands/review-code.tmpl +40 -2
  38. package/commands/review-context.md +124 -21
  39. package/commands/review-context.tmpl +42 -4
  40. package/commands/review-tech-docs.md +113 -19
  41. package/commands/review-tech-docs.tmpl +31 -2
  42. package/commands/setup-ai-first.md +35 -16
  43. package/commands/setup-ai-first.tmpl +19 -6
  44. package/commands/sync.md +15 -4
  45. package/commands/sync.tmpl +12 -2
  46. package/commands/update-framework.md +40 -2
  47. package/commands/update-framework.tmpl +37 -0
  48. package/commands/validate-traces.md +231 -25
  49. package/commands/validate-traces.tmpl +149 -8
  50. package/core/FRAMEWORK_VERSION +1 -1
  51. package/core/README.md +56 -0
  52. package/core/commands/debug.md +82 -17
  53. package/core/commands/define-product.md +82 -17
  54. package/core/commands/dev-gen-test.md +82 -17
  55. package/core/commands/dev-run-test.md +84 -18
  56. package/core/commands/dev-smoke-test.md +82 -17
  57. package/core/commands/fix-bug.md +137 -20
  58. package/core/commands/generate-architecture.md +82 -17
  59. package/core/commands/generate-bdd.md +187 -44
  60. package/core/commands/generate-code.md +115 -20
  61. package/core/commands/generate-design-spec.md +82 -17
  62. package/core/commands/generate-prd.md +82 -17
  63. package/core/commands/generate-spec-manifest.md +82 -17
  64. package/core/commands/generate-tech-docs.md +85 -20
  65. package/core/commands/learn.md +82 -17
  66. package/core/commands/map-testids.md +82 -17
  67. package/core/commands/propose-scenario.md +102 -19
  68. package/core/commands/qc-analyze.md +82 -17
  69. package/core/commands/qc-design-test.md +82 -17
  70. package/core/commands/qc-plan.md +82 -17
  71. package/core/commands/qc-report.md +82 -17
  72. package/core/commands/qc-review.md +82 -17
  73. package/core/commands/qc-run-test.md +104 -19
  74. package/core/commands/refine-prd.md +82 -17
  75. package/core/commands/report-bug.md +82 -17
  76. package/core/commands/review-code.md +122 -19
  77. package/core/commands/review-context.md +124 -21
  78. package/core/commands/review-tech-docs.md +113 -19
  79. package/core/commands/setup-ai-first.md +35 -16
  80. package/core/commands/sync.md +15 -4
  81. package/core/commands/update-framework.md +40 -2
  82. package/core/commands/validate-traces.md +231 -25
  83. package/core/modules/android-compose/stack-profile.yaml +1 -1
  84. package/core/modules/flutter/stack-profile.yaml +1 -1
  85. package/core/modules/ios-swiftui/stack-profile.yaml +1 -1
  86. package/core/modules/java-spring/stack-profile.yaml +1 -1
  87. package/core/modules/nextjs/stack-profile.yaml +1 -1
  88. package/core/modules/nuxt/stack-profile.yaml +1 -1
  89. package/core/modules/phaser-game/stack-profile.yaml +1 -1
  90. package/core/modules/php-laravel/stack-profile.yaml +1 -1
  91. package/core/modules/qc-playwright/stack-profile.yaml +1 -1
  92. package/core/modules/react/stack-profile.yaml +1 -1
  93. package/core/modules/react-native/stack-profile.yaml +1 -1
  94. package/core/modules/vue/stack-profile.yaml +1 -1
  95. package/core/rules/workflow.md +11 -0
  96. package/core/steps/context-loader.md +66 -7
  97. package/core/steps/gate.md +13 -8
  98. package/core/steps/report-footer.md +3 -2
  99. package/core/templates/README.md +47 -0
  100. package/core/templates/feature.template +13 -10
  101. package/core/templates/project-context.yaml +49 -17
  102. package/core/templates/tech-design.template.md +1 -1
  103. package/docs/02-concepts/traceability.md +29 -6
  104. package/docs/04-reference/trace-schema.md +128 -37
  105. package/modules/android-compose/stack-profile.yaml +1 -1
  106. package/modules/flutter/stack-profile.yaml +1 -1
  107. package/modules/ios-swiftui/stack-profile.yaml +1 -1
  108. package/modules/java-spring/stack-profile.yaml +1 -1
  109. package/modules/nextjs/stack-profile.yaml +1 -1
  110. package/modules/nuxt/stack-profile.yaml +1 -1
  111. package/modules/phaser-game/stack-profile.yaml +1 -1
  112. package/modules/php-laravel/stack-profile.yaml +1 -1
  113. package/modules/qc-playwright/stack-profile.yaml +1 -1
  114. package/modules/react/stack-profile.yaml +1 -1
  115. package/modules/react-native/stack-profile.yaml +1 -1
  116. package/modules/vue/stack-profile.yaml +1 -1
  117. package/package.json +50 -49
  118. package/rules/workflow.md +11 -0
  119. package/scripts/migrate-bdd-platform.js +286 -0
  120. package/steps/context-loader.md +66 -7
  121. package/steps/gate.md +13 -8
  122. package/steps/report-footer.md +3 -2
  123. package/templates/README.md +47 -0
  124. package/templates/feature.template +13 -10
  125. package/templates/project-context.yaml +49 -17
  126. package/templates/tech-design.template.md +1 -1
@@ -0,0 +1,692 @@
1
+ {
2
+ "$comment": [
3
+ "NGUỒN-SỰ-THẬT MÁY ĐỌC cho contract trace của framework. bin/self-check.js đối chiếu",
4
+ "file này với commands/*.tmpl + steps/*.md mỗi lần `npm run build`, và FAIL build khi lệch.",
5
+ "",
6
+ "Vì sao tồn tại: 19/23 GAP trong GAPS.md là cùng một lỗi — contract được phát biểu lại",
7
+ "bằng prose ở nhiều lệnh rồi lệch nhau qua từng lần sửa. Ca thuần khiết nhất là",
8
+ "@trace.sc_version: 3 consumer, 0 producer, tồn tại qua nhiều version mà không lệnh nào,",
9
+ "không cổng nào, không test nào phát hiện. Rule R1 dưới đây bắt đúng lớp lỗi đó.",
10
+ "",
11
+ "ĐỔI CONTRACT: sửa file này TRƯỚC, rồi mới sửa lệnh. Build fail nếu lệnh lệch schema.",
12
+ "Bản dành cho người đọc: docs/04-reference/trace-schema.md (giữ đồng bộ với file này).",
13
+ "",
14
+ "Định dạng JSON chứ không YAML vì package.json có ZERO dependency (npx chạy không cần",
15
+ "install) — thêm js-yaml chỉ để đọc một file cấu hình build-time là không đáng."
16
+ ],
17
+ "actors": {
18
+ "$comment": "Tên logic → file nguồn. self-check tìm chuỗi field trong các file này.",
19
+ "generate-bdd": "commands/generate-bdd.tmpl",
20
+ "generate-code": "commands/generate-code.tmpl",
21
+ "generate-tech-docs": "commands/generate-tech-docs.tmpl",
22
+ "generate-prd": "commands/generate-prd.tmpl",
23
+ "generate-design-spec": "commands/generate-design-spec.tmpl",
24
+ "review-context": "commands/review-context.tmpl",
25
+ "review-tech-docs": "commands/review-tech-docs.tmpl",
26
+ "review-code": "commands/review-code.tmpl",
27
+ "validate-traces": "commands/validate-traces.tmpl",
28
+ "dev-gen-test": "commands/dev-gen-test.tmpl",
29
+ "dev-run-test": "commands/dev-run-test.tmpl",
30
+ "dev-smoke-test": "commands/dev-smoke-test.tmpl",
31
+ "qc-run-test": "commands/qc-run-test.tmpl",
32
+ "report-bug": "commands/report-bug.tmpl",
33
+ "propose-scenario": "commands/propose-scenario.tmpl",
34
+ "fix-bug": "commands/fix-bug.tmpl",
35
+ "refine-prd": "commands/refine-prd.tmpl",
36
+ "sync": "commands/sync.tmpl",
37
+ "setup-ai-first": "commands/setup-ai-first.tmpl",
38
+ "context-loader": "steps/context-loader.md",
39
+ "gate": "steps/gate.md",
40
+ "report-footer": "steps/report-footer.md",
41
+ "feature-template": "templates/feature.template",
42
+ "prd-template": "templates/prd.template.md",
43
+ "tech-design-template": "templates/tech-design.template.md"
44
+ },
45
+ "tags": [
46
+ {
47
+ "name": "@trace.sc_version",
48
+ "artifact": ".feature",
49
+ "scope": "scenario",
50
+ "shape": "semver-lite (1.0, 1.1)",
51
+ "written_by": [
52
+ "generate-bdd",
53
+ "feature-template"
54
+ ],
55
+ "bumped_by": [
56
+ "generate-bdd",
57
+ "review-context"
58
+ ],
59
+ "read_by": [
60
+ "generate-bdd",
61
+ "validate-traces",
62
+ "review-context"
63
+ ],
64
+ "why": "Tín hiệu DUY NHẤT cho DRIFT (spec_ver != gen_ver). Không có producer = DRIFT chết."
65
+ },
66
+ {
67
+ "name": "@trace.bdd_version",
68
+ "artifact": ".feature",
69
+ "scope": "file",
70
+ "shape": "semver-lite scalar",
71
+ "written_by": [
72
+ "generate-bdd",
73
+ "feature-template"
74
+ ],
75
+ "bumped_by": [
76
+ "generate-bdd",
77
+ "review-context"
78
+ ],
79
+ "read_by": [
80
+ "generate-bdd",
81
+ "generate-code",
82
+ "generate-tech-docs",
83
+ "validate-traces",
84
+ "review-tech-docs",
85
+ "review-context"
86
+ ],
87
+ "why": "Drift cấp file (Background/dataset/business-definition) mà sc_version không thấy."
88
+ },
89
+ {
90
+ "name": "@trace.bdd_versions",
91
+ "artifact": "tech-design.md",
92
+ "scope": "file",
93
+ "shape": "map theo platform (system=1.5, web=1.9)",
94
+ "written_by": [
95
+ "generate-tech-docs",
96
+ "tech-design-template"
97
+ ],
98
+ "read_by": [
99
+ "generate-code",
100
+ "validate-traces",
101
+ "review-tech-docs"
102
+ ],
103
+ "why": "Số NHIỀU, cố ý khác @trace.bdd_version (scalar) — cùng tên cho hai kiểu dữ liệu làm vỡ parser generic."
104
+ },
105
+ {
106
+ "name": "@trace.platform",
107
+ "artifact": ".feature",
108
+ "scope": "file",
109
+ "required": "always",
110
+ "values_from": "platform",
111
+ "written_by": [
112
+ "generate-bdd",
113
+ "feature-template"
114
+ ],
115
+ "read_by": [
116
+ "generate-code",
117
+ "generate-tech-docs",
118
+ "review-context",
119
+ "context-loader"
120
+ ],
121
+ "why": "Quyết BE/FE ở generate-code (cấm fallback platform_type) + tên sổ trace + lookup design-spec. Lưu ý: validate-traces và report-bug KHÔNG đọc tag này — chúng suy platform từ TÊN FILE .tsv ({UC-ID}-{platform}.tsv), nên không phải consumer của tag."
122
+ },
123
+ {
124
+ "name": "@trace.prd_version",
125
+ "artifact": ".feature + code",
126
+ "scope": "file + method",
127
+ "written_by": [
128
+ "generate-bdd",
129
+ "generate-code",
130
+ "feature-template"
131
+ ],
132
+ "read_by": [
133
+ "generate-bdd",
134
+ "validate-traces",
135
+ "review-context"
136
+ ],
137
+ "why": "Nguồn của PRD_DRIFT (validate-traces Step 4 so 3 tầng: PRD file, TSV, tag trong code)."
138
+ },
139
+ {
140
+ "name": "@trace.implements",
141
+ "artifact": "code",
142
+ "scope": "method",
143
+ "shape": "{UC-ID}-SC{N}",
144
+ "written_by": [
145
+ "generate-code",
146
+ "setup-ai-first"
147
+ ],
148
+ "read_by": [
149
+ "validate-traces",
150
+ "review-code",
151
+ "dev-gen-test",
152
+ "dev-smoke-test",
153
+ "fix-bug"
154
+ ],
155
+ "why": "Khoá chính của trace ở tầng code. Tra bằng khớp chuỗi CHÍNH XÁC → cấm trỏ thư mục."
156
+ },
157
+ {
158
+ "name": "@trace.source",
159
+ "artifact": "code",
160
+ "scope": "method",
161
+ "shape": "{specs_dir}/{domain}/{prd-slug}/bdd/{platform}/{UC-ID}-{slug}.feature",
162
+ "written_by": [
163
+ "generate-code",
164
+ "setup-ai-first"
165
+ ],
166
+ "read_by": [
167
+ "review-code"
168
+ ],
169
+ "why": "Con trỏ ngược về spec. PHẢI gồm segment {platform}."
170
+ },
171
+ {
172
+ "name": "@trace.tech_doc_revision",
173
+ "artifact": "code",
174
+ "scope": "method",
175
+ "written_by": [
176
+ "generate-code"
177
+ ],
178
+ "read_by": [
179
+ "review-code"
180
+ ],
181
+ "why": "Ghi revision tech-doc mà method này được sinh theo. BẤT ĐỐI XỨNG ĐÃ BIẾT: validate-traces Step 5 tính TECHDOC_DRIFT từ cột TSV tech_doc_revision chứ không từ tag này (khác Step 4, có so tag @trace.prd_version trong code). Nên hiện chỉ review-code kiểm sự CÓ MẶT của nó. Muốn đối xứng thì Step 5 phải đọc thêm tag trong code."
182
+ },
183
+ {
184
+ "name": "@trace.verifies",
185
+ "artifact": "test",
186
+ "scope": "method",
187
+ "shape": "{UC-ID}-SC{N}",
188
+ "written_by": [
189
+ "dev-gen-test",
190
+ "qc-run-test",
191
+ "fix-bug"
192
+ ],
193
+ "read_by": [
194
+ "validate-traces",
195
+ "review-code",
196
+ "dev-run-test",
197
+ "qc-run-test"
198
+ ],
199
+ "why": "Khớp test → sc_id khi ghi test_count/dev_selftest/qc_status."
200
+ },
201
+ {
202
+ "name": "@trace.scenario",
203
+ "artifact": ".feature",
204
+ "scope": "scenario",
205
+ "shape": "{UC-ID}-SC{N}",
206
+ "written_by": [
207
+ "generate-bdd",
208
+ "propose-scenario",
209
+ "feature-template"
210
+ ],
211
+ "read_by": [
212
+ "generate-bdd",
213
+ "review-context"
214
+ ],
215
+ "why": "Sinh sc_id cho row TSV. Thiếu nó = scenario vô hình với toàn bộ coverage."
216
+ },
217
+ {
218
+ "name": "@trace.status",
219
+ "artifact": ".feature + tech-design.md",
220
+ "scope": "file",
221
+ "values_from": "approval_status",
222
+ "written_by": [
223
+ "feature-template",
224
+ "review-context",
225
+ "review-tech-docs",
226
+ "generate-tech-docs",
227
+ "tech-design-template"
228
+ ],
229
+ "read_by": [
230
+ "generate-code",
231
+ "validate-traces",
232
+ "review-tech-docs"
233
+ ],
234
+ "why": "Cổng duyệt: DS1 của generate-code, và uc_status sync từ đây."
235
+ },
236
+ {
237
+ "name": "@trace.revision",
238
+ "artifact": "tech-design.md",
239
+ "scope": "file",
240
+ "shape": "integer",
241
+ "written_by": [
242
+ "generate-tech-docs",
243
+ "review-tech-docs",
244
+ "tech-design-template"
245
+ ],
246
+ "read_by": [
247
+ "generate-code",
248
+ "validate-traces"
249
+ ],
250
+ "why": "Nguồn của tech_doc_revision + TECHDOC_DRIFT."
251
+ },
252
+ {
253
+ "name": "@trace.api_source",
254
+ "artifact": ".feature + tech-design.md",
255
+ "scope": "file",
256
+ "written_by": [
257
+ "generate-bdd",
258
+ "tech-design-template"
259
+ ],
260
+ "read_by": [
261
+ "review-tech-docs",
262
+ "review-context"
263
+ ],
264
+ "why": "existing → bỏ cổng T7 + skip System BDD Synthesis S1-S3."
265
+ },
266
+ {
267
+ "name": "@trace.stub",
268
+ "artifact": "code",
269
+ "scope": "method",
270
+ "written_by": [
271
+ "generate-code"
272
+ ],
273
+ "read_by": [
274
+ "validate-traces",
275
+ "review-code"
276
+ ],
277
+ "why": "Method trắng nội-feature. Nguồn của STUB_UNRESOLVED."
278
+ },
279
+ {
280
+ "name": "@trace.seam_pending",
281
+ "artifact": "code",
282
+ "scope": "class",
283
+ "written_by": [
284
+ "generate-code"
285
+ ],
286
+ "read_by": [
287
+ "validate-traces",
288
+ "review-code"
289
+ ],
290
+ "why": "Port cross-UC chưa có hàng thật. Nguồn của SEAM_UNWIRED."
291
+ },
292
+ {
293
+ "name": "@trace.fixes",
294
+ "artifact": "code",
295
+ "scope": "method",
296
+ "written_by": [
297
+ "fix-bug"
298
+ ],
299
+ "read_by": [],
300
+ "allow_no_reader": "Nhãn cho người đọc code, không có consumer tự động."
301
+ }
302
+ ],
303
+ "tsv_columns": [
304
+ {
305
+ "n": 1,
306
+ "name": "sc_id",
307
+ "written_by": [
308
+ "generate-bdd"
309
+ ],
310
+ "read_by": [
311
+ "validate-traces",
312
+ "generate-code",
313
+ "dev-gen-test",
314
+ "dev-run-test",
315
+ "qc-run-test",
316
+ "report-bug",
317
+ "fix-bug"
318
+ ]
319
+ },
320
+ {
321
+ "n": 2,
322
+ "name": "sc_title",
323
+ "written_by": [
324
+ "generate-bdd"
325
+ ],
326
+ "read_by": [
327
+ "validate-traces"
328
+ ]
329
+ },
330
+ {
331
+ "n": 3,
332
+ "name": "spec_ver",
333
+ "written_by": [
334
+ "generate-bdd",
335
+ "validate-traces",
336
+ "review-context"
337
+ ],
338
+ "read_by": [
339
+ "validate-traces",
340
+ "generate-code"
341
+ ]
342
+ },
343
+ {
344
+ "n": 4,
345
+ "name": "gen_ver",
346
+ "written_by": [
347
+ "generate-code"
348
+ ],
349
+ "read_by": [
350
+ "validate-traces",
351
+ "generate-bdd"
352
+ ]
353
+ },
354
+ {
355
+ "n": 5,
356
+ "name": "implemented_by",
357
+ "written_by": [
358
+ "generate-code"
359
+ ],
360
+ "read_by": [
361
+ "validate-traces",
362
+ "generate-bdd"
363
+ ]
364
+ },
365
+ {
366
+ "n": 6,
367
+ "name": "test_count",
368
+ "written_by": [
369
+ "dev-gen-test",
370
+ "fix-bug"
371
+ ],
372
+ "read_by": [
373
+ "validate-traces",
374
+ "generate-bdd"
375
+ ]
376
+ },
377
+ {
378
+ "n": 7,
379
+ "name": "test_classes",
380
+ "written_by": [
381
+ "dev-gen-test",
382
+ "fix-bug"
383
+ ],
384
+ "read_by": [
385
+ "validate-traces",
386
+ "generate-bdd"
387
+ ]
388
+ },
389
+ {
390
+ "n": 8,
391
+ "name": "dev_selftest",
392
+ "written_by": [
393
+ "dev-run-test",
394
+ "dev-gen-test",
395
+ "generate-code",
396
+ "fix-bug"
397
+ ],
398
+ "read_by": [
399
+ "validate-traces",
400
+ "qc-run-test"
401
+ ]
402
+ },
403
+ {
404
+ "n": 9,
405
+ "name": "dev_selftest_at",
406
+ "written_by": [
407
+ "dev-run-test",
408
+ "generate-code",
409
+ "fix-bug"
410
+ ],
411
+ "read_by": [
412
+ "validate-traces",
413
+ "qc-run-test"
414
+ ]
415
+ },
416
+ {
417
+ "n": 10,
418
+ "name": "qc_status",
419
+ "written_by": [
420
+ "qc-run-test"
421
+ ],
422
+ "read_by": [
423
+ "validate-traces",
424
+ "dev-run-test",
425
+ "generate-code",
426
+ "report-bug",
427
+ "fix-bug"
428
+ ]
429
+ },
430
+ {
431
+ "n": 11,
432
+ "name": "qc_run_at",
433
+ "written_by": [
434
+ "qc-run-test"
435
+ ],
436
+ "read_by": [
437
+ "validate-traces",
438
+ "dev-run-test",
439
+ "generate-code"
440
+ ]
441
+ },
442
+ {
443
+ "n": 12,
444
+ "name": "qc_owner",
445
+ "written_by": [
446
+ "qc-run-test",
447
+ "report-bug"
448
+ ],
449
+ "read_by": [
450
+ "validate-traces",
451
+ "generate-code",
452
+ "fix-bug"
453
+ ]
454
+ },
455
+ {
456
+ "n": 13,
457
+ "name": "qc_blocked_by",
458
+ "written_by": [
459
+ "qc-run-test",
460
+ "report-bug"
461
+ ],
462
+ "read_by": [
463
+ "validate-traces",
464
+ "generate-code",
465
+ "qc-run-test"
466
+ ]
467
+ },
468
+ {
469
+ "n": 14,
470
+ "name": "prd_version",
471
+ "written_by": [
472
+ "generate-bdd"
473
+ ],
474
+ "read_by": [
475
+ "validate-traces",
476
+ "generate-code"
477
+ ]
478
+ },
479
+ {
480
+ "n": 15,
481
+ "name": "bdd_version",
482
+ "written_by": [
483
+ "generate-bdd",
484
+ "review-context"
485
+ ],
486
+ "read_by": [
487
+ "validate-traces"
488
+ ]
489
+ },
490
+ {
491
+ "n": 16,
492
+ "name": "tech_doc_revision",
493
+ "written_by": [
494
+ "generate-code",
495
+ "review-tech-docs"
496
+ ],
497
+ "read_by": [
498
+ "validate-traces",
499
+ "generate-bdd"
500
+ ]
501
+ },
502
+ {
503
+ "n": 17,
504
+ "name": "fe_tech_doc_revision",
505
+ "written_by": [
506
+ "generate-code"
507
+ ],
508
+ "read_by": [
509
+ "validate-traces",
510
+ "generate-bdd",
511
+ "review-tech-docs"
512
+ ]
513
+ },
514
+ {
515
+ "n": 18,
516
+ "name": "prd_status",
517
+ "written_by": [
518
+ "generate-bdd",
519
+ "validate-traces"
520
+ ],
521
+ "read_by": [
522
+ "validate-traces"
523
+ ]
524
+ },
525
+ {
526
+ "n": 19,
527
+ "name": "uc_status",
528
+ "written_by": [
529
+ "generate-bdd",
530
+ "validate-traces",
531
+ "review-context"
532
+ ],
533
+ "read_by": [
534
+ "validate-traces",
535
+ "generate-code"
536
+ ]
537
+ },
538
+ {
539
+ "n": 20,
540
+ "name": "fe_phase",
541
+ "written_by": [
542
+ "generate-code",
543
+ "generate-bdd"
544
+ ],
545
+ "read_by": [
546
+ "validate-traces"
547
+ ]
548
+ },
549
+ {
550
+ "n": 21,
551
+ "name": "status",
552
+ "written_by": [
553
+ "validate-traces",
554
+ "generate-bdd"
555
+ ],
556
+ "read_by": [
557
+ "validate-traces",
558
+ "generate-code",
559
+ "dev-run-test",
560
+ "qc-run-test"
561
+ ]
562
+ },
563
+ {
564
+ "n": 22,
565
+ "name": "last_updated",
566
+ "written_by": [
567
+ "generate-bdd",
568
+ "generate-code",
569
+ "dev-gen-test",
570
+ "dev-run-test",
571
+ "qc-run-test",
572
+ "review-context",
573
+ "review-tech-docs",
574
+ "fix-bug"
575
+ ],
576
+ "read_by": [
577
+ "validate-traces"
578
+ ]
579
+ }
580
+ ],
581
+ "vocabularies": {
582
+ "$comment": "Mọi giá trị phải xuất hiện ở ít nhất một actor — giá trị chết là dấu hiệu contract lệch.",
583
+ "trace_status": {
584
+ "values": [
585
+ "OK",
586
+ "DRIFT",
587
+ "GAP",
588
+ "UNTRACKED",
589
+ "ORPHANED"
590
+ ],
591
+ "column": "status"
592
+ },
593
+ "platform": {
594
+ "values": [
595
+ "web",
596
+ "app",
597
+ "system"
598
+ ]
599
+ },
600
+ "approval_status": {
601
+ "values": [
602
+ "draft",
603
+ "in-review",
604
+ "approved"
605
+ ]
606
+ },
607
+ "fe_phase": {
608
+ "values": [
609
+ "ui",
610
+ "integrated"
611
+ ],
612
+ "column": "fe_phase"
613
+ },
614
+ "seam_status": {
615
+ "values": [
616
+ "PENDING",
617
+ "READY",
618
+ "RESOLVED"
619
+ ]
620
+ },
621
+ "audit_flags": {
622
+ "values": [
623
+ "PRD_DRIFT",
624
+ "BDD_DRIFT",
625
+ "TECHDOC_DRIFT",
626
+ "FE_TECHDOC_DRIFT",
627
+ "TECHDOC_STALE_VS_BDD",
628
+ "TRACE_ORPHAN",
629
+ "SEAM_UNWIRED",
630
+ "STUB_UNRESOLVED",
631
+ "SEAM_PENDING",
632
+ "STUB_PENDING"
633
+ ]
634
+ }
635
+ },
636
+ "path_keys": {
637
+ "$comment": "Key phải có trong templates/project-context.yaml VÀ được dùng bởi ít nhất một actor. Key khai mà không ai dùng = key chết (GAPS.md G17).",
638
+ "config_file": "templates/project-context.yaml",
639
+ "ignore_unused": [
640
+ "specs_dir",
641
+ "src_dir",
642
+ "trace_dir",
643
+ "tech_docs_dir",
644
+ "lessons_file"
645
+ ]
646
+ },
647
+ "forbidden_patterns": [
648
+ {
649
+ "pattern": "bdd/{UC-ID}.feature",
650
+ "reason": "@trace.source thiếu segment {platform}. Layout thật: bdd/{platform}/{UC-ID}-{slug}.feature",
651
+ "gap": "G8"
652
+ },
653
+ {
654
+ "pattern": "{UC-ID}*-tech-design",
655
+ "reason": "Glob không bao giờ khớp: tech-doc là doc GỘP cấp PRD, tên mang {TICKET-ID} chứ không mang {UC-ID}",
656
+ "gap": "G10",
657
+ "except": {
658
+ "steps/gate.md": "Trích dẫn pattern trong cảnh báo tại chỗ: \"Đừng glob {UC-ID}*-tech-design*.md — nó nở thành ... và không bao giờ khớp\""
659
+ }
660
+ },
661
+ {
662
+ "pattern": "{prd-slug}/{UC-ID}.tsv",
663
+ "reason": "Tên sổ trace thiếu -{platform}. Một sổ cho mỗi UC × platform",
664
+ "gap": "G18"
665
+ },
666
+ {
667
+ "pattern": "claude-opus-4",
668
+ "reason": "Hardcode version model — dùng \"model Opus mới nhất\" để không phải sửa framework mỗi lần lên model",
669
+ "gap": "G21"
670
+ },
671
+ {
672
+ "pattern": "{paths.feature_template}",
673
+ "reason": "Key chết: template được {{include}} nướng cứng lúc build, lệnh không đọc path template lúc chạy",
674
+ "gap": "G17"
675
+ },
676
+ {
677
+ "pattern": "{paths.prd_template}",
678
+ "reason": "Key chết — xem G9/G17",
679
+ "gap": "G17"
680
+ },
681
+ {
682
+ "pattern": "{paths.trace_report}",
683
+ "reason": "Key chết và trỏ sai: report thật là {trace_dir}/trace-report.json",
684
+ "gap": "G17"
685
+ },
686
+ {
687
+ "pattern": "{paths.templates_dir}",
688
+ "reason": "Key chết — xem G17",
689
+ "gap": "G17"
690
+ }
691
+ ]
692
+ }