create-yss-spec 3.4.5 → 3.4.6

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 (392) hide show
  1. package/README.md +1 -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-application/SKILL.md +8 -6
  5. package/template/.agents/skills/yss-audit-log/SKILL.md +12 -7
  6. package/template/.agents/skills/yss-audit-log/references/source-index.boot2-java8.md +57 -0
  7. package/template/.agents/skills/yss-audit-log/references/source-index.boot3-java17.md +58 -0
  8. package/template/.agents/skills/yss-audit-log/references/source-index.md +6 -39
  9. package/template/.agents/skills/yss-cache/SKILL.md +5 -1
  10. package/template/.agents/skills/yss-cache/references/source-index.boot2-java8.md +81 -0
  11. package/template/.agents/skills/yss-cache/references/source-index.boot3-java17.md +83 -0
  12. package/template/.agents/skills/yss-cache/references/source-index.md +6 -63
  13. package/template/.agents/skills/yss-cache/scripts/check-skill-freshness.sh +20 -15
  14. package/template/.agents/skills/yss-ddd-scaffold-generator/SKILL.md +2 -2
  15. package/template/.agents/skills/yss-ddd-scaffold-generator/references/engineering-baseline.md +53 -0
  16. package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +5 -51
  17. package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/agents/openai.yaml +3 -3
  18. package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +1 -1
  19. package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +2 -2
  20. package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +2 -3
  21. package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
  22. package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +1 -1
  23. package/template/.agents/skills/yss-distributed-id/SKILL.md +4 -0
  24. package/template/.agents/skills/yss-distributed-id/references/source-index.boot2-java8.md +102 -0
  25. package/template/.agents/skills/yss-distributed-id/references/source-index.boot3-java17.md +90 -0
  26. package/template/.agents/skills/yss-distributed-id/references/source-index.md +6 -82
  27. package/template/.agents/skills/yss-dto/SKILL.md +2 -2
  28. package/template/.agents/skills/yss-dto/references/source-index.boot2-java8.md +67 -0
  29. package/template/.agents/skills/yss-dto/references/source-index.boot3-java17.md +70 -0
  30. package/template/.agents/skills/yss-dto/references/source-index.md +6 -51
  31. package/template/.agents/skills/yss-excel-mvc/SKILL.md +4 -0
  32. package/template/.agents/skills/yss-excel-mvc/references/source-index.boot2-java8.md +90 -0
  33. package/template/.agents/skills/yss-excel-mvc/references/source-index.boot3-java17.md +58 -0
  34. package/template/.agents/skills/yss-excel-mvc/references/source-index.md +6 -70
  35. package/template/.agents/skills/yss-exception/SKILL.md +12 -9
  36. package/template/.agents/skills/yss-exception/references/source-index.boot2-java8.md +50 -0
  37. package/template/.agents/skills/yss-exception/references/source-index.boot3-java17.md +50 -0
  38. package/template/.agents/skills/yss-exception/references/source-index.md +6 -31
  39. package/template/.agents/skills/yss-implementation-contract-compiler/SKILL.md +2 -0
  40. package/template/.agents/skills/yss-implementation-contract-compiler/references/boundaries.md +3 -5
  41. package/template/.agents/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +27 -2
  42. package/template/.agents/skills/yss-implementation-contract-compiler/references/yss-skill-execution-result.md +2 -1
  43. package/template/.agents/skills/yss-implementation-contract-compiler/tests/compiler-scenarios.test.mjs +60 -14
  44. package/template/.agents/skills/yss-layered-mvc-scaffold-generator/SKILL.md +6 -5
  45. package/template/.agents/skills/yss-layered-mvc-scaffold-generator/agents/openai.yaml +2 -2
  46. package/template/.agents/skills/yss-layered-mvc-scaffold-generator/references/architecture.md +2 -0
  47. package/template/.agents/skills/yss-layered-mvc-scaffold-generator/scripts/data-analysis-profile.mjs +82 -0
  48. package/template/.agents/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +23 -9
  49. package/template/.agents/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +30 -6
  50. package/template/.agents/skills/yss-layered-mvc-scaffold-generator/tests/scaffold-generator.test.mjs +2 -0
  51. package/template/.agents/skills/yss-mvc-data-analysis-project-initializer/SKILL.md +5 -15
  52. package/template/.agents/skills/yss-mvc-data-analysis-project-initializer/scripts/generate_project.mjs +9 -68
  53. package/template/.agents/skills/yss-mvc-design/SKILL.md +5 -9
  54. package/template/.agents/skills/yss-mvc-design/agents/openai.yaml +3 -3
  55. package/template/.agents/skills/yss-mybatis/SKILL.md +2 -2
  56. package/template/.agents/skills/yss-mybatis/references/source-index.boot2-java8.md +126 -0
  57. package/template/.agents/skills/yss-mybatis/references/source-index.boot3-java17.md +126 -0
  58. package/template/.agents/skills/yss-mybatis/references/source-index.md +6 -109
  59. package/template/.agents/skills/yss-product-lifecycle/references/orchestration-contract.yaml +10 -8
  60. package/template/.agents/skills/yss-product-lifecycle/references/orchestration.md +2 -2
  61. package/template/.agents/skills/yss-repository/SKILL.md +1 -1
  62. package/template/.agents/skills/yss-resilience4j/SKILL.md +4 -0
  63. package/template/.agents/skills/yss-resilience4j/references/source-index.boot2-java8.md +48 -0
  64. package/template/.agents/skills/yss-resilience4j/references/source-index.boot3-java17.md +48 -0
  65. package/template/.agents/skills/yss-resilience4j/references/source-index.md +6 -29
  66. package/template/.agents/skills/yss-security-algorithm/SKILL.md +34 -10
  67. package/template/.agents/skills/yss-security-algorithm/references/source-index.boot2-java8.md +50 -0
  68. package/template/.agents/skills/yss-security-algorithm/references/source-index.boot3-java17.md +51 -0
  69. package/template/.agents/skills/yss-security-algorithm/references/source-index.md +6 -31
  70. package/template/.agents/skills/yss-skill-source-index-refresh/SKILL.md +12 -6
  71. package/template/.agents/skills/yss-skill-source-index-refresh/references/backend-component-platform-compatibility.md +27 -0
  72. package/template/.agents/skills/yss-skill-source-index-refresh/references/source-location.md +4 -4
  73. package/template/.agents/skills/yss-skill-source-index-refresh/references/source-map-config.md +10 -3
  74. package/template/.agents/skills/yss-skill-source-index-refresh/scripts/check-backend-skill-source-index.mjs +60 -0
  75. package/template/.agents/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +247 -54
  76. package/template/.agents/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.test.mjs +74 -7
  77. package/template/.agents/skills/yss-tactical-design/SKILL.md +1 -1
  78. package/template/.agents/skills/yss-tactical-design/references/output-template.md +1 -1
  79. package/template/.agents/skills/yss-technical-design/SKILL.md +3 -1
  80. package/template/.agents/skills/yss-technical-design/references/mvc-design.schema.json +315 -0
  81. package/template/.agents/skills/yss-technical-design/references/technical-design-contract.md +1 -1
  82. package/template/.agents/skills/yss-technical-design/scripts/generate-schema.mjs +1 -1
  83. package/template/.agents/skills/yss-technical-design/tests/run-scenarios.mjs +4 -1
  84. package/template/.agents/skills/yss-up-springboot3/SKILL.md +23 -9
  85. package/template/.agents/skills/yss-userinfo/SKILL.md +21 -14
  86. package/template/.agents/skills/yss-userinfo/references/source-index.boot2-java8.md +49 -0
  87. package/template/.agents/skills/yss-userinfo/references/source-index.boot3-java17.md +54 -0
  88. package/template/.agents/skills/yss-userinfo/references/source-index.md +6 -30
  89. package/template/.agents/skills/yss-validation/SKILL.md +12 -17
  90. package/template/.agents/skills/yss-validation/references/source-index.boot2-java8.md +47 -0
  91. package/template/.agents/skills/yss-validation/references/source-index.boot3-java17.md +47 -0
  92. package/template/.agents/skills/yss-validation/references/source-index.md +6 -29
  93. package/template/.agents/skills/yss-web-controller/SKILL.md +4 -4
  94. package/template/.agents/skills/yss-web-controller/scripts/generate_controller.test.mjs +1 -1
  95. package/template/.codex/skills/yss-application/SKILL.md +8 -6
  96. package/template/.codex/skills/yss-audit-log/SKILL.md +12 -7
  97. package/template/.codex/skills/yss-audit-log/references/source-index.boot2-java8.md +57 -0
  98. package/template/.codex/skills/yss-audit-log/references/source-index.boot3-java17.md +58 -0
  99. package/template/.codex/skills/yss-audit-log/references/source-index.md +6 -39
  100. package/template/.codex/skills/yss-cache/SKILL.md +5 -1
  101. package/template/.codex/skills/yss-cache/references/source-index.boot2-java8.md +81 -0
  102. package/template/.codex/skills/yss-cache/references/source-index.boot3-java17.md +83 -0
  103. package/template/.codex/skills/yss-cache/references/source-index.md +6 -63
  104. package/template/.codex/skills/yss-cache/scripts/check-skill-freshness.sh +20 -15
  105. package/template/.codex/skills/yss-ddd-scaffold-generator/SKILL.md +2 -2
  106. package/template/.codex/skills/yss-ddd-scaffold-generator/references/engineering-baseline.md +53 -0
  107. package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +5 -51
  108. package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/agents/openai.yaml +3 -3
  109. package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +1 -1
  110. package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +2 -2
  111. package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +2 -3
  112. package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
  113. package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +1 -1
  114. package/template/.codex/skills/yss-distributed-id/SKILL.md +4 -0
  115. package/template/.codex/skills/yss-distributed-id/references/source-index.boot2-java8.md +102 -0
  116. package/template/.codex/skills/yss-distributed-id/references/source-index.boot3-java17.md +90 -0
  117. package/template/.codex/skills/yss-distributed-id/references/source-index.md +6 -82
  118. package/template/.codex/skills/yss-dto/SKILL.md +2 -2
  119. package/template/.codex/skills/yss-dto/references/source-index.boot2-java8.md +67 -0
  120. package/template/.codex/skills/yss-dto/references/source-index.boot3-java17.md +70 -0
  121. package/template/.codex/skills/yss-dto/references/source-index.md +6 -51
  122. package/template/.codex/skills/yss-excel-mvc/SKILL.md +4 -0
  123. package/template/.codex/skills/yss-excel-mvc/references/source-index.boot2-java8.md +90 -0
  124. package/template/.codex/skills/yss-excel-mvc/references/source-index.boot3-java17.md +58 -0
  125. package/template/.codex/skills/yss-excel-mvc/references/source-index.md +6 -70
  126. package/template/.codex/skills/yss-exception/SKILL.md +12 -9
  127. package/template/.codex/skills/yss-exception/references/source-index.boot2-java8.md +50 -0
  128. package/template/.codex/skills/yss-exception/references/source-index.boot3-java17.md +50 -0
  129. package/template/.codex/skills/yss-exception/references/source-index.md +6 -31
  130. package/template/.codex/skills/yss-implementation-contract-compiler/SKILL.md +2 -0
  131. package/template/.codex/skills/yss-implementation-contract-compiler/references/boundaries.md +3 -5
  132. package/template/.codex/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +27 -2
  133. package/template/.codex/skills/yss-implementation-contract-compiler/references/yss-skill-execution-result.md +2 -1
  134. package/template/.codex/skills/yss-implementation-contract-compiler/tests/compiler-scenarios.test.mjs +60 -14
  135. package/template/.codex/skills/yss-layered-mvc-scaffold-generator/SKILL.md +6 -5
  136. package/template/.codex/skills/yss-layered-mvc-scaffold-generator/agents/openai.yaml +2 -2
  137. package/template/.codex/skills/yss-layered-mvc-scaffold-generator/references/architecture.md +2 -0
  138. package/template/.codex/skills/yss-layered-mvc-scaffold-generator/scripts/data-analysis-profile.mjs +82 -0
  139. package/template/.codex/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +23 -9
  140. package/template/.codex/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +30 -6
  141. package/template/.codex/skills/yss-layered-mvc-scaffold-generator/tests/scaffold-generator.test.mjs +2 -0
  142. package/template/.codex/skills/yss-mvc-data-analysis-project-initializer/SKILL.md +5 -15
  143. package/template/.codex/skills/yss-mvc-data-analysis-project-initializer/scripts/generate_project.mjs +9 -68
  144. package/template/.codex/skills/yss-mvc-design/SKILL.md +5 -9
  145. package/template/.codex/skills/yss-mvc-design/agents/openai.yaml +3 -3
  146. package/template/.codex/skills/yss-mybatis/SKILL.md +2 -2
  147. package/template/.codex/skills/yss-mybatis/references/source-index.boot2-java8.md +126 -0
  148. package/template/.codex/skills/yss-mybatis/references/source-index.boot3-java17.md +126 -0
  149. package/template/.codex/skills/yss-mybatis/references/source-index.md +6 -109
  150. package/template/.codex/skills/yss-product-lifecycle/references/orchestration-contract.yaml +10 -8
  151. package/template/.codex/skills/yss-product-lifecycle/references/orchestration.md +2 -2
  152. package/template/.codex/skills/yss-repository/SKILL.md +1 -1
  153. package/template/.codex/skills/yss-resilience4j/SKILL.md +4 -0
  154. package/template/.codex/skills/yss-resilience4j/references/source-index.boot2-java8.md +48 -0
  155. package/template/.codex/skills/yss-resilience4j/references/source-index.boot3-java17.md +48 -0
  156. package/template/.codex/skills/yss-resilience4j/references/source-index.md +6 -29
  157. package/template/.codex/skills/yss-security-algorithm/SKILL.md +34 -10
  158. package/template/.codex/skills/yss-security-algorithm/references/source-index.boot2-java8.md +50 -0
  159. package/template/.codex/skills/yss-security-algorithm/references/source-index.boot3-java17.md +51 -0
  160. package/template/.codex/skills/yss-security-algorithm/references/source-index.md +6 -31
  161. package/template/.codex/skills/yss-skill-source-index-refresh/SKILL.md +12 -6
  162. package/template/.codex/skills/yss-skill-source-index-refresh/references/backend-component-platform-compatibility.md +27 -0
  163. package/template/.codex/skills/yss-skill-source-index-refresh/references/source-location.md +4 -4
  164. package/template/.codex/skills/yss-skill-source-index-refresh/references/source-map-config.md +10 -3
  165. package/template/.codex/skills/yss-skill-source-index-refresh/scripts/check-backend-skill-source-index.mjs +60 -0
  166. package/template/.codex/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +247 -54
  167. package/template/.codex/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.test.mjs +74 -7
  168. package/template/.codex/skills/yss-tactical-design/SKILL.md +1 -1
  169. package/template/.codex/skills/yss-tactical-design/references/output-template.md +1 -1
  170. package/template/.codex/skills/yss-technical-design/SKILL.md +3 -1
  171. package/template/.codex/skills/yss-technical-design/references/mvc-design.schema.json +315 -0
  172. package/template/.codex/skills/yss-technical-design/references/technical-design-contract.md +1 -1
  173. package/template/.codex/skills/yss-technical-design/scripts/generate-schema.mjs +1 -1
  174. package/template/.codex/skills/yss-technical-design/tests/run-scenarios.mjs +4 -1
  175. package/template/.codex/skills/yss-up-springboot3/SKILL.md +23 -9
  176. package/template/.codex/skills/yss-userinfo/SKILL.md +21 -14
  177. package/template/.codex/skills/yss-userinfo/references/source-index.boot2-java8.md +49 -0
  178. package/template/.codex/skills/yss-userinfo/references/source-index.boot3-java17.md +54 -0
  179. package/template/.codex/skills/yss-userinfo/references/source-index.md +6 -30
  180. package/template/.codex/skills/yss-validation/SKILL.md +12 -17
  181. package/template/.codex/skills/yss-validation/references/source-index.boot2-java8.md +47 -0
  182. package/template/.codex/skills/yss-validation/references/source-index.boot3-java17.md +47 -0
  183. package/template/.codex/skills/yss-validation/references/source-index.md +6 -29
  184. package/template/.codex/skills/yss-web-controller/SKILL.md +4 -4
  185. package/template/.codex/skills/yss-web-controller/scripts/generate_controller.test.mjs +1 -1
  186. package/template/.cursor/skills/yss-application/SKILL.md +8 -6
  187. package/template/.cursor/skills/yss-audit-log/SKILL.md +12 -7
  188. package/template/.cursor/skills/yss-audit-log/references/source-index.boot2-java8.md +57 -0
  189. package/template/.cursor/skills/yss-audit-log/references/source-index.boot3-java17.md +58 -0
  190. package/template/.cursor/skills/yss-audit-log/references/source-index.md +6 -39
  191. package/template/.cursor/skills/yss-cache/SKILL.md +5 -1
  192. package/template/.cursor/skills/yss-cache/references/source-index.boot2-java8.md +81 -0
  193. package/template/.cursor/skills/yss-cache/references/source-index.boot3-java17.md +83 -0
  194. package/template/.cursor/skills/yss-cache/references/source-index.md +6 -63
  195. package/template/.cursor/skills/yss-cache/scripts/check-skill-freshness.sh +20 -15
  196. package/template/.cursor/skills/yss-ddd-scaffold-generator/SKILL.md +2 -2
  197. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/engineering-baseline.md +53 -0
  198. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +5 -51
  199. package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/agents/openai.yaml +3 -3
  200. package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +1 -1
  201. package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +2 -2
  202. package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +2 -3
  203. package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
  204. package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +1 -1
  205. package/template/.cursor/skills/yss-distributed-id/SKILL.md +4 -0
  206. package/template/.cursor/skills/yss-distributed-id/references/source-index.boot2-java8.md +102 -0
  207. package/template/.cursor/skills/yss-distributed-id/references/source-index.boot3-java17.md +90 -0
  208. package/template/.cursor/skills/yss-distributed-id/references/source-index.md +6 -82
  209. package/template/.cursor/skills/yss-dto/SKILL.md +2 -2
  210. package/template/.cursor/skills/yss-dto/references/source-index.boot2-java8.md +67 -0
  211. package/template/.cursor/skills/yss-dto/references/source-index.boot3-java17.md +70 -0
  212. package/template/.cursor/skills/yss-dto/references/source-index.md +6 -51
  213. package/template/.cursor/skills/yss-excel-mvc/SKILL.md +4 -0
  214. package/template/.cursor/skills/yss-excel-mvc/references/source-index.boot2-java8.md +90 -0
  215. package/template/.cursor/skills/yss-excel-mvc/references/source-index.boot3-java17.md +58 -0
  216. package/template/.cursor/skills/yss-excel-mvc/references/source-index.md +6 -70
  217. package/template/.cursor/skills/yss-exception/SKILL.md +12 -9
  218. package/template/.cursor/skills/yss-exception/references/source-index.boot2-java8.md +50 -0
  219. package/template/.cursor/skills/yss-exception/references/source-index.boot3-java17.md +50 -0
  220. package/template/.cursor/skills/yss-exception/references/source-index.md +6 -31
  221. package/template/.cursor/skills/yss-implementation-contract-compiler/SKILL.md +2 -0
  222. package/template/.cursor/skills/yss-implementation-contract-compiler/references/boundaries.md +3 -5
  223. package/template/.cursor/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +27 -2
  224. package/template/.cursor/skills/yss-implementation-contract-compiler/references/yss-skill-execution-result.md +2 -1
  225. package/template/.cursor/skills/yss-implementation-contract-compiler/tests/compiler-scenarios.test.mjs +60 -14
  226. package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/SKILL.md +6 -5
  227. package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/agents/openai.yaml +2 -2
  228. package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/references/architecture.md +2 -0
  229. package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/scripts/data-analysis-profile.mjs +82 -0
  230. package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +23 -9
  231. package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +30 -6
  232. package/template/.cursor/skills/yss-layered-mvc-scaffold-generator/tests/scaffold-generator.test.mjs +2 -0
  233. package/template/.cursor/skills/yss-mvc-data-analysis-project-initializer/SKILL.md +5 -15
  234. package/template/.cursor/skills/yss-mvc-data-analysis-project-initializer/scripts/generate_project.mjs +9 -68
  235. package/template/.cursor/skills/yss-mvc-design/SKILL.md +5 -9
  236. package/template/.cursor/skills/yss-mvc-design/agents/openai.yaml +3 -3
  237. package/template/.cursor/skills/yss-mybatis/SKILL.md +2 -2
  238. package/template/.cursor/skills/yss-mybatis/references/source-index.boot2-java8.md +126 -0
  239. package/template/.cursor/skills/yss-mybatis/references/source-index.boot3-java17.md +126 -0
  240. package/template/.cursor/skills/yss-mybatis/references/source-index.md +6 -109
  241. package/template/.cursor/skills/yss-product-lifecycle/references/orchestration-contract.yaml +10 -8
  242. package/template/.cursor/skills/yss-product-lifecycle/references/orchestration.md +2 -2
  243. package/template/.cursor/skills/yss-repository/SKILL.md +1 -1
  244. package/template/.cursor/skills/yss-resilience4j/SKILL.md +4 -0
  245. package/template/.cursor/skills/yss-resilience4j/references/source-index.boot2-java8.md +48 -0
  246. package/template/.cursor/skills/yss-resilience4j/references/source-index.boot3-java17.md +48 -0
  247. package/template/.cursor/skills/yss-resilience4j/references/source-index.md +6 -29
  248. package/template/.cursor/skills/yss-security-algorithm/SKILL.md +34 -10
  249. package/template/.cursor/skills/yss-security-algorithm/references/source-index.boot2-java8.md +50 -0
  250. package/template/.cursor/skills/yss-security-algorithm/references/source-index.boot3-java17.md +51 -0
  251. package/template/.cursor/skills/yss-security-algorithm/references/source-index.md +6 -31
  252. package/template/.cursor/skills/yss-skill-source-index-refresh/SKILL.md +12 -6
  253. package/template/.cursor/skills/yss-skill-source-index-refresh/references/backend-component-platform-compatibility.md +27 -0
  254. package/template/.cursor/skills/yss-skill-source-index-refresh/references/source-location.md +4 -4
  255. package/template/.cursor/skills/yss-skill-source-index-refresh/references/source-map-config.md +10 -3
  256. package/template/.cursor/skills/yss-skill-source-index-refresh/scripts/check-backend-skill-source-index.mjs +60 -0
  257. package/template/.cursor/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +247 -54
  258. package/template/.cursor/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.test.mjs +74 -7
  259. package/template/.cursor/skills/yss-tactical-design/SKILL.md +1 -1
  260. package/template/.cursor/skills/yss-tactical-design/references/output-template.md +1 -1
  261. package/template/.cursor/skills/yss-technical-design/SKILL.md +3 -1
  262. package/template/.cursor/skills/yss-technical-design/references/mvc-design.schema.json +315 -0
  263. package/template/.cursor/skills/yss-technical-design/references/technical-design-contract.md +1 -1
  264. package/template/.cursor/skills/yss-technical-design/scripts/generate-schema.mjs +1 -1
  265. package/template/.cursor/skills/yss-technical-design/tests/run-scenarios.mjs +4 -1
  266. package/template/.cursor/skills/yss-up-springboot3/SKILL.md +23 -9
  267. package/template/.cursor/skills/yss-userinfo/SKILL.md +21 -14
  268. package/template/.cursor/skills/yss-userinfo/references/source-index.boot2-java8.md +49 -0
  269. package/template/.cursor/skills/yss-userinfo/references/source-index.boot3-java17.md +54 -0
  270. package/template/.cursor/skills/yss-userinfo/references/source-index.md +6 -30
  271. package/template/.cursor/skills/yss-validation/SKILL.md +12 -17
  272. package/template/.cursor/skills/yss-validation/references/source-index.boot2-java8.md +47 -0
  273. package/template/.cursor/skills/yss-validation/references/source-index.boot3-java17.md +47 -0
  274. package/template/.cursor/skills/yss-validation/references/source-index.md +6 -29
  275. package/template/.cursor/skills/yss-web-controller/SKILL.md +4 -4
  276. package/template/.cursor/skills/yss-web-controller/scripts/generate_controller.test.mjs +1 -1
  277. package/template/.pi/skills/yss-application/SKILL.md +8 -6
  278. package/template/.pi/skills/yss-audit-log/SKILL.md +12 -7
  279. package/template/.pi/skills/yss-audit-log/references/source-index.boot2-java8.md +57 -0
  280. package/template/.pi/skills/yss-audit-log/references/source-index.boot3-java17.md +58 -0
  281. package/template/.pi/skills/yss-audit-log/references/source-index.md +6 -39
  282. package/template/.pi/skills/yss-cache/SKILL.md +5 -1
  283. package/template/.pi/skills/yss-cache/references/source-index.boot2-java8.md +81 -0
  284. package/template/.pi/skills/yss-cache/references/source-index.boot3-java17.md +83 -0
  285. package/template/.pi/skills/yss-cache/references/source-index.md +6 -63
  286. package/template/.pi/skills/yss-cache/scripts/check-skill-freshness.sh +20 -15
  287. package/template/.pi/skills/yss-ddd-scaffold-generator/SKILL.md +2 -2
  288. package/template/.pi/skills/yss-ddd-scaffold-generator/references/engineering-baseline.md +53 -0
  289. package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +5 -51
  290. package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/agents/openai.yaml +3 -3
  291. package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +1 -1
  292. package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +2 -2
  293. package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +2 -3
  294. package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/run_scaffold_verification.mjs +1 -1
  295. package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +1 -1
  296. package/template/.pi/skills/yss-distributed-id/SKILL.md +4 -0
  297. package/template/.pi/skills/yss-distributed-id/references/source-index.boot2-java8.md +102 -0
  298. package/template/.pi/skills/yss-distributed-id/references/source-index.boot3-java17.md +90 -0
  299. package/template/.pi/skills/yss-distributed-id/references/source-index.md +6 -82
  300. package/template/.pi/skills/yss-dto/SKILL.md +2 -2
  301. package/template/.pi/skills/yss-dto/references/source-index.boot2-java8.md +67 -0
  302. package/template/.pi/skills/yss-dto/references/source-index.boot3-java17.md +70 -0
  303. package/template/.pi/skills/yss-dto/references/source-index.md +6 -51
  304. package/template/.pi/skills/yss-excel-mvc/SKILL.md +4 -0
  305. package/template/.pi/skills/yss-excel-mvc/references/source-index.boot2-java8.md +90 -0
  306. package/template/.pi/skills/yss-excel-mvc/references/source-index.boot3-java17.md +58 -0
  307. package/template/.pi/skills/yss-excel-mvc/references/source-index.md +6 -70
  308. package/template/.pi/skills/yss-exception/SKILL.md +12 -9
  309. package/template/.pi/skills/yss-exception/references/source-index.boot2-java8.md +50 -0
  310. package/template/.pi/skills/yss-exception/references/source-index.boot3-java17.md +50 -0
  311. package/template/.pi/skills/yss-exception/references/source-index.md +6 -31
  312. package/template/.pi/skills/yss-implementation-contract-compiler/SKILL.md +2 -0
  313. package/template/.pi/skills/yss-implementation-contract-compiler/references/boundaries.md +3 -5
  314. package/template/.pi/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +27 -2
  315. package/template/.pi/skills/yss-implementation-contract-compiler/references/yss-skill-execution-result.md +2 -1
  316. package/template/.pi/skills/yss-implementation-contract-compiler/tests/compiler-scenarios.test.mjs +60 -14
  317. package/template/.pi/skills/yss-layered-mvc-scaffold-generator/SKILL.md +6 -5
  318. package/template/.pi/skills/yss-layered-mvc-scaffold-generator/agents/openai.yaml +2 -2
  319. package/template/.pi/skills/yss-layered-mvc-scaffold-generator/references/architecture.md +2 -0
  320. package/template/.pi/skills/yss-layered-mvc-scaffold-generator/scripts/data-analysis-profile.mjs +82 -0
  321. package/template/.pi/skills/yss-layered-mvc-scaffold-generator/scripts/generate_scaffold.mjs +23 -9
  322. package/template/.pi/skills/yss-layered-mvc-scaffold-generator/scripts/scaffold-generator.test.mjs +30 -6
  323. package/template/.pi/skills/yss-layered-mvc-scaffold-generator/tests/scaffold-generator.test.mjs +2 -0
  324. package/template/.pi/skills/yss-mvc-data-analysis-project-initializer/SKILL.md +5 -15
  325. package/template/.pi/skills/yss-mvc-data-analysis-project-initializer/scripts/generate_project.mjs +9 -68
  326. package/template/.pi/skills/yss-mvc-design/SKILL.md +5 -9
  327. package/template/.pi/skills/yss-mvc-design/agents/openai.yaml +3 -3
  328. package/template/.pi/skills/yss-mybatis/SKILL.md +2 -2
  329. package/template/.pi/skills/yss-mybatis/references/source-index.boot2-java8.md +126 -0
  330. package/template/.pi/skills/yss-mybatis/references/source-index.boot3-java17.md +126 -0
  331. package/template/.pi/skills/yss-mybatis/references/source-index.md +6 -109
  332. package/template/.pi/skills/yss-product-lifecycle/references/orchestration-contract.yaml +10 -8
  333. package/template/.pi/skills/yss-product-lifecycle/references/orchestration.md +2 -2
  334. package/template/.pi/skills/yss-repository/SKILL.md +1 -1
  335. package/template/.pi/skills/yss-resilience4j/SKILL.md +4 -0
  336. package/template/.pi/skills/yss-resilience4j/references/source-index.boot2-java8.md +48 -0
  337. package/template/.pi/skills/yss-resilience4j/references/source-index.boot3-java17.md +48 -0
  338. package/template/.pi/skills/yss-resilience4j/references/source-index.md +6 -29
  339. package/template/.pi/skills/yss-security-algorithm/SKILL.md +34 -10
  340. package/template/.pi/skills/yss-security-algorithm/references/source-index.boot2-java8.md +50 -0
  341. package/template/.pi/skills/yss-security-algorithm/references/source-index.boot3-java17.md +51 -0
  342. package/template/.pi/skills/yss-security-algorithm/references/source-index.md +6 -31
  343. package/template/.pi/skills/yss-skill-source-index-refresh/SKILL.md +12 -6
  344. package/template/.pi/skills/yss-skill-source-index-refresh/references/backend-component-platform-compatibility.md +27 -0
  345. package/template/.pi/skills/yss-skill-source-index-refresh/references/source-location.md +4 -4
  346. package/template/.pi/skills/yss-skill-source-index-refresh/references/source-map-config.md +10 -3
  347. package/template/.pi/skills/yss-skill-source-index-refresh/scripts/check-backend-skill-source-index.mjs +60 -0
  348. package/template/.pi/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.mjs +247 -54
  349. package/template/.pi/skills/yss-skill-source-index-refresh/scripts/refresh-yss-skill-index.test.mjs +74 -7
  350. package/template/.pi/skills/yss-tactical-design/SKILL.md +1 -1
  351. package/template/.pi/skills/yss-tactical-design/references/output-template.md +1 -1
  352. package/template/.pi/skills/yss-technical-design/SKILL.md +3 -1
  353. package/template/.pi/skills/yss-technical-design/references/mvc-design.schema.json +315 -0
  354. package/template/.pi/skills/yss-technical-design/references/technical-design-contract.md +1 -1
  355. package/template/.pi/skills/yss-technical-design/scripts/generate-schema.mjs +1 -1
  356. package/template/.pi/skills/yss-technical-design/tests/run-scenarios.mjs +4 -1
  357. package/template/.pi/skills/yss-up-springboot3/SKILL.md +23 -9
  358. package/template/.pi/skills/yss-userinfo/SKILL.md +21 -14
  359. package/template/.pi/skills/yss-userinfo/references/source-index.boot2-java8.md +49 -0
  360. package/template/.pi/skills/yss-userinfo/references/source-index.boot3-java17.md +54 -0
  361. package/template/.pi/skills/yss-userinfo/references/source-index.md +6 -30
  362. package/template/.pi/skills/yss-validation/SKILL.md +12 -17
  363. package/template/.pi/skills/yss-validation/references/source-index.boot2-java8.md +47 -0
  364. package/template/.pi/skills/yss-validation/references/source-index.boot3-java17.md +47 -0
  365. package/template/.pi/skills/yss-validation/references/source-index.md +6 -29
  366. package/template/.pi/skills/yss-web-controller/SKILL.md +4 -4
  367. package/template/.pi/skills/yss-web-controller/scripts/generate_controller.test.mjs +1 -1
  368. package/template/docs/agents/backend-architecture-profiles.md +1 -1
  369. package/template/docs/agents/digital-human-roles.yaml +1 -1
  370. package/template/docs/agents/skill-migrations.md +23 -0
  371. package/template/docs/agents/yss-skill-registry.yaml +109 -40
  372. package/template/docs/api/templates/openapi-draft-review-checklist.md +1 -1
  373. package/template/docs/architecture/templates/engineering-baseline-review-template.md +3 -3
  374. package/template/docs/architecture/templates/system-overview-design-template.md +1 -1
  375. package/template/docs/engineering/backend-platforms.json +662 -9
  376. package/template/docs/engineering/backend-platforms.md +33 -7
  377. package/template/docs/process/schemas/backend-architecture-identity.schema.json +102 -0
  378. package/template/docs/process/schemas/project-scaffold-contract.schema.json +16 -4
  379. package/template/docs/process/schemas/scaffold-architecture-decisions.schema.json +7 -0
  380. package/template/docs/process/schemas/slice-implementation-contract-v3.schema.json +143 -0
  381. package/template/docs/process/strategic-handoff-package.md +1 -1
  382. package/template/docs/templates/implementation-routing-template.md +1 -1
  383. package/template/docs/user-guide//346/212/200/346/234/257/350/256/276/350/256/241/347/224/250/346/210/267/346/214/207/345/215/227.md +2 -2
  384. package/template/scripts/backend-platforms +77 -8
  385. package/template/scripts/lib/backend-platform.mjs +232 -5
  386. package/template/scripts/lib/existing-backend-architecture.mjs +3 -2
  387. package/template/scripts/lib/implementation-contract-compiler.mjs +93 -9
  388. package/template/scripts/lib/skill-registry.mjs +165 -12
  389. package/template/scripts/lib/slice-contract-preparation.mjs +6 -5
  390. package/template/scripts/verify-backend-platform-matrix +1 -1
  391. package/template/skills-lock.json +29 -29
  392. package/template.snapshot.json +4 -4
@@ -1,12 +1,13 @@
1
1
  import { existsSync, readFileSync } from "node:fs";
2
2
  import path from "node:path";
3
3
  import { parseDocument } from "../vendor/yaml.mjs";
4
- import { nestedSkillPaths, PROJECTION_ROOTS, ROOT, unregisteredNestedSkillPaths } from "./skill-supply-chain.mjs";
4
+ import { nestedSkillPaths, OBSOLETE, PROJECTION_ROOTS, ROOT, unregisteredNestedSkillPaths } from "./skill-supply-chain.mjs";
5
5
 
6
6
  export const DEFAULT_REGISTRY = path.join(ROOT, "docs/agents/yss-skill-registry.yaml");
7
7
  const LOCK_PATH = path.join(ROOT, "skills-lock.json");
8
8
  const COMPILER_CONTRACT = path.join(ROOT, ".agents/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml");
9
9
  const LIFECYCLE_CONTRACT = path.join(ROOT, ".agents/skills/yss-product-lifecycle/references/orchestration-contract.yaml");
10
+ const BACKEND_PLATFORMS = path.join(ROOT, "docs/engineering/backend-platforms.json");
10
11
  const LAYERS = new Set(["core", "specialist", "compatibility", "maintainer-only"]);
11
12
  const MATURITIES = new Set(["draft", "verified", "supported", "deprecated"]);
12
13
  const INVOCATION_MODES = new Set(["user", "model", "both"]);
@@ -15,6 +16,24 @@ const TASK_MODES = new Set(["guidance", "integration", "slice-implementation", "
15
16
  const ID_PATTERN = /^[a-z0-9][a-z0-9-]*$/;
16
17
  const CAPABILITY_ID_PATTERN = /^[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+$/;
17
18
  const PLATFORM_ALIAS_PATTERN = /^[a-z0-9][a-z0-9-]*(?::[a-z0-9][a-z0-9-]*)?$/;
19
+ const PROVIDER_KINDS = new Set(["yss-component", "platform-managed", "none"]);
20
+ const BACKEND_SKILL_DOMAINS = new Set(["technical-design", "layered-implementation", "wire-framework-contract", "component-capability", "engineering-initialization", "platform-governance-migration"]);
21
+ const CLEANUP_STATUSES = new Set(["migration-only", "remove-ready"]);
22
+ const ISO_DATE_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
23
+
24
+ export const SKILL_LIFECYCLE_FAILURE_CODES = Object.freeze({
25
+ deprecated: "skill-deprecated",
26
+ retired: "skill-retired"
27
+ });
28
+
29
+ export class SkillLifecycleError extends TypeError {
30
+ constructor(code, message, details = {}) {
31
+ super(`${code}: ${message}`);
32
+ this.name = "SkillLifecycleError";
33
+ this.code = code;
34
+ this.details = details;
35
+ }
36
+ }
18
37
 
19
38
  function fail(message) {
20
39
  throw new TypeError(message);
@@ -39,6 +58,34 @@ export function loadSkillRegistry(filePath = DEFAULT_REGISTRY) {
39
58
  return yamlFromFile(filePath, "技能路由注册表");
40
59
  }
41
60
 
61
+ export function resolveSkillForNewUse(registry, requestedId) {
62
+ requireString(requestedId, "requested skill id");
63
+ if (OBSOLETE.has(requestedId)) {
64
+ throw new SkillLifecycleError(
65
+ SKILL_LIFECYCLE_FAILURE_CODES.retired,
66
+ `${requestedId} 已硬退役;按迁移 tombstone 重新路由`,
67
+ { skill: requestedId, migration_ref: "docs/agents/skill-migrations.md" }
68
+ );
69
+ }
70
+ const aliases = new Map((registry.skills ?? []).flatMap((skill) => (skill.aliases ?? []).map((alias) => [alias, skill.id])));
71
+ const canonicalId = aliases.get(requestedId) ?? requestedId;
72
+ const skill = [...(registry.skills ?? []), ...(registry.external_skills ?? [])].find((item) => item.id === canonicalId);
73
+ if (!skill) fail(`未知 skill: ${requestedId}`);
74
+ if (skill.maturity === "deprecated") {
75
+ throw new SkillLifecycleError(
76
+ SKILL_LIFECYCLE_FAILURE_CODES.deprecated,
77
+ `${canonicalId} 已停止新用法;必须重新编译并显式迁移到 ${skill.replacement_skill}`,
78
+ {
79
+ skill: canonicalId,
80
+ replacement_skill: skill.replacement_skill,
81
+ remove_after: skill.deprecation.remove_after,
82
+ cleanup_status: skill.deprecation.cleanup_status
83
+ }
84
+ );
85
+ }
86
+ return skill;
87
+ }
88
+
42
89
  function frontmatterName(skillMd) {
43
90
  const match = skillMd.match(/^---\r?\n([\s\S]*?)\r?\n---/);
44
91
  if (!match) fail("SKILL.md 缺少 frontmatter");
@@ -61,6 +108,26 @@ function requireStringArray(value, field, { nonEmpty = false } = {}) {
61
108
  }
62
109
  }
63
110
 
111
+ function exactValuePaths(value, targets, current = "$", found = []) {
112
+ if (typeof value === "string" && targets.has(value)) found.push(current);
113
+ else if (Array.isArray(value)) value.forEach((item, index) => exactValuePaths(item, targets, `${current}[${index}]`, found));
114
+ else if (value && typeof value === "object") for (const [key, item] of Object.entries(value)) exactValuePaths(item, targets, `${current}.${key}`, found);
115
+ return found;
116
+ }
117
+
118
+ function validateDeprecation(skill, prefix) {
119
+ requireString(skill.replacement_skill, `${prefix}.replacement_skill`);
120
+ requireObject(skill.deprecation, `${prefix}.deprecation`);
121
+ if (skill.deprecation.new_use !== "forbidden") fail(`${prefix}.deprecation.new_use 必须为 forbidden`);
122
+ if (!CLEANUP_STATUSES.has(skill.deprecation.cleanup_status)) {
123
+ fail(`${prefix}.deprecation.cleanup_status 必须是 migration-only 或 remove-ready`);
124
+ }
125
+ requireString(skill.deprecation.remove_after, `${prefix}.deprecation.remove_after`);
126
+ if (!ISO_DATE_PATTERN.test(skill.deprecation.remove_after) || Number.isNaN(Date.parse(`${skill.deprecation.remove_after}T00:00:00Z`))) {
127
+ fail(`${prefix}.deprecation.remove_after 必须是有效 ISO 日期`);
128
+ }
129
+ }
130
+
64
131
  function effectiveInvocationContract(registry, skill) {
65
132
  const contract = registry.invocation_contract;
66
133
  return {
@@ -217,9 +284,9 @@ function validateCodeReviewRoute(route, resolve) {
217
284
  validateFindingDisposition(standards.finding_disposition);
218
285
  }
219
286
 
220
- export function validateSkillRegistry(registry, { lock, compilerContract, lifecycleContract, skillSource, externalSkillSource, nestedSkillSources } = {}) {
287
+ export function validateSkillRegistry(registry, { lock, compilerContract, lifecycleContract, skillSource, externalSkillSource, nestedSkillSources, backendPlatforms } = {}) {
221
288
  if (!registry || typeof registry !== "object" || Array.isArray(registry)) fail("技能路由注册表必须是对象");
222
- if (registry.schema_version !== 2) fail("schema_version 必须为 2;v1 已停止支持,请迁移 capability、typed dependencies 与 recipes");
289
+ if (registry.schema_version !== 3) fail("schema_version 必须为 3;v1/v2 已停止支持,请迁移 provider 与两阶段退役合同");
223
290
  if (registry.registry_id !== "yss.skill-routing") fail("registry_id 必须为 yss.skill-routing");
224
291
  if (!["shadow", "active"].includes(registry.status)) fail("status 必须是 shadow 或 active");
225
292
  requireString(registry.description, "description");
@@ -271,13 +338,10 @@ export function validateSkillRegistry(registry, { lock, compilerContract, lifecy
271
338
  fail(`${skill.id} 作为 ${skill.layer} 不得默认可发现`);
272
339
  }
273
340
  if (skill.maturity === "deprecated") {
274
- requireString(skill.replaced_by, `${skill.id}.replaced_by`);
275
- requireString(skill.migration_deadline, `${skill.id}.migration_deadline`);
276
- requireString(skill.cleanup_status, `${skill.id}.cleanup_status`);
277
- }
278
- if (skill.replaced_by && !ids.has(skill.replaced_by) && !skills.some((item) => item.id === skill.replaced_by)) {
279
- // resolved in second pass
341
+ validateDeprecation(skill, prefix);
342
+ if (registry.invocation_contract?.overrides?.[skill.id] !== undefined) fail(`${skill.id} 进入 deprecated 后不得保留 invocation override`);
280
343
  }
344
+ else if (skill.replacement_skill !== undefined || skill.deprecation !== undefined) fail(`${skill.id} 仅 deprecated 技能可声明 replacement_skill/deprecation`);
281
345
  if (!Array.isArray(skill.aliases) || skill.aliases.some((alias) => typeof alias !== "string" || !ID_PATTERN.test(alias))) {
282
346
  fail(`${skill.id} aliases 必须是合法 id 数组`);
283
347
  }
@@ -292,7 +356,23 @@ export function validateSkillRegistry(registry, { lock, compilerContract, lifecy
292
356
  validateInvocationContract(registry, skill);
293
357
  }
294
358
  for (const skill of skills) {
295
- if (skill.replaced_by && !ids.has(skill.replaced_by)) fail(`${skill.id}.replaced_by 引用了未登记技能: ${skill.replaced_by}`);
359
+ if (skill.maturity === "deprecated") {
360
+ if (!ids.has(skill.replacement_skill)) fail(`${skill.id}.replacement_skill 引用了未登记技能: ${skill.replacement_skill}`);
361
+ if (skills.find((item) => item.id === skill.replacement_skill)?.maturity === "deprecated") fail(`${skill.id}.replacement_skill 不得指向 deprecated 技能`);
362
+ if (skill.aliases.length) fail(`${skill.id} 进入 deprecated 后不得保留 alias`);
363
+ }
364
+ }
365
+
366
+ requireObject(registry.retirement_contract, "retirement_contract");
367
+ if (registry.retirement_contract.schema_version !== 1) fail("retirement_contract.schema_version 必须为 1");
368
+ requireStringSet(registry.retirement_contract.stages, ["deprecated", "retired"], "retirement_contract.stages");
369
+ if (registry.retirement_contract.deprecated_new_use !== "forbidden") fail("retirement_contract.deprecated_new_use 必须为 forbidden");
370
+ requireStringSet(registry.retirement_contract.cleanup_statuses, [...CLEANUP_STATUSES], "retirement_contract.cleanup_statuses");
371
+ if (registry.retirement_contract.hard_retirement_tombstone !== "docs/agents/skill-migrations.md") fail("retirement_contract.hard_retirement_tombstone 必须指向技能迁移说明");
372
+ if (registry.retirement_contract.retired_id_source !== "scripts/lib/skill-supply-chain.mjs#OBSOLETE") fail("retirement_contract.retired_id_source 必须指向统一 OBSOLETE 集");
373
+ requireObject(registry.retirement_contract.failure_codes, "retirement_contract.failure_codes");
374
+ if (registry.retirement_contract.failure_codes.deprecated !== SKILL_LIFECYCLE_FAILURE_CODES.deprecated || registry.retirement_contract.failure_codes.retired !== SKILL_LIFECYCLE_FAILURE_CODES.retired) {
375
+ fail("retirement_contract.failure_codes 必须稳定为 skill-deprecated/skill-retired");
296
376
  }
297
377
 
298
378
  const platform = registry.platform_skills ?? [];
@@ -319,6 +399,9 @@ export function validateSkillRegistry(registry, { lock, compilerContract, lifecy
319
399
  for (const skill of external) {
320
400
  requireString(skill.id, "external_skills.id");
321
401
  requireString(skill.source, `${skill.id}.source`);
402
+ if (skill.maturity !== undefined && skill.maturity !== "deprecated") fail(`${skill.id}.maturity 仅允许 deprecated`);
403
+ if (skill.maturity === "deprecated") validateDeprecation(skill, `external_skills.${skill.id}`);
404
+ else if (skill.replacement_skill !== undefined || skill.deprecation !== undefined) fail(`${skill.id} 仅 deprecated external skill 可声明 replacement_skill/deprecation`);
322
405
  if (externalIds.has(skill.id) || ids.has(skill.id) || aliases.has(skill.id) || platformAliases.has(skill.id)) fail(`external skill 冲突: ${skill.id}`);
323
406
  const canonicalExternalSource = skill.source.startsWith(`${registry.canonical_content_root}/`);
324
407
  if (canonicalExternalSource && externalSources.has(skill.source)) fail(`external skill source 重复: ${skill.source}`);
@@ -329,6 +412,20 @@ export function validateSkillRegistry(registry, { lock, compilerContract, lifecy
329
412
  externalIds.add(skill.id);
330
413
  externalSources.add(skill.source);
331
414
  }
415
+ for (const skill of external.filter((item) => item.maturity === "deprecated")) {
416
+ if (!ids.has(skill.replacement_skill)) fail(`${skill.id}.replacement_skill 引用了未登记技能: ${skill.replacement_skill}`);
417
+ if (skills.find((item) => item.id === skill.replacement_skill)?.maturity === "deprecated") fail(`${skill.id}.replacement_skill 不得指向 deprecated 技能`);
418
+ }
419
+ const deprecatedSkillIds = new Set([
420
+ ...skills.filter((item) => item.maturity === "deprecated").map((item) => item.id),
421
+ ...external.filter((item) => item.maturity === "deprecated").map((item) => item.id)
422
+ ]);
423
+ for (const [profileId, profile] of Object.entries(registry.architecture_profiles ?? {})) {
424
+ requireObject(profile, `architecture_profiles.${profileId}`);
425
+ requireString(profile.generator_skill, `architecture_profiles.${profileId}.generator_skill`);
426
+ if (!ids.has(profile.generator_skill)) fail(`${profileId}.generator_skill 引用了未登记技能: ${profile.generator_skill}`);
427
+ if (deprecatedSkillIds.has(profile.generator_skill)) fail(`${profileId}.generator_skill 不得使用 deprecated skill: ${profile.generator_skill}`);
428
+ }
332
429
  if (nestedSkillSources) {
333
430
  const unregistered = unregisteredNestedSkillPaths(nestedSkillSources, externalSources);
334
431
  if (unregistered.length) fail(`嵌套 SKILL.md 必须登记到 external_skills: ${unregistered.join(", ")}`);
@@ -347,7 +444,7 @@ export function validateSkillRegistry(registry, { lock, compilerContract, lifecy
347
444
  || [...platformIds].some((key) => key.endsWith(`:${name}`));
348
445
  const capabilityContract = registry.capability_contract;
349
446
  requireObject(capabilityContract, "capability_contract");
350
- if (capabilityContract.schema_version !== 2) fail("capability_contract.schema_version 必须为 2");
447
+ if (capabilityContract.schema_version !== 3) fail("capability_contract.schema_version 必须为 3");
351
448
  requireStringSet(capabilityContract.dependency_types, [...DEPENDENCY_TYPES], "capability_contract.dependency_types");
352
449
  requireStringSet(capabilityContract.task_modes, [...TASK_MODES], "capability_contract.task_modes");
353
450
  requireObject(capabilityContract.closure, "capability_contract.closure");
@@ -360,6 +457,11 @@ export function validateSkillRegistry(registry, { lock, compilerContract, lifecy
360
457
  if (JSON.stringify(capabilityContract.deterministic_order) !== JSON.stringify(["recipe-declaration", "dependency-topology", "skill-id"])) {
361
458
  fail("capability_contract.deterministic_order 必须固定为 recipe-declaration、dependency-topology、skill-id");
362
459
  }
460
+ requireObject(capabilityContract.platform_component_binding, "capability_contract.platform_component_binding");
461
+ if (capabilityContract.platform_component_binding.marker !== "provider" || capabilityContract.platform_component_binding.required_kind !== "yss-component" || capabilityContract.platform_component_binding.catalog_source !== "docs/engineering/backend-platforms.json") {
462
+ fail("capability_contract.platform_component_binding 必须绑定中央后端平台目录");
463
+ }
464
+ requireStringSet(capabilityContract.provider_kinds, [...PROVIDER_KINDS], "capability_contract.provider_kinds");
363
465
 
364
466
  if (!Array.isArray(registry.capabilities) || registry.capabilities.length === 0) fail("capabilities 不能为空");
365
467
  const capabilityIds = new Set();
@@ -373,14 +475,49 @@ export function validateSkillRegistry(registry, { lock, compilerContract, lifecy
373
475
  capabilityIds.add(capability.id);
374
476
  requireString(capability.primary_skill, `${prefix}.primary_skill`);
375
477
  if (!ids.has(capability.primary_skill)) fail(`${capability.id} 的 primary_skill 未登记: ${capability.primary_skill}`);
478
+ if (skills.find((item) => item.id === capability.primary_skill)?.maturity === "deprecated") fail(`${capability.id} 不得由 deprecated skill 持有: ${capability.primary_skill}`);
376
479
  requireStringArray(capability.task_modes, `${prefix}.task_modes`, { nonEmpty: true });
377
480
  for (const mode of capability.task_modes) if (!TASK_MODES.has(mode)) fail(`${capability.id} 使用未知 task mode: ${mode}`);
481
+ requireObject(capability.provider, `${prefix}.provider`);
482
+ if (!PROVIDER_KINDS.has(capability.provider.kind)) fail(`${capability.id}.provider.kind 无效: ${capability.provider.kind}`);
483
+ if (capability.provider.kind === "none") {
484
+ if (capability.provider.binding_id !== undefined || capability.provider.new_adoption !== undefined || capability.provider.failure_code !== undefined) {
485
+ fail(`${capability.id} 的 none provider 不得声明 binding_id/new_adoption/failure_code`);
486
+ }
487
+ } else requireString(capability.provider.binding_id, `${prefix}.provider.binding_id`);
488
+ if (capability.provider.new_adoption !== undefined && capability.provider.new_adoption !== "forbidden") fail(`${capability.id}.provider.new_adoption 只能为 forbidden`);
489
+ if (capability.provider.new_adoption === "forbidden" && capability.provider.failure_code !== "component-new-adoption-forbidden") {
490
+ fail(`${capability.id}.provider.failure_code 必须为 component-new-adoption-forbidden`);
491
+ }
492
+ if (capability.provider.failure_code !== undefined && capability.provider.new_adoption !== "forbidden") fail(`${capability.id}.provider.failure_code 仅用于禁止新接入`);
493
+ if (capability.component_binding !== undefined) fail(`${capability.id}.component_binding 已由 provider 取代`);
378
494
  capabilitySkills.add(capability.primary_skill);
379
495
  }
496
+ if (backendPlatforms) {
497
+ const catalogIds = new Set((backendPlatforms.compatibility ?? []).flatMap((item) => Object.keys(item.component_capabilities ?? {})));
498
+ for (const capability of registry.capabilities.filter((item) => item.provider.kind === "yss-component")) {
499
+ if (!catalogIds.has(capability.provider.binding_id)) fail(`${capability.id} 的 YSS component binding 未登记到后端平台目录: ${capability.provider.binding_id}`);
500
+ }
501
+ }
380
502
  for (const skill of skills.filter((item) => item.impacts.includes("backend") && item.maturity !== "deprecated")) {
381
503
  if (!capabilitySkills.has(skill.id)) fail(`backend skill 缺少 capability: ${skill.id}`);
382
504
  }
383
505
 
506
+ const backendDomains = registry.backend_skill_domains;
507
+ requireObject(backendDomains, "backend_skill_domains");
508
+ if (backendDomains.schema_version !== 1 || backendDomains.scope !== "active-yss-backend-capability-owners") fail("backend_skill_domains 必须使用 schema v1 与 active-yss-backend-capability-owners scope");
509
+ requireStringSet(backendDomains.domain_ids, [...BACKEND_SKILL_DOMAINS], "backend_skill_domains.domain_ids");
510
+ requireObject(backendDomains.assignments, "backend_skill_domains.assignments");
511
+ const backendCapabilityOwners = [...new Set(registry.capabilities
512
+ .filter((capability) => capability.id !== "scaffold.frontend-vue3" && capability.primary_skill.startsWith("yss-"))
513
+ .map((capability) => capability.primary_skill))];
514
+ requireStringSet(Object.keys(backendDomains.assignments), backendCapabilityOwners, "backend_skill_domains.assignments");
515
+ for (const [skillId, domainId] of Object.entries(backendDomains.assignments)) {
516
+ if (!BACKEND_SKILL_DOMAINS.has(domainId)) fail(`backend skill ${skillId} 使用未知能力域: ${domainId}`);
517
+ if (deprecatedSkillIds.has(skillId)) fail(`deprecated skill 不得进入 active backend domain: ${skillId}`);
518
+ }
519
+ requireStringSet(backendDomains.deprecated_skills, [...deprecatedSkillIds], "backend_skill_domains.deprecated_skills");
520
+
384
521
  if (!Array.isArray(registry.recipes) || registry.recipes.length === 0) fail("recipes 不能为空");
385
522
  const recipeIds = new Set();
386
523
  for (const [index, recipe] of registry.recipes.entries()) {
@@ -399,6 +536,7 @@ export function validateSkillRegistry(registry, { lock, compilerContract, lifecy
399
536
  const requiredGraph = new Map([...ids].map((id) => [id, []]));
400
537
  for (const [owner, dependencies] of Object.entries(registry.skill_dependencies)) {
401
538
  if (!ids.has(owner)) fail(`skill_dependencies 使用未知 owner: ${owner}`);
539
+ if (deprecatedSkillIds.has(owner)) fail(`deprecated skill 不得拥有 typed dependency: ${owner}`);
402
540
  if (!Array.isArray(dependencies)) fail(`skill_dependencies.${owner} 必须是数组`);
403
541
  const edgeKeys = new Set();
404
542
  for (const [index, dependency] of dependencies.entries()) {
@@ -406,6 +544,7 @@ export function validateSkillRegistry(registry, { lock, compilerContract, lifecy
406
544
  requireObject(dependency, prefix);
407
545
  requireString(dependency.skill, `${prefix}.skill`);
408
546
  if (!registeredDependency(dependency.skill)) fail(`${owner} 的依赖引用了未登记技能: ${dependency.skill}`);
547
+ if (deprecatedSkillIds.has(dependency.skill)) fail(`${owner} 不得依赖 deprecated skill: ${dependency.skill}`);
409
548
  if (dependency.skill === owner) fail(`${owner} 不得依赖自身`);
410
549
  if (!DEPENDENCY_TYPES.has(dependency.type)) fail(`${owner} 使用未知依赖类型: ${dependency.type}`);
411
550
  if (dependency.type === "context-conditional") requireString(dependency.when, `${prefix}.when`);
@@ -461,6 +600,8 @@ export function validateSkillRegistry(registry, { lock, compilerContract, lifecy
461
600
  }
462
601
 
463
602
  if (compilerContract) {
603
+ const deprecatedCompilerRefs = exactValuePaths(compilerContract, deprecatedSkillIds);
604
+ if (deprecatedCompilerRefs.length) fail(`实现合同编译器合同仍引用 deprecated skill: ${deprecatedCompilerRefs.join(", ")}`);
464
605
  if (compilerContract.schema_version !== 2) fail("compiler-contract.yaml schema_version 必须为 2;v1 已停止支持");
465
606
  if (compilerContract.compiled_by !== "yss-implementation-contract-compiler") fail("compiler-contract.yaml compiled_by 无效");
466
607
  if (compilerContract.capability_source !== "docs/agents/yss-skill-registry.yaml") fail("compiler-contract.yaml capability_source 必须指向技能注册表");
@@ -477,9 +618,12 @@ export function validateSkillRegistry(registry, { lock, compilerContract, lifecy
477
618
 
478
619
  if (lifecycleContract || existsSync(LIFECYCLE_CONTRACT)) {
479
620
  const lifecycle = lifecycleContract ?? yamlFromFile(LIFECYCLE_CONTRACT, "生命周期编排合同");
621
+ const deprecatedLifecycleRefs = exactValuePaths(lifecycle, deprecatedSkillIds);
622
+ if (deprecatedLifecycleRefs.length) fail(`生命周期编排合同仍引用 deprecated skill: ${deprecatedLifecycleRefs.join(", ")}`);
480
623
  const routes = lifecycle.work_unit_routes;
481
624
  if (!routes || typeof routes !== "object" || Array.isArray(routes)) fail("生命周期编排合同缺少 work_unit_routes");
482
625
  const resolve = (name) => {
626
+ if (deprecatedSkillIds.has(name)) return null;
483
627
  if (ids.has(name)) return name;
484
628
  if (aliases.has(name)) return aliases.get(name);
485
629
  if (platformAliases.has(name)) return platformAliases.get(name);
@@ -494,6 +638,7 @@ export function validateSkillRegistry(registry, { lock, compilerContract, lifecy
494
638
  if (!Array.isArray(route.skills) || route.skills.length === 0) fail(`${routeId}.skills 不能为空`);
495
639
  if (!route.applies_when || !route.not_applicable_reason) fail(`${routeId} 缺少 applies_when 或 not_applicable_reason`);
496
640
  for (const name of [route.primary_skill, ...route.supporting_skills, ...route.skills]) {
641
+ if (deprecatedSkillIds.has(name)) fail(`生命周期路由不得引用 deprecated skill: ${routeId} -> ${name}`);
497
642
  if (!resolve(name)) fail(`生命周期路由引用了未登记技能: ${routeId} -> ${name}`);
498
643
  }
499
644
  if (route.frontend_route) {
@@ -524,15 +669,23 @@ export function validateSkillRegistry(registry, { lock, compilerContract, lifecy
524
669
  if (lifecycle.review_input) validateReviewInputFinding(lifecycle.review_input);
525
670
  }
526
671
 
527
- return { skill_count: skills.length, platform_count: platform.length, status: registry.status };
672
+ return {
673
+ schema_version: registry.schema_version,
674
+ skill_count: skills.length,
675
+ platform_count: platform.length,
676
+ deprecated_count: deprecatedSkillIds.size,
677
+ status: registry.status
678
+ };
528
679
  }
529
680
 
530
681
  export function validateDefaultSkillRegistry() {
531
682
  const registry = loadSkillRegistry();
532
683
  const lock = JSON.parse(readFileSync(LOCK_PATH, "utf8"));
684
+ const backendPlatforms = JSON.parse(readFileSync(BACKEND_PLATFORMS, "utf8"));
533
685
  const compilerContract = yamlFromFile(COMPILER_CONTRACT, "实现合同编译器合同");
534
686
  return validateSkillRegistry(registry, {
535
687
  lock,
688
+ backendPlatforms,
536
689
  compilerContract,
537
690
  lifecycleContract: yamlFromFile(LIFECYCLE_CONTRACT, "生命周期编排合同"),
538
691
  skillSource: (id) => readFileSync(path.join(ROOT, ".agents/skills", id, "SKILL.md"), "utf8"),
@@ -4,7 +4,7 @@ import path from 'node:path';
4
4
  import fs from 'node:fs';
5
5
  import { stringify } from '../vendor/yaml.mjs';
6
6
  import { safe, hash, digest, write } from './strategic-handoff-io.mjs';
7
- import { compileDefaultImplementationContract, loadCompilerContract } from './implementation-contract-compiler.mjs';
7
+ import { compileDefaultImplementationContract, digestDocument, loadCompilerContract } from './implementation-contract-compiler.mjs';
8
8
  import { normalizeSliceContract, parseSliceYaml, readSliceSources, resolveSliceBasis, sourceSliceContract, sliceArchitectureEvidence } from './slice-contract.mjs';
9
9
 
10
10
  const object=value=>value && typeof value==='object' && !Array.isArray(value);
@@ -123,11 +123,12 @@ export function prepareSliceImplementationContract({root=process.cwd(),ticket_re
123
123
  return compileDefaultImplementationContract({...compileBase,recipeIds,requiredCapabilities:[...requiredCapabilities,...(repo.project.delivery_role==='backend'?componentCapabilities:[])],architecture_identity:repo.resolution.architecture_identity,architecture_evidence:repo.resolution.architecture_evidence,technical_design:repo.resolution.technical_design,...(repo.resolution.frontend_delivery?{frontend_delivery:repo.resolution.frontend_delivery}:{}),...(approved_slice?{approved_slice,work_unit_id:input.work_units.find(u=>u.project_root===projectRoot)?.id}:{})});
124
124
  });
125
125
  if(results.some(r=>r.registry_digest!==results[0].registry_digest||r.compiler_contract_digest!==results[0].compiler_contract_digest))throw new TypeError('逐仓编译依据冲突:准备期间来源发生变化');
126
- compiled={...results[0],required_capabilities:[...new Set(results.flatMap(r=>r.required_capabilities))],required_skills:[...new Set(results.flatMap(r=>r.required_skills))],recipe_ids:[...new Set(results.flatMap(r=>r.recipe_ids))],readiness_blockers:results.flatMap(r=>r.readiness_blockers||[]),reason_chains:Object.fromEntries(Object.keys(repositories).map((p,i)=>[p,results[i].reason_chains]))};
126
+ const componentBindings=[...new Map(results.flatMap(result=>result.component_bindings||[]).map(binding=>[digestDocument(binding),binding])).values()];
127
+ compiled={...results[0],required_capabilities:[...new Set(results.flatMap(r=>r.required_capabilities))],required_skills:[...new Set(results.flatMap(r=>r.required_skills))],recipe_ids:[...new Set(results.flatMap(r=>r.recipe_ids))],readiness_blockers:results.flatMap(r=>r.readiness_blockers||[]),reason_chains:Object.fromEntries(Object.keys(repositories).map((p,i)=>[p,results[i].reason_chains])),...(componentBindings.length?{component_bindings:componentBindings,component_bindings_digest:digestDocument(componentBindings)}:{})};
127
128
  delete compiled.architecture_identity;
128
129
  } else compiled=compileDefaultImplementationContract({...compileBase,recipeIds:input.recipe_ids||[],requiredCapabilities:[...new Set([...(input.required_capabilities||[]),...componentCapabilities])],architecture_identity,architecture_evidence,technical_design:bound('technical_design'),...(bound('frontend_delivery')?{frontend_delivery:{acceptance_ref:bound('frontend_delivery').ref,digest:bound('frontend_delivery').digest}}:{}),...(approved_slice?{approved_slice}:{})});
129
130
  if(compiled.compiler_contract_digest!==digest(compilerRules).slice(7))throw new TypeError('编译规则来源冲突:准备期间发生变化');
130
- const resolution=Object.fromEntries(['required_capabilities','required_skills','recipe_ids','conditions','registry_digest','compiler_contract_digest','architecture_identity'].filter(key=>compiled[key]!==undefined).map(key=>[key,compiled[key]]));
131
+ const resolution=Object.fromEntries(['required_capabilities','required_skills','recipe_ids','conditions','registry_digest','compiler_contract_digest','architecture_identity','component_bindings','component_bindings_digest'].filter(key=>compiled[key]!==undefined).map(key=>[key,compiled[key]]));
131
132
  contract={schema_version:3,ticket_policy:{mode:'frozen-requirements',state_owner:'tracker-or-task-package'},contract_id:input.contract_id,contract_version:input.contract_version,slice_id:input.slice_id,status:'draft',basis,scope,applicability,resolution,acceptance:input.acceptance||markdownAcceptance(ticketText),verification:input.verification,work_units:input.work_units,...(input.extensions?{extensions:input.extensions}:{})};
132
133
  report.reason_chains=compiled.reason_chains;
133
134
  for(const reason of compiled.readiness_blockers||[])report.blockers.push({reason});
@@ -145,7 +146,7 @@ export function prepareSliceImplementationContract({root=process.cwd(),ticket_re
145
146
  if(field==='applicability'&&scope.risk_level)origins.push({kind:'lifecycle-rule',ref:resolveSliceBasis({basis},'lifecycle_registry').ref});
146
147
  report.provenance.push({target:field,origins,requires_professional_review:true});
147
148
  }
148
- }catch(error){if(error.code!=='SLICE_DEPENDENCIES_UNAVAILABLE')report.blockers.push({reason:error.message,recovery:'补齐已确认输入后重新准备;草案不授予执行权限'});report.checks.push({check:'assembly',result:'not-executed',reason:'前置检查未通过'});}
149
+ }catch(error){if(error.code!=='SLICE_DEPENDENCIES_UNAVAILABLE')report.blockers.push({...(error.code?{code:error.code}:{}),reason:error.message,recovery:'补齐已确认输入后重新准备;草案不授予执行权限'});report.checks.push({check:'assembly',result:'not-executed',reason:'前置检查未通过'});}
149
150
  for(const [ref,bytes] of snapshots) {
150
151
  try {if(hash(fs.readFileSync(safe(root,ref)))!==hash(bytes))report.blockers.push({field:ref,reason:'生成期间来源变化'});}catch(error){report.blockers.push({field:ref,reason:error.message});}
151
152
  report.sources[ref]=hash(bytes);
@@ -203,7 +204,7 @@ export function migrateSliceContractV2(document,{root=process.cwd(),ticket_ref,s
203
204
  const checkUnknown=(value,known,prefix)=>{for(const [key,item]of Object.entries(value||{}))if(meaningful(item)&&!known.includes(key))conflicts.push({field:`${prefix}.${key}`,reason:'未映射约束,禁止静默丢弃'});};
204
205
  checkUnknown(old,['schema_version','contract_id','contract_version','slice_id','status','suggested_owner_role_id','lifecycle_refs','readiness','resolution','common','frontend','backend','contract','cross_repo','work_units'],'root');
205
206
  checkUnknown(old.common,[...scopeKeys,'required_capabilities','required_skills','verification_commands','expected_evidence_files','quality_baseline_ref'],'common');
206
- checkUnknown(old.resolution,['schema_version','status','slice_id','architecture_identity','architecture_identity_digest','architecture_evidence','technical_design','frontend_delivery','profile_maturity','readiness_blockers','skill_profiles','recipe_ids','conditions','required_capabilities','required_skills','reason_chains','non_expanding_dependencies','excluded_conditional_dependencies','registry_digest','compiler_contract_digest','compiled_at','freshness'],'resolution');
207
+ checkUnknown(old.resolution,['schema_version','status','slice_id','architecture_identity','architecture_identity_digest','architecture_evidence','technical_design','frontend_delivery','profile_maturity','readiness_blockers','skill_profiles','recipe_ids','conditions','required_capabilities','required_skills','component_bindings','component_bindings_digest','reason_chains','non_expanding_dependencies','excluded_conditional_dependencies','registry_digest','compiler_contract_digest','compiled_at','freshness'],'resolution');
207
208
  const ticketRef=ticket_ref||old.lifecycle_refs?.ticket;
208
209
  let acceptance=refinements.acceptance;
209
210
  if(!acceptance){try{acceptance=markdownAcceptance(fs.readFileSync(safe(root,ticketRef),'utf8'));}catch(error){conflicts.push({field:'acceptance',reason:error.message});acceptance={};}}
@@ -17,7 +17,7 @@ await mkdir(evidence, { recursive: true });
17
17
  const input = values.inputs ? JSON.parse(await readFile(path.resolve(values.inputs), "utf8")) : {};
18
18
  const inputRoot = values.inputs ? path.dirname(path.resolve(values.inputs)) : process.cwd();
19
19
  const catalog = input.catalog_ref ? JSON.parse(await readFile(path.resolve(inputRoot, input.catalog_ref), "utf8")) : loadBackendPlatforms();
20
- if (catalog.schema_version !== 1 || catalog.kind !== "backend-platform-catalog" || !Array.isArray(catalog.compatibility) || platformDigest(catalog.profiles) !== platformDigest(loadBackendPlatforms().profiles)) throw new Error("candidate input must preserve the maintained platform profiles; only supply actual YSS combinations");
20
+ if (catalog.schema_version !== 2 || catalog.kind !== "backend-platform-catalog" || !Array.isArray(catalog.compatibility) || platformDigest(catalog.profiles) !== platformDigest(loadBackendPlatforms().profiles)) throw new Error("candidate input must preserve the maintained platform profiles; only supply actual YSS combinations");
21
21
  const keys = new Set();
22
22
  for (const item of input.combinations ?? []) {
23
23
  const key = `${item.profile_id}:${item.spring_boot_version}:${item.architecture_family}`;