create-yss-spec 3.2.0 → 3.3.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 (317) hide show
  1. package/README.md +2 -2
  2. package/package.json +1 -1
  3. package/template/.agents/skills/code-review/SKILL.md +4 -0
  4. package/template/.agents/skills/code-review/agents/openai.yaml +1 -1
  5. package/template/.agents/skills/code-review/references/yss-review-standards.md +9 -2
  6. package/template/.agents/skills/yss-ddd-scaffold-generator/SKILL.md +1 -1
  7. package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +7 -3
  8. package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
  9. package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +9 -0
  10. package/template/.agents/skills/yss-frontend-scaffold-generator/SKILL.md +10 -7
  11. package/template/.agents/skills/yss-frontend-scaffold-generator/scripts/generate_and_verify_scaffold.mjs +10 -0
  12. package/template/.agents/skills/yss-frontend-scaffold-generator/scripts/generate_scaffold.mjs +107 -0
  13. package/template/.agents/skills/yss-frontend-scaffold-generator/scripts/run_scaffold_verification.mjs +41 -0
  14. package/template/.agents/skills/yss-frontend-scaffold-generator/scripts/scaffold-generator.test.mjs +37 -0
  15. package/template/.agents/skills/yss-implementation-contract-compiler/SKILL.md +1 -1
  16. package/template/.agents/skills/yss-implementation-contract-compiler/references/boundaries.md +4 -0
  17. package/template/.agents/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +25 -0
  18. package/template/.agents/skills/yss-layered-mvc-scaffold-generator/SKILL.md +2 -2
  19. package/template/.agents/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +8 -5
  20. package/template/.agents/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +17 -2
  21. package/template/.agents/skills/yss-mybatis/SKILL.md +34 -58
  22. package/template/.agents/skills/yss-mybatis/agents/openai.yaml +2 -2
  23. package/template/.agents/skills/yss-mybatis/references/source-index.md +88 -68
  24. package/template/.agents/skills/yss-product-lifecycle/SKILL.md +48 -43
  25. package/template/.agents/skills/yss-product-lifecycle/references/artifact-dependencies.md +4 -2
  26. package/template/.agents/skills/yss-product-lifecycle/references/orchestration-contract.yaml +67 -10
  27. package/template/.agents/skills/yss-product-lifecycle/references/orchestration.md +5 -1
  28. package/template/.agents/skills/yss-product-lifecycle/references/state-model.md +5 -2
  29. package/template/.agents/skills/yss-repository/SKILL.md +28 -70
  30. package/template/.agents/skills/yss-repository/agents/openai.yaml +2 -2
  31. package/template/.agents/skills/yss-repository/references/profiles/layered-mvc-service.md +19 -1
  32. package/template/.agents/skills/yss-repository/references/profiles/mvc-data-analysis-v1.md +19 -1
  33. package/template/.agents/skills/yss-repository/references/profiles/target-domain-model.md +21 -1
  34. package/template/.agents/skills/yss-repository/tests/profile-routing.test.mjs +59 -0
  35. package/template/.agents/skills/yss-skill-source-index-refresh/SKILL.md +8 -5
  36. package/template/.agents/skills/yss-skill-source-index-refresh/references/source-location.md +2 -1
  37. package/template/.agents/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +388 -18
  38. package/template/.agents/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.test.mjs +79 -1
  39. package/template/.claude/skills/code-review/SKILL.md +4 -0
  40. package/template/.claude/skills/code-review/agents/openai.yaml +1 -1
  41. package/template/.claude/skills/code-review/references/yss-review-standards.md +9 -2
  42. package/template/.claude/skills/yss-ddd-scaffold-generator/SKILL.md +1 -1
  43. package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +7 -3
  44. package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
  45. package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +9 -0
  46. package/template/.claude/skills/yss-frontend-scaffold-generator/SKILL.md +10 -7
  47. package/template/.claude/skills/yss-frontend-scaffold-generator/scripts/generate_and_verify_scaffold.mjs +10 -0
  48. package/template/.claude/skills/yss-frontend-scaffold-generator/scripts/generate_scaffold.mjs +107 -0
  49. package/template/.claude/skills/yss-frontend-scaffold-generator/scripts/run_scaffold_verification.mjs +41 -0
  50. package/template/.claude/skills/yss-frontend-scaffold-generator/scripts/scaffold-generator.test.mjs +37 -0
  51. package/template/.claude/skills/yss-implementation-contract-compiler/SKILL.md +1 -1
  52. package/template/.claude/skills/yss-implementation-contract-compiler/references/boundaries.md +4 -0
  53. package/template/.claude/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +25 -0
  54. package/template/.claude/skills/yss-layered-mvc-scaffold-generator/SKILL.md +2 -2
  55. package/template/.claude/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +8 -5
  56. package/template/.claude/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +17 -2
  57. package/template/.claude/skills/yss-mybatis/SKILL.md +34 -58
  58. package/template/.claude/skills/yss-mybatis/agents/openai.yaml +2 -2
  59. package/template/.claude/skills/yss-mybatis/references/source-index.md +88 -68
  60. package/template/.claude/skills/yss-product-lifecycle/SKILL.md +48 -43
  61. package/template/.claude/skills/yss-product-lifecycle/references/artifact-dependencies.md +4 -2
  62. package/template/.claude/skills/yss-product-lifecycle/references/orchestration-contract.yaml +67 -10
  63. package/template/.claude/skills/yss-product-lifecycle/references/orchestration.md +5 -1
  64. package/template/.claude/skills/yss-product-lifecycle/references/state-model.md +5 -2
  65. package/template/.claude/skills/yss-repository/SKILL.md +28 -70
  66. package/template/.claude/skills/yss-repository/agents/openai.yaml +2 -2
  67. package/template/.claude/skills/yss-repository/references/profiles/layered-mvc-service.md +19 -1
  68. package/template/.claude/skills/yss-repository/references/profiles/mvc-data-analysis-v1.md +19 -1
  69. package/template/.claude/skills/yss-repository/references/profiles/target-domain-model.md +21 -1
  70. package/template/.claude/skills/yss-repository/tests/profile-routing.test.mjs +59 -0
  71. package/template/.claude/skills/yss-skill-source-index-refresh/SKILL.md +8 -5
  72. package/template/.claude/skills/yss-skill-source-index-refresh/references/source-location.md +2 -1
  73. package/template/.claude/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +388 -18
  74. package/template/.claude/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.test.mjs +79 -1
  75. package/template/.codex/skills/code-review/SKILL.md +4 -0
  76. package/template/.codex/skills/code-review/agents/openai.yaml +1 -1
  77. package/template/.codex/skills/code-review/references/yss-review-standards.md +9 -2
  78. package/template/.codex/skills/yss-ddd-scaffold-generator/SKILL.md +1 -1
  79. package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +7 -3
  80. package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
  81. package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +9 -0
  82. package/template/.codex/skills/yss-frontend-scaffold-generator/SKILL.md +10 -7
  83. package/template/.codex/skills/yss-frontend-scaffold-generator/scripts/generate_and_verify_scaffold.mjs +10 -0
  84. package/template/.codex/skills/yss-frontend-scaffold-generator/scripts/generate_scaffold.mjs +107 -0
  85. package/template/.codex/skills/yss-frontend-scaffold-generator/scripts/run_scaffold_verification.mjs +41 -0
  86. package/template/.codex/skills/yss-frontend-scaffold-generator/scripts/scaffold-generator.test.mjs +37 -0
  87. package/template/.codex/skills/yss-implementation-contract-compiler/SKILL.md +1 -1
  88. package/template/.codex/skills/yss-implementation-contract-compiler/references/boundaries.md +4 -0
  89. package/template/.codex/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +25 -0
  90. package/template/.codex/skills/yss-layered-mvc-scaffold-generator/SKILL.md +2 -2
  91. package/template/.codex/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +8 -5
  92. package/template/.codex/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +17 -2
  93. package/template/.codex/skills/yss-mybatis/SKILL.md +34 -58
  94. package/template/.codex/skills/yss-mybatis/agents/openai.yaml +2 -2
  95. package/template/.codex/skills/yss-mybatis/references/source-index.md +88 -68
  96. package/template/.codex/skills/yss-product-lifecycle/SKILL.md +48 -43
  97. package/template/.codex/skills/yss-product-lifecycle/references/artifact-dependencies.md +4 -2
  98. package/template/.codex/skills/yss-product-lifecycle/references/orchestration-contract.yaml +67 -10
  99. package/template/.codex/skills/yss-product-lifecycle/references/orchestration.md +5 -1
  100. package/template/.codex/skills/yss-product-lifecycle/references/state-model.md +5 -2
  101. package/template/.codex/skills/yss-repository/SKILL.md +28 -70
  102. package/template/.codex/skills/yss-repository/agents/openai.yaml +2 -2
  103. package/template/.codex/skills/yss-repository/references/profiles/layered-mvc-service.md +19 -1
  104. package/template/.codex/skills/yss-repository/references/profiles/mvc-data-analysis-v1.md +19 -1
  105. package/template/.codex/skills/yss-repository/references/profiles/target-domain-model.md +21 -1
  106. package/template/.codex/skills/yss-repository/tests/profile-routing.test.mjs +59 -0
  107. package/template/.codex/skills/yss-skill-source-index-refresh/SKILL.md +8 -5
  108. package/template/.codex/skills/yss-skill-source-index-refresh/references/source-location.md +2 -1
  109. package/template/.codex/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +388 -18
  110. package/template/.codex/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.test.mjs +79 -1
  111. package/template/.cursor/skills/code-review/SKILL.md +4 -0
  112. package/template/.cursor/skills/code-review/agents/openai.yaml +1 -1
  113. package/template/.cursor/skills/code-review/references/yss-review-standards.md +9 -2
  114. package/template/.cursor/skills/yss-ddd-scaffold-generator/SKILL.md +1 -1
  115. package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +7 -3
  116. package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
  117. package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +9 -0
  118. package/template/.cursor/skills/yss-frontend-scaffold-generator/SKILL.md +10 -7
  119. package/template/.cursor/skills/yss-frontend-scaffold-generator/scripts/generate_and_verify_scaffold.mjs +10 -0
  120. package/template/.cursor/skills/yss-frontend-scaffold-generator/scripts/generate_scaffold.mjs +107 -0
  121. package/template/.cursor/skills/yss-frontend-scaffold-generator/scripts/run_scaffold_verification.mjs +41 -0
  122. package/template/.cursor/skills/yss-frontend-scaffold-generator/scripts/scaffold-generator.test.mjs +37 -0
  123. package/template/.cursor/skills/yss-implementation-contract-compiler/SKILL.md +1 -1
  124. package/template/.cursor/skills/yss-implementation-contract-compiler/references/boundaries.md +4 -0
  125. package/template/.cursor/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +25 -0
  126. package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/SKILL.md +2 -2
  127. package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +8 -5
  128. package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +17 -2
  129. package/template/.cursor/skills/yss-mybatis/SKILL.md +34 -58
  130. package/template/.cursor/skills/yss-mybatis/agents/openai.yaml +2 -2
  131. package/template/.cursor/skills/yss-mybatis/references/source-index.md +88 -68
  132. package/template/.cursor/skills/yss-product-lifecycle/SKILL.md +48 -43
  133. package/template/.cursor/skills/yss-product-lifecycle/references/artifact-dependencies.md +4 -2
  134. package/template/.cursor/skills/yss-product-lifecycle/references/orchestration-contract.yaml +67 -10
  135. package/template/.cursor/skills/yss-product-lifecycle/references/orchestration.md +5 -1
  136. package/template/.cursor/skills/yss-product-lifecycle/references/state-model.md +5 -2
  137. package/template/.cursor/skills/yss-repository/SKILL.md +28 -70
  138. package/template/.cursor/skills/yss-repository/agents/openai.yaml +2 -2
  139. package/template/.cursor/skills/yss-repository/references/profiles/layered-mvc-service.md +19 -1
  140. package/template/.cursor/skills/yss-repository/references/profiles/mvc-data-analysis-v1.md +19 -1
  141. package/template/.cursor/skills/yss-repository/references/profiles/target-domain-model.md +21 -1
  142. package/template/.cursor/skills/yss-repository/tests/profile-routing.test.mjs +59 -0
  143. package/template/.cursor/skills/yss-skill-source-index-refresh/SKILL.md +8 -5
  144. package/template/.cursor/skills/yss-skill-source-index-refresh/references/source-location.md +2 -1
  145. package/template/.cursor/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +388 -18
  146. package/template/.cursor/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.test.mjs +79 -1
  147. package/template/.pi/skills/code-review/SKILL.md +4 -0
  148. package/template/.pi/skills/code-review/agents/openai.yaml +1 -1
  149. package/template/.pi/skills/code-review/references/yss-review-standards.md +9 -2
  150. package/template/.pi/skills/yss-ddd-scaffold-generator/SKILL.md +1 -1
  151. package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +7 -3
  152. package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
  153. package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +9 -0
  154. package/template/.pi/skills/yss-frontend-scaffold-generator/SKILL.md +10 -7
  155. package/template/.pi/skills/yss-frontend-scaffold-generator/scripts/generate_and_verify_scaffold.mjs +10 -0
  156. package/template/.pi/skills/yss-frontend-scaffold-generator/scripts/generate_scaffold.mjs +107 -0
  157. package/template/.pi/skills/yss-frontend-scaffold-generator/scripts/run_scaffold_verification.mjs +41 -0
  158. package/template/.pi/skills/yss-frontend-scaffold-generator/scripts/scaffold-generator.test.mjs +37 -0
  159. package/template/.pi/skills/yss-implementation-contract-compiler/SKILL.md +1 -1
  160. package/template/.pi/skills/yss-implementation-contract-compiler/references/boundaries.md +4 -0
  161. package/template/.pi/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +25 -0
  162. package/template/.pi/skills/yss-layered-mvc-scaffold-generator/SKILL.md +2 -2
  163. package/template/.pi/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +8 -5
  164. package/template/.pi/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +17 -2
  165. package/template/.pi/skills/yss-mybatis/SKILL.md +34 -58
  166. package/template/.pi/skills/yss-mybatis/agents/openai.yaml +2 -2
  167. package/template/.pi/skills/yss-mybatis/references/source-index.md +88 -68
  168. package/template/.pi/skills/yss-product-lifecycle/SKILL.md +48 -43
  169. package/template/.pi/skills/yss-product-lifecycle/references/artifact-dependencies.md +4 -2
  170. package/template/.pi/skills/yss-product-lifecycle/references/orchestration-contract.yaml +67 -10
  171. package/template/.pi/skills/yss-product-lifecycle/references/orchestration.md +5 -1
  172. package/template/.pi/skills/yss-product-lifecycle/references/state-model.md +5 -2
  173. package/template/.pi/skills/yss-repository/SKILL.md +28 -70
  174. package/template/.pi/skills/yss-repository/agents/openai.yaml +2 -2
  175. package/template/.pi/skills/yss-repository/references/profiles/layered-mvc-service.md +19 -1
  176. package/template/.pi/skills/yss-repository/references/profiles/mvc-data-analysis-v1.md +19 -1
  177. package/template/.pi/skills/yss-repository/references/profiles/target-domain-model.md +21 -1
  178. package/template/.pi/skills/yss-repository/tests/profile-routing.test.mjs +59 -0
  179. package/template/.pi/skills/yss-skill-source-index-refresh/SKILL.md +8 -5
  180. package/template/.pi/skills/yss-skill-source-index-refresh/references/source-location.md +2 -1
  181. package/template/.pi/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +388 -18
  182. package/template/.pi/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.test.mjs +79 -1
  183. package/template/.qoder/skills/code-review/SKILL.md +4 -0
  184. package/template/.qoder/skills/code-review/agents/openai.yaml +1 -1
  185. package/template/.qoder/skills/code-review/references/yss-review-standards.md +9 -2
  186. package/template/.qoder/skills/yss-ddd-scaffold-generator/SKILL.md +1 -1
  187. package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +7 -3
  188. package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
  189. package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +9 -0
  190. package/template/.qoder/skills/yss-frontend-scaffold-generator/SKILL.md +10 -7
  191. package/template/.qoder/skills/yss-frontend-scaffold-generator/scripts/generate_and_verify_scaffold.mjs +10 -0
  192. package/template/.qoder/skills/yss-frontend-scaffold-generator/scripts/generate_scaffold.mjs +107 -0
  193. package/template/.qoder/skills/yss-frontend-scaffold-generator/scripts/run_scaffold_verification.mjs +41 -0
  194. package/template/.qoder/skills/yss-frontend-scaffold-generator/scripts/scaffold-generator.test.mjs +37 -0
  195. package/template/.qoder/skills/yss-implementation-contract-compiler/SKILL.md +1 -1
  196. package/template/.qoder/skills/yss-implementation-contract-compiler/references/boundaries.md +4 -0
  197. package/template/.qoder/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +25 -0
  198. package/template/.qoder/skills/yss-layered-mvc-scaffold-generator/SKILL.md +2 -2
  199. package/template/.qoder/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +8 -5
  200. package/template/.qoder/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +17 -2
  201. package/template/.qoder/skills/yss-mybatis/SKILL.md +34 -58
  202. package/template/.qoder/skills/yss-mybatis/agents/openai.yaml +2 -2
  203. package/template/.qoder/skills/yss-mybatis/references/source-index.md +88 -68
  204. package/template/.qoder/skills/yss-product-lifecycle/SKILL.md +48 -43
  205. package/template/.qoder/skills/yss-product-lifecycle/references/artifact-dependencies.md +4 -2
  206. package/template/.qoder/skills/yss-product-lifecycle/references/orchestration-contract.yaml +67 -10
  207. package/template/.qoder/skills/yss-product-lifecycle/references/orchestration.md +5 -1
  208. package/template/.qoder/skills/yss-product-lifecycle/references/state-model.md +5 -2
  209. package/template/.qoder/skills/yss-repository/SKILL.md +28 -70
  210. package/template/.qoder/skills/yss-repository/agents/openai.yaml +2 -2
  211. package/template/.qoder/skills/yss-repository/references/profiles/layered-mvc-service.md +19 -1
  212. package/template/.qoder/skills/yss-repository/references/profiles/mvc-data-analysis-v1.md +19 -1
  213. package/template/.qoder/skills/yss-repository/references/profiles/target-domain-model.md +21 -1
  214. package/template/.qoder/skills/yss-repository/tests/profile-routing.test.mjs +59 -0
  215. package/template/.qoder/skills/yss-skill-source-index-refresh/SKILL.md +8 -5
  216. package/template/.qoder/skills/yss-skill-source-index-refresh/references/source-location.md +2 -1
  217. package/template/.qoder/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +388 -18
  218. package/template/.qoder/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.test.mjs +79 -1
  219. package/template/.trae/skills/code-review/SKILL.md +4 -0
  220. package/template/.trae/skills/code-review/agents/openai.yaml +1 -1
  221. package/template/.trae/skills/code-review/references/yss-review-standards.md +9 -2
  222. package/template/.trae/skills/yss-ddd-scaffold-generator/SKILL.md +1 -1
  223. package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +7 -3
  224. package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
  225. package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +9 -0
  226. package/template/.trae/skills/yss-frontend-scaffold-generator/SKILL.md +10 -7
  227. package/template/.trae/skills/yss-frontend-scaffold-generator/scripts/generate_and_verify_scaffold.mjs +10 -0
  228. package/template/.trae/skills/yss-frontend-scaffold-generator/scripts/generate_scaffold.mjs +107 -0
  229. package/template/.trae/skills/yss-frontend-scaffold-generator/scripts/run_scaffold_verification.mjs +41 -0
  230. package/template/.trae/skills/yss-frontend-scaffold-generator/scripts/scaffold-generator.test.mjs +37 -0
  231. package/template/.trae/skills/yss-implementation-contract-compiler/SKILL.md +1 -1
  232. package/template/.trae/skills/yss-implementation-contract-compiler/references/boundaries.md +4 -0
  233. package/template/.trae/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +25 -0
  234. package/template/.trae/skills/yss-layered-mvc-scaffold-generator/SKILL.md +2 -2
  235. package/template/.trae/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +8 -5
  236. package/template/.trae/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +17 -2
  237. package/template/.trae/skills/yss-mybatis/SKILL.md +34 -58
  238. package/template/.trae/skills/yss-mybatis/agents/openai.yaml +2 -2
  239. package/template/.trae/skills/yss-mybatis/references/source-index.md +88 -68
  240. package/template/.trae/skills/yss-product-lifecycle/SKILL.md +48 -43
  241. package/template/.trae/skills/yss-product-lifecycle/references/artifact-dependencies.md +4 -2
  242. package/template/.trae/skills/yss-product-lifecycle/references/orchestration-contract.yaml +67 -10
  243. package/template/.trae/skills/yss-product-lifecycle/references/orchestration.md +5 -1
  244. package/template/.trae/skills/yss-product-lifecycle/references/state-model.md +5 -2
  245. package/template/.trae/skills/yss-repository/SKILL.md +28 -70
  246. package/template/.trae/skills/yss-repository/agents/openai.yaml +2 -2
  247. package/template/.trae/skills/yss-repository/references/profiles/layered-mvc-service.md +19 -1
  248. package/template/.trae/skills/yss-repository/references/profiles/mvc-data-analysis-v1.md +19 -1
  249. package/template/.trae/skills/yss-repository/references/profiles/target-domain-model.md +21 -1
  250. package/template/.trae/skills/yss-repository/tests/profile-routing.test.mjs +59 -0
  251. package/template/.trae/skills/yss-skill-source-index-refresh/SKILL.md +8 -5
  252. package/template/.trae/skills/yss-skill-source-index-refresh/references/source-location.md +2 -1
  253. package/template/.trae/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +388 -18
  254. package/template/.trae/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.test.mjs +79 -1
  255. package/template/docs/agents/digital-human-roles.yaml +2 -0
  256. package/template/docs/agents/yss-skill-registry.yaml +5 -0
  257. package/template/docs/process/lifecycle-artifact-map.md +4 -0
  258. package/template/docs/process/lifecycle-registry-baseline.json +6 -1
  259. package/template/docs/process/lifecycle-registry.yaml +23 -0
  260. package/template/docs/process/schemas/implementation-repository-preparation-result.schema.json +38 -0
  261. package/template/docs/process/schemas/project-scaffold-contract.schema.json +113 -0
  262. package/template/docs/process/template-verification-profiles.yaml +23 -0
  263. package/template/docs/templates/implementation-repo-registry-template.md +8 -0
  264. package/template/docs/templates/review-report-template.md +7 -3
  265. package/template/scripts/lib/lifecycle-context-query.mjs +137 -0
  266. package/template/scripts/lib/lifecycle-transition.mjs +109 -3
  267. package/template/scripts/lib/scenario-checks.mjs +29 -26
  268. package/template/scripts/lib/skill-registry.mjs +9 -0
  269. package/template/scripts/query-lifecycle-context +25 -0
  270. package/template/scripts/verify-business-language-scenarios +0 -7
  271. package/template/scripts/verify-frontend-scaffold-generator-scenarios +2 -0
  272. package/template/scripts/verify-lifecycle-context-query-scenarios +68 -0
  273. package/template/scripts/verify-lifecycle-transition-scenarios +44 -4
  274. package/template/skills-lock.json +9 -9
  275. package/template.snapshot.json +4 -4
  276. package/template/.agents/skills/yss-mybatis/assets/BaseRepository.java +0 -112
  277. package/template/.agents/skills/yss-mybatis/assets/EntityQueryAspect.java +0 -37
  278. package/template/.agents/skills/yss-mybatis/assets/MybatisBaseConfiguration.java +0 -18
  279. package/template/.agents/skills/yss-mybatis/assets/PageQueryEntityConfigration.java +0 -18
  280. package/template/.agents/skills/yss-mybatis/references/README.md +0 -57
  281. package/template/.agents/skills/yss-repository/references/infrastructure-layer-guide.md +0 -107
  282. package/template/.claude/skills/yss-mybatis/assets/BaseRepository.java +0 -112
  283. package/template/.claude/skills/yss-mybatis/assets/EntityQueryAspect.java +0 -37
  284. package/template/.claude/skills/yss-mybatis/assets/MybatisBaseConfiguration.java +0 -18
  285. package/template/.claude/skills/yss-mybatis/assets/PageQueryEntityConfigration.java +0 -18
  286. package/template/.claude/skills/yss-mybatis/references/README.md +0 -57
  287. package/template/.claude/skills/yss-repository/references/infrastructure-layer-guide.md +0 -107
  288. package/template/.codex/skills/yss-mybatis/assets/BaseRepository.java +0 -112
  289. package/template/.codex/skills/yss-mybatis/assets/EntityQueryAspect.java +0 -37
  290. package/template/.codex/skills/yss-mybatis/assets/MybatisBaseConfiguration.java +0 -18
  291. package/template/.codex/skills/yss-mybatis/assets/PageQueryEntityConfigration.java +0 -18
  292. package/template/.codex/skills/yss-mybatis/references/README.md +0 -57
  293. package/template/.codex/skills/yss-repository/references/infrastructure-layer-guide.md +0 -107
  294. package/template/.cursor/skills/yss-mybatis/assets/BaseRepository.java +0 -112
  295. package/template/.cursor/skills/yss-mybatis/assets/EntityQueryAspect.java +0 -37
  296. package/template/.cursor/skills/yss-mybatis/assets/MybatisBaseConfiguration.java +0 -18
  297. package/template/.cursor/skills/yss-mybatis/assets/PageQueryEntityConfigration.java +0 -18
  298. package/template/.cursor/skills/yss-mybatis/references/README.md +0 -57
  299. package/template/.cursor/skills/yss-repository/references/infrastructure-layer-guide.md +0 -107
  300. package/template/.pi/skills/yss-mybatis/assets/BaseRepository.java +0 -112
  301. package/template/.pi/skills/yss-mybatis/assets/EntityQueryAspect.java +0 -37
  302. package/template/.pi/skills/yss-mybatis/assets/MybatisBaseConfiguration.java +0 -18
  303. package/template/.pi/skills/yss-mybatis/assets/PageQueryEntityConfigration.java +0 -18
  304. package/template/.pi/skills/yss-mybatis/references/README.md +0 -57
  305. package/template/.pi/skills/yss-repository/references/infrastructure-layer-guide.md +0 -107
  306. package/template/.qoder/skills/yss-mybatis/assets/BaseRepository.java +0 -112
  307. package/template/.qoder/skills/yss-mybatis/assets/EntityQueryAspect.java +0 -37
  308. package/template/.qoder/skills/yss-mybatis/assets/MybatisBaseConfiguration.java +0 -18
  309. package/template/.qoder/skills/yss-mybatis/assets/PageQueryEntityConfigration.java +0 -18
  310. package/template/.qoder/skills/yss-mybatis/references/README.md +0 -57
  311. package/template/.qoder/skills/yss-repository/references/infrastructure-layer-guide.md +0 -107
  312. package/template/.trae/skills/yss-mybatis/assets/BaseRepository.java +0 -112
  313. package/template/.trae/skills/yss-mybatis/assets/EntityQueryAspect.java +0 -37
  314. package/template/.trae/skills/yss-mybatis/assets/MybatisBaseConfiguration.java +0 -18
  315. package/template/.trae/skills/yss-mybatis/assets/PageQueryEntityConfigration.java +0 -18
  316. package/template/.trae/skills/yss-mybatis/references/README.md +0 -57
  317. package/template/.trae/skills/yss-repository/references/infrastructure-layer-guide.md +0 -107
@@ -5,6 +5,7 @@ import { enforceFrontendDelivery } from "./frontend-delivery-boundary.mjs";
5
5
 
6
6
  const IMPLEMENTATION_WORK_UNIT = "work-unit.slice-implementation";
7
7
  const TICKET_DECOMPOSITION_WORK_UNIT = "work-unit.ticket-decomposition";
8
+ const REPOSITORY_PREPARATION_WORK_UNIT = "work-unit.implementation-repository-preparation";
8
9
 
9
10
  function deepFreeze(value) {
10
11
  if (!value || typeof value !== "object" || Object.isFrozen(value)) return value;
@@ -26,9 +27,10 @@ const NEXT_ROUTES = deepFreeze({
26
27
  "work-unit.discovery-requirements": ["work-unit.domain-strategy-design", "work-unit.stage-decision", "work-unit.spec-synthesis"],
27
28
  "work-unit.domain-strategy-design": ["work-unit.stage-decision", "work-unit.spec-synthesis"],
28
29
  "work-unit.stage-decision": ["work-unit.spec-synthesis"],
29
- "work-unit.spec-synthesis": ["work-unit.prototype-design", "work-unit.technical-analysis", TICKET_DECOMPOSITION_WORK_UNIT],
30
- "work-unit.prototype-design": ["work-unit.technical-analysis", TICKET_DECOMPOSITION_WORK_UNIT],
31
- "work-unit.technical-analysis": [TICKET_DECOMPOSITION_WORK_UNIT],
30
+ "work-unit.spec-synthesis": ["work-unit.prototype-design", "work-unit.technical-analysis", REPOSITORY_PREPARATION_WORK_UNIT],
31
+ "work-unit.prototype-design": ["work-unit.technical-analysis", REPOSITORY_PREPARATION_WORK_UNIT],
32
+ "work-unit.technical-analysis": [REPOSITORY_PREPARATION_WORK_UNIT],
33
+ [REPOSITORY_PREPARATION_WORK_UNIT]: [TICKET_DECOMPOSITION_WORK_UNIT],
32
34
  [TICKET_DECOMPOSITION_WORK_UNIT]: [IMPLEMENTATION_WORK_UNIT],
33
35
  [IMPLEMENTATION_WORK_UNIT]: ["work-unit.frontend-implementation-verification", "work-unit.code-review"],
34
36
  "work-unit.frontend-implementation-verification": ["work-unit.code-review"],
@@ -56,6 +58,15 @@ const BLOCKING_SIGNALS = Object.freeze({
56
58
  contractNotCurrent: "slice-contract-not-current",
57
59
  missingEvidence: "ticket-formalization-evidence-missing",
58
60
  stale: "ticket-formalization-stale",
61
+ repositoryDecisionRequired: "implementation-repository-decision-required",
62
+ repositoryLocationRequired: "implementation-repository-location-required",
63
+ repositoryOnboardingIncomplete: "implementation-repository-onboarding-incomplete",
64
+ scaffoldChoiceRequired: "scaffold-choice-required",
65
+ scaffoldContractUnapproved: "scaffold-contract-unapproved",
66
+ scaffoldGenerationIncomplete: "scaffold-generation-incomplete",
67
+ scaffoldVerificationFailed: "scaffold-verification-failed",
68
+ frontendTemplateUnavailable: "frontend-template-unavailable",
69
+ implementationRepositoriesStale: "implementation-repositories-stale",
59
70
  });
60
71
 
61
72
  const allowedResult = (evidenceRefs = []) => ({
@@ -130,9 +141,101 @@ export function validateNextRoute(currentWorkUnit, nextRoute, decisionState, opt
130
141
  }
131
142
  return blockedResult(signals, ["allowed_next_route"]);
132
143
  }
144
+ if (nextRoute === TICKET_DECOMPOSITION_WORK_UNIT) {
145
+ const readiness = validateImplementationRepositoriesReady(decisionState, options);
146
+ if (readiness.result === "blocked") return readiness;
147
+ }
133
148
  return decisionState ? validateDecisionBoundary(currentWorkUnit, decisionState, options) : allowedResult();
134
149
  }
135
150
 
151
+ /**
152
+ * Validate the aggregate stage-5 repository-preparation result. Every affected
153
+ * delivery role must resolve to an onboarded existing repository or a freshly
154
+ * generated and verified scaffold. Unaffected roles need an explicit reason.
155
+ */
156
+ export function validateImplementationRepositoriesReady(state, { exists = existsSync } = {}) {
157
+ const preparation = state?.implementation_repository_preparation;
158
+ const impacts = state?.delivery_impacts;
159
+ const signals = [];
160
+ const missing = [];
161
+ const evidenceRefs = Array.isArray(preparation?.evidence_refs) ? preparation.evidence_refs : [];
162
+
163
+ if (!preparation || preparation.result !== "completed" || !Array.isArray(preparation.projects)) {
164
+ return blockedResult([BLOCKING_SIGNALS.repositoryDecisionRequired], ["completed implementation_repository_preparation with projects"]);
165
+ }
166
+ if (preparation.current_version !== true || state?.implementation_repositories_stale === true) {
167
+ signals.push(BLOCKING_SIGNALS.implementationRepositoriesStale);
168
+ missing.push("implementation repository preparation is current");
169
+ }
170
+ if (evidenceRefs.length === 0 || evidenceRefs.some((ref) => !isReadable(ref, exists))) {
171
+ signals.push(BLOCKING_SIGNALS.repositoryOnboardingIncomplete);
172
+ missing.push("readable implementation_repository_preparation.evidence_refs");
173
+ }
174
+
175
+ for (const role of ["backend", "frontend"]) {
176
+ const affected = impacts?.[role] === true;
177
+ const projects = preparation.projects.filter((project) => project?.delivery_role === role);
178
+ if (affected && projects.length === 0) {
179
+ signals.push(BLOCKING_SIGNALS.repositoryDecisionRequired);
180
+ missing.push(`${role} repository decision`);
181
+ }
182
+ if (!affected && projects.length === 0) {
183
+ signals.push(BLOCKING_SIGNALS.repositoryDecisionRequired);
184
+ missing.push(`${role} not-applicable decision with reason`);
185
+ }
186
+ for (const project of projects) {
187
+ if (!hasText(project.project_id) || !hasText(project.status)) {
188
+ signals.push(BLOCKING_SIGNALS.repositoryDecisionRequired);
189
+ missing.push(`${role} project_id and status`);
190
+ continue;
191
+ }
192
+ if (project.status === "not-applicable") {
193
+ if (affected || !hasText(project.reason)) {
194
+ signals.push(BLOCKING_SIGNALS.repositoryDecisionRequired);
195
+ missing.push(`${project.project_id} not-applicable reason for an unaffected role`);
196
+ }
197
+ continue;
198
+ }
199
+ if (!hasText(project.repository_ref) || !hasText(project.project_root) || !hasText(project.repository_scope)) {
200
+ signals.push(BLOCKING_SIGNALS.repositoryLocationRequired);
201
+ missing.push(`${project.project_id} repository_ref, project_root and repository_scope`);
202
+ }
203
+ if (project.status === "existing-and-onboarded") {
204
+ if (project.onboarding_result?.status !== "completed" || !isReadable(project.onboarding_result?.ref, exists)) {
205
+ signals.push(BLOCKING_SIGNALS.repositoryOnboardingIncomplete);
206
+ missing.push(`${project.project_id} readable completed onboarding result`);
207
+ }
208
+ } else if (project.status === "initialized-and-verified") {
209
+ if (role === "backend" && !hasText(project.architecture_family)) {
210
+ signals.push(BLOCKING_SIGNALS.scaffoldChoiceRequired);
211
+ missing.push(`${project.project_id} confirmed backend architecture_family`);
212
+ }
213
+ const contract = project.scaffold_contract;
214
+ if (![3, 4].includes(contract?.schema_version) || contract?.status !== "approved" || contract?.persisted !== true || contract?.current_version !== true || (role === "frontend" && contract?.schema_version !== 4)) {
215
+ signals.push(BLOCKING_SIGNALS.scaffoldContractUnapproved);
216
+ missing.push(`${project.project_id} approved persisted current scaffold contract`);
217
+ }
218
+ if (!isReadable(project.scaffold_manifest_ref, exists)) {
219
+ signals.push(BLOCKING_SIGNALS.scaffoldGenerationIncomplete);
220
+ missing.push(`${project.project_id} readable scaffold manifest`);
221
+ }
222
+ if (project.scaffold_verification?.status !== "passed" || !isReadable(project.scaffold_verification?.ref, exists)) {
223
+ signals.push(BLOCKING_SIGNALS.scaffoldVerificationFailed);
224
+ missing.push(`${project.project_id} readable passed scaffold verification`);
225
+ }
226
+ if (role === "frontend" && project.template_available !== true) {
227
+ signals.push(BLOCKING_SIGNALS.frontendTemplateUnavailable);
228
+ missing.push(`${project.project_id} verified frontend template source`);
229
+ }
230
+ } else {
231
+ signals.push(BLOCKING_SIGNALS.repositoryDecisionRequired);
232
+ missing.push(`${project.project_id} supported repository preparation status`);
233
+ }
234
+ }
235
+ }
236
+ return signals.length === 0 ? allowedResult(evidenceRefs) : blockedResult(signals, missing, evidenceRefs);
237
+ }
238
+
136
239
  function validateDecisionBoundary(workUnit, state, options) {
137
240
  try { assertWorkUnitUserDecision(workUnit, state, options); return allowedResult(); }
138
241
  catch (error) { return blockedResult([error.code || "user-decision-invalid"], [error.message]); }
@@ -145,6 +248,8 @@ function validateDecisionBoundary(workUnit, state, options) {
145
248
  export function validateTicketFormalization(state, { exists = existsSync, read = (ref) => readFileSync(ref, "utf8"), ...decisionOptions } = {}) {
146
249
  try { enforceFrontendDelivery(state, { root: decisionOptions.root, phase: "implementation" }); }
147
250
  catch (error) { return blockedResult(["frontend-delivery-blocked"], [error.message]); }
251
+ const repositoryResult = validateImplementationRepositoriesReady(state, { exists });
252
+ if (repositoryResult.result === "blocked") return repositoryResult;
148
253
  const decomposition = state?.ticket_decomposition_result;
149
254
  const ticket = state?.vertical_slice_ticket;
150
255
  const contract = state?.slice_contract;
@@ -276,6 +381,7 @@ export function validateImplementationEntry(state, options = {}) {
276
381
  export const lifecycleTransitionContract = Object.freeze({
277
382
  implementation_work_unit: IMPLEMENTATION_WORK_UNIT,
278
383
  ticket_decomposition_work_unit: TICKET_DECOMPOSITION_WORK_UNIT,
384
+ repository_preparation_work_unit: REPOSITORY_PREPARATION_WORK_UNIT,
279
385
  next_routes: NEXT_ROUTES,
280
386
  blocking_signals: BLOCKING_SIGNALS,
281
387
  });
@@ -76,7 +76,9 @@ function validateInvocationBoundary(data) {
76
76
  ensure(routes?.["work-unit.frontend-implementation-verification"]?.skills?.includes("code-review") && routes?.["work-unit.frontend-implementation-verification"]?.applies_when === "ui_impact", "前端还原验证未绑定 UI fidelity 审查轴");
77
77
  const reviewRoute = routes?.["work-unit.code-review"];
78
78
  ensure(reviewRoute?.primary_skill === "code-review" && reviewRoute?.review_standards_route?.unique_default_skill === "code-review" && reviewRoute?.review_standards_route?.second_generic_review_skill === "forbidden", "code-review 不是唯一默认审查入口或允许第二套通用审查 skill");
79
- ensure(includesAll(reviewRoute?.supporting_skills, ["alibaba-java-code-style", "yss-ui", "yss-domain"]) && includesAll(reviewRoute?.skills, ["code-review", "alibaba-java-code-style", "yss-ui"]), "审查工作单元缺少 YSS / Alibaba 专项检查输入");
79
+ ensure(includesAll(reviewRoute?.supporting_skills, ["alibaba-java-code-style", "yss-ui", "yss-domain", "yss-repository", "yss-mybatis"]) && includesAll(reviewRoute?.skills, ["code-review", "alibaba-java-code-style", "yss-ui", "yss-repository", "yss-mybatis"]), "审查工作单元缺少 YSS / Alibaba / Repository / MyBatis 专项检查输入");
80
+ const reviewScope = reviewRoute?.review_standards_route?.project_scope;
81
+ ensure(includesAll(reviewScope?.sources, ["candidate-project-root", "implementation-repository-registry", "slice-project-roots", "allowed-write-paths"]) && includesAll(reviewScope?.include, ["project-itself", "registered-backend-development-projects"]) && includesAll(reviewScope?.exclude, ["frontend-projects", "unrelated-submodules", "vendor", "unregistered-directories"]) && reviewScope?.fixed_apps_backend_assumption === "forbidden", "后端审查范围未绑定本体项目与已登记后端研发项目,或仍固定为 apps/backend");
80
82
  const disposition = reviewRoute?.review_standards_route?.finding_disposition;
81
83
  ensure(includesAll(disposition?.same_loop_for, ["product-slice", "template-maintenance"]) && disposition?.reviewer_write_implementation === "forbidden", "审查 finding 闭环未同时覆盖产品切片与模板维护,或允许审查者写实现");
82
84
  ensure(includesAll(disposition?.repair_then_full_rereview?.kinds, ["violation", "machine_check_failure", "blank_applicable_row", "missing_evidence"]) && disposition?.repair_then_full_rereview?.actor === "implementer" && disposition?.repair_then_full_rereview?.then === "recapture_candidate_and_rerun_all_axes", "violation 类 finding 未要求实现者修复后全轴复审");
@@ -125,6 +127,8 @@ function validateWorkflowExecutionResult(payload, contract, workUnitRoutes) {
125
127
  const implementationState = {
126
128
  user_decisions: payload.user_decisions,
127
129
  slice_contract_ref: payload.slice_contract_ref,
130
+ delivery_impacts: payload.delivery_impacts,
131
+ implementation_repository_preparation: payload.implementation_repository_preparation,
128
132
  tracker_kind: payload.tracker_kind,
129
133
  predecessor_work_unit: payload.predecessor_work_unit,
130
134
  ready_for_agent: payload.ready_for_agent,
@@ -164,18 +168,15 @@ function validateInvocationMetadata(boundary, skillContents) {
164
168
  for (const skill of boundary.model_invoked_skills) ensure(!skillContents(skill).includes("disable-model-invocation: true"), `${skill} 不应出现在 model-invoked 白名单`);
165
169
  }
166
170
 
167
- function validateMattProse(skill, adapter) {
168
- ensure(skill.includes("不得写生命周期资产或改变门禁/Ticket 状态") && skill.includes("任何写入前回交本编排器"), "主技能缺少 direct Matt 只导航并回交的说明");
169
- ensure(adapter.includes("仅发现旧路径资产") && adapter.includes("不得调用 `setup-matt-pocock-skills`"), "适配器缺少 setup 旧资产迁移或显式用户入口条件");
170
- ensure(adapter.includes("frontier 为空") && adapter.includes("双方共同理解已确认"), "适配器缺少 grill_exit 的 frontier 或共同理解条件");
171
- ensure(skill.includes("自然语言意向不构成上述结构化 Git 授权") && adapter.includes("本身不是结构化授权"), "主技能或适配器缺少自然语言 Git 意向不是授权的说明");
172
- ensure(adapter.includes("禁止 detached HEAD 提交") && adapter.includes("先推子仓再更新父仓 gitlink"), "适配器缺少 git-submodule 嵌套 Git 授权说明");
173
- }
174
-
175
- function validateInvocationProse(skill, adapter, orchestration) {
176
- ensure(skill.includes("不得自动调用它们或代替其创建正式资产") && skill.includes("Workflow Execution Result"), "主技能未限制 user-invoked 调用或未采用新结果协议");
177
- ensure(adapter.includes("workflow reference 不表示调用") && adapter.includes("正式 Spec、Ticket 或实现资产仍只能由对应显式用户入口创建"), "适配器未限制 workflow reference 的正式资产所有权");
178
- ensure(orchestration.includes("只实际调用允许的 model-invoked skill") && orchestration.includes("用户显式启动"), "编排协议未区分 model-invoked 原语和显式用户入口");
171
+ function validateLifecycleEntrySkill(skill) {
172
+ ensure(/^---\nname: yss-product-lifecycle\n/m.test(skill), "生命周期入口缺少有效 frontmatter");
173
+ ensure(Buffer.byteLength(skill) <= 8192, "生命周期入口超过 8KB 上下文预算");
174
+ for (const reference of ["docs/process/lifecycle-registry.yaml", "references/orchestration-contract.yaml", "docs/agents/yss-skill-registry.yaml", "scripts/query-lifecycle-context"]) {
175
+ ensure(skill.includes(reference), `生命周期入口缺少权威引用: ${reference}`);
176
+ }
177
+ for (const heading of ["### 仓库身份", "### 流转与实现", "### 用户决定", "### 外部副作用与 Git"]) {
178
+ ensure(skill.includes(heading), `生命周期入口缺少边界分组: ${heading}`);
179
+ }
179
180
  }
180
181
 
181
182
  const profiles = {
@@ -192,7 +193,7 @@ const profiles = {
192
193
  prototype: {
193
194
  message: "原型到后端脚手架及后续 YSS 代码生成压力场景验证通过",
194
195
  files: [".agents/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs", ".agents/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml"],
195
- markers: [[".agents/skills/yss-product-lifecycle/SKILL.md", "controlled-generation"]]
196
+ markers: [[".agents/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml", "controlled-generation"]]
196
197
  },
197
198
  implementationContractCompiler: {
198
199
  message: "YSS implementation contract compiler stage 7 scenarios passed",
@@ -248,7 +249,10 @@ export function runScenario(name) {
248
249
  { from: "work-unit.spec-synthesis", to: "work-unit.slice-implementation" },
249
250
  { from: "work-unit.prototype-design", to: "work-unit.slice-implementation" },
250
251
  { from: "work-unit.technical-analysis", to: "work-unit.slice-implementation" },
251
- ]), "生命周期转换图缺少 Spec/原型/技术分析到实现的越级阻断");
252
+ { from: "work-unit.technical-analysis", to: "work-unit.ticket-decomposition" },
253
+ ]), "生命周期转换图缺少工程准备、Ticket 正式化与实现越级阻断");
254
+ ensure(contract.transition_graph?.routes?.["work-unit.implementation-repository-preparation"]?.includes("work-unit.ticket-decomposition"), "实现仓库准备未成为 Ticket 正式化前置");
255
+ ensure(contract.implementation_repository_preparation?.gate === "gate.implementation-repositories-ready", "实现仓库准备聚合门禁缺失");
252
256
  ensure(lifecycleTransitionContract.next_routes["work-unit.ticket-decomposition"]?.includes("work-unit.slice-implementation"), "转换校验器未允许 Ticket 正式化后进入实现");
253
257
  ensure(contract.release_readiness?.conditional?.ui_impact?.includes("gate.frontend-implementation-verified") && contract.frontend_implementation_plan?.acceptance?.includes("no_template_placeholders"), "发布公式或前端计划实质校验不完整");
254
258
  const templateRejected = spawnSync("scripts/verify-frontend-implementation-evidence", ["docs/process/templates/frontend-implementation-plan-template.yaml"], { cwd: root, encoding: "utf8" });
@@ -275,7 +279,7 @@ export function runScenario(name) {
275
279
  changed_artifacts: [],
276
280
  new_impacts: [],
277
281
  stale_candidates: [],
278
- next_route: "work-unit.ticket-decomposition",
282
+ next_route: "work-unit.implementation-repository-preparation",
279
283
  blocking_signals: []
280
284
  };
281
285
  validateWorkflowExecutionResult(validResult, data.workflow_execution_result, data.work_unit_routes);
@@ -304,6 +308,14 @@ export function runScenario(name) {
304
308
  slice_contract_status: "approved",
305
309
  slice_contract_persisted: true,
306
310
  slice_contract_current_version: true,
311
+ delivery_impacts: { backend: true, frontend: false },
312
+ implementation_repository_preparation: {
313
+ result: "completed", current_version: true, evidence_refs: ["docs/process/lifecycle-registry.yaml"],
314
+ projects: [
315
+ { project_id: "backend", delivery_role: "backend", status: "existing-and-onboarded", repository_ref: "git://backend", project_root: "/workspace/backend", repository_scope: "external-repository", onboarding_result: { status: "completed", ref: "docs/process/lifecycle-registry.yaml" } },
316
+ { project_id: "frontend-na", delivery_role: "frontend", status: "not-applicable", reason: "no frontend impact" },
317
+ ],
318
+ },
307
319
  };
308
320
  validateWorkflowExecutionResult(validImplementationResult, data.workflow_execution_result, data.work_unit_routes);
309
321
  for (const mutate of [
@@ -377,16 +389,7 @@ export function runScenario(name) {
377
389
  ensure(rejected, "Matt/YSS 契约变异未被 baseline oracle 拒绝");
378
390
  }
379
391
  const skill = read(".agents/skills/yss-product-lifecycle/SKILL.md");
380
- const adapter = read(".agents/skills/yss-product-lifecycle/references/matt-yss-adapter.md");
381
- const orchestration = read(".agents/skills/yss-product-lifecycle/references/orchestration.md");
382
- validateMattProse(skill, adapter);
383
- validateInvocationProse(skill, adapter, orchestration);
384
- let proseRejected = false;
385
- try { validateMattProse(skill.replace("任何写入前回交本编排器", "允许直接写入"), adapter); } catch { proseRejected = true; }
386
- ensure(proseRejected, "Matt/YSS prose 变异未被 baseline oracle 拒绝");
387
- let invocationProseRejected = false;
388
- try { validateInvocationProse(skill.replace("不得自动调用它们或代替其创建正式资产", "可以自动调用并创建正式资产"), adapter, orchestration); } catch { invocationProseRejected = true; }
389
- ensure(invocationProseRejected, "调用边界 prose 变异未被 baseline oracle 拒绝");
392
+ validateLifecycleEntrySkill(skill);
390
393
  for (const relative of ["SKILL.md", "references/matt-yss-adapter.md", "references/orchestration-contract.yaml"]) {
391
394
  ensure(read(`.agents/skills/yss-product-lifecycle/${relative}`) === read(`.codex/skills/yss-product-lifecycle/${relative}`), `YSS 生命周期投影未同步: ${relative}`);
392
395
  }
@@ -166,6 +166,10 @@ function validateReviewInputFinding(reviewInput) {
166
166
  if (reviewInput.completed_requires_no_open_mandatory_violations !== true) fail("未关闭的 mandatory violation 不得 completed");
167
167
  if (reviewInput.completed_requires_no_blank_applicable_rows !== true) fail("适用报告行空白不得 completed");
168
168
  if (reviewInput.reviewer_write_implementation !== "forbidden") fail("review_input 禁止审查者写实现");
169
+ requireObject(reviewInput.scope_resolution, "review_input.scope_resolution");
170
+ requireStringSet(reviewInput.scope_resolution.sources, ["candidate-project-root", "implementation-repository-registry", "slice-project-roots", "allowed-write-paths"], "review_input.scope_resolution.sources");
171
+ requireStringSet(reviewInput.scope_resolution.backend_includes, ["project-itself", "registered-backend-development-projects"], "review_input.scope_resolution.backend_includes");
172
+ requireStringSet(reviewInput.scope_resolution.excludes, ["frontend-projects", "unrelated-submodules", "vendor", "unregistered-directories"], "review_input.scope_resolution.excludes");
169
173
  }
170
174
 
171
175
  function validateCodeReviewRoute(route, resolve) {
@@ -180,6 +184,11 @@ function validateCodeReviewRoute(route, resolve) {
180
184
  if (standards.contract_required_skills !== "required") fail("Standards 必须消费 Slice 合同 required_skills");
181
185
  requireString(standards.report_template, "review_standards_route.report_template");
182
186
  if (!existsSync(path.join(ROOT, standards.report_template))) fail(`审查报告模板不存在: ${standards.report_template}`);
187
+ requireObject(standards.project_scope, "review_standards_route.project_scope");
188
+ requireStringSet(standards.project_scope.sources, ["candidate-project-root", "implementation-repository-registry", "slice-project-roots", "allowed-write-paths"], "review_standards_route.project_scope.sources");
189
+ requireStringSet(standards.project_scope.include, ["project-itself", "registered-backend-development-projects"], "review_standards_route.project_scope.include");
190
+ requireStringSet(standards.project_scope.exclude, ["frontend-projects", "unrelated-submodules", "vendor", "unregistered-directories"], "review_standards_route.project_scope.exclude");
191
+ if (standards.project_scope.fixed_apps_backend_assumption !== "forbidden") fail("code-review 不得把后端审查范围固定为 apps/backend");
183
192
  const conditional = standards.conditional_skills;
184
193
  if (!conditional || typeof conditional !== "object" || Array.isArray(conditional)) {
185
194
  fail("review_standards_route.conditional_skills 必须是对象");
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env node
2
+ import { parseArgs } from "node:util";
3
+ import { queryLifecycleContext } from "./lib/lifecycle-context-query.mjs";
4
+
5
+ try {
6
+ const { values } = parseArgs({
7
+ options: {
8
+ mode: { type: "string" },
9
+ stage: { type: "string" },
10
+ "work-unit": { type: "string" },
11
+ include: { type: "string", multiple: true },
12
+ },
13
+ strict: true,
14
+ });
15
+ const result = queryLifecycleContext({
16
+ mode: values.mode,
17
+ stageId: values.stage,
18
+ workUnitId: values["work-unit"],
19
+ include: values.include ?? [],
20
+ });
21
+ process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
22
+ } catch (error) {
23
+ process.stderr.write(`${error.message}\n`);
24
+ process.exitCode = 1;
25
+ }
@@ -25,13 +25,6 @@ for (const relativePath of PUBLIC_FILES) {
25
25
  }
26
26
  }
27
27
 
28
- const lifecycle = read(".agents/skills/yss-product-lifecycle/SKILL.md");
29
- for (const phrase of [
30
- "机会与目标 → 业务故事 → 责任与交接 → 规则、例子与疑问 → 可验收需求 → 页面验证 → 业务任务 → 交接研发",
31
- "业务方案总览",
32
- "不成为新的事实源",
33
- ]) assert.match(lifecycle, new RegExp(phrase));
34
-
35
28
  const registry = read("docs/process/lifecycle-registry.yaml");
36
29
  for (const stableId of ["work-unit.domain-strategy-design", "artifact.domain-strategy", "gate.domain-strategy-approved"]) {
37
30
  assert.match(registry, new RegExp(`id: ${stableId.replaceAll(".", "\\.")}`));
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import "../.agents/skills/yss-frontend-scaffold-generator/scripts/scaffold-generator.test.mjs";
@@ -0,0 +1,68 @@
1
+ #!/usr/bin/env node
2
+ import assert from "node:assert/strict";
3
+ import { readFileSync } from "node:fs";
4
+ import { spawnSync } from "node:child_process";
5
+ import path from "node:path";
6
+ import { fileURLToPath } from "node:url";
7
+ import { queryLifecycleContext } from "./lib/lifecycle-context-query.mjs";
8
+
9
+ const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
10
+
11
+ const query = {
12
+ mode: "route",
13
+ stageId: "stage.discovery",
14
+ workUnitId: "work-unit.discovery-requirements",
15
+ include: ["grill_exit"],
16
+ };
17
+ const first = queryLifecycleContext(query);
18
+ const second = queryLifecycleContext(query);
19
+
20
+ assert.deepEqual(first, second, "同一查询必须产生确定性结果");
21
+ assert.equal(first.query.mode, "route");
22
+ assert.equal(first.lifecycle.stage.id, "stage.discovery");
23
+ assert.ok(first.lifecycle.gates.every((gate) => gate.stage === "stage.discovery"));
24
+ assert.ok(first.lifecycle.artifacts.every((artifact) => artifact.stage === "stage.discovery"));
25
+ assert.equal(first.lifecycle.work_unit.id, "work-unit.discovery-requirements");
26
+ assert.equal(first.execution.mode, "read_only");
27
+ assert.equal(first.execution.work_unit_route.primary_skill, "yss-product-lifecycle");
28
+ assert.ok(first.execution.selected.grill_exit.required.includes("frontier_empty"));
29
+ assert.equal("review_input" in first.execution.selected, false, "不得返回未请求的合同子树");
30
+ assert.ok(first.skills.some((skill) => skill.id === "grilling"));
31
+ assert.match(first.sources.lifecycle_registry.semantic_sha256, /^[0-9a-f]{64}$/);
32
+ assert.match(first.sources.orchestration_contract.sha256, /^[0-9a-f]{64}$/);
33
+
34
+ for (const invalid of [
35
+ { mode: "invalid" },
36
+ { stageId: "stage.missing" },
37
+ { workUnitId: "work-unit.missing" },
38
+ { include: ["missing_contract_section"] },
39
+ ]) {
40
+ assert.throws(() => queryLifecycleContext(invalid), /未知|至少提供/);
41
+ }
42
+
43
+ const cli = spawnSync("node", [
44
+ "scripts/query-lifecycle-context",
45
+ "--mode", "route",
46
+ "--stage", "stage.discovery",
47
+ "--work-unit", "work-unit.discovery-requirements",
48
+ "--include", "grill_exit",
49
+ ], { cwd: ROOT, encoding: "utf8" });
50
+ assert.equal(cli.status, 0, cli.stderr);
51
+ assert.deepEqual(JSON.parse(cli.stdout), first, "CLI 输出必须等于库函数的规范投影");
52
+
53
+ const skillPath = path.join(ROOT, ".agents/skills/yss-product-lifecycle/SKILL.md");
54
+ const skill = readFileSync(skillPath, "utf8");
55
+ assert.ok(Buffer.byteLength(skill) <= 8192, "生命周期入口 Skill 必须保持在 8KB 软预算内");
56
+ assert.equal(skill.includes("| 主阶段 |"), false, "入口 Skill 不得复制完整阶段表");
57
+ for (const marker of [
58
+ "docs/process/lifecycle-registry.yaml",
59
+ "references/orchestration-contract.yaml",
60
+ "docs/agents/yss-skill-registry.yaml",
61
+ "scripts/query-lifecycle-context",
62
+ "### 仓库身份",
63
+ "### 流转与实现",
64
+ "### 用户决定",
65
+ "### 外部副作用与 Git",
66
+ ]) assert.match(skill, new RegExp(marker.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")));
67
+
68
+ process.stdout.write("生命周期按需上下文查询场景验证通过\n");
@@ -3,16 +3,24 @@ import assert from "node:assert/strict";
3
3
  import { mkdtempSync, rmSync, readFileSync, existsSync } from "node:fs";
4
4
  import os from "node:os";
5
5
  import path from "node:path";
6
- import { buildImplementationFixture } from "./fixtures/user-decision/build-fixture.mjs";
6
+ import { buildDecisionFixture, buildImplementationFixture } from "./fixtures/user-decision/build-fixture.mjs";
7
7
  const temp = mkdtempSync(path.join(os.tmpdir(), "lifecycle-decision-test-"));
8
8
  process.on("exit", () => rmSync(temp, { recursive: true, force: true }));
9
9
  const approval = buildImplementationFixture(temp, "docs/.scratch/demo/issues/01-valid-slice.md");
10
- import { validateImplementationEntry, validateNextRoute, validateTicketFormalization } from "./lib/lifecycle-transition.mjs";
10
+ const scaffoldApproval = buildDecisionFixture(path.join(temp, "scaffold-choice"), { boundary: "scaffold-choice", scope: ["backend", "frontend"] });
11
+ import { validateImplementationEntry, validateImplementationRepositoriesReady, validateNextRoute, validateTicketFormalization } from "./lib/lifecycle-transition.mjs";
11
12
 
12
13
  const exists = (ref) => [
13
14
  "docs/process/lifecycle-registry.yaml",
14
15
  "docs/.scratch/demo/issues/01-valid-slice.md",
15
16
  "docs/.scratch/demo/evidence/ticket-decomposition-result.yaml",
17
+ "docs/.scratch/demo/evidence/repository-preparation.yaml",
18
+ "docs/.scratch/demo/evidence/backend-onboarding.yaml",
19
+ "docs/.scratch/demo/evidence/frontend-onboarding.yaml",
20
+ "docs/.scratch/demo/evidence/backend-manifest.json",
21
+ "docs/.scratch/demo/evidence/backend-verification.json",
22
+ "docs/.scratch/demo/evidence/frontend-manifest.json",
23
+ "docs/.scratch/demo/evidence/frontend-verification.json",
16
24
  ].includes(ref) || existsSync(ref);
17
25
  const decompositionResult = `result_schema: workflow-execution-result-v1\nwork_unit: work-unit.ticket-decomposition\nresult: completed\nevidence_refs:\n - docs/.scratch/demo/evidence/ticket-decomposition-result.yaml\n`;
18
26
  const read = (ref) => ref === "docs/.scratch/demo/evidence/ticket-decomposition-result.yaml" ? decompositionResult : readFileSync(ref, "utf8");
@@ -20,6 +28,17 @@ const options = { exists, read };
20
28
 
21
29
  const validTicketState = {
22
30
  ...approval.state,
31
+ user_decisions: [...approval.state.user_decisions, scaffoldApproval.requirement],
32
+ delivery_impacts: { backend: true, frontend: true },
33
+ implementation_repository_preparation: {
34
+ result: "completed",
35
+ current_version: true,
36
+ evidence_refs: ["docs/.scratch/demo/evidence/repository-preparation.yaml"],
37
+ projects: [
38
+ { project_id: "backend", delivery_role: "backend", status: "existing-and-onboarded", repository_ref: "git://backend", project_root: "/workspace/backend", repository_scope: "external-repository", onboarding_result: { status: "completed", ref: "docs/.scratch/demo/evidence/backend-onboarding.yaml" } },
39
+ { project_id: "frontend", delivery_role: "frontend", status: "existing-and-onboarded", repository_ref: "git://frontend", project_root: "/workspace/frontend", repository_scope: "external-repository", onboarding_result: { status: "completed", ref: "docs/.scratch/demo/evidence/frontend-onboarding.yaml" } },
40
+ ],
41
+ },
23
42
  predecessor_work_unit: "work-unit.ticket-decomposition",
24
43
  tracker_kind: "local-markdown",
25
44
  ticket_decomposition_result_ref: "docs/.scratch/demo/evidence/ticket-decomposition-result.yaml",
@@ -45,6 +64,19 @@ const validTicketState = {
45
64
 
46
65
  const valid = validateTicketFormalization(validTicketState, options);
47
66
  assert.equal(valid.result, "allowed");
67
+ assert.equal(validateImplementationRepositoriesReady(validTicketState, options).result, "allowed");
68
+ const initializedState = {
69
+ delivery_impacts: { backend: true, frontend: true },
70
+ implementation_repository_preparation: {
71
+ result: "completed", current_version: true, evidence_refs: ["docs/.scratch/demo/evidence/repository-preparation.yaml"],
72
+ projects: [
73
+ { project_id: "backend-ddd", delivery_role: "backend", status: "initialized-and-verified", repository_ref: "git://backend", project_root: "/workspace/backend", repository_scope: "external-repository", architecture_family: "domain-driven", scaffold_contract: { schema_version: 4, status: "approved", persisted: true, current_version: true }, scaffold_manifest_ref: "docs/.scratch/demo/evidence/backend-manifest.json", scaffold_verification: { status: "passed", ref: "docs/.scratch/demo/evidence/backend-verification.json" } },
74
+ { project_id: "frontend", delivery_role: "frontend", status: "initialized-and-verified", repository_ref: "git://frontend", project_root: "/workspace/frontend", repository_scope: "external-repository", template_available: true, scaffold_contract: { schema_version: 4, status: "approved", persisted: true, current_version: true }, scaffold_manifest_ref: "docs/.scratch/demo/evidence/frontend-manifest.json", scaffold_verification: { status: "passed", ref: "docs/.scratch/demo/evidence/frontend-verification.json" } },
75
+ ],
76
+ },
77
+ };
78
+ assert.equal(validateImplementationRepositoriesReady(initializedState, options).result, "allowed");
79
+ assert.equal(validateImplementationRepositoriesReady({ delivery_impacts: { backend: false, frontend: false }, implementation_repository_preparation: { result: "completed", current_version: true, evidence_refs: ["docs/.scratch/demo/evidence/repository-preparation.yaml"], projects: [{ project_id: "backend-na", delivery_role: "backend", status: "not-applicable", reason: "no backend impact" }, { project_id: "frontend-na", delivery_role: "frontend", status: "not-applicable", reason: "no frontend impact" }] } }, options).result, "allowed");
48
80
 
49
81
  const implementation = validateImplementationEntry({
50
82
  ...validTicketState,
@@ -53,6 +85,11 @@ const implementation = validateImplementationEntry({
53
85
  assert.equal(implementation.result, "allowed");
54
86
 
55
87
  const cases = [
88
+ ["missing repository preparation", { ...validTicketState, implementation_repository_preparation: undefined }, "implementation-repository-decision-required"],
89
+ ["stale repository preparation", { ...validTicketState, implementation_repositories_stale: true }, "implementation-repositories-stale"],
90
+ ["missing frontend decision", { ...validTicketState, implementation_repository_preparation: { ...validTicketState.implementation_repository_preparation, projects: validTicketState.implementation_repository_preparation.projects.filter((item) => item.delivery_role !== "frontend") } }, "implementation-repository-decision-required"],
91
+ ["missing repository location", { ...validTicketState, implementation_repository_preparation: { ...validTicketState.implementation_repository_preparation, projects: validTicketState.implementation_repository_preparation.projects.map((item) => item.delivery_role === "backend" ? { ...item, project_root: undefined } : item) } }, "implementation-repository-location-required"],
92
+ ["incomplete onboarding", { ...validTicketState, implementation_repository_preparation: { ...validTicketState.implementation_repository_preparation, projects: validTicketState.implementation_repository_preparation.projects.map((item) => item.delivery_role === "backend" ? { ...item, onboarding_result: { status: "blocked" } } : item) } }, "implementation-repository-onboarding-incomplete"],
56
93
  ["missing decomposition result ref", { ...validTicketState, ticket_decomposition_result_ref: undefined }, "ticket-decomposition-result-ref-missing"],
57
94
  ["missing slice ref", { ...validTicketState, vertical_slice_ticket_ref: undefined }, "vertical-slice-ticket-ref-missing"],
58
95
  ["missing slice role", { ...validTicketState, vertical_slice_ticket_role: undefined }, "vertical-slice-ticket-role-missing"],
@@ -90,7 +127,10 @@ for (const current of ["work-unit.spec-synthesis", "work-unit.prototype-design",
90
127
  assert.equal(result.result, "blocked", current);
91
128
  assert.ok(result.blocking_signals.includes("ticket-formalization-required"), current);
92
129
  }
93
- assert.equal(validateNextRoute("work-unit.spec-synthesis", "work-unit.ticket-decomposition").result, "allowed");
130
+ assert.equal(validateNextRoute("work-unit.spec-synthesis", "work-unit.ticket-decomposition").result, "blocked");
131
+ assert.equal(validateNextRoute("work-unit.technical-analysis", "work-unit.implementation-repository-preparation").result, "allowed");
132
+ assert.equal(validateNextRoute("work-unit.implementation-repository-preparation", "work-unit.ticket-decomposition", validTicketState, options).result, "allowed");
133
+ assert.ok(validateNextRoute("work-unit.implementation-repository-preparation", "work-unit.ticket-decomposition", {}, options).blocking_signals.includes("implementation-repository-decision-required"));
94
134
  assert.equal(validateNextRoute("work-unit.intensity-aware-verification", "work-unit.intensity-aware-review").result, "allowed");
95
135
  assert.equal(validateNextRoute("work-unit.release-and-rollback", null).result, "allowed");
96
136
  const arbitraryReadable = validateTicketFormalization({
@@ -110,6 +150,6 @@ assert.equal(validateTicketFormalization({
110
150
  vertical_slice_ticket_ref: "https://github.com/example/project/issues/1",
111
151
  vertical_slice_ticket: { ref: "https://github.com/example/project/issues/1", kind: "vertical-slice-ticket", role: "ready-for-agent" },
112
152
  slice_contract: { ...validTicketState.slice_contract, ticket_ref: "https://github.com/example/project/issues/1" },
113
- }, { ...options, exists: (ref) => ref === "https://github.com/example/project/issues/1", read: (ref) => ref === "https://github.com/example/project/issues/1" ? decompositionResult.replace("docs/.scratch/demo/evidence/ticket-decomposition-result.yaml", "https://github.com/example/project/issues/1") : readFileSync(ref, "utf8") }).result, "allowed");
153
+ }, { ...options, exists: (ref) => ref === "https://github.com/example/project/issues/1" || exists(ref), read: (ref) => ref === "https://github.com/example/project/issues/1" ? decompositionResult.replace("docs/.scratch/demo/evidence/ticket-decomposition-result.yaml", "https://github.com/example/project/issues/1") : readFileSync(ref, "utf8") }).result, "allowed");
114
154
 
115
155
  process.stdout.write("生命周期转换压力场景验证通过\n");
@@ -63,7 +63,7 @@
63
63
  "source": "mattpocock/skills",
64
64
  "sourceType": "github",
65
65
  "skillPath": "skills/engineering/code-review/SKILL.md",
66
- "effectiveHash": "a9839b761443bcb9bf46b886630378e53dfb748ed77fc46b96e5777e701a438e",
66
+ "effectiveHash": "660ca39ab37b65099940b2e6a197089291e2fb74494ec93bbeb8e2fde6559465",
67
67
  "sourceRevision": "0ab1b63a410a03d3627979a109c8695de27af954",
68
68
  "upstreamHash": "12daafb9c4f77deb3c3303dc2e6f8a3c2a0ff7928fc004af959ba18b8bd38068",
69
69
  "adaptationRef": "docs/process/MATT-POCOCK-ENGINEERING-SKILLS.md",
@@ -937,7 +937,7 @@
937
937
  "source": "project",
938
938
  "sourceType": "local",
939
939
  "skillPath": ".agents/skills/yss-ddd-scaffold-generator/SKILL.md",
940
- "effectiveHash": "438b92a03e9e0c80ac68db65096fd499275ad16cb69d4d751571754a97aa38a8",
940
+ "effectiveHash": "96e1c82c538a96af293273906db5ddefcf9943e8b76bb47b05d08772f16258cb",
941
941
  "targets": [
942
942
  ".agents/skills",
943
943
  ".claude/skills",
@@ -1078,7 +1078,7 @@
1078
1078
  "source": "project",
1079
1079
  "sourceType": "local",
1080
1080
  "skillPath": ".agents/skills/yss-frontend-scaffold-generator/SKILL.md",
1081
- "effectiveHash": "87bc0d2f0c279d3fff14ded7a07ba7b9f72a61080e7b9ca826bb452894877e4e",
1081
+ "effectiveHash": "968c213c90a30d719e51050a6122ef729bc03ae97d2841a5d47824d68a5d27ff",
1082
1082
  "targets": [
1083
1083
  ".agents/skills",
1084
1084
  ".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": "4f9ec75e4484bc2794ea057037890d2bcb96512c8c64bef9d9fdae7c66abe46d",
1111
+ "effectiveHash": "96582c950a13f26a7c16b2087d0614cb28a99f0f805190fc64cfc80e6456c335",
1112
1112
  "targets": [
1113
1113
  ".agents/skills",
1114
1114
  ".claude/skills",
@@ -1123,7 +1123,7 @@
1123
1123
  "source": "project",
1124
1124
  "sourceType": "local",
1125
1125
  "skillPath": ".agents/skills/yss-layered-mvc-scaffold-generator/SKILL.md",
1126
- "effectiveHash": "360389486d6bd07949c0b11ab30e266fbf073169d8ee447d89581fe583228950",
1126
+ "effectiveHash": "50d0f704326fc523c29f4b728c08148cde372c674b9e8686829bee3e74b66fdc",
1127
1127
  "targets": [
1128
1128
  ".agents/skills",
1129
1129
  ".claude/skills",
@@ -1183,7 +1183,7 @@
1183
1183
  "source": "project",
1184
1184
  "sourceType": "local",
1185
1185
  "skillPath": ".agents/skills/yss-mybatis/SKILL.md",
1186
- "effectiveHash": "1f70b00dcc6be6fde9c32ebf4ee41a86f2b348ca4bb789a3f2f32a7a24258ff4",
1186
+ "effectiveHash": "8ab792d519c045a8a682942185f9aae3dcabfe86dbd8a4a9a444d7f657798701",
1187
1187
  "targets": [
1188
1188
  ".agents/skills",
1189
1189
  ".claude/skills",
@@ -1228,7 +1228,7 @@
1228
1228
  "source": "project",
1229
1229
  "sourceType": "local",
1230
1230
  "skillPath": ".agents/skills/yss-product-lifecycle/SKILL.md",
1231
- "effectiveHash": "c262bd69e978eee24b49526043b2439c30ce006f4fbbcb56e881c903ba6f3d51",
1231
+ "effectiveHash": "d317bd2799da0442745c8126e62f7919a0b3de03f2c3cc2e1a7ca0433dc69645",
1232
1232
  "targets": [
1233
1233
  ".agents/skills",
1234
1234
  ".claude/skills",
@@ -1261,7 +1261,7 @@
1261
1261
  "source": "project",
1262
1262
  "sourceType": "local",
1263
1263
  "skillPath": ".agents/skills/yss-repository/SKILL.md",
1264
- "effectiveHash": "19f4380ba81f6cf373b737a4b17316f35bf2be27646be38707d52cfd6c1c7aef",
1264
+ "effectiveHash": "0abe4e8f4896613985074615281f11711b807fcfc5727a6e6d2e7d2ebcf7ddc7",
1265
1265
  "targets": [
1266
1266
  ".agents/skills",
1267
1267
  ".claude/skills",
@@ -1324,7 +1324,7 @@
1324
1324
  "source": "project",
1325
1325
  "sourceType": "local",
1326
1326
  "skillPath": ".agents/skills/yss-skill-source-index-refresh/SKILL.md",
1327
- "effectiveHash": "4c95ec664da1d3515ac49b80c063df20bf69d352c6892f66ceb29d0a12b55458",
1327
+ "effectiveHash": "96ff974a0f7b3db8de09680daf9ecada94dd19f608341dcc85a32d40c02591b0",
1328
1328
  "targets": [
1329
1329
  ".agents/skills",
1330
1330
  ".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": "c3d09280872dcfc905c86ac6f40e4e32e610e220",
7
- "templateCommit": "c3d09280872dcfc905c86ac6f40e4e32e610e220",
6
+ "requestedRef": "6f5c5d80adcdb743fb06199f70a7ab0b0a640ce5",
7
+ "templateCommit": "6f5c5d80adcdb743fb06199f70a7ab0b0a640ce5",
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": "80175edec720607595f99f1bab5d0a8480b1644537be8ae71623de01acb0a787",
16
- "generatedAt": "2026-09-08T11:40:21.647Z"
15
+ "snapshotHash": "2a676bf4ed0d3151bab51ad900181cbb8fdd628385572e11dd398bcbaceab61b",
16
+ "generatedAt": "2026-09-09T02:16:12.516Z"
17
17
  }