create-yss-spec 3.1.3 → 3.2.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 (206) hide show
  1. package/README.md +5 -1
  2. package/package.json +1 -1
  3. package/template/.agents/skills/.strategic-design-skills-manifest.json +1 -1
  4. package/template/.agents/skills/yss-domain/SKILL.md +3 -3
  5. package/template/.agents/skills/yss-implementation-contract-compiler/SKILL.md +2 -2
  6. package/template/.agents/skills/yss-implementation-contract-compiler/references/boundaries.md +5 -0
  7. package/template/.agents/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +10 -2
  8. package/template/.agents/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +8 -1
  9. package/template/.agents/skills/yss-mvc-design/SKILL.md +16 -0
  10. package/template/.agents/skills/yss-mvc-design/agents/openai.yaml +4 -0
  11. package/template/.agents/skills/yss-mvc-design/references/mvc-design.schema.json +315 -0
  12. package/template/.agents/skills/yss-product-lifecycle/SKILL.md +2 -2
  13. package/template/.agents/skills/yss-product-lifecycle/references/artifact-dependencies.md +2 -2
  14. package/template/.agents/skills/yss-product-lifecycle/references/orchestration-contract.yaml +14 -9
  15. package/template/.agents/skills/yss-product-lifecycle/references/orchestration.md +1 -1
  16. package/template/.agents/skills/yss-product-lifecycle/references/state-model.md +1 -1
  17. package/template/.agents/skills/yss-tactical-design/SKILL.md +2 -2
  18. package/template/.agents/skills/yss-tactical-design/references/output-template.md +2 -0
  19. package/template/.agents/skills/yss-tactical-design/references/tactical-design-contract.md +3 -1
  20. package/template/.agents/skills/yss-tactical-design/scripts/validate-tactical-design.mjs +3 -2
  21. package/template/.agents/skills/yss-technical-design/SKILL.md +31 -0
  22. package/template/.agents/skills/yss-technical-design/agents/openai.yaml +4 -0
  23. package/template/.agents/skills/yss-technical-design/references/technical-design-common.schema.json +290 -0
  24. package/template/.agents/skills/yss-technical-design/references/technical-design-contract.md +31 -0
  25. package/template/.agents/skills/yss-technical-design/references/technical-design.schema.json +759 -0
  26. package/template/.agents/skills/yss-technical-design/scripts/generate-schema.mjs +20 -0
  27. package/template/.agents/skills/yss-technical-design/scripts/validate-technical-design.mjs +134 -0
  28. package/template/.agents/skills/yss-technical-design/tests/fixtures.mjs +32 -0
  29. package/template/.agents/skills/yss-technical-design/tests/run-scenarios.mjs +82 -0
  30. package/template/.claude/skills/yss-domain/SKILL.md +3 -3
  31. package/template/.claude/skills/yss-implementation-contract-compiler/SKILL.md +2 -2
  32. package/template/.claude/skills/yss-implementation-contract-compiler/references/boundaries.md +5 -0
  33. package/template/.claude/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +10 -2
  34. package/template/.claude/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +8 -1
  35. package/template/.claude/skills/yss-mvc-design/SKILL.md +16 -0
  36. package/template/.claude/skills/yss-mvc-design/agents/openai.yaml +4 -0
  37. package/template/.claude/skills/yss-mvc-design/references/mvc-design.schema.json +315 -0
  38. package/template/.claude/skills/yss-product-lifecycle/SKILL.md +2 -2
  39. package/template/.claude/skills/yss-product-lifecycle/references/artifact-dependencies.md +2 -2
  40. package/template/.claude/skills/yss-product-lifecycle/references/orchestration-contract.yaml +14 -9
  41. package/template/.claude/skills/yss-product-lifecycle/references/orchestration.md +1 -1
  42. package/template/.claude/skills/yss-product-lifecycle/references/state-model.md +1 -1
  43. package/template/.claude/skills/yss-tactical-design/SKILL.md +2 -2
  44. package/template/.claude/skills/yss-tactical-design/references/output-template.md +2 -0
  45. package/template/.claude/skills/yss-tactical-design/references/tactical-design-contract.md +3 -1
  46. package/template/.claude/skills/yss-tactical-design/scripts/validate-tactical-design.mjs +3 -2
  47. package/template/.claude/skills/yss-technical-design/SKILL.md +31 -0
  48. package/template/.claude/skills/yss-technical-design/agents/openai.yaml +4 -0
  49. package/template/.claude/skills/yss-technical-design/references/technical-design-common.schema.json +290 -0
  50. package/template/.claude/skills/yss-technical-design/references/technical-design-contract.md +31 -0
  51. package/template/.claude/skills/yss-technical-design/references/technical-design.schema.json +759 -0
  52. package/template/.claude/skills/yss-technical-design/scripts/generate-schema.mjs +20 -0
  53. package/template/.claude/skills/yss-technical-design/scripts/validate-technical-design.mjs +134 -0
  54. package/template/.claude/skills/yss-technical-design/tests/fixtures.mjs +32 -0
  55. package/template/.claude/skills/yss-technical-design/tests/run-scenarios.mjs +82 -0
  56. package/template/.codex/skills/yss-domain/SKILL.md +3 -3
  57. package/template/.codex/skills/yss-implementation-contract-compiler/SKILL.md +2 -2
  58. package/template/.codex/skills/yss-implementation-contract-compiler/references/boundaries.md +5 -0
  59. package/template/.codex/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +10 -2
  60. package/template/.codex/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +8 -1
  61. package/template/.codex/skills/yss-mvc-design/SKILL.md +16 -0
  62. package/template/.codex/skills/yss-mvc-design/agents/openai.yaml +4 -0
  63. package/template/.codex/skills/yss-mvc-design/references/mvc-design.schema.json +315 -0
  64. package/template/.codex/skills/yss-product-lifecycle/SKILL.md +2 -2
  65. package/template/.codex/skills/yss-product-lifecycle/references/artifact-dependencies.md +2 -2
  66. package/template/.codex/skills/yss-product-lifecycle/references/orchestration-contract.yaml +14 -9
  67. package/template/.codex/skills/yss-product-lifecycle/references/orchestration.md +1 -1
  68. package/template/.codex/skills/yss-product-lifecycle/references/state-model.md +1 -1
  69. package/template/.codex/skills/yss-tactical-design/SKILL.md +2 -2
  70. package/template/.codex/skills/yss-tactical-design/references/output-template.md +2 -0
  71. package/template/.codex/skills/yss-tactical-design/references/tactical-design-contract.md +3 -1
  72. package/template/.codex/skills/yss-tactical-design/scripts/validate-tactical-design.mjs +3 -2
  73. package/template/.codex/skills/yss-technical-design/SKILL.md +31 -0
  74. package/template/.codex/skills/yss-technical-design/agents/openai.yaml +4 -0
  75. package/template/.codex/skills/yss-technical-design/references/technical-design-common.schema.json +290 -0
  76. package/template/.codex/skills/yss-technical-design/references/technical-design-contract.md +31 -0
  77. package/template/.codex/skills/yss-technical-design/references/technical-design.schema.json +759 -0
  78. package/template/.codex/skills/yss-technical-design/scripts/generate-schema.mjs +20 -0
  79. package/template/.codex/skills/yss-technical-design/scripts/validate-technical-design.mjs +134 -0
  80. package/template/.codex/skills/yss-technical-design/tests/fixtures.mjs +32 -0
  81. package/template/.codex/skills/yss-technical-design/tests/run-scenarios.mjs +82 -0
  82. package/template/.cursor/skills/yss-domain/SKILL.md +3 -3
  83. package/template/.cursor/skills/yss-implementation-contract-compiler/SKILL.md +2 -2
  84. package/template/.cursor/skills/yss-implementation-contract-compiler/references/boundaries.md +5 -0
  85. package/template/.cursor/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +10 -2
  86. package/template/.cursor/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +8 -1
  87. package/template/.cursor/skills/yss-mvc-design/SKILL.md +16 -0
  88. package/template/.cursor/skills/yss-mvc-design/agents/openai.yaml +4 -0
  89. package/template/.cursor/skills/yss-mvc-design/references/mvc-design.schema.json +315 -0
  90. package/template/.cursor/skills/yss-product-lifecycle/SKILL.md +2 -2
  91. package/template/.cursor/skills/yss-product-lifecycle/references/artifact-dependencies.md +2 -2
  92. package/template/.cursor/skills/yss-product-lifecycle/references/orchestration-contract.yaml +14 -9
  93. package/template/.cursor/skills/yss-product-lifecycle/references/orchestration.md +1 -1
  94. package/template/.cursor/skills/yss-product-lifecycle/references/state-model.md +1 -1
  95. package/template/.cursor/skills/yss-tactical-design/SKILL.md +2 -2
  96. package/template/.cursor/skills/yss-tactical-design/references/output-template.md +2 -0
  97. package/template/.cursor/skills/yss-tactical-design/references/tactical-design-contract.md +3 -1
  98. package/template/.cursor/skills/yss-tactical-design/scripts/validate-tactical-design.mjs +3 -2
  99. package/template/.cursor/skills/yss-technical-design/SKILL.md +31 -0
  100. package/template/.cursor/skills/yss-technical-design/agents/openai.yaml +4 -0
  101. package/template/.cursor/skills/yss-technical-design/references/technical-design-common.schema.json +290 -0
  102. package/template/.cursor/skills/yss-technical-design/references/technical-design-contract.md +31 -0
  103. package/template/.cursor/skills/yss-technical-design/references/technical-design.schema.json +759 -0
  104. package/template/.cursor/skills/yss-technical-design/scripts/generate-schema.mjs +20 -0
  105. package/template/.cursor/skills/yss-technical-design/scripts/validate-technical-design.mjs +134 -0
  106. package/template/.cursor/skills/yss-technical-design/tests/fixtures.mjs +32 -0
  107. package/template/.cursor/skills/yss-technical-design/tests/run-scenarios.mjs +82 -0
  108. package/template/.pi/skills/yss-domain/SKILL.md +3 -3
  109. package/template/.pi/skills/yss-implementation-contract-compiler/SKILL.md +2 -2
  110. package/template/.pi/skills/yss-implementation-contract-compiler/references/boundaries.md +5 -0
  111. package/template/.pi/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +10 -2
  112. package/template/.pi/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +8 -1
  113. package/template/.pi/skills/yss-mvc-design/SKILL.md +16 -0
  114. package/template/.pi/skills/yss-mvc-design/agents/openai.yaml +4 -0
  115. package/template/.pi/skills/yss-mvc-design/references/mvc-design.schema.json +315 -0
  116. package/template/.pi/skills/yss-product-lifecycle/SKILL.md +2 -2
  117. package/template/.pi/skills/yss-product-lifecycle/references/artifact-dependencies.md +2 -2
  118. package/template/.pi/skills/yss-product-lifecycle/references/orchestration-contract.yaml +14 -9
  119. package/template/.pi/skills/yss-product-lifecycle/references/orchestration.md +1 -1
  120. package/template/.pi/skills/yss-product-lifecycle/references/state-model.md +1 -1
  121. package/template/.pi/skills/yss-tactical-design/SKILL.md +2 -2
  122. package/template/.pi/skills/yss-tactical-design/references/output-template.md +2 -0
  123. package/template/.pi/skills/yss-tactical-design/references/tactical-design-contract.md +3 -1
  124. package/template/.pi/skills/yss-tactical-design/scripts/validate-tactical-design.mjs +3 -2
  125. package/template/.pi/skills/yss-technical-design/SKILL.md +31 -0
  126. package/template/.pi/skills/yss-technical-design/agents/openai.yaml +4 -0
  127. package/template/.pi/skills/yss-technical-design/references/technical-design-common.schema.json +290 -0
  128. package/template/.pi/skills/yss-technical-design/references/technical-design-contract.md +31 -0
  129. package/template/.pi/skills/yss-technical-design/references/technical-design.schema.json +759 -0
  130. package/template/.pi/skills/yss-technical-design/scripts/generate-schema.mjs +20 -0
  131. package/template/.pi/skills/yss-technical-design/scripts/validate-technical-design.mjs +134 -0
  132. package/template/.pi/skills/yss-technical-design/tests/fixtures.mjs +32 -0
  133. package/template/.pi/skills/yss-technical-design/tests/run-scenarios.mjs +82 -0
  134. package/template/.qoder/skills/yss-domain/SKILL.md +3 -3
  135. package/template/.qoder/skills/yss-implementation-contract-compiler/SKILL.md +2 -2
  136. package/template/.qoder/skills/yss-implementation-contract-compiler/references/boundaries.md +5 -0
  137. package/template/.qoder/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +10 -2
  138. package/template/.qoder/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +8 -1
  139. package/template/.qoder/skills/yss-mvc-design/SKILL.md +16 -0
  140. package/template/.qoder/skills/yss-mvc-design/agents/openai.yaml +4 -0
  141. package/template/.qoder/skills/yss-mvc-design/references/mvc-design.schema.json +315 -0
  142. package/template/.qoder/skills/yss-product-lifecycle/SKILL.md +2 -2
  143. package/template/.qoder/skills/yss-product-lifecycle/references/artifact-dependencies.md +2 -2
  144. package/template/.qoder/skills/yss-product-lifecycle/references/orchestration-contract.yaml +14 -9
  145. package/template/.qoder/skills/yss-product-lifecycle/references/orchestration.md +1 -1
  146. package/template/.qoder/skills/yss-product-lifecycle/references/state-model.md +1 -1
  147. package/template/.qoder/skills/yss-tactical-design/SKILL.md +2 -2
  148. package/template/.qoder/skills/yss-tactical-design/references/output-template.md +2 -0
  149. package/template/.qoder/skills/yss-tactical-design/references/tactical-design-contract.md +3 -1
  150. package/template/.qoder/skills/yss-tactical-design/scripts/validate-tactical-design.mjs +3 -2
  151. package/template/.qoder/skills/yss-technical-design/SKILL.md +31 -0
  152. package/template/.qoder/skills/yss-technical-design/agents/openai.yaml +4 -0
  153. package/template/.qoder/skills/yss-technical-design/references/technical-design-common.schema.json +290 -0
  154. package/template/.qoder/skills/yss-technical-design/references/technical-design-contract.md +31 -0
  155. package/template/.qoder/skills/yss-technical-design/references/technical-design.schema.json +759 -0
  156. package/template/.qoder/skills/yss-technical-design/scripts/generate-schema.mjs +20 -0
  157. package/template/.qoder/skills/yss-technical-design/scripts/validate-technical-design.mjs +134 -0
  158. package/template/.qoder/skills/yss-technical-design/tests/fixtures.mjs +32 -0
  159. package/template/.qoder/skills/yss-technical-design/tests/run-scenarios.mjs +82 -0
  160. package/template/.trae/skills/yss-domain/SKILL.md +3 -3
  161. package/template/.trae/skills/yss-implementation-contract-compiler/SKILL.md +2 -2
  162. package/template/.trae/skills/yss-implementation-contract-compiler/references/boundaries.md +5 -0
  163. package/template/.trae/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +10 -2
  164. package/template/.trae/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +8 -1
  165. package/template/.trae/skills/yss-mvc-design/SKILL.md +16 -0
  166. package/template/.trae/skills/yss-mvc-design/agents/openai.yaml +4 -0
  167. package/template/.trae/skills/yss-mvc-design/references/mvc-design.schema.json +315 -0
  168. package/template/.trae/skills/yss-product-lifecycle/SKILL.md +2 -2
  169. package/template/.trae/skills/yss-product-lifecycle/references/artifact-dependencies.md +2 -2
  170. package/template/.trae/skills/yss-product-lifecycle/references/orchestration-contract.yaml +14 -9
  171. package/template/.trae/skills/yss-product-lifecycle/references/orchestration.md +1 -1
  172. package/template/.trae/skills/yss-product-lifecycle/references/state-model.md +1 -1
  173. package/template/.trae/skills/yss-tactical-design/SKILL.md +2 -2
  174. package/template/.trae/skills/yss-tactical-design/references/output-template.md +2 -0
  175. package/template/.trae/skills/yss-tactical-design/references/tactical-design-contract.md +3 -1
  176. package/template/.trae/skills/yss-tactical-design/scripts/validate-tactical-design.mjs +3 -2
  177. package/template/.trae/skills/yss-technical-design/SKILL.md +31 -0
  178. package/template/.trae/skills/yss-technical-design/agents/openai.yaml +4 -0
  179. package/template/.trae/skills/yss-technical-design/references/technical-design-common.schema.json +290 -0
  180. package/template/.trae/skills/yss-technical-design/references/technical-design-contract.md +31 -0
  181. package/template/.trae/skills/yss-technical-design/references/technical-design.schema.json +759 -0
  182. package/template/.trae/skills/yss-technical-design/scripts/generate-schema.mjs +20 -0
  183. package/template/.trae/skills/yss-technical-design/scripts/validate-technical-design.mjs +134 -0
  184. package/template/.trae/skills/yss-technical-design/tests/fixtures.mjs +32 -0
  185. package/template/.trae/skills/yss-technical-design/tests/run-scenarios.mjs +82 -0
  186. package/template/CONTEXT.md +2 -1
  187. package/template/docs/agents/digital-human-roles.yaml +2 -2
  188. package/template/docs/agents/yss-skill-registry.yaml +20 -1
  189. package/template/docs/architecture/templates/architecture-review-checklist.md +1 -1
  190. package/template/docs/architecture/templates/system-overview-design-template.md +15 -4
  191. package/template/docs/process/lifecycle-artifact-map.md +2 -0
  192. package/template/docs/process/lifecycle-registry-baseline.json +3 -1
  193. package/template/docs/process/lifecycle-registry.yaml +9 -2
  194. package/template/docs/process/schemas/strategic-design-handoff.schema.json +77 -4
  195. package/template/docs/process/strategic-handoff-package.md +4 -2
  196. package/template/docs/process/template-verification-profiles.yaml +14 -0
  197. package/template/docs/user-guide//346/210/230/346/234/257/350/256/276/350/256/241/345/255/220/351/241/271/347/233/256/347/224/250/346/210/267/346/211/213/345/206/214.md +7 -6
  198. package/template/scripts/fixtures/strategic-handoff/fixture.mjs +3 -2
  199. package/template/scripts/lib/implementation-contract-compiler.mjs +8 -1
  200. package/template/scripts/lib/strategic-handoff-consumption.mjs +4 -4
  201. package/template/scripts/lib/strategic-handoff-design-targets.mjs +15 -0
  202. package/template/scripts/lib/technical-design-boundary.mjs +23 -0
  203. package/template/scripts/sync-strategic-handoff-tools +3 -2
  204. package/template/scripts/verify-strategic-handoff-package-scenarios +7 -1
  205. package/template/skills-lock.json +41 -11
  206. package/template.snapshot.json +4 -4
@@ -82,6 +82,11 @@ required_files:
82
82
  - docs/design/templates/visual-baseline-template.yaml
83
83
  - docs/process/templates/maintenance-checkpoint-template.yaml
84
84
  - docs/templates/subagent-task-package-template.md
85
+ - .agents/skills/yss-technical-design/SKILL.md
86
+ - .agents/skills/yss-technical-design/references/technical-design.schema.json
87
+ - .agents/skills/yss-technical-design/scripts/validate-technical-design.mjs
88
+ - .agents/skills/yss-mvc-design/SKILL.md
89
+ - .agents/skills/yss-mvc-design/references/mvc-design.schema.json
85
90
  - .agents/skills/yss-tactical-design/SKILL.md
86
91
  - .agents/skills/yss-tactical-design/agents/openai.yaml
87
92
  - .agents/skills/yss-tactical-design/references/tactical-design-contract.md
@@ -191,6 +196,10 @@ syntax_files:
191
196
  - scripts/verify-maintenance-review-workflow-scenarios
192
197
  - scripts/verify-template-cache-scenarios
193
198
  routing:
199
+ - patterns: [".template-source/cli-core/**"]
200
+ groups: [dedicated-cli-core]
201
+ - patterns: [".agents/skills/yss-technical-design/**", ".agents/skills/yss-mvc-design/**", ".agents/skills/yss-tactical-design/**", "scripts/lib/technical-design-boundary.mjs", "scripts/lib/strategic-handoff-design-targets.mjs"]
202
+ groups: [tactical-design, implementation]
194
203
  - patterns: ["scripts/*backend-delivery*", "scripts/*frontend-delivery*", "scripts/lib/*backend-delivery*", "scripts/lib/*frontend-delivery*", "scripts/fixtures/backend-delivery/**", "docs/process/frontend-backend-delivery.md", "docs/process/schemas/backend-delivery*", "docs/process/schemas/frontend-delivery*"]
195
204
  groups: [frontend-delivery]
196
205
  - patterns: ["scripts/*user-decision*", "scripts/lib/user-decision*", "scripts/fixtures/user-decision/**", "docs/process/schemas/user-decision*", "docs/process/templates/user-decision*", "scripts/lib/approval-record.mjs", "scripts/verify-approval-record"]
@@ -230,6 +239,9 @@ routing:
230
239
  - patterns: ["scripts/**"]
231
240
  groups: [hygiene]
232
241
  groups:
242
+ dedicated-cli-core:
243
+ commands:
244
+ - { run: "node --test .template-source/cli-core/tests/*.test.mjs", when: template-source }
233
245
  frontend-delivery:
234
246
  commands:
235
247
  - { run: "scripts/verify-frontend-delivery-scenarios" }
@@ -259,6 +271,8 @@ groups:
259
271
  - { run: "node .agents/skills/yss-antdv-next-design/tests/run-scenarios.mjs" }
260
272
  tactical-design:
261
273
  commands:
274
+ - { run: "node .agents/skills/yss-technical-design/scripts/generate-schema.mjs --check" }
275
+ - { run: "node .agents/skills/yss-technical-design/tests/run-scenarios.mjs" }
262
276
  - { run: "node --check .agents/skills/yss-tactical-design/scripts/validate-tactical-design.mjs" }
263
277
  - { run: "node --check .agents/skills/yss-tactical-design/tests/run-scenarios.mjs" }
264
278
  - { run: "node .agents/skills/yss-tactical-design/tests/run-scenarios.mjs" }
@@ -1,14 +1,15 @@
1
1
  # 战术设计子项目用户手册
2
2
 
3
- 本入口保留给既有读者。Tactical Design 把已批准业务规则映射为聚合、状态、不变量、一致性边界和测试 seam;它不是新的模板家族,不代替 API Freeze 或 Slice Contract 批准。
3
+ 本入口保留给既有读者。“战术设计子项目”通过 `yss-technical-design` 统一承接技术设计,整体主控仍为 `yss-product-lifecycle`。先确认后端项目采用 `domain-driven` 或 `layered-mvc`,再分别调用 `yss-tactical-design` 或 `yss-mvc-design`;DDD 是选项,不是默认要求。技术设计不代替 API Freeze 或 Slice Contract 批准。
4
4
 
5
5
  ## 输入与开始
6
6
 
7
- 先核对本仓身份、profile、根 CONTEXT.md、当前战略交接及批准证据。导入快照后完成目标词汇对账,再逐项登记源规则/关键场景的承接;缺失、冲突或过期先回交,不能猜测业务规则。
7
+ 先核对本仓身份、profile、根 CONTEXT.md、适用的战略交接、需求及批准证据。已有战略包时,导入快照后完成目标词汇对账,再逐项登记源规则/关键场景的承接;缺失、冲突或过期先回交,不能猜测业务规则。
8
8
 
9
9
  ```text
10
10
  请按本仓生命周期检查“设备领用”当前战略输入及目标词汇对账。
11
- 有领域行为影响时,使用 yss-tactical-design 起草战术设计,
11
+ 使用 yss-technical-design 核对已确认的项目架构并起草技术设计,
12
+ DDD 调用 yss-tactical-design,传统 MVC 调用 yss-mvc-design;
12
13
  解释设备占用的竞争、状态转换和一致性边界,并映射公开测试 seam。
13
14
  逐项列出已承接、冲突、延期及依赖切片,等待适用审查后再编译实现合同。
14
15
  ```
@@ -20,15 +21,15 @@
20
21
  | 谁保护不变量 | 哪个对象/边界保证设备不能同时被领用 |
21
22
  | 状态是否合法 | 未批准申请是否允许领用;重复归还如何处理 |
22
23
  | 一致性在哪里保证 | 申请与设备占用是否同事务;失败如何恢复 |
23
- | 外部依赖如何隔离 | API/Repository/Gateway 怎样映射而不篡改业务含义 |
24
+ | 外部依赖如何隔离 | API/Repository/适配边界怎样映射而不篡改业务含义 |
24
25
  | 如何证伪设计 | 并发领用、无权限、重复请求的公开 seam 与预期结果 |
25
26
 
26
- 案例只是提问方向,答案由项目实际业务与工程条件决定。没有领域行为影响时按当前政策记录带原因的 not-applicable,不为简单页面硬造聚合。
27
+ 案例只是提问方向,答案由项目实际业务与工程条件决定。MVC 不要求先完成战略 DDD,也不要求聚合、值对象或 DDD Gateway;用例、规则、事务、幂等、并发和测试承接仍须清晰。没有相关技术设计影响时记录带原因的 not-applicable。
27
28
 
28
29
  ## 从设计到实现
29
30
 
30
31
  综合项目由本仓生命周期继续路由,通用研发/后端由 Harness 流程承接。前端专职只消费上游规则、冻结接口并准备前端工程设计,不在本仓派发后端战术实现。
31
32
 
32
- 编译器起草当前合同,批准与可实现状态由本仓编排和门禁控制。实现前确认工程登记、冻结接口、测试 seam、允许路径与回滚点。战术评审通过不等于 ready-for-agent。
33
+ 技术设计经现有门禁批准后,编译器消费当前设计并起草实现合同,批准与可实现状态由本仓编排和门禁控制。实现前确认工程登记、冻结接口、测试 seam、允许路径与回滚点。战术评审通过不等于 ready-for-agent。
33
34
 
34
35
  过程示例见 [设备借用贯穿案例](设备借用贯穿案例.md);项目选型见 [用户手册](用户手册.md)。
@@ -16,7 +16,8 @@ context_schema_version: 1
16
16
  |---|---|---|---|---|
17
17
  | 供应商 | 提供产品或服务的主体 | Supplier | Global | |
18
18
  `;
19
- export async function fixture(root) {
19
+ // Legacy fixture remains the default for released CLI compatibility tests.
20
+ export async function fixture(root, { technicalDesign = false } = {}) {
20
21
  const put=(ref,value)=>{const p=path.join(root,ref);mkdirSync(path.dirname(p),{recursive:true});writeFileSync(p,typeof value==='string'?value:json(value));};
21
22
  put('yss-project.yaml','schema_version: 1\nrepository_mode: project-instance\n');put('CONTEXT.md',context);
22
23
  const source=parseContextSource(context), resolved=resolveContextTermRefs(source,['Global/Supplier']);
@@ -51,7 +52,7 @@ const visualBaselineRef = { baseline_id: sealedBaseline.baseline_id, version: se
51
52
  const terminalGate=countersignRuleForGate(roles.gate_policy,'gate.strategic-design-handoff-approved')?'gate.strategic-design-handoff-approved':'gate.stage-decision-package-approved';
52
53
  const gates={domain_strategy_ref:'gate.domain-strategy-approved',stage_decision_package_ref:'gate.stage-decision-package-approved',spec_ref:'gate.spec-baseline-approved',prototype_ref:'gate.user-confirmation',visual_baseline_ref:'gate.user-confirmation',business_ticket_set_ref:terminalGate,handoff:terminalGate};
53
54
  const approvals=Object.fromEntries([...Object.keys(sourceRefs),'handoff'].map(key=>[key,{record_ref:`approvals/${key}.yaml`,gate_id:gates[key],digest_kind:key==='visual_baseline_ref'?'visual-baseline':['domain_strategy_ref','stage_decision_package_ref','business_ticket_set_ref'].includes(key)?'canonical-json':'sha256-bytes'}]));
54
- const handoff={schema_version:3,handoff_id:'strategic-design-handoff.supplier',handoff_version:'v1',status:'approved',source:sourceRefs,source_context_snapshot:snapshot,context_delta:{added:resolved.terms.map(({term_ref,term,meaning,english_identifier,context_id,forbidden_aliases})=>({term_ref,term,meaning,english_identifier,context_id,forbidden_aliases})),updated:[],deprecated:[]},target_context_reconciliation:{target_context_ref:'CONTEXT.md',reconciliation_schema_ref:'docs/process/schemas/context-reconciliation.schema.json',required_before_skill:'yss-tactical-design',status:'pending'},target:{team:'downstream-rd-team',skill:'yss-tactical-design',output:'tactical-design-contract'},problem_and_business_outcomes:['提交供应商材料'],bounded_context_and_subdomain_map:['SupplierManagement'],context_map_and_translation_responsibility:['SupplierManagement'],ubiquitous_language_and_concept_candidates:['Global/Supplier'],scenarios_and_business_invariants:['rule.complete','scenario.submit'],tactical_design_questions:['一致性边界'],deferred_decisions_and_ownership:[],evidence_and_version_digests:['evidence/offline.log'],acceptance:['traceability'],package_export:{schema_version:1,approvals,additional_files:[],reference_map:{},prototype:{profile:'H2',preview_root:'preview',entry_ref:'preview/index.html',verification_ref:'evidence/offline.json',verification_digest:hash(readFileSync(path.join(root,'evidence/offline.json'))),source_digest:treeDigest(root,'prototype-src'),source_root:'prototype-src',lock_ref:'prototype-src/pnpm-lock.yaml'}}};
55
+ const handoff={schema_version:3,handoff_id:'strategic-design-handoff.supplier',handoff_version:'v1',status:'approved',source:sourceRefs,source_context_snapshot:snapshot,context_delta:{added:resolved.terms.map(({term_ref,term,meaning,english_identifier,context_id,forbidden_aliases})=>({term_ref,term,meaning,english_identifier,context_id,forbidden_aliases})),updated:[],deprecated:[]},target_context_reconciliation:{target_context_ref:'CONTEXT.md',reconciliation_schema_ref:'docs/process/schemas/context-reconciliation.schema.json',required_before_skill:technicalDesign?'yss-technical-design':'yss-tactical-design',status:'pending'},target:{team:'downstream-rd-team',skill:technicalDesign?'yss-technical-design':'yss-tactical-design',output:technicalDesign?'technical-design-contract':'tactical-design-contract'},problem_and_business_outcomes:['提交供应商材料'],bounded_context_and_subdomain_map:['SupplierManagement'],context_map_and_translation_responsibility:['SupplierManagement'],ubiquitous_language_and_concept_candidates:['Global/Supplier'],scenarios_and_business_invariants:['rule.complete','scenario.submit'],tactical_design_questions:['一致性边界'],deferred_decisions_and_ownership:[],evidence_and_version_digests:['evidence/offline.log'],acceptance:['traceability'],package_export:{schema_version:1,approvals,additional_files:[],reference_map:{},prototype:{profile:'H2',preview_root:'preview',entry_ref:'preview/index.html',verification_ref:'evidence/offline.json',verification_digest:hash(readFileSync(path.join(root,'evidence/offline.json'))),source_digest:treeDigest(root,'prototype-src'),source_root:'prototype-src',lock_ref:'prototype-src/pnpm-lock.yaml'}}};
55
56
  const sign=()=>{put('handoff.yaml',handoff);for(const[key,approval]of Object.entries(approvals)){const asset=key==='handoff'?{id:handoff.handoff_id,version:handoff.handoff_version,digest:hash(readFileSync(path.join(root,'handoff.yaml')))}:sourceRefs[key];put(approval.record_ref,{schema_version:1,gate_id:approval.gate_id,decision:'approved',actor_kind:'digital-human',role_id:countersignRuleForGate(roles.gate_policy,approval.gate_id).countersigners[0],runtime_id:'runtime.generic',principal_ref:'synthetic-maintenance-fixture',artifact_bindings:[{id:asset.id||asset.baseline_id,version:asset.version,digest:asset.digest}]});}};
56
57
  sign();return{handoff,strategy,stage,put,sign,snapshot};
57
58
  }
@@ -1,3 +1,4 @@
1
+ import { enforceTechnicalDesign } from './technical-design-boundary.mjs';
1
2
  import { enforceHarnessSkillScope } from "./harness-execution-scope.mjs";
2
3
  import { createHash } from "node:crypto";
3
4
  import { readFileSync } from "node:fs";
@@ -66,7 +67,8 @@ export function compileImplementationContract({
66
67
  architecture_evidence,
67
68
  root = ROOT,
68
69
  slice_id,
69
- frontend_delivery
70
+ frontend_delivery,
71
+ technical_design
70
72
  }) {
71
73
  assertV2(registry, compilerContract);
72
74
  const deliveryInput = enforceFrontendDelivery({ slice_id, frontend_delivery }, { root });
@@ -91,6 +93,8 @@ export function compileImplementationContract({
91
93
  for (const recipe of orderedRecipes) if (recipe.architecture_family && recipe.architecture_family !== architecture_identity.architecture_family) fail(`Recipe ${recipe.id} 与架构族不匹配`);
92
94
  }
93
95
 
96
+ enforceTechnicalDesign({ technical_design, conditions, architecture_identity, slice_id }, { root });
97
+
94
98
  const capabilitySources = new Map();
95
99
  const orderedCapabilities = [];
96
100
  const addCapability = (capabilityId, source) => {
@@ -175,6 +179,7 @@ export function compileImplementationContract({
175
179
  readiness_blockers: architectureProfile.maturity === "supported" ? [] : ["backend-profile-not-supported"],
176
180
  skill_profiles: Object.fromEntries(orderedSkills.map((skill) => [skill, architecture_identity.architecture_profile]))
177
181
  } : {}),
182
+ ...(technical_design ? { technical_design, slice_id } : {}),
178
183
  recipe_ids: orderedRecipes.map((recipe) => recipe.id),
179
184
  conditions: [...conditionSet].sort(),
180
185
  required_capabilities: orderedCapabilities,
@@ -202,6 +207,8 @@ export function evaluateContractFreshness(contract, { registry, compilerContract
202
207
  if (contract?.schema_version !== 2) fail("Slice Implementation Contract schema v1 已停止支持;必须重新编译 v2 合同");
203
208
  const resolution = contract.resolution ?? contract;
204
209
  const reasons = [];
210
+ try { enforceTechnicalDesign({ ...resolution, slice_id: contract.slice_id ?? resolution.slice_id }, { root }); }
211
+ catch { reasons.push("technical-design-stale-or-unavailable"); }
205
212
  try { enforceFrontendDelivery(contract, { root }); }
206
213
  catch { reasons.push("frontend-delivery-stale-or-unavailable"); }
207
214
  if (resolution.registry_digest !== digestDocument(registry)) reasons.push("registry-digest-changed");
@@ -3,6 +3,7 @@ import path from 'node:path';
3
3
  import { spawnSync } from 'node:child_process';
4
4
  import { openBundle } from './strategic-handoff.mjs';
5
5
  import { read, safe, ensure, ROOT, digest, project } from './strategic-handoff-io.mjs';
6
+ import { designTargets } from './strategic-handoff-design-targets.mjs';
6
7
  import { parseContextContract } from './context-contract.mjs';
7
8
  const present=x=>typeof x==='string'&&x.trim();
8
9
  const list=x=>Array.isArray(x)&&x.length&&x.every(present);
@@ -14,6 +15,7 @@ const strategyBasis=value=>({
14
15
  export async function verifyConsumption(data,{root=process.cwd(),sliceRef,consumer='tactical'}={}) {
15
16
  project(root);
16
17
  ensure(['tactical','frontend'].includes(consumer),'未知战略消费者');
18
+ if (data.schema_version === 2 && consumer === 'tactical') ensure(['domain-driven','layered-mvc'].includes(data.architecture?.family), '未知技术设计架构');
17
19
  if (sliceRef) ensure(data.status === (consumer==='frontend'?'accepted':'approved'), consumer==='frontend'?'前端接收记录尚未 accepted':'切片只能消费 approved 战术合同');
18
20
  const binding=data.strategic_handoff;
19
21
  ensure(binding && present(binding.import_receipt_ref) && present(binding.context_reconciliation_ref),'缺少战略交接导入收据与目标对账引用');
@@ -42,9 +44,7 @@ export async function verifyConsumption(data,{root=process.cwd(),sliceRef,consum
42
44
  const rows=new Map();for(const row of binding.rows){ensure(!rows.has(row.source_id),`重复承接: ${row.source_id}`);rows.set(row.source_id,row);}
43
45
  const issues=[], blocked=new Set();let all=false;
44
46
  const mark=(id,reason,row)=>{issues.push({source_id:id,reason});if(row?.dependency_status!=='known'||!list(row.dependent_slice_refs))all=true;else row.dependent_slice_refs.forEach(x=>blocked.add(x));};
45
- const catalogs=['aggregate_catalog','entity_catalog','value_object_catalog','behavior_catalog','invariant_catalog','state_transition_catalog','domain_event_catalog','gateway_catalog'];
46
- const ids=new Set(catalogs.flatMap(k=>(data[k]||[]).flatMap(x=>Object.entries(x).filter(([k])=>k.endsWith('_id')).map(([,v])=>v))));
47
- const seams=new Map((data.test_seams||[]).map(x=>[x.seam_id,x]));
47
+ const { ids, seams } = designTargets(data);
48
48
  const cases=new Map((data.frontend_cases||[]).map(x=>[x.case_id,x]));
49
49
  for(const[id,source]of known){
50
50
  const row=rows.get(id);
@@ -77,7 +77,7 @@ export async function verifyConsumption(data,{root=process.cwd(),sliceRef,consum
77
77
  all=true;issues.push({source_id:'strategic-design-basis',reason:'upstream-design-stale'});
78
78
  }
79
79
  const blockedHere=all||(sliceRef?blocked.has(sliceRef):issues.length>0);
80
- return {result:blockedHere?'blocked':'verified',bundle_digest:current.manifest.bundle_digest,consumed_bundle_digest:receipt.bundle_digest,...(consumer==='frontend'?{frontend_acceptance_digest:digest(data)}:{tactical_digest:digest(data)}),scope:sliceRef||`whole-${consumer}-design`,coverage_complete:[...known.keys()].every(id=>rows.has(id)),block_all:all,blocked_slice_refs:[...blocked].sort(),issues};
80
+ return {result:blockedHere?'blocked':'verified',bundle_digest:current.manifest.bundle_digest,consumed_bundle_digest:receipt.bundle_digest,...(consumer==='frontend'?{frontend_acceptance_digest:digest(data)}:{tactical_digest:digest(data), ...(data.schema_version === 2 ? {technical_design_digest:digest(data)} : {})}),scope:sliceRef||`whole-${consumer}-design`,coverage_complete:[...known.keys()].every(id=>rows.has(id)),block_all:all,blocked_slice_refs:[...blocked].sort(),issues};
81
81
  });
82
82
  });
83
83
  }
@@ -0,0 +1,15 @@
1
+ import { ensure } from './strategic-handoff-io.mjs';
2
+
3
+ export function designTargets(data) {
4
+ const design = data.schema_version === 2 ? data.design : data;
5
+ const catalogs = data.schema_version === 2 && data.architecture?.family === 'layered-mvc'
6
+ ? ['module_catalog', 'use_case_catalog', 'rule_catalog', 'state_transition_catalog', 'persistence_mapping', 'integration_catalog']
7
+ : ['aggregate_catalog', 'entity_catalog', 'value_object_catalog', 'behavior_catalog', 'invariant_catalog', 'state_transition_catalog', 'domain_event_catalog', 'gateway_catalog'];
8
+ const primaryKeys = { module_catalog: 'module_id', use_case_catalog: 'use_case_id', rule_catalog: 'rule_id', state_transition_catalog: 'transition_id', persistence_mapping: 'mapping_id', integration_catalog: 'integration_id', aggregate_catalog: 'aggregate_id', entity_catalog: 'entity_id', value_object_catalog: 'value_object_id', behavior_catalog: 'behavior_id', invariant_catalog: 'invariant_id', domain_event_catalog: 'event_id', gateway_catalog: 'gateway_id' };
9
+ const ids = catalogs.flatMap(key => (design?.[key] || []).map(item => item[primaryKeys[key]]).filter(Boolean));
10
+ ensure(new Set(ids).size === ids.length, '设计对象 ID 重复');
11
+ const seams = design?.test_seams || [];
12
+ ensure(new Set(seams.map(item => item.seam_id)).size === seams.length, '测试 seam ID 重复');
13
+ return { ids: new Set(ids), seams: new Map(seams.map(item => [item.seam_id, item])) };
14
+ }
15
+
@@ -0,0 +1,23 @@
1
+ import path from 'node:path';
2
+ import { readFileSync } from 'node:fs';
3
+ import { spawnSync } from 'node:child_process';
4
+ import { ROOT, read, safe, ensure, hash } from './strategic-handoff-io.mjs';
5
+
6
+ // The compiler's synchronous boundary reruns the design verifier against current files.
7
+ export function enforceTechnicalDesign(state = {}, { root = ROOT } = {}) {
8
+ const binding = state.technical_design;
9
+ const affected = (state.conditions || []).some(value => ['backend-technical-design-impact','tactical-domain','tactical-domain-impact','aggregate-impact','state-machine-impact','invariant-impact','consistency-impact','domain-event-impact','gateway-boundary-impact','persistence-mapping-impact'].includes(value));
10
+ if (!binding && !affected) return;
11
+ ensure(binding?.ref && binding?.digest && binding?.version, '缺少已批准技术设计绑定');
12
+ ensure(state.slice_id, '技术设计消费必须绑定切片 ID');
13
+ const file = safe(root, binding.ref);
14
+ ensure(hash(readFileSync(file)) === binding.digest, '技术设计绑定摘要漂移');
15
+ const data = read(file);
16
+ ensure(data.status === 'approved' && data.version === binding.version, '技术设计必须为批准且绑定版本');
17
+ const family = data.schema_version === 1 && binding.legacy_ddd === true ? 'domain-driven' : data.architecture?.family;
18
+ ensure(family && family === state.architecture_identity?.architecture_family, '技术设计与实现架构不匹配');
19
+ const args = [path.join(ROOT, '.agents/skills/yss-technical-design/scripts/validate-technical-design.mjs'), file, '--root', root, '--slice', state.slice_id];
20
+ if (binding.legacy_ddd === true) args.push('--legacy-ddd');
21
+ const verified = spawnSync(process.execPath, args, { cwd: root, encoding: 'utf8', timeout: 60000, maxBuffer: 2 * 1024 * 1024 });
22
+ ensure(verified.status === 0, `技术设计不可消费: ${verified.error?.message || verified.stderr}`);
23
+ }
@@ -7,9 +7,10 @@ const root=path.resolve(import.meta.dirname,'..');
7
7
  const check=process.argv.includes('--check');
8
8
  const targets=['submodules/yss-harness-design-agent','submodules/yss-harness-dev-agent','submodules/yss-harness-backend-agent','submodules/yss-harness-frontend-agent'];
9
9
  const shared=['scripts/strategic-handoff','scripts/verify-strategic-handoff-consumption','scripts/verify-strategic-handoff-package-scenarios','scripts/verify-strategic-context-import','scripts/verify-strategic-context-import-scenarios','scripts/lib/context-contract.mjs','docs/process/strategic-handoff-package.md','docs/process/schemas/strategic-design-handoff.schema.json',...readdirSync(path.join(root,'scripts/lib')).filter(x=>x.startsWith('strategic-handoff-')||x==='strategic-handoff.mjs').map(x=>`scripts/lib/${x}`),...readdirSync(path.join(root,'docs/process/schemas')).filter(x=>x.startsWith('strategic-handoff-')).map(x=>`docs/process/schemas/${x}`),...readdirSync(path.join(root,'scripts/fixtures/strategic-handoff')).map(x=>`scripts/fixtures/strategic-handoff/${x}`)];
10
- shared.push('scripts/instantiate-harness','scripts/lib/harness-execution-scope.mjs','scripts/backend-delivery','scripts/verify-frontend-delivery','scripts/lib/backend-delivery.mjs','scripts/lib/frontend-delivery.mjs','scripts/lib/frontend-delivery-boundary.mjs','docs/process/frontend-backend-delivery.md','docs/process/schemas/backend-delivery.schema.json','docs/process/schemas/backend-delivery-verification.schema.json','docs/process/schemas/frontend-delivery-acceptance.schema.json');
10
+ shared.push('scripts/instantiate-harness','scripts/backend-delivery','scripts/verify-frontend-delivery','scripts/lib/backend-delivery.mjs','scripts/lib/frontend-delivery.mjs','scripts/lib/frontend-delivery-boundary.mjs','docs/process/frontend-backend-delivery.md','docs/process/schemas/backend-delivery.schema.json','docs/process/schemas/backend-delivery-verification.schema.json','docs/process/schemas/frontend-delivery-acceptance.schema.json');
11
11
  let differences=[];
12
- function sync(source,dest){const bytes=readFileSync(source);if(!existsSync(dest)||!bytes.equals(readFileSync(dest))){differences.push(path.relative(root,dest));if(!check){mkdirSync(path.dirname(dest),{recursive:true});writeFileSync(dest,bytes);}}if(!check&&path.basename(path.dirname(dest))==='scripts'&&!path.extname(dest))chmodSync(dest,0o755);}
12
+ // 专职执行范围由各模板持有;后端只消费 wire 校验器,不恢复原型构建技能。
13
+ function sync(source,dest){let bytes=readFileSync(source);if(dest.includes('/yss-harness-backend-agent/')){let content=bytes.toString();if(dest.endsWith('/scripts/lib/strategic-handoff.mjs'))content=content.replace('../../.agents/skills/yss-prototype-stage/scripts/visual-baseline-contract.mjs','./visual-baseline-contract.mjs');if(dest.endsWith('/scripts/fixtures/strategic-handoff/fixture.mjs'))content=content.replace('../../../.agents/skills/yss-prototype-stage/scripts/visual-baseline-contract.mjs','../../lib/visual-baseline-contract.mjs');bytes=Buffer.from(content);}if(!existsSync(dest)||!bytes.equals(readFileSync(dest))){differences.push(path.relative(root,dest));if(!check){mkdirSync(path.dirname(dest),{recursive:true});writeFileSync(dest,bytes);}}if(!check&&path.basename(path.dirname(dest))==='scripts'&&!path.extname(dest))chmodSync(dest,0o755);}
13
14
  for(const kind of ['domain-strategy','stage-decision-package'])sync(path.join(root,`.agents/skills/yss-stage-decision/references/${kind}.schema.json`),path.join(root,`docs/process/schemas/strategic-handoff-${kind}.schema.json`));
14
15
  for(const target of targets){
15
16
  if(!existsSync(path.join(root,target,'.git')))continue;
@@ -9,7 +9,7 @@ import { fixture, context } from './fixtures/strategic-handoff/fixture.mjs';
9
9
  import { exportBundle, openBundle, importBundle } from './lib/strategic-handoff.mjs';
10
10
  import { read, json, hash, digest } from './lib/strategic-handoff-io.mjs';
11
11
  import { parseContextContract } from './lib/context-contract.mjs';
12
- const setup=async t=>{const base=mkdtempSync(path.join(tmpdir(),'handoff-test-'));t.after(()=>rmSync(base,{recursive:true,force:true}));const source=path.join(base,'source');mkdirSync(source);return{base,source,...await fixture(source)};};
12
+ const setup=async t=>{const base=mkdtempSync(path.join(tmpdir(),'handoff-test-'));t.after(()=>rmSync(base,{recursive:true,force:true}));const source=path.join(base,'source');mkdirSync(source);return{base,source,...await fixture(source,{technicalDesign:true})};};
13
13
  function advanceStrategy(f,version='v2') {
14
14
  f.handoff.handoff_version=version;
15
15
  f.strategy.domain_version=version;
@@ -79,6 +79,12 @@ test('受控延期只阻断依赖切片;未知依赖扩大阻断;目标未
79
79
  writeFileSync(path.join(target,'reconciliation.yaml'),json(record));
80
80
  for(const row of tactical.strategic_handoff.rows)Object.assign(row,{disposition:'implemented',tactical_refs:['behavior.submit'],test_seam_refs:['test-seam.submit'],scenario_tests:[{outcome:'success',seam_ref:'test-seam.submit'},{outcome:'failure',seam_ref:'test-seam.submit'}],evidence_refs:['CONTEXT.md'],dependency_status:'known',dependent_slice_refs:['slice.submit']});
81
81
  assert.equal((await verifyConsumption(tactical,{root:target})).result,'verified');
82
+ const mvc={schema_version:2,status:'approved',architecture:{family:'layered-mvc'},strategic_handoff:structuredClone(tactical.strategic_handoff),design:{use_case_catalog:[{use_case_id:'use-case.submit'}],test_seams:[{seam_id:'test-seam.submit',subject_ref:'use-case.submit'}]}};
83
+ for(const row of mvc.strategic_handoff.rows)row.tactical_refs=['use-case.submit'];
84
+ assert.equal((await verifyConsumption(mvc,{root:target})).result,'verified');
85
+ mvc.strategic_handoff.rows[0].tactical_refs=['aggregate.fake'];
86
+ await assert.rejects(()=>verifyConsumption(mvc,{root:target}),/落点悬空/);
87
+
82
88
  const row=tactical.strategic_handoff.rows[0];Object.assign(row,{disposition:'deferred',reason:'分批实现',risk:'不能提交',owner:'需求负责人',followup_ticket_ref:'ticket.followup',verification_plan:'提交测试',target_version:'v2'});
83
89
  assert.equal((await verifyConsumption(tactical,{root:target,sliceRef:'slice.submit'})).result,'blocked');
84
90
  assert.equal((await verifyConsumption(tactical,{root:target,sliceRef:'slice.other'})).result,'verified');
@@ -21,7 +21,7 @@
21
21
  "revision": "c4d958f18cc947cb91cbe1bd48783fa4601cc18f"
22
22
  },
23
23
  "iloveZzz/yss-harness-design-agent": {
24
- "revision": "5c1c98225bb181c7c1add8972c1e44b866205f76"
24
+ "revision": "8a67e0f5a56aa5085d18c2b42bb540c8f36c2fab"
25
25
  }
26
26
  },
27
27
  "skills": {
@@ -559,7 +559,7 @@
559
559
  "sourceType": "git-submodule",
560
560
  "skillPath": ".agents/skills/prototype-review/SKILL.md",
561
561
  "effectiveHash": "51021f119697dbff644d70c3d6ba3314147c47f412c6f56e4b5540ea3bf554a1",
562
- "sourceRevision": "5c1c98225bb181c7c1add8972c1e44b866205f76",
562
+ "sourceRevision": "8a67e0f5a56aa5085d18c2b42bb540c8f36c2fab",
563
563
  "upstreamHash": "2e77b3093a758bb692fb3bda453c5c020d0523f875975e17e2731365f67432e1",
564
564
  "adaptationRef": "docs/agents/strategic-design-skills-integration.md",
565
565
  "targets": [
@@ -824,7 +824,7 @@
824
824
  "sourceType": "git-submodule",
825
825
  "skillPath": ".agents/skills/yss-antd-design/SKILL.md",
826
826
  "effectiveHash": "917099caa9b76ca3cfd1d0f81f61b28111c1c54ed93e92891f81012dcd0662e2",
827
- "sourceRevision": "5c1c98225bb181c7c1add8972c1e44b866205f76",
827
+ "sourceRevision": "8a67e0f5a56aa5085d18c2b42bb540c8f36c2fab",
828
828
  "upstreamHash": "08ce99d45586d5ea19e25fdd9e9a6ede16e66f18992b70b87e0cd23f92343b16",
829
829
  "adaptationRef": "docs/agents/strategic-design-skills-integration.md",
830
830
  "targets": [
@@ -842,7 +842,7 @@
842
842
  "sourceType": "git-submodule",
843
843
  "skillPath": ".agents/skills/yss-antdv-next-design/SKILL.md",
844
844
  "effectiveHash": "8c55e3a815ace34fbf591e931a58970b3d58cb657e00432ca6c72938d307563b",
845
- "sourceRevision": "5c1c98225bb181c7c1add8972c1e44b866205f76",
845
+ "sourceRevision": "8a67e0f5a56aa5085d18c2b42bb540c8f36c2fab",
846
846
  "upstreamHash": "2942ed52dd58a38e51f09eb11254809334aeaed08f21cd081f09f35e6647a68c",
847
847
  "adaptationRef": "docs/agents/strategic-design-skills-integration.md",
848
848
  "targets": [
@@ -953,7 +953,7 @@
953
953
  "sourceType": "git-submodule",
954
954
  "skillPath": ".agents/skills/yss-design-system/SKILL.md",
955
955
  "effectiveHash": "e69597b8b6a5ce4de5bd40f67630443b8176202f6b028b2ce146a2a1d062816f",
956
- "sourceRevision": "5c1c98225bb181c7c1add8972c1e44b866205f76",
956
+ "sourceRevision": "8a67e0f5a56aa5085d18c2b42bb540c8f36c2fab",
957
957
  "upstreamHash": "90aaf06b2514353152464a4d032076fa9d5ef56272d8ad526f5544f3c22a2b00",
958
958
  "adaptationRef": "docs/agents/strategic-design-skills-integration.md",
959
959
  "targets": [
@@ -985,7 +985,7 @@
985
985
  "source": "project",
986
986
  "sourceType": "local",
987
987
  "skillPath": ".agents/skills/yss-domain/SKILL.md",
988
- "effectiveHash": "ed5fbd0ff31f0677f7901a9ea69c4939c22a170f1fef3947b4f7409b11fa5161",
988
+ "effectiveHash": "e682e141ac6cdb9d97296f270e314a6c7d00ebf574f8a9aaba557dcd8f6553b7",
989
989
  "targets": [
990
990
  ".agents/skills",
991
991
  ".claude/skills",
@@ -1108,7 +1108,7 @@
1108
1108
  "source": "project",
1109
1109
  "sourceType": "local",
1110
1110
  "skillPath": ".agents/skills/yss-implementation-contract-compiler/SKILL.md",
1111
- "effectiveHash": "abc754700c6ac1c20245923400c0e5c65e5dcf419c7d6674ec9a3fe6a997868b",
1111
+ "effectiveHash": "4f9ec75e4484bc2794ea057037890d2bcb96512c8c64bef9d9fdae7c66abe46d",
1112
1112
  "targets": [
1113
1113
  ".agents/skills",
1114
1114
  ".claude/skills",
@@ -1149,6 +1149,21 @@
1149
1149
  ".trae/skills"
1150
1150
  ]
1151
1151
  },
1152
+ "yss-mvc-design": {
1153
+ "source": "project",
1154
+ "sourceType": "local",
1155
+ "skillPath": ".agents/skills/yss-mvc-design/SKILL.md",
1156
+ "effectiveHash": "b3deae27723c3a0e9e32c8f5b40fb1295d082a31ccea3f4d9a190b47a704efd3",
1157
+ "targets": [
1158
+ ".agents/skills",
1159
+ ".claude/skills",
1160
+ ".codex/skills",
1161
+ ".cursor/skills",
1162
+ ".pi/skills",
1163
+ ".qoder/skills",
1164
+ ".trae/skills"
1165
+ ]
1166
+ },
1152
1167
  "yss-mvc-scaffold-generator": {
1153
1168
  "source": "project",
1154
1169
  "sourceType": "local",
@@ -1213,7 +1228,7 @@
1213
1228
  "source": "project",
1214
1229
  "sourceType": "local",
1215
1230
  "skillPath": ".agents/skills/yss-product-lifecycle/SKILL.md",
1216
- "effectiveHash": "3134144d171d3ac7a52ba37683d6a2972cf7df1f83492a5d58083567f12764af",
1231
+ "effectiveHash": "c262bd69e978eee24b49526043b2439c30ce006f4fbbcb56e881c903ba6f3d51",
1217
1232
  "targets": [
1218
1233
  ".agents/skills",
1219
1234
  ".claude/skills",
@@ -1229,7 +1244,7 @@
1229
1244
  "sourceType": "git-submodule",
1230
1245
  "skillPath": ".agents/skills/yss-prototype-stage/SKILL.md",
1231
1246
  "effectiveHash": "0ecf3125a73d15e4c9b6b665f92535180df82ccb2255fa863ec59f3ff5d460aa",
1232
- "sourceRevision": "5c1c98225bb181c7c1add8972c1e44b866205f76",
1247
+ "sourceRevision": "8a67e0f5a56aa5085d18c2b42bb540c8f36c2fab",
1233
1248
  "upstreamHash": "e8f2f3a507da6bf7be0582e4a4dd9659381da8e291755070698a1f51a4e33808",
1234
1249
  "adaptationRef": "docs/agents/strategic-design-skills-integration.md",
1235
1250
  "targets": [
@@ -1325,7 +1340,7 @@
1325
1340
  "sourceType": "git-submodule",
1326
1341
  "skillPath": ".agents/skills/yss-stage-decision/SKILL.md",
1327
1342
  "effectiveHash": "63e222ec2bc572c8d66fc52143ba3862650d243f57e1e9c71214b533eba37c23",
1328
- "sourceRevision": "5c1c98225bb181c7c1add8972c1e44b866205f76",
1343
+ "sourceRevision": "8a67e0f5a56aa5085d18c2b42bb540c8f36c2fab",
1329
1344
  "upstreamHash": "1eadf230f0e17bf6d209c1df1249acef3520ab29c26a80c476a2a557a224c10a",
1330
1345
  "adaptationRef": "docs/agents/strategic-design-skills-integration.md",
1331
1346
  "targets": [
@@ -1342,7 +1357,22 @@
1342
1357
  "source": "project",
1343
1358
  "sourceType": "local",
1344
1359
  "skillPath": ".agents/skills/yss-tactical-design/SKILL.md",
1345
- "effectiveHash": "336eda3a058ae565d31f90a46cb26d6fc921d2c8a7ec0ccc2f4bcb2c780bd128",
1360
+ "effectiveHash": "2ffb26709fd68184e0fe8f724318dc748fc479dcf52af236fe63f49a17540bfa",
1361
+ "targets": [
1362
+ ".agents/skills",
1363
+ ".claude/skills",
1364
+ ".codex/skills",
1365
+ ".cursor/skills",
1366
+ ".pi/skills",
1367
+ ".qoder/skills",
1368
+ ".trae/skills"
1369
+ ]
1370
+ },
1371
+ "yss-technical-design": {
1372
+ "source": "project",
1373
+ "sourceType": "local",
1374
+ "skillPath": ".agents/skills/yss-technical-design/SKILL.md",
1375
+ "effectiveHash": "a4226303571483b115ef7134f9615440ce8b7d39f209be39e1bc16152e080a9f",
1346
1376
  "targets": [
1347
1377
  ".agents/skills",
1348
1378
  ".claude/skills",
@@ -3,8 +3,8 @@
3
3
  "templateName": "yss-spec-project-template",
4
4
  "templateSource": "github:iloveZzz/yss-spec-project-template",
5
5
  "templateRepository": "https://github.com/iloveZzz/yss-spec-project-template.git",
6
- "requestedRef": "4f01bef25dfac465e9ff54c71681cf4d0f74669b",
7
- "templateCommit": "4f01bef25dfac465e9ff54c71681cf4d0f74669b",
6
+ "requestedRef": "c3d09280872dcfc905c86ac6f40e4e32e610e220",
7
+ "templateCommit": "c3d09280872dcfc905c86ac6f40e4e32e610e220",
8
8
  "manifestHash": "f7520dfdfa388b19ea47cb893c2daab8936019783aa84589f13921e459702280",
9
9
  "encodedPaths": {
10
10
  ".codex/skills/data-analytics/.gitignore": ".codex/skills/data-analytics/__yss_dotfile__.gitignore",
@@ -12,6 +12,6 @@
12
12
  ".codex/skills/product-design/templates/prototype/.npmrc": ".codex/skills/product-design/templates/prototype/__yss_dotfile__.npmrc",
13
13
  ".gitignore": "__yss_dotfile__.gitignore"
14
14
  },
15
- "snapshotHash": "3c5bb9dea7cc8f5bf8559f49ee7b31fea830bff51839dfc49e233e7afe9f948d",
16
- "generatedAt": "2026-09-07T03:27:16.902Z"
15
+ "snapshotHash": "80175edec720607595f99f1bab5d0a8480b1644537be8ae71623de01acb0a787",
16
+ "generatedAt": "2026-09-08T11:40:21.647Z"
17
17
  }