soloforge 1.2.20 → 1.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 (667) hide show
  1. package/README.md +140 -3
  2. package/dist/adapters/claude_code/claude_md.d.ts +1 -2
  3. package/dist/adapters/claude_code/claude_md.d.ts.map +1 -1
  4. package/dist/adapters/claude_code/claude_md.js +47 -4
  5. package/dist/adapters/claude_code/claude_md.js.map +1 -1
  6. package/dist/adapters/claude_code/hooks.d.ts.map +1 -1
  7. package/dist/adapters/claude_code/hooks.js +2 -1
  8. package/dist/adapters/claude_code/hooks.js.map +1 -1
  9. package/dist/adapters/claude_code/server.js +4 -3
  10. package/dist/adapters/claude_code/server.js.map +1 -1
  11. package/dist/adapters/claude_code/tools.d.ts +255 -1
  12. package/dist/adapters/claude_code/tools.d.ts.map +1 -1
  13. package/dist/adapters/claude_code/tools.js +855 -39
  14. package/dist/adapters/claude_code/tools.js.map +1 -1
  15. package/dist/adapters/codex/codex_config.d.ts.map +1 -1
  16. package/dist/adapters/codex/codex_config.js +3 -2
  17. package/dist/adapters/codex/codex_config.js.map +1 -1
  18. package/dist/adapters/codex/codex_rules.d.ts.map +1 -1
  19. package/dist/adapters/codex/codex_rules.js +2 -1
  20. package/dist/adapters/codex/codex_rules.js.map +1 -1
  21. package/dist/adapters/shared/workflow_template.d.ts.map +1 -1
  22. package/dist/adapters/shared/workflow_template.js +2 -1
  23. package/dist/adapters/shared/workflow_template.js.map +1 -1
  24. package/dist/adapters/trae/trae_config.d.ts +0 -5
  25. package/dist/adapters/trae/trae_config.d.ts.map +1 -1
  26. package/dist/adapters/trae/trae_config.js +2 -1
  27. package/dist/adapters/trae/trae_config.js.map +1 -1
  28. package/dist/adapters/trae/trae_rules.d.ts.map +1 -1
  29. package/dist/adapters/trae/trae_rules.js +2 -1
  30. package/dist/adapters/trae/trae_rules.js.map +1 -1
  31. package/dist/bin/config_commands.d.ts.map +1 -1
  32. package/dist/bin/config_commands.js +34 -33
  33. package/dist/bin/config_commands.js.map +1 -1
  34. package/dist/bin/soloforge.d.ts.map +1 -1
  35. package/dist/bin/soloforge.js +1110 -157
  36. package/dist/bin/soloforge.js.map +1 -1
  37. package/dist/engine/adapter_prompt_contract.d.ts +60 -0
  38. package/dist/engine/adapter_prompt_contract.d.ts.map +1 -0
  39. package/dist/engine/adapter_prompt_contract.js +163 -0
  40. package/dist/engine/adapter_prompt_contract.js.map +1 -0
  41. package/dist/engine/architecture_design_contract.d.ts +49 -0
  42. package/dist/engine/architecture_design_contract.d.ts.map +1 -0
  43. package/dist/engine/architecture_design_contract.js +169 -0
  44. package/dist/engine/architecture_design_contract.js.map +1 -0
  45. package/dist/engine/artifact_contract_registry.d.ts.map +1 -1
  46. package/dist/engine/artifact_contract_registry.js +7 -14
  47. package/dist/engine/artifact_contract_registry.js.map +1 -1
  48. package/dist/engine/{batch1_manifest.d.ts → asset_manifest.d.ts} +8 -8
  49. package/dist/engine/asset_manifest.d.ts.map +1 -0
  50. package/dist/engine/{batch1_manifest.js → asset_manifest.js} +52 -9
  51. package/dist/engine/asset_manifest.js.map +1 -0
  52. package/dist/engine/audit_pool.d.ts.map +1 -1
  53. package/dist/engine/audit_pool.js +5 -4
  54. package/dist/engine/audit_pool.js.map +1 -1
  55. package/dist/engine/audit_sampler.d.ts.map +1 -1
  56. package/dist/engine/audit_sampler.js +2 -1
  57. package/dist/engine/audit_sampler.js.map +1 -1
  58. package/dist/engine/audit_verifier.d.ts.map +1 -1
  59. package/dist/engine/audit_verifier.js +5 -4
  60. package/dist/engine/audit_verifier.js.map +1 -1
  61. package/dist/engine/brainstorm_contract.d.ts +46 -0
  62. package/dist/engine/brainstorm_contract.d.ts.map +1 -0
  63. package/dist/engine/brainstorm_contract.js +136 -0
  64. package/dist/engine/brainstorm_contract.js.map +1 -0
  65. package/dist/engine/capability_action_advisor.d.ts.map +1 -1
  66. package/dist/engine/capability_action_advisor.js +8 -7
  67. package/dist/engine/capability_action_advisor.js.map +1 -1
  68. package/dist/engine/capability_registry.d.ts.map +1 -1
  69. package/dist/engine/capability_registry.js +0 -7
  70. package/dist/engine/capability_registry.js.map +1 -1
  71. package/dist/engine/capability_state_store.d.ts.map +1 -1
  72. package/dist/engine/capability_state_store.js +7 -6
  73. package/dist/engine/capability_state_store.js.map +1 -1
  74. package/dist/engine/change_coordinator.d.ts.map +1 -1
  75. package/dist/engine/change_coordinator.js +4 -3
  76. package/dist/engine/change_coordinator.js.map +1 -1
  77. package/dist/engine/chinese_semantic_priority.d.ts +62 -0
  78. package/dist/engine/chinese_semantic_priority.d.ts.map +1 -0
  79. package/dist/engine/chinese_semantic_priority.js +153 -0
  80. package/dist/engine/chinese_semantic_priority.js.map +1 -0
  81. package/dist/engine/coding_readiness_gate.d.ts +46 -0
  82. package/dist/engine/coding_readiness_gate.d.ts.map +1 -0
  83. package/dist/engine/coding_readiness_gate.js +175 -0
  84. package/dist/engine/coding_readiness_gate.js.map +1 -0
  85. package/dist/engine/cognitive_anchor.d.ts.map +1 -1
  86. package/dist/engine/cognitive_anchor.js +7 -6
  87. package/dist/engine/cognitive_anchor.js.map +1 -1
  88. package/dist/engine/command_execution_contract.d.ts.map +1 -1
  89. package/dist/engine/command_execution_contract.js +13 -12
  90. package/dist/engine/command_execution_contract.js.map +1 -1
  91. package/dist/engine/confidence_scorer.d.ts.map +1 -1
  92. package/dist/engine/confidence_scorer.js +2 -1
  93. package/dist/engine/confidence_scorer.js.map +1 -1
  94. package/dist/engine/config_precedence_contract.d.ts.map +1 -1
  95. package/dist/engine/config_precedence_contract.js +9 -8
  96. package/dist/engine/config_precedence_contract.js.map +1 -1
  97. package/dist/engine/conflict_gate.d.ts.map +1 -1
  98. package/dist/engine/conflict_gate.js +4 -3
  99. package/dist/engine/conflict_gate.js.map +1 -1
  100. package/dist/engine/consumable_asset_registry.d.ts +4 -0
  101. package/dist/engine/consumable_asset_registry.d.ts.map +1 -1
  102. package/dist/engine/consumable_asset_registry.js +307 -0
  103. package/dist/engine/consumable_asset_registry.js.map +1 -1
  104. package/dist/engine/consumption_trace_store.d.ts +50 -0
  105. package/dist/engine/consumption_trace_store.d.ts.map +1 -0
  106. package/dist/engine/consumption_trace_store.js +84 -0
  107. package/dist/engine/consumption_trace_store.js.map +1 -0
  108. package/dist/engine/contract_guard.d.ts.map +1 -1
  109. package/dist/engine/contract_guard.js +7 -6
  110. package/dist/engine/contract_guard.js.map +1 -1
  111. package/dist/engine/contract_registry.d.ts +1 -1
  112. package/dist/engine/contract_registry.d.ts.map +1 -1
  113. package/dist/engine/contract_registry.js +511 -38
  114. package/dist/engine/contract_registry.js.map +1 -1
  115. package/dist/engine/convention_detector.d.ts.map +1 -1
  116. package/dist/engine/convention_detector.js +4 -3
  117. package/dist/engine/convention_detector.js.map +1 -1
  118. package/dist/engine/core_engineering_principles.d.ts.map +1 -1
  119. package/dist/engine/core_engineering_principles.js +4 -14
  120. package/dist/engine/core_engineering_principles.js.map +1 -1
  121. package/dist/engine/core_experience_principle.d.ts +194 -0
  122. package/dist/engine/core_experience_principle.d.ts.map +1 -0
  123. package/dist/engine/core_experience_principle.js +349 -0
  124. package/dist/engine/core_experience_principle.js.map +1 -0
  125. package/dist/engine/debt_reporter.d.ts.map +1 -1
  126. package/dist/engine/debt_reporter.js +3 -2
  127. package/dist/engine/debt_reporter.js.map +1 -1
  128. package/dist/engine/debt_tracker.d.ts.map +1 -1
  129. package/dist/engine/debt_tracker.js +8 -7
  130. package/dist/engine/debt_tracker.js.map +1 -1
  131. package/dist/engine/debug_log.d.ts +4 -1
  132. package/dist/engine/debug_log.d.ts.map +1 -1
  133. package/dist/engine/debug_log.js +4 -6
  134. package/dist/engine/debug_log.js.map +1 -1
  135. package/dist/engine/debugger.d.ts.map +1 -1
  136. package/dist/engine/debugger.js +5 -4
  137. package/dist/engine/debugger.js.map +1 -1
  138. package/dist/engine/decision_contract.d.ts.map +1 -1
  139. package/dist/engine/decision_contract.js +4 -3
  140. package/dist/engine/decision_contract.js.map +1 -1
  141. package/dist/engine/delivery.d.ts.map +1 -1
  142. package/dist/engine/delivery.js +16 -15
  143. package/dist/engine/delivery.js.map +1 -1
  144. package/dist/engine/delivery_readiness.d.ts +5 -1
  145. package/dist/engine/delivery_readiness.d.ts.map +1 -1
  146. package/dist/engine/delivery_readiness.js +24 -2
  147. package/dist/engine/delivery_readiness.js.map +1 -1
  148. package/dist/engine/dependency_scanner.d.ts.map +1 -1
  149. package/dist/engine/dependency_scanner.js +6 -5
  150. package/dist/engine/dependency_scanner.js.map +1 -1
  151. package/dist/engine/detail_discipline.d.ts +40 -0
  152. package/dist/engine/detail_discipline.d.ts.map +1 -0
  153. package/dist/engine/detail_discipline.js +107 -0
  154. package/dist/engine/detail_discipline.js.map +1 -0
  155. package/dist/engine/developer_sovereignty.d.ts.map +1 -1
  156. package/dist/engine/developer_sovereignty.js +6 -5
  157. package/dist/engine/developer_sovereignty.js.map +1 -1
  158. package/dist/engine/diff_ownership.d.ts.map +1 -1
  159. package/dist/engine/diff_ownership.js +9 -8
  160. package/dist/engine/diff_ownership.js.map +1 -1
  161. package/dist/engine/diff_ownership_store.d.ts.map +1 -1
  162. package/dist/engine/diff_ownership_store.js +8 -7
  163. package/dist/engine/diff_ownership_store.js.map +1 -1
  164. package/dist/engine/documentation_governance.d.ts +55 -0
  165. package/dist/engine/documentation_governance.d.ts.map +1 -0
  166. package/dist/engine/documentation_governance.js +249 -0
  167. package/dist/engine/documentation_governance.js.map +1 -0
  168. package/dist/engine/dual_layer_mechanism_registry.d.ts +6 -4
  169. package/dist/engine/dual_layer_mechanism_registry.d.ts.map +1 -1
  170. package/dist/engine/dual_layer_mechanism_registry.js +731 -11
  171. package/dist/engine/dual_layer_mechanism_registry.js.map +1 -1
  172. package/dist/engine/enforcement_guard.d.ts.map +1 -1
  173. package/dist/engine/enforcement_guard.js +14 -0
  174. package/dist/engine/enforcement_guard.js.map +1 -1
  175. package/dist/engine/escape_report.d.ts.map +1 -1
  176. package/dist/engine/escape_report.js +4 -3
  177. package/dist/engine/escape_report.js.map +1 -1
  178. package/dist/engine/evolution_regression_gate.d.ts +42 -0
  179. package/dist/engine/evolution_regression_gate.d.ts.map +1 -0
  180. package/dist/engine/evolution_regression_gate.js +159 -0
  181. package/dist/engine/evolution_regression_gate.js.map +1 -0
  182. package/dist/engine/existing_system_analysis.d.ts +37 -0
  183. package/dist/engine/existing_system_analysis.d.ts.map +1 -0
  184. package/dist/engine/existing_system_analysis.js +151 -0
  185. package/dist/engine/existing_system_analysis.js.map +1 -0
  186. package/dist/engine/exploration.d.ts.map +1 -1
  187. package/dist/engine/exploration.js +7 -6
  188. package/dist/engine/exploration.js.map +1 -1
  189. package/dist/engine/extension_contract.d.ts +50 -0
  190. package/dist/engine/extension_contract.d.ts.map +1 -0
  191. package/dist/engine/extension_contract.js +158 -0
  192. package/dist/engine/extension_contract.js.map +1 -0
  193. package/dist/engine/extension_platform_contracts.d.ts +712 -0
  194. package/dist/engine/extension_platform_contracts.d.ts.map +1 -0
  195. package/dist/engine/extension_platform_contracts.js +42 -0
  196. package/dist/engine/extension_platform_contracts.js.map +1 -0
  197. package/dist/engine/extension_scenario_registry.d.ts +30 -0
  198. package/dist/engine/extension_scenario_registry.d.ts.map +1 -0
  199. package/dist/engine/extension_scenario_registry.js +976 -0
  200. package/dist/engine/extension_scenario_registry.js.map +1 -0
  201. package/dist/engine/failure_classifier.d.ts.map +1 -1
  202. package/dist/engine/failure_classifier.js +9 -8
  203. package/dist/engine/failure_classifier.js.map +1 -1
  204. package/dist/engine/feasibility_checker.d.ts.map +1 -1
  205. package/dist/engine/feasibility_checker.js +5 -4
  206. package/dist/engine/feasibility_checker.js.map +1 -1
  207. package/dist/engine/first_principles.d.ts +35 -0
  208. package/dist/engine/first_principles.d.ts.map +1 -0
  209. package/dist/engine/first_principles.js +128 -0
  210. package/dist/engine/first_principles.js.map +1 -0
  211. package/dist/engine/{batch1_scenario_registry.d.ts → foundation_scenario_registry.d.ts} +15 -15
  212. package/dist/engine/foundation_scenario_registry.d.ts.map +1 -0
  213. package/dist/engine/{batch1_scenario_registry.js → foundation_scenario_registry.js} +22 -25
  214. package/dist/engine/foundation_scenario_registry.js.map +1 -0
  215. package/dist/engine/{batch1_scenario_runners.d.ts → foundation_scenario_runners.d.ts} +1 -1
  216. package/dist/engine/foundation_scenario_runners.d.ts.map +1 -0
  217. package/dist/engine/{batch1_scenario_runners.js → foundation_scenario_runners.js} +8 -7
  218. package/dist/engine/foundation_scenario_runners.js.map +1 -0
  219. package/dist/engine/git_deps.d.ts.map +1 -1
  220. package/dist/engine/git_deps.js +2 -1
  221. package/dist/engine/git_deps.js.map +1 -1
  222. package/dist/engine/governance_report.d.ts.map +1 -1
  223. package/dist/engine/governance_report.js +10 -9
  224. package/dist/engine/governance_report.js.map +1 -1
  225. package/dist/engine/impact_analyzer.d.ts.map +1 -1
  226. package/dist/engine/impact_analyzer.js +5 -4
  227. package/dist/engine/impact_analyzer.js.map +1 -1
  228. package/dist/engine/implementation_roadmap_registry.d.ts.map +1 -1
  229. package/dist/engine/implementation_roadmap_registry.js +217 -80
  230. package/dist/engine/implementation_roadmap_registry.js.map +1 -1
  231. package/dist/engine/input_material_contract_registry.d.ts.map +1 -1
  232. package/dist/engine/input_material_contract_registry.js +4 -3
  233. package/dist/engine/input_material_contract_registry.js.map +1 -1
  234. package/dist/engine/instruction_contract.d.ts +68 -0
  235. package/dist/engine/instruction_contract.d.ts.map +1 -0
  236. package/dist/engine/instruction_contract.js +123 -0
  237. package/dist/engine/instruction_contract.js.map +1 -0
  238. package/dist/engine/intent_expander.d.ts.map +1 -1
  239. package/dist/engine/intent_expander.js +339 -1
  240. package/dist/engine/intent_expander.js.map +1 -1
  241. package/dist/engine/intent_router.d.ts +11 -2
  242. package/dist/engine/intent_router.d.ts.map +1 -1
  243. package/dist/engine/intent_router.js +121 -1
  244. package/dist/engine/intent_router.js.map +1 -1
  245. package/dist/engine/intent_signal_extractor.d.ts +3 -0
  246. package/dist/engine/intent_signal_extractor.d.ts.map +1 -1
  247. package/dist/engine/intent_signal_extractor.js +49 -0
  248. package/dist/engine/intent_signal_extractor.js.map +1 -1
  249. package/dist/engine/io_controller.d.ts.map +1 -1
  250. package/dist/engine/io_controller.js +8 -7
  251. package/dist/engine/io_controller.js.map +1 -1
  252. package/dist/engine/java_quality_guard.d.ts.map +1 -1
  253. package/dist/engine/java_quality_guard.js +5 -18
  254. package/dist/engine/java_quality_guard.js.map +1 -1
  255. package/dist/engine/job_manager.d.ts.map +1 -1
  256. package/dist/engine/job_manager.js +8 -7
  257. package/dist/engine/job_manager.js.map +1 -1
  258. package/dist/engine/knowledge_acceptance_registry.d.ts +35 -0
  259. package/dist/engine/knowledge_acceptance_registry.d.ts.map +1 -0
  260. package/dist/engine/knowledge_acceptance_registry.js +271 -0
  261. package/dist/engine/knowledge_acceptance_registry.js.map +1 -0
  262. package/dist/engine/knowledge_asset_audit.d.ts +65 -0
  263. package/dist/engine/knowledge_asset_audit.d.ts.map +1 -0
  264. package/dist/engine/knowledge_asset_audit.js +230 -0
  265. package/dist/engine/knowledge_asset_audit.js.map +1 -0
  266. package/dist/engine/knowledge_asset_consumer.d.ts +150 -0
  267. package/dist/engine/knowledge_asset_consumer.d.ts.map +1 -0
  268. package/dist/engine/knowledge_asset_consumer.js +279 -0
  269. package/dist/engine/knowledge_asset_consumer.js.map +1 -0
  270. package/dist/engine/knowledge_asset_generation_gate.d.ts +38 -0
  271. package/dist/engine/knowledge_asset_generation_gate.d.ts.map +1 -0
  272. package/dist/engine/knowledge_asset_generation_gate.js +131 -0
  273. package/dist/engine/knowledge_asset_generation_gate.js.map +1 -0
  274. package/dist/engine/knowledge_asset_migration.d.ts +117 -0
  275. package/dist/engine/knowledge_asset_migration.d.ts.map +1 -0
  276. package/dist/engine/knowledge_asset_migration.js +204 -0
  277. package/dist/engine/knowledge_asset_migration.js.map +1 -0
  278. package/dist/engine/knowledge_asset_schema.d.ts +97 -0
  279. package/dist/engine/knowledge_asset_schema.d.ts.map +1 -0
  280. package/dist/engine/knowledge_asset_schema.js +413 -0
  281. package/dist/engine/knowledge_asset_schema.js.map +1 -0
  282. package/dist/engine/knowledge_config_loader.d.ts.map +1 -1
  283. package/dist/engine/knowledge_config_loader.js +5 -4
  284. package/dist/engine/knowledge_config_loader.js.map +1 -1
  285. package/dist/engine/knowledge_consumption_snapshot.d.ts +91 -0
  286. package/dist/engine/knowledge_consumption_snapshot.d.ts.map +1 -0
  287. package/dist/engine/knowledge_consumption_snapshot.js +113 -0
  288. package/dist/engine/knowledge_consumption_snapshot.js.map +1 -0
  289. package/dist/engine/knowledge_evolution.d.ts +82 -0
  290. package/dist/engine/knowledge_evolution.d.ts.map +1 -0
  291. package/dist/engine/knowledge_evolution.js +272 -0
  292. package/dist/engine/knowledge_evolution.js.map +1 -0
  293. package/dist/engine/knowledge_lifecycle.d.ts +70 -10
  294. package/dist/engine/knowledge_lifecycle.d.ts.map +1 -1
  295. package/dist/engine/knowledge_lifecycle.js +238 -4
  296. package/dist/engine/knowledge_lifecycle.js.map +1 -1
  297. package/dist/engine/knowledge_manager.d.ts.map +1 -1
  298. package/dist/engine/knowledge_manager.js +9 -8
  299. package/dist/engine/knowledge_manager.js.map +1 -1
  300. package/dist/engine/knowledge_scenario_registry.d.ts +21 -0
  301. package/dist/engine/knowledge_scenario_registry.d.ts.map +1 -0
  302. package/dist/engine/knowledge_scenario_registry.js +337 -0
  303. package/dist/engine/knowledge_scenario_registry.js.map +1 -0
  304. package/dist/engine/knowledge_sovereignty.d.ts.map +1 -1
  305. package/dist/engine/knowledge_sovereignty.js +5 -4
  306. package/dist/engine/knowledge_sovereignty.js.map +1 -1
  307. package/dist/engine/knowledge_template_contracts.d.ts +244 -0
  308. package/dist/engine/knowledge_template_contracts.d.ts.map +1 -0
  309. package/dist/engine/knowledge_template_contracts.js +26 -0
  310. package/dist/engine/knowledge_template_contracts.js.map +1 -0
  311. package/dist/engine/language_policy.d.ts +69 -12
  312. package/dist/engine/language_policy.d.ts.map +1 -1
  313. package/dist/engine/language_policy.js +129 -8
  314. package/dist/engine/language_policy.js.map +1 -1
  315. package/dist/engine/llm_gateway.d.ts.map +1 -1
  316. package/dist/engine/llm_gateway.js +10 -9
  317. package/dist/engine/llm_gateway.js.map +1 -1
  318. package/dist/engine/local_docker_acceptance.d.ts +94 -0
  319. package/dist/engine/local_docker_acceptance.d.ts.map +1 -0
  320. package/dist/engine/local_docker_acceptance.js +312 -0
  321. package/dist/engine/local_docker_acceptance.js.map +1 -0
  322. package/dist/engine/logger.d.ts +64 -0
  323. package/dist/engine/logger.d.ts.map +1 -0
  324. package/dist/engine/logger.js +115 -0
  325. package/dist/engine/logger.js.map +1 -0
  326. package/dist/engine/main_path_integration_contract.d.ts.map +1 -1
  327. package/dist/engine/main_path_integration_contract.js +43 -42
  328. package/dist/engine/main_path_integration_contract.js.map +1 -1
  329. package/dist/engine/mechanism_contract_registry.d.ts.map +1 -1
  330. package/dist/engine/mechanism_contract_registry.js +448 -17
  331. package/dist/engine/mechanism_contract_registry.js.map +1 -1
  332. package/dist/engine/metric_governance.d.ts +51 -0
  333. package/dist/engine/metric_governance.d.ts.map +1 -0
  334. package/dist/engine/metric_governance.js +138 -0
  335. package/dist/engine/metric_governance.js.map +1 -0
  336. package/dist/engine/migration_guard.d.ts.map +1 -1
  337. package/dist/engine/migration_guard.js +6 -5
  338. package/dist/engine/migration_guard.js.map +1 -1
  339. package/dist/engine/mutation_audit.d.ts.map +1 -1
  340. package/dist/engine/mutation_audit.js +6 -5
  341. package/dist/engine/mutation_audit.js.map +1 -1
  342. package/dist/engine/observability.d.ts +11 -0
  343. package/dist/engine/observability.d.ts.map +1 -1
  344. package/dist/engine/observability.js +60 -8
  345. package/dist/engine/observability.js.map +1 -1
  346. package/dist/engine/onboarding.d.ts.map +1 -1
  347. package/dist/engine/onboarding.js +17 -16
  348. package/dist/engine/onboarding.js.map +1 -1
  349. package/dist/engine/plan_proposal_gate.d.ts +131 -0
  350. package/dist/engine/plan_proposal_gate.d.ts.map +1 -0
  351. package/dist/engine/plan_proposal_gate.js +340 -0
  352. package/dist/engine/plan_proposal_gate.js.map +1 -0
  353. package/dist/engine/platform_context.d.ts +44 -0
  354. package/dist/engine/platform_context.d.ts.map +1 -0
  355. package/dist/engine/platform_context.js +165 -0
  356. package/dist/engine/platform_context.js.map +1 -0
  357. package/dist/engine/policy_drift_detector.d.ts.map +1 -1
  358. package/dist/engine/policy_drift_detector.js +8 -7
  359. package/dist/engine/policy_drift_detector.js.map +1 -1
  360. package/dist/engine/regression_matrix.d.ts.map +1 -1
  361. package/dist/engine/regression_matrix.js +15 -14
  362. package/dist/engine/regression_matrix.js.map +1 -1
  363. package/dist/engine/release_compatibility.d.ts +62 -0
  364. package/dist/engine/release_compatibility.d.ts.map +1 -0
  365. package/dist/engine/release_compatibility.js +145 -0
  366. package/dist/engine/release_compatibility.js.map +1 -0
  367. package/dist/engine/release_gate.d.ts +29 -0
  368. package/dist/engine/release_gate.d.ts.map +1 -0
  369. package/dist/engine/release_gate.js +675 -0
  370. package/dist/engine/release_gate.js.map +1 -0
  371. package/dist/engine/release_gate_scenario_registry.d.ts +50 -0
  372. package/dist/engine/release_gate_scenario_registry.d.ts.map +1 -0
  373. package/dist/engine/release_gate_scenario_registry.js +514 -0
  374. package/dist/engine/release_gate_scenario_registry.js.map +1 -0
  375. package/dist/engine/release_readiness_gate.d.ts +36 -0
  376. package/dist/engine/release_readiness_gate.d.ts.map +1 -0
  377. package/dist/engine/release_readiness_gate.js +1050 -0
  378. package/dist/engine/release_readiness_gate.js.map +1 -0
  379. package/dist/engine/risk_sampler.d.ts.map +1 -1
  380. package/dist/engine/risk_sampler.js +4 -3
  381. package/dist/engine/risk_sampler.js.map +1 -1
  382. package/dist/engine/runtime_safety.d.ts.map +1 -1
  383. package/dist/engine/runtime_safety.js +18 -17
  384. package/dist/engine/runtime_safety.js.map +1 -1
  385. package/dist/engine/scaffolder.d.ts.map +1 -1
  386. package/dist/engine/scaffolder.js +4 -3
  387. package/dist/engine/scaffolder.js.map +1 -1
  388. package/dist/engine/scope_lease.d.ts.map +1 -1
  389. package/dist/engine/scope_lease.js +4 -3
  390. package/dist/engine/scope_lease.js.map +1 -1
  391. package/dist/engine/semantic_evidence.d.ts.map +1 -1
  392. package/dist/engine/semantic_evidence.js +4 -3
  393. package/dist/engine/semantic_evidence.js.map +1 -1
  394. package/dist/engine/state_fact_classifier.d.ts +47 -0
  395. package/dist/engine/state_fact_classifier.d.ts.map +1 -0
  396. package/dist/engine/state_fact_classifier.js +158 -0
  397. package/dist/engine/state_fact_classifier.js.map +1 -0
  398. package/dist/engine/task_context.d.ts +25 -3
  399. package/dist/engine/task_context.d.ts.map +1 -1
  400. package/dist/engine/task_context.js +126 -37
  401. package/dist/engine/task_context.js.map +1 -1
  402. package/dist/engine/task_planner.d.ts.map +1 -1
  403. package/dist/engine/task_planner.js +6 -5
  404. package/dist/engine/task_planner.js.map +1 -1
  405. package/dist/engine/team_awareness.d.ts.map +1 -1
  406. package/dist/engine/team_awareness.js +2 -1
  407. package/dist/engine/team_awareness.js.map +1 -1
  408. package/dist/engine/technology_decision.d.ts +38 -0
  409. package/dist/engine/technology_decision.d.ts.map +1 -0
  410. package/dist/engine/technology_decision.js +120 -0
  411. package/dist/engine/technology_decision.js.map +1 -0
  412. package/dist/engine/template_manifest_io.d.ts +47 -0
  413. package/dist/engine/template_manifest_io.d.ts.map +1 -0
  414. package/dist/engine/template_manifest_io.js +151 -0
  415. package/dist/engine/template_manifest_io.js.map +1 -0
  416. package/dist/engine/template_mechanism_auditor.d.ts.map +1 -1
  417. package/dist/engine/template_mechanism_auditor.js +5 -4
  418. package/dist/engine/template_mechanism_auditor.js.map +1 -1
  419. package/dist/engine/template_sync.d.ts +98 -0
  420. package/dist/engine/template_sync.d.ts.map +1 -0
  421. package/dist/engine/template_sync.js +355 -0
  422. package/dist/engine/template_sync.js.map +1 -0
  423. package/dist/engine/test_generator.d.ts.map +1 -1
  424. package/dist/engine/test_generator.js +5 -4
  425. package/dist/engine/test_generator.js.map +1 -1
  426. package/dist/engine/test_quality.d.ts.map +1 -1
  427. package/dist/engine/test_quality.js +5 -4
  428. package/dist/engine/test_quality.js.map +1 -1
  429. package/dist/engine/tool_invocation_contract_registry.d.ts.map +1 -1
  430. package/dist/engine/tool_invocation_contract_registry.js +32 -31
  431. package/dist/engine/tool_invocation_contract_registry.js.map +1 -1
  432. package/dist/engine/traceability.d.ts.map +1 -1
  433. package/dist/engine/traceability.js +6 -5
  434. package/dist/engine/traceability.js.map +1 -1
  435. package/dist/engine/user_feedback_contract.d.ts.map +1 -1
  436. package/dist/engine/user_feedback_contract.js +81 -19
  437. package/dist/engine/user_feedback_contract.js.map +1 -1
  438. package/dist/engine/user_promise.d.ts +67 -0
  439. package/dist/engine/user_promise.d.ts.map +1 -0
  440. package/dist/engine/user_promise.js +436 -0
  441. package/dist/engine/user_promise.js.map +1 -0
  442. package/dist/engine/verifier.d.ts +6 -10
  443. package/dist/engine/verifier.d.ts.map +1 -1
  444. package/dist/engine/verifier.js +149 -1
  445. package/dist/engine/verifier.js.map +1 -1
  446. package/dist/engine/workflow_contract_registry.d.ts.map +1 -1
  447. package/dist/engine/workflow_contract_registry.js +127 -10
  448. package/dist/engine/workflow_contract_registry.js.map +1 -1
  449. package/dist/engine/workflow_template_pack.d.ts +71 -0
  450. package/dist/engine/workflow_template_pack.d.ts.map +1 -0
  451. package/dist/engine/workflow_template_pack.js +246 -0
  452. package/dist/engine/workflow_template_pack.js.map +1 -0
  453. package/dist/engine/workspace_resumer.d.ts.map +1 -1
  454. package/dist/engine/workspace_resumer.js +9 -8
  455. package/dist/engine/workspace_resumer.js.map +1 -1
  456. package/dist/engine/zero_config_init.d.ts.map +1 -1
  457. package/dist/engine/zero_config_init.js +16 -15
  458. package/dist/engine/zero_config_init.js.map +1 -1
  459. package/dist/git/operations.d.ts.map +1 -1
  460. package/dist/git/operations.js +18 -17
  461. package/dist/git/operations.js.map +1 -1
  462. package/dist/index.js +10 -9
  463. package/dist/index.js.map +1 -1
  464. package/dist/knowledge/conflict_detector.d.ts.map +1 -1
  465. package/dist/knowledge/conflict_detector.js +2 -1
  466. package/dist/knowledge/conflict_detector.js.map +1 -1
  467. package/dist/knowledge/health_checker.d.ts.map +1 -1
  468. package/dist/knowledge/health_checker.js +5 -4
  469. package/dist/knowledge/health_checker.js.map +1 -1
  470. package/dist/knowledge/index_manager.js +4 -4
  471. package/dist/knowledge/index_manager.js.map +1 -1
  472. package/dist/knowledge/loader.d.ts.map +1 -1
  473. package/dist/knowledge/loader.js +20 -14
  474. package/dist/knowledge/loader.js.map +1 -1
  475. package/dist/knowledge/writer.d.ts.map +1 -1
  476. package/dist/knowledge/writer.js +7 -6
  477. package/dist/knowledge/writer.js.map +1 -1
  478. package/dist/types.d.ts +28 -8
  479. package/dist/types.d.ts.map +1 -1
  480. package/package.json +13 -5
  481. package/templates/knowledge/acceptance_templates/Bug/345/210/206/346/236/220/346/250/241/347/211/210.md +27 -3
  482. package/templates/knowledge/acceptance_templates/POC/347/273/223/350/256/272/346/250/241/347/211/210.md +27 -3
  483. package/templates/knowledge/acceptance_templates//345/211/215/347/253/257/351/241/265/351/235/242/351/252/214/346/224/266/346/270/205/345/215/225.md +30 -3
  484. package/templates/knowledge/acceptance_templates//345/216/237/345/236/213/350/257/264/346/230/216/346/250/241/347/211/210.md +31 -3
  485. package/templates/knowledge/acceptance_templates//345/220/216/347/253/257API/351/252/214/346/224/266/346/270/205/345/215/225.md +29 -3
  486. package/templates/knowledge/acceptance_templates//345/256/211/345/205/250/345/256/241/350/256/241/346/250/241/347/211/210.md +27 -3
  487. package/templates/knowledge/acceptance_templates//346/200/247/350/203/275/345/210/206/346/236/220/346/250/241/347/211/210.md +27 -3
  488. package/templates/knowledge/acceptance_templates//346/212/200/346/234/257/351/200/211/345/236/213/351/252/214/346/224/266/346/270/205/345/215/225.md +30 -3
  489. package/templates/knowledge/acceptance_templates//346/216/245/345/217/243/345/257/271/346/216/245/346/226/271/346/241/210/346/250/241/347/211/210.md +26 -3
  490. package/templates/knowledge/acceptance_templates//346/216/245/345/217/243/350/256/276/350/256/241/346/250/241/347/211/210.md +27 -3
  491. package/templates/knowledge/acceptance_templates//346/225/205/351/232/234/345/244/215/347/233/230/346/250/241/347/211/210.md +28 -3
  492. package/templates/knowledge/acceptance_templates//346/225/260/346/215/256/345/272/223/345/217/230/346/233/264/346/226/271/346/241/210/346/250/241/347/211/210.md +26 -3
  493. package/templates/knowledge/acceptance_templates//346/225/260/346/215/256/345/272/223/345/217/230/346/233/264/351/252/214/346/224/266/346/270/205/345/215/225.md +31 -3
  494. package/templates/knowledge/acceptance_templates//346/236/266/346/236/204/350/256/276/350/256/241/346/250/241/347/211/210.md +27 -3
  495. package/templates/knowledge/acceptance_templates//346/265/213/350/257/225/350/256/241/345/210/222/346/250/241/347/211/210.md +27 -3
  496. package/templates/knowledge/acceptance_templates//350/257/246/347/273/206/350/256/276/350/256/241/346/250/241/347/211/210.md +26 -3
  497. package/templates/knowledge/acceptance_templates//350/277/201/347/247/273/350/257/204/344/274/260/346/250/241/347/211/210.md +27 -3
  498. package/templates/knowledge/acceptance_templates//351/200/232/347/224/250/350/264/250/351/207/217/351/252/214/346/224/266/346/270/205/345/215/225.md +30 -3
  499. package/templates/knowledge/acceptance_templates//351/207/215/346/236/204/346/226/271/346/241/210/346/250/241/347/211/210.md +27 -3
  500. package/templates/knowledge/acceptance_templates//351/234/200/346/261/202/345/210/206/346/236/220/346/250/241/347/211/210.md +27 -3
  501. package/templates/knowledge/checklists//344/270/273/351/223/276/350/267/257/346/216/245/345/205/245/351/252/214/346/224/266/346/270/205/345/215/225.md +29 -0
  502. package/templates/knowledge/checklists//344/274/232/350/257/235/346/201/242/345/244/215.md +30 -8
  503. package/templates/knowledge/checklists//345/267/245/344/275/234/346/265/201/351/252/214/346/224/266/346/270/205/345/215/225.md +30 -0
  504. package/templates/knowledge/checklists//346/240/270/345/277/203/345/267/245/347/250/213/346/211/247/350/241/214/351/252/214/346/224/266/346/270/205/345/215/225.md +29 -0
  505. package/templates/knowledge/checklists//347/237/245/350/257/206/346/263/250/345/205/245/351/252/214/346/224/266/346/270/205/345/215/225.md +30 -0
  506. package/templates/knowledge/checklists//351/232/220/347/247/201/345/256/241/346/237/245/346/270/205/345/215/225.md +29 -0
  507. package/templates/knowledge/checklists//351/252/214/350/257/201/351/252/214/346/224/266/346/270/205/345/215/225.md +29 -0
  508. package/templates/knowledge/domain//345/244/232/347/247/237/346/210/267.md +28 -3
  509. package/templates/knowledge/domain//345/256/241/350/256/241/346/227/245/345/277/227.md +27 -3
  510. package/templates/knowledge/domain//345/257/274/345/205/245/345/257/274/345/207/272/350/247/204/345/210/231.md +30 -3
  511. package/templates/knowledge/domain//345/267/245/344/275/234/346/265/201/345/274/225/346/223/216.md +32 -3
  512. package/templates/knowledge/domain//346/212/245/350/241/250/347/273/237/350/256/241.md +31 -3
  513. package/templates/knowledge/domain//346/224/257/344/273/230/350/247/204/345/210/231.md +31 -3
  514. package/templates/knowledge/domain//346/225/260/346/215/256/346/235/203/351/231/220.md +28 -3
  515. package/templates/knowledge/domain//351/200/232/347/224/250/346/234/272/346/242/260/346/235/241/346/254/276.md +30 -3
  516. package/templates/knowledge/domain//351/200/232/347/237/245/350/247/204/345/210/231.md +31 -3
  517. package/templates/knowledge/patterns/core/Diff/345/275/222/345/261/236/350/277/275/350/270/252.md +24 -7
  518. package/templates/knowledge/patterns/core/Java/350/264/250/351/207/217/351/227/250/347/246/201.md +25 -7
  519. package/templates/knowledge/patterns/core/LLM/351/242/204/347/256/227/347/275/221/345/205/263.md +24 -7
  520. package/templates/knowledge/patterns/core//344/273/273/345/212/241/344/270/212/344/270/213/346/226/207/347/224/237/345/221/275/345/221/250/346/234/237.md +24 -7
  521. package/templates/knowledge/patterns/core//344/273/273/345/212/241/347/256/241/347/220/206/345/231/250.md +25 -7
  522. package/templates/knowledge/patterns/core//344/275/234/347/224/250/345/237/237/344/270/216/345/257/206/351/222/245/346/213/246/346/210/252.md +24 -7
  523. package/templates/knowledge/patterns/core//344/275/234/347/224/250/345/237/237/347/247/237/347/272/246.md +25 -7
  524. package/templates/knowledge/patterns/core//345/206/262/347/252/201/351/227/250/347/246/201.md +24 -7
  525. package/templates/knowledge/patterns/core//345/206/263/347/255/226/347/275/221/345/205/263.md +26 -7
  526. package/templates/knowledge/patterns/core//345/217/230/345/274/202/345/256/241/350/256/241.md +25 -7
  527. package/templates/knowledge/patterns/core//345/233/236/345/275/222/347/237/251/351/230/265.md +24 -7
  528. package/templates/knowledge/patterns/core//345/267/245/344/275/234/345/214/272/344/272/222/346/226/245/351/224/201.md +24 -7
  529. package/templates/knowledge/patterns/core//345/267/245/344/275/234/345/214/272/345/224/244/351/206/222.md +24 -7
  530. package/templates/knowledge/patterns/core//345/271/266/345/217/221/351/224/201.md +26 -7
  531. package/templates/knowledge/patterns/core//345/274/200/345/217/221/350/200/205/345/256/252/346/263/225.md +26 -7
  532. package/templates/knowledge/patterns/core//346/225/217/346/204/237/344/277/241/346/201/257/346/211/253/346/217/217.md +24 -7
  533. package/templates/knowledge/patterns/core//346/262/273/347/220/206/350/277/220/350/241/214/346/227/266/345/276/252/347/216/257.md +25 -7
  534. package/templates/knowledge/patterns/core//346/265/201/345/274/217/345/277/203/350/267/263.md +25 -7
  535. package/templates/knowledge/patterns/core//347/237/245/350/257/206/344/270/273/346/235/203.md +25 -7
  536. package/templates/knowledge/patterns/core//350/257/255/344/271/211/350/257/201/346/215/256.md +24 -7
  537. package/templates/knowledge/patterns/core//350/277/220/350/241/214/345/256/211/345/205/250/345/214/205.md +25 -7
  538. package/templates/knowledge/patterns/core//351/233/266/351/205/215/347/275/256/345/210/235/345/247/213/345/214/226.md +24 -7
  539. package/templates/knowledge/patterns/core//351/252/214/350/257/201/345/221/275/344/273/244/347/224/237/346/210/220.md +24 -7
  540. package/templates/knowledge/procedures/Schema/345/217/230/346/233/264/346/265/201/346/260/264/347/272/277.md +29 -3
  541. package/templates/knowledge/procedures//344/270/273/351/223/276/350/267/257/346/216/245/345/205/245/351/252/214/350/257/201/346/265/201/347/250/213.md +33 -0
  542. package/templates/knowledge/procedures//344/273/243/347/240/201/351/227/250/347/246/201/346/265/201/347/250/213.md +30 -3
  543. package/templates/knowledge/procedures//344/273/273/345/212/241/346/213/206/350/247/243/346/265/201/347/250/213.md +30 -3
  544. package/templates/knowledge/procedures//345/212/237/350/203/275/345/274/200/345/217/221/346/265/201/347/250/213.md +30 -3
  545. package/templates/knowledge/procedures//345/221/275/344/273/244/346/211/247/350/241/214/346/265/201/347/250/213.md +34 -0
  546. package/templates/knowledge/procedures//345/256/211/345/205/250/345/212/240/345/233/272/346/265/201/346/260/264/347/272/277.md +30 -3
  547. package/templates/knowledge/procedures//345/267/245/345/205/267/350/260/203/347/224/250/346/265/201/347/250/213.md +34 -0
  548. package/templates/knowledge/procedures//346/200/247/350/203/275/346/265/201/346/260/264/347/272/277.md +30 -3
  549. package/templates/knowledge/procedures//346/204/217/345/233/276/350/267/257/347/224/261/346/265/201/347/250/213.md +34 -0
  550. package/templates/knowledge/procedures//346/216/245/345/217/243/351/233/206/346/210/220/346/265/201/346/260/264/347/272/277.md +30 -3
  551. package/templates/knowledge/procedures//346/225/260/346/215/256/345/272/223/350/277/201/347/247/273/346/265/201/347/250/213.md +29 -3
  552. package/templates/knowledge/procedures//346/234/254/345/234/260/346/265/217/350/247/210/345/231/250/351/252/214/346/224/266/345/267/245/344/275/234/346/265/201.md +99 -0
  553. package/templates/knowledge/procedures//346/236/266/346/236/204/350/256/276/350/256/241/345/267/245/344/275/234/346/265/201.md +95 -0
  554. package/templates/knowledge/procedures//346/236/266/346/236/204/350/256/276/350/256/241/346/265/201/347/250/213.md +30 -3
  555. package/templates/knowledge/procedures//346/246/202/345/277/265/351/252/214/350/257/201/346/265/201/346/260/264/347/272/277.md +30 -3
  556. package/templates/knowledge/procedures//346/265/213/350/257/225/344/274/230/345/205/210/347/274/226/347/240/201/345/267/245/344/275/234/346/265/201.md +91 -0
  557. package/templates/knowledge/procedures//346/272/220/347/240/201/345/216/237/345/236/213/344/272/244/344/273/230/346/265/201/347/250/213.md +30 -3
  558. package/templates/knowledge/procedures//347/216/260/346/234/211/347/263/273/347/273/237/345/267/256/350/267/235/345/210/206/346/236/220/345/267/245/344/275/234/346/265/201.md +97 -0
  559. package/templates/knowledge/procedures//347/237/245/350/257/206/347/273/264/346/212/244/346/265/201/346/260/264/347/272/277.md +30 -3
  560. package/templates/knowledge/procedures//347/264/247/346/200/245/344/277/256/345/244/215/346/265/201/346/260/264/347/272/277.md +30 -3
  561. package/templates/knowledge/procedures//347/264/247/346/200/245/344/277/256/345/244/215/346/265/201/347/250/213.md +30 -3
  562. package/templates/knowledge/procedures//347/274/226/347/240/201/345/211/215/346/276/204/346/270/205/346/265/201/347/250/213.md +33 -0
  563. package/templates/knowledge/procedures//347/274/272/351/231/267/344/277/256/345/244/215/346/265/201/346/260/264/347/272/277.md +30 -3
  564. package/templates/knowledge/procedures//350/207/252/344/270/273/351/200/211/345/236/213/346/265/201/347/250/213.md +30 -3
  565. package/templates/knowledge/procedures//350/257/246/347/273/206/350/256/276/350/256/241/346/265/201/347/250/213.md +30 -3
  566. package/templates/knowledge/procedures//350/260/203/350/257/225/346/216/222/346/237/245/346/265/201/347/250/213.md +30 -3
  567. package/templates/knowledge/procedures//350/277/201/347/247/273/346/265/201/346/260/264/347/272/277.md +30 -3
  568. package/templates/knowledge/procedures//351/203/250/347/275/262/345/217/221/345/270/203/346/265/201/347/250/213.md +30 -3
  569. package/templates/knowledge/procedures//351/207/215/346/236/204/346/265/201/346/260/264/347/272/277.md +30 -3
  570. package/templates/knowledge/procedures//351/233/206/346/210/220/351/252/214/350/257/201/346/265/201/347/250/213.md +30 -3
  571. package/templates/knowledge/procedures//351/234/200/346/261/202/346/276/204/346/270/205/346/265/201/347/250/213.md +30 -3
  572. package/templates/knowledge/procedures//351/252/214/346/224/266/346/265/213/350/257/225/350/247/204/345/210/222.md +30 -3
  573. package/templates/knowledge/procedures//351/252/214/350/257/201/350/256/241/345/210/222/346/265/201/347/250/213.md +30 -3
  574. package/templates/knowledge/review_rules//344/272/244/344/273/230/345/256/214/345/244/207/346/200/247/345/256/241/346/237/245/350/247/204/345/210/231.md +24 -3
  575. package/templates/knowledge/review_rules//345/256/211/345/205/250/345/256/241/346/237/245/350/247/204/345/210/231.md +24 -3
  576. package/templates/knowledge/review_rules//345/271/266/345/217/221/345/256/241/346/237/245/350/247/204/345/210/231.md +23 -3
  577. package/templates/knowledge/review_rules//346/200/247/350/203/275/345/256/241/346/237/245/350/247/204/345/210/231.md +24 -3
  578. package/templates/knowledge/review_rules//346/216/245/345/217/243/345/245/221/347/272/246/345/256/241/346/237/245/350/247/204/345/210/231.md +23 -3
  579. package/templates/knowledge/review_rules//346/236/266/346/236/204/345/256/241/346/237/245/350/247/204/345/210/231.md +24 -3
  580. package/templates/knowledge/review_rules//350/264/250/351/207/217/345/256/241/346/237/245/350/247/204/345/210/231.md +24 -3
  581. package/templates/knowledge/rules//344/272/247/347/211/251/345/245/221/347/272/246/350/247/204/345/210/231.md +36 -0
  582. package/templates/knowledge/rules//344/273/273/345/212/241/344/270/212/344/270/213/346/226/207/347/224/237/345/221/275/345/221/250/346/234/237/350/247/204/345/210/231.md +65 -0
  583. package/templates/knowledge/rules//345/221/275/344/273/244/346/211/247/350/241/214/350/247/204/345/210/231.md +36 -0
  584. package/templates/knowledge/rules//345/267/245/344/275/234/346/265/201/345/245/221/347/272/246/350/247/204/345/210/231.md +36 -0
  585. package/templates/knowledge/rules//345/267/245/344/275/234/346/265/201/346/250/241/346/235/277/345/214/205/350/247/204/345/210/231.md +38 -0
  586. package/templates/knowledge/rules//345/267/245/345/205/267/350/260/203/347/224/250/350/247/204/345/210/231.md +36 -0
  587. package/templates/knowledge/rules//346/204/217/345/233/276/350/267/257/347/224/261/350/247/204/345/210/231.md +36 -0
  588. package/templates/knowledge/rules//346/211/247/350/241/214/345/256/210/345/215/253/350/257/204/344/274/260/350/247/204/345/210/231.md +36 -0
  589. package/templates/knowledge/rules//346/211/251/345/261/225/347/224/237/345/221/275/345/221/250/346/234/237/350/247/204/345/210/231.md +38 -0
  590. package/templates/knowledge/rules//346/212/200/346/234/257/345/206/263/347/255/226/344/270/273/346/235/203/350/247/204/345/210/231.md +64 -0
  591. package/templates/knowledge/rules//346/225/217/346/204/237/344/277/241/346/201/257/345/244/204/347/220/206/350/247/204/345/210/231.md +36 -0
  592. package/templates/knowledge/rules//346/226/275/345/267/245/346/214/207/344/273/244/345/245/221/347/272/246/350/247/204/345/210/231.md +49 -0
  593. package/templates/knowledge/rules//346/240/270/345/277/203/344/275/223/351/252/214/345/216/237/345/210/231.md +50 -0
  594. package/templates/knowledge/rules//346/240/270/345/277/203/345/267/245/347/250/213/346/211/247/350/241/214/345/216/237/345/210/231.md +35 -0
  595. package/templates/knowledge/rules//346/263/250/345/206/214/350/241/250/345/237/272/347/241/200/350/256/276/346/226/275/350/247/204/345/210/231.md +36 -0
  596. package/templates/knowledge/rules//346/274/224/350/277/233/345/233/236/345/275/222/350/247/204/345/210/231.md +51 -0
  597. package/templates/knowledge/rules//346/274/224/350/277/233/345/233/236/345/275/222/351/227/250/346/216/247/350/247/204/345/210/231.md +74 -0
  598. package/templates/knowledge/rules//347/224/250/346/210/267/345/217/215/351/246/210/345/245/221/347/272/246/350/247/204/345/210/231.md +35 -0
  599. package/templates/knowledge/rules//347/237/245/350/257/206/346/263/250/345/205/245/350/276/271/347/225/214/350/247/204/345/210/231.md +36 -0
  600. package/templates/knowledge/rules//347/237/245/350/257/206/350/265/204/344/272/247/346/262/273/347/220/206/350/247/204/345/210/231.md +61 -0
  601. package/templates/knowledge/rules//347/254/254/344/270/200/346/200/247/345/216/237/347/220/206/346/216/250/347/220/206/350/247/204/345/210/231.md +73 -0
  602. package/templates/knowledge/rules//347/273/206/350/212/202/347/272/252/345/276/213/350/247/204/345/210/231.md +67 -0
  603. package/templates/knowledge/rules//350/204/221/346/232/264/344/270/216/346/226/271/346/241/210/346/216/242/347/264/242/350/247/204/345/210/231.md +66 -0
  604. package/templates/knowledge/rules//350/256/241/345/210/222/345/211/215/347/275/256/351/227/250/350/247/204/345/210/231.md +59 -0
  605. package/templates/knowledge/rules//350/267/250/345/271/263/345/217/260/350/267/257/345/276/204/345/256/211/345/205/250/350/247/204/345/210/231.md +38 -0
  606. package/templates/knowledge/rules//350/276/223/345/205/245/346/235/220/346/226/231/345/245/221/347/272/246/350/247/204/345/210/231.md +36 -0
  607. package/templates/knowledge/rules//351/205/215/347/275/256/344/274/230/345/205/210/347/272/247/350/247/204/345/210/231.md +35 -0
  608. package/templates/knowledge/rules//351/230/262/345/255/244/345/262/233/345/256/236/347/216/260/350/247/204/345/210/231.md +36 -0
  609. package/templates/knowledge/rules//351/233/266/351/205/215/347/275/256/345/210/235/345/247/213/345/214/226/350/247/204/345/210/231.md +36 -0
  610. package/templates/knowledge/rules//351/252/214/350/257/201/345/245/221/347/272/246/350/247/204/345/210/231.md +36 -0
  611. package/templates/knowledge/templates//345/256/241/346/237/245/346/221/230/350/246/201.md +26 -7
  612. package/templates/patterns/API/350/256/276/350/256/241/350/247/204/350/214/203.md +30 -3
  613. package/templates/patterns/Docker/351/203/250/347/275/262/350/247/204/350/214/203.md +29 -3
  614. package/templates/patterns/Git/346/223/215/344/275/234/350/247/204/350/214/203.md +33 -3
  615. package/templates/patterns/N/345/212/2401/346/237/245/350/257/242/350/247/204/350/214/203.md +31 -3
  616. package/templates/patterns/React/345/210/227/350/241/250/350/241/250/346/240/274/350/247/204/350/214/203.md +30 -3
  617. package/templates/patterns/React/346/216/245/345/217/243/351/233/206/346/210/220/350/247/204/350/214/203.md +31 -3
  618. package/templates/patterns/React/347/212/266/346/200/201/347/256/241/347/220/206/350/247/204/350/214/203.md +31 -3
  619. package/templates/patterns/React/347/273/204/344/273/266/350/247/204/350/214/203.md +30 -3
  620. package/templates/patterns/React/350/241/250/345/215/225/350/247/204/350/214/203.md +30 -3
  621. package/templates/patterns/React/350/267/257/347/224/261/350/247/204/350/214/203.md +31 -3
  622. package/templates/patterns/Schema/345/205/274/345/256/271/350/247/204/350/214/203.md +30 -3
  623. package/templates/patterns/Vue/347/212/266/346/200/201/347/256/241/347/220/206/350/247/204/350/214/203.md +29 -3
  624. package/templates/patterns/Vue/347/273/204/344/273/266/350/247/204/350/214/203.md +33 -3
  625. package/templates/patterns/Vue/350/267/257/347/224/261/350/247/204/350/214/203.md +28 -3
  626. package/templates/patterns//344/272/213/344/273/266/351/251/261/345/212/250/350/247/204/350/214/203.md +32 -3
  627. package/templates/patterns//344/272/213/345/212/241/346/250/241/345/274/217/350/247/204/350/214/203.md +31 -3
  628. package/templates/patterns//344/274/230/351/233/205/345/201/234/346/234/272/350/247/204/350/214/203.md +31 -3
  629. package/templates/patterns//345/205/250/346/240/210/346/265/201/347/250/213/344/277/256/345/244/215.md +30 -3
  630. package/templates/patterns//345/210/206/351/241/265/346/237/245/350/257/242/350/247/204/350/214/203.md +34 -3
  631. package/templates/patterns//345/211/215/347/253/257/346/200/247/350/203/275/350/247/204/350/214/203.md +32 -3
  632. package/templates/patterns//345/221/275/345/220/215/350/247/204/350/214/203.md +30 -3
  633. package/templates/patterns//345/233/275/351/231/205/345/214/226/350/247/204/350/214/203.md +31 -3
  634. package/templates/patterns//345/242/236/345/210/240/346/224/271/346/237/245/350/247/204/350/214/203.md +31 -3
  635. package/templates/patterns//345/244/226/351/203/250/344/276/235/350/265/226/350/247/204/350/214/203.md +31 -3
  636. package/templates/patterns//345/245/221/347/272/246/345/205/274/345/256/271/350/247/204/350/214/203.md +28 -3
  637. package/templates/patterns//345/256/232/346/227/266/344/273/273/345/212/241/350/247/204/350/214/203.md +32 -3
  638. package/templates/patterns//345/256/236/346/227/266/346/216/250/351/200/201/350/247/204/350/214/203.md +31 -3
  639. package/templates/patterns//345/267/245/347/250/213/347/272/252/345/276/213.md +30 -3
  640. package/templates/patterns//345/271/266/345/217/221/346/216/247/345/210/266/350/247/204/350/214/203.md +34 -3
  641. package/templates/patterns//345/274/202/346/255/245/345/257/274/345/207/272/350/247/204/350/214/203.md +31 -3
  642. package/templates/patterns//346/216/245/345/217/243/345/245/221/347/272/246/350/247/204/350/214/203.md +29 -3
  643. package/templates/patterns//346/220/234/347/264/242/346/250/241/345/274/217/350/247/204/350/214/203.md +33 -3
  644. package/templates/patterns//346/225/260/346/215/256/351/232/220/347/247/201/350/247/204/350/214/203.md +34 -3
  645. package/templates/patterns//346/226/207/344/273/266/344/270/212/344/274/240/350/247/204/350/214/203.md +30 -3
  646. package/templates/patterns//346/227/240/351/232/234/347/242/215/350/247/204/350/214/203.md +30 -3
  647. package/templates/patterns//346/227/245/345/277/227/350/247/204/350/214/203.md +31 -3
  648. package/templates/patterns//346/235/203/351/231/220/350/256/244/350/257/201/350/247/204/350/214/203.md +34 -3
  649. package/templates/patterns//346/236/266/346/236/204/347/272/242/347/272/277.md +28 -3
  650. package/templates/patterns//346/265/213/350/257/225/350/264/250/351/207/217/350/247/204/350/214/203.md +30 -3
  651. package/templates/patterns//347/206/224/346/226/255/351/231/215/347/272/247/350/247/204/350/214/203.md +32 -3
  652. package/templates/patterns//347/212/266/346/200/201/346/265/201/350/275/254/350/247/204/350/214/203.md +29 -3
  653. package/templates/patterns//347/272/246/346/235/237/345/256/236/347/216/260/350/247/204/350/214/203.md +32 -3
  654. package/templates/patterns//347/274/223/345/255/230/347/255/226/347/225/245/350/247/204/350/214/203.md +31 -3
  655. package/templates/patterns//347/274/226/347/240/201/350/264/250/351/207/217/350/247/204/350/214/203.md +30 -3
  656. package/templates/patterns//347/274/272/351/231/267/347/256/241/347/220/206/350/247/204/350/214/203.md +29 -3
  657. package/templates/patterns//350/260/203/350/257/225/346/226/271/346/263/225/350/256/272.md +30 -3
  658. package/templates/patterns//350/276/223/345/205/245/346/240/241/351/252/214/350/247/204/350/214/203.md +31 -3
  659. package/templates/patterns//351/224/231/350/257/257/345/244/204/347/220/206/350/247/204/350/214/203.md +31 -3
  660. package/templates/patterns//351/224/231/350/257/257/350/276/271/347/225/214/350/247/204/350/214/203.md +33 -3
  661. package/templates/patterns//351/242/206/345/237/237/351/251/261/345/212/250/350/256/276/350/256/241/350/247/204/350/214/203.md +30 -3
  662. package/dist/engine/batch1_manifest.d.ts.map +0 -1
  663. package/dist/engine/batch1_manifest.js.map +0 -1
  664. package/dist/engine/batch1_scenario_registry.d.ts.map +0 -1
  665. package/dist/engine/batch1_scenario_registry.js.map +0 -1
  666. package/dist/engine/batch1_scenario_runners.d.ts.map +0 -1
  667. package/dist/engine/batch1_scenario_runners.js.map +0 -1
@@ -0,0 +1,1050 @@
1
+ /**
2
+ * 发布就绪门禁 — CLI 和 npm 共用的正式发布检查逻辑。
3
+ *
4
+ * 本模块是 validate-release 的唯一正式入口。
5
+ * 旧 validate-batch* gate 仅代表历史施工检查,不代表正式发布通过。
6
+ *
7
+ * 检查项:
8
+ * 0. dist 旧产物风险
9
+ * 1. Batch 施工痕迹泄漏
10
+ * 2. 双层模型语义归位
11
+ * 3. 主链路真实消费
12
+ * 4. 模板/adapter 更新空洞
13
+ * 5. 旧 gate 误导标记
14
+ * 6. 测试污染初筛
15
+ * 7. Batch 问题文档格式一致性
16
+ */
17
+ import fs from "node:fs";
18
+ import path from "node:path";
19
+ // ── 辅助函数 ──
20
+ function safeRead(filePath) {
21
+ try {
22
+ return fs.readFileSync(filePath, "utf8");
23
+ }
24
+ catch {
25
+ return null;
26
+ }
27
+ }
28
+ function safeReadLines(filePath) {
29
+ const content = safeRead(filePath);
30
+ return content ? content.split("\n") : [];
31
+ }
32
+ // ── 0. dist 旧产物风险 ──
33
+ function checkDistFreshness(rootDir, hardFail) {
34
+ const srcDir = path.join(rootDir, "src");
35
+ const distDir = path.join(rootDir, "dist");
36
+ if (!fs.existsSync(distDir)) {
37
+ hardFail("DIST_STALE", "dist/ 目录不存在,请先 npm run build", ["dist/"], "构建系统", "旧 gate 不检查 dist 是否存在", "构建");
38
+ return;
39
+ }
40
+ let latestSrc = new Date(0);
41
+ function findLatestSrc(dir) {
42
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
43
+ for (const entry of entries) {
44
+ const full = path.join(dir, entry.name);
45
+ if (entry.isDirectory()) {
46
+ if (entry.name === "node_modules")
47
+ continue;
48
+ findLatestSrc(full);
49
+ }
50
+ else if (entry.isFile() && entry.name.endsWith(".ts")) {
51
+ const stat = fs.statSync(full);
52
+ if (stat.mtime > latestSrc)
53
+ latestSrc = stat.mtime;
54
+ }
55
+ }
56
+ }
57
+ findLatestSrc(srcDir);
58
+ let oldestDist = new Date(Infinity);
59
+ let distFileCount = 0;
60
+ function findOldestDist(dir) {
61
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
62
+ for (const entry of entries) {
63
+ const full = path.join(dir, entry.name);
64
+ if (entry.isDirectory()) {
65
+ findOldestDist(full);
66
+ }
67
+ else if (entry.isFile() && entry.name.endsWith(".js")) {
68
+ distFileCount++;
69
+ const stat = fs.statSync(full);
70
+ if (stat.mtime < oldestDist)
71
+ oldestDist = stat.mtime;
72
+ }
73
+ }
74
+ }
75
+ findOldestDist(distDir);
76
+ if (distFileCount === 0) {
77
+ hardFail("DIST_STALE", "dist/ 中无 .js 文件,请先 npm run build", ["dist/"], "构建系统", "旧 gate 不检查 dist 是否为空", "构建");
78
+ }
79
+ else if (oldestDist < latestSrc) {
80
+ hardFail("DIST_STALE", `dist/ 最旧文件 (${oldestDist.toISOString()}) 早于 src/ 最新文件 (${latestSrc.toISOString()}),存在过期风险`, ["dist/", "src/"], "构建系统", "旧 gate 不检查 dist 与 src 的时间一致性", "构建");
81
+ }
82
+ }
83
+ // ── 1. Batch 施工痕迹泄漏 ──
84
+ function checkBatchTraceLeakage(rootDir, hardFail, _info) {
85
+ const srcDir = path.join(rootDir, "src");
86
+ const batchRegex = /\b(batch[1-5]|batch_[1-5])\b/i;
87
+ // 白名单: 仅允许 @deprecated 标记和类型中的迁移兼容字段
88
+ const allowedPatterns = [/deprecated/i, /@deprecated/, /迁移兼容/];
89
+ const findings = [];
90
+ function scanDir(dir) {
91
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
92
+ for (const entry of entries) {
93
+ const full = path.join(dir, entry.name);
94
+ if (entry.isDirectory()) {
95
+ if (entry.name === "node_modules" || entry.name === "dist")
96
+ continue;
97
+ scanDir(full);
98
+ }
99
+ else if (entry.isFile() && entry.name.endsWith(".ts")) {
100
+ const lines = safeReadLines(full);
101
+ const rel = path.relative(rootDir, full);
102
+ for (let i = 0; i < lines.length; i++) {
103
+ const line = lines[i];
104
+ if (!batchRegex.test(line))
105
+ continue;
106
+ if (allowedPatterns.some(p => p.test(line)))
107
+ continue;
108
+ findings.push({ file: rel, line: i + 1, content: line.trim() });
109
+ }
110
+ }
111
+ }
112
+ }
113
+ scanDir(srcDir);
114
+ if (findings.length > 0) {
115
+ const criticalFindings = findings.filter(f => {
116
+ if (f.file.startsWith("src/engine/") && !f.content.startsWith("//") && !f.content.startsWith("*"))
117
+ return true;
118
+ return false;
119
+ });
120
+ for (const f of criticalFindings) {
121
+ hardFail("BATCH_TRACE_LEAK", `正式代码中发现 batch 施工痕迹: ${f.content}`, [f.file], `${f.file}:${f.line}`, "旧 validate-batch* gate 只检查文件是否存在和测试是否通过,不检查 batch 命名是否泄漏到正式 runtime", "清理");
122
+ }
123
+ const nonCritical = findings.filter(f => !criticalFindings.includes(f));
124
+ for (const f of nonCritical) {
125
+ _info(` [注意] batch 引用在: ${f.file}:${f.line} — ${f.content}`);
126
+ }
127
+ }
128
+ }
129
+ // ── 2. 双层模型语义归位 ──
130
+ async function checkDualLayerSemantics(rootDir, hardFail, _info) {
131
+ const registryPath = path.join(rootDir, "dist", "engine", "dual_layer_mechanism_registry.js");
132
+ const consumablePath = path.join(rootDir, "dist", "engine", "consumable_asset_registry.js");
133
+ if (!fs.existsSync(registryPath)) {
134
+ hardFail("REGISTRY_NOT_BUILT", "dual_layer_mechanism_registry.js 未编译,请先 npm run build", ["dist/engine/dual_layer_mechanism_registry.js"], "构建系统", "旧 gate 只检查源文件存在,不检查是否可运行", "构建");
135
+ return;
136
+ }
137
+ let mechanisms = [];
138
+ let consumableAssets = [];
139
+ try {
140
+ const reg = await import(registryPath);
141
+ mechanisms = reg.listMechanismLayerMaps ? reg.listMechanismLayerMaps() : [];
142
+ }
143
+ catch (e) {
144
+ hardFail("REGISTRY_LOAD_FAIL", `无法加载 dual_layer_mechanism_registry: ${e.message}`, ["dist/engine/dual_layer_mechanism_registry.js"], "构建系统", "旧 gate 只检查源文件存在,不检查运行时可加载", "修复");
145
+ return;
146
+ }
147
+ try {
148
+ const con = await import(consumablePath);
149
+ consumableAssets = con.listBuiltinConsumableAssets ? con.listBuiltinConsumableAssets() : [];
150
+ }
151
+ catch (e) {
152
+ _info(` [警告] 无法加载 consumable_asset_registry: ${e.message}`);
153
+ }
154
+ const enforced = mechanisms.filter((m) => m.status === "dual_layer_enforced");
155
+ for (const mech of enforced) {
156
+ const assets = mech.template_assets || [];
157
+ if (assets.length > 0 && assets.every((a) => a.consumption_mode === "supporting")) {
158
+ hardFail("ALL_SUPPORTING_ASSETS", `机制 ${mech.mechanism_id} 的所有模板资产都是 supporting 模式,无 required 资产: ${assets.map((a) => a.path).join(", ")}`, assets.map((a) => a.path), mech.mechanism_id, "旧 gate 用 template_assets.length > 0 判断模板层通过,不区分 required/supporting", "修复语义归位");
159
+ continue;
160
+ }
161
+ for (const asset of assets) {
162
+ const inConsumable = consumableAssets.find((ca) => ca.path === asset.path && ca.owner_mechanism_id === mech.mechanism_id);
163
+ if (!inConsumable) {
164
+ const assetBasename = path.basename(asset.path, ".md");
165
+ const mechanismIdShort = mech.mechanism_id.replace("mc-", "");
166
+ const nameCorresponds = assetBasename.includes(mechanismIdShort) || assetBasename.includes(mech.mechanism_name);
167
+ if (!nameCorresponds && asset.consumption_mode === "supporting") {
168
+ hardFail("TEMPLATE_SEMANTIC_MISALIGN", `机制 ${mech.mechanism_id} 的模板 ${asset.path} 在 consumable_asset_registry 中未声明 owner_mechanism_id 为该机制,且文件名不对应机制名称`, [asset.path, "src/engine/consumable_asset_registry.ts"], mech.mechanism_id, "旧 gate 用 template_assets.length > 0 判断模板层通过,不检查资产是否语义归属该机制", "修复语义归位");
169
+ }
170
+ }
171
+ }
172
+ }
173
+ const firstPrinciples = enforced.find((m) => m.mechanism_id === "mc-first-principles");
174
+ if (firstPrinciples) {
175
+ const assets = firstPrinciples.template_assets || [];
176
+ if (assets.length === 1 && assets[0].path.includes("架构设计工作流") && assets[0].consumption_mode === "supporting") {
177
+ hardFail("FIRST_PRINCIPLES_MISALIGNED", "mc-first-principles 只挂了 架构设计工作流.md(supporting),无自有模板资产。第一性原理检查应有独立的推理框架模板或规则", ["templates/knowledge/procedures/架构设计工作流.md", "src/engine/dual_layer_mechanism_registry.ts"], "mc-first-principles", "旧 gate 用 template_assets.length > 0 判断通过,不检查资产内容是否匹配机制语义", "修复语义归位");
178
+ }
179
+ }
180
+ for (const sm of [{ id: "mc-brainstorm-contract", name: "脑暴与方案探索" }, { id: "mc-detail-discipline", name: "细节纪律" }, { id: "mc-decision-sovereignty", name: "技术决策主权" }]) {
181
+ const mech = enforced.find((m) => m.mechanism_id === sm.id);
182
+ if (!mech)
183
+ continue;
184
+ const assets = mech.template_assets || [];
185
+ if (assets.every((a) => a.path.includes("架构设计工作流") || a.path.includes("测试优先编码工作流")) && assets.every((a) => a.consumption_mode === "supporting")) {
186
+ hardFail("SHARED_SUPPORTING_ONLY", `${sm.id}(${sm.name}) 只挂了共享的 supporting 模板(架构设计工作流/测试优先编码工作流),无自有 required 模板资产`, assets.map((a) => a.path), sm.id, "旧 gate 用 template_assets.length > 0 判断通过,不检查模板是否专属", "修复语义归位");
187
+ }
188
+ }
189
+ // 检查 required template asset 是否在 ASSET_MANIFEST 中注册
190
+ try {
191
+ const manifestPath = path.join(rootDir, "dist/engine/asset_manifest.js");
192
+ const manifestMod = await import(manifestPath);
193
+ const manifestEntries = manifestMod.ASSET_MANIFEST || [];
194
+ for (const mech of enforced) {
195
+ const assets = mech.template_assets || [];
196
+ for (const asset of assets) {
197
+ if (asset.consumption_mode !== "required")
198
+ continue;
199
+ const inManifest = manifestEntries.some((me) => me.path === asset.path && me.owner_mechanism_id === mech.mechanism_id && me.consumption_mode === "required");
200
+ if (!inManifest) {
201
+ hardFail("ASSET_MANIFEST_GAP", `机制 ${mech.mechanism_id} 的 required 模板 ${asset.path} 未在 ASSET_MANIFEST 中注册`, [asset.path, "src/engine/asset_manifest.ts"], mech.mechanism_id, "旧 gate 不检查 required 模板是否同步进入 ASSET_MANIFEST", "修复语义归位");
202
+ }
203
+ }
204
+ }
205
+ }
206
+ catch (e) {
207
+ _info(` [警告] 无法加载 asset_manifest 进行 required 模板检查: ${e.message}`);
208
+ }
209
+ _info(` 共检查 ${enforced.length} 个 dual_layer_enforced 机制`);
210
+ }
211
+ // ── 3. 主链路真实消费 ──
212
+ /** 已知的消费者入口→文件映射 */
213
+ const CONSUMER_ENTRY_FILES = {
214
+ "CLI validate": ["src/bin/soloforge.ts"],
215
+ "CLI sync-templates": ["src/bin/soloforge.ts"],
216
+ "CLI sync-adapters": ["src/bin/soloforge.ts"],
217
+ "CLI migrate": ["src/bin/soloforge.ts"],
218
+ "CLI validate-knowledge": ["src/engine/knowledge_scenario_registry.ts"],
219
+ "sf_verify": ["src/engine/verifier.ts"],
220
+ "sf_deliver": ["src/adapters/claude_code/tools.ts", "src/engine/delivery_readiness.ts"],
221
+ "sf_expand": ["src/engine/intent_expander.ts"],
222
+ "问题管理流程": [],
223
+ };
224
+ /** 模块名→文件路径映射 (用于模块间调用链如 "knowledge_evolution.validateCandidateTrust") */
225
+ const MODULE_FILE_MAP = {
226
+ "knowledge_lifecycle": "src/engine/knowledge_lifecycle.ts",
227
+ "knowledge_evolution": "src/engine/knowledge_evolution.ts",
228
+ "chinese_semantic_priority": "src/engine/chinese_semantic_priority.ts",
229
+ "language_policy": "src/engine/language_policy.ts",
230
+ "documentation_governance": "src/engine/documentation_governance.ts",
231
+ "template_sync": "src/engine/template_sync.ts",
232
+ "user_promise": "src/engine/user_promise.ts",
233
+ "adapter_prompt_contract": "src/engine/adapter_prompt_contract.ts",
234
+ "release_compatibility": "src/engine/release_compatibility.ts",
235
+ "extension_contract": "src/engine/extension_contract.ts",
236
+ "platform_context": "src/engine/platform_context.ts",
237
+ "metric_governance": "src/engine/metric_governance.ts",
238
+ "technology_decision": "src/engine/technology_decision.ts",
239
+ "brainstorm_contract": "src/engine/brainstorm_contract.ts",
240
+ "detail_discipline": "src/engine/detail_discipline.ts",
241
+ "first_principles": "src/engine/first_principles.ts",
242
+ "architecture_design_contract": "src/engine/architecture_design_contract.ts",
243
+ "existing_system_analysis": "src/engine/existing_system_analysis.ts",
244
+ "coding_readiness_gate": "src/engine/coding_readiness_gate.ts",
245
+ "local_docker_acceptance": "src/engine/local_docker_acceptance.ts",
246
+ "workflow_template_pack": "src/engine/workflow_template_pack.ts",
247
+ "evolution_regression_gate": "src/engine/evolution_regression_gate.ts",
248
+ "delivery_readiness": "src/engine/delivery_readiness.ts",
249
+ "knowledge_scenario_registry": "src/engine/knowledge_scenario_registry.ts",
250
+ "intent_expander": "src/engine/intent_expander.ts",
251
+ };
252
+ /** 从调用链文本中解析出所有消费者文件 */
253
+ function resolveConsumerFiles(chainText) {
254
+ const files = new Set();
255
+ const segments = chainText.split("→").map(s => s.trim()).filter(Boolean);
256
+ for (const seg of segments) {
257
+ // 检查是否匹配已知入口 (如 "CLI validate →" 或 "sf_verify →")
258
+ for (const [entry, paths] of Object.entries(CONSUMER_ENTRY_FILES)) {
259
+ if (seg.includes(entry) || seg.startsWith(entry)) {
260
+ for (const p of paths)
261
+ files.add(p);
262
+ }
263
+ }
264
+ // 检查是否匹配 cmdXxx 命令 (如 "cmdValidate")
265
+ const cmdMatch = seg.match(/cmd([A-Z]\w+)/);
266
+ if (cmdMatch) {
267
+ // cmd* 函数通常在 src/bin/soloforge.ts
268
+ files.add("src/bin/soloforge.ts");
269
+ }
270
+ // 检查是否匹配 generateVerifyCommands
271
+ if (seg.includes("generateVerifyCommands")) {
272
+ files.add("src/engine/verifier.ts");
273
+ }
274
+ // 检查是否匹配 evaluateDeliveryReadiness
275
+ if (seg.includes("evaluateDeliveryReadiness")) {
276
+ files.add("src/engine/delivery_readiness.ts");
277
+ files.add("src/adapters/claude_code/tools.ts");
278
+ }
279
+ // 检查是否匹配 cmdSyncTemplates/cmdSyncAdapters/cmdMigrate
280
+ if (seg.includes("cmdSyncTemplates") || seg.includes("cmdSyncAdapters") || seg.includes("cmdMigrate") || seg.includes("cmdValidate")) {
281
+ files.add("src/bin/soloforge.ts");
282
+ }
283
+ // 检查模块.function 模式 (如 "knowledge_evolution.validateCandidateTrust")
284
+ for (const [modName, modPath] of Object.entries(MODULE_FILE_MAP)) {
285
+ if (seg.includes(`${modName}.`) || seg.includes(modName)) {
286
+ files.add(modPath);
287
+ }
288
+ }
289
+ // 检查 buildTemplateManifestFromSource
290
+ if (seg.includes("buildTemplateManifestFromSource")) {
291
+ files.add("src/bin/soloforge.ts");
292
+ }
293
+ }
294
+ return [...files];
295
+ }
296
+ /** 从字符串数组格式的字段中提取文件路径列表 */
297
+ function extractStringArray(rawValue) {
298
+ // 处理 ["a", "b"] 格式
299
+ const items = rawValue.match(/["']([^"']+)["']/g) || [];
300
+ return items.map(s => s.replace(/["']/g, ""));
301
+ }
302
+ /** 从注册表文件内容中提取所有验收条目的结构化数据 */
303
+ function parseAcceptanceEntries(content) {
304
+ const entries = [];
305
+ const lines = content.split("\n");
306
+ let currentEntry = null;
307
+ for (let i = 0; i < lines.length; i++) {
308
+ const line = lines[i];
309
+ // 检测新条目开始 (issue_id 出现)
310
+ const issueMatch = line.match(/issue_id:\s*["']([^"']+)["']/);
311
+ if (issueMatch) {
312
+ if (currentEntry)
313
+ entries.push(currentEntry);
314
+ currentEntry = {
315
+ issue_id: issueMatch[1],
316
+ owner_files: [],
317
+ required_entrypoints: [],
318
+ mainline_consumption_check: "",
319
+ entryStartLine: i,
320
+ };
321
+ continue;
322
+ }
323
+ if (!currentEntry)
324
+ continue;
325
+ // 提取 owner_files
326
+ if (line.includes("owner_files:") && !line.includes("//")) {
327
+ // 可能是单行或多行
328
+ let raw = line;
329
+ if (!raw.includes("]")) {
330
+ let j = i + 1;
331
+ while (j < lines.length && !raw.includes("]")) {
332
+ raw += lines[j];
333
+ j++;
334
+ }
335
+ }
336
+ currentEntry.owner_files = extractStringArray(raw.replace(/^.*owner_files:\s*/, ""));
337
+ }
338
+ // 提取 required_entrypoints
339
+ if (line.includes("required_entrypoints:") && !line.includes("//")) {
340
+ let raw = line;
341
+ if (!raw.includes("]")) {
342
+ let j = i + 1;
343
+ while (j < lines.length && !raw.includes("]")) {
344
+ raw += lines[j];
345
+ j++;
346
+ }
347
+ }
348
+ currentEntry.required_entrypoints = extractStringArray(raw.replace(/^.*required_entrypoints:\s*/, ""));
349
+ }
350
+ // 提取 mainline_consumption_check
351
+ if (line.includes("mainline_consumption_check:") && !line.includes("//")) {
352
+ let raw = line;
353
+ if (!raw.includes("]")) {
354
+ let j = i + 1;
355
+ while (j < lines.length && !raw.includes("]")) {
356
+ raw += lines[j];
357
+ j++;
358
+ }
359
+ }
360
+ currentEntry.mainline_consumption_check = raw.replace(/^.*mainline_consumption_check:\s*/, "");
361
+ }
362
+ }
363
+ if (currentEntry)
364
+ entries.push(currentEntry);
365
+ return entries;
366
+ }
367
+ function checkMainlineConsumption(rootDir, hardFail, _info) {
368
+ const registryFiles = [
369
+ { filePath: "tests/engine/extension_acceptance_registry.ts", label: "Extension 验收" },
370
+ { filePath: "src/engine/knowledge_acceptance_registry.ts", label: "知识验收" },
371
+ ];
372
+ for (const reg of registryFiles) {
373
+ const content = safeRead(path.join(rootDir, reg.filePath));
374
+ if (!content) {
375
+ _info(` [跳过] ${reg.filePath} 不存在`);
376
+ continue;
377
+ }
378
+ const entries = parseAcceptanceEntries(content);
379
+ for (const entry of entries) {
380
+ // ── 检查 1: owner_files 必须在磁盘上存在 ──
381
+ for (const ownerFile of entry.owner_files) {
382
+ const fullPath = path.join(rootDir, ownerFile);
383
+ if (!fs.existsSync(fullPath)) {
384
+ hardFail("MAINLINE_OWNER_FILE_MISSING", `${reg.label}: ${entry.issue_id} 的 owner_file "${ownerFile}" 不存在`, [reg.filePath, ownerFile], entry.issue_id, "旧 gate 不校验 owner_files 是否真实存在", "创建缺失文件或修正 owner_files");
385
+ }
386
+ }
387
+ // ── 检查 2: required_entrypoints 必须在 owner_files 中真实 export ──
388
+ for (const ep of entry.required_entrypoints) {
389
+ let found = false;
390
+ for (const ownerFile of entry.owner_files) {
391
+ const srcContent = safeRead(path.join(rootDir, ownerFile));
392
+ if (!srcContent)
393
+ continue;
394
+ // 检查 export function 或 export const 或 export async function
395
+ const exportPattern = new RegExp(`export\\s+(async\\s+)?function\\s+${ep}\\b|export\\s+const\\s+${ep}\\b`);
396
+ if (exportPattern.test(srcContent)) {
397
+ found = true;
398
+ break;
399
+ }
400
+ }
401
+ if (!found) {
402
+ hardFail("MAINLINE_ENTRYPOINT_NOT_EXPORTED", `${reg.label}: ${entry.issue_id} 的 required_entrypoint "${ep}" 未在 owner_files 中找到 export`, [reg.filePath, ...entry.owner_files], entry.issue_id, "旧 gate 不校验 required_entrypoints 是否真实导出", "添加缺失的 export 或修正 required_entrypoints");
403
+ }
404
+ }
405
+ // ── 检查 3: 调用链格式 — pending_integration 或至少 2 级 (→ 分隔) ──
406
+ const chainText = entry.mainline_consumption_check.match(/\[([^\]]+)\]/)?.[1] || "";
407
+ const isPendingIntegration = chainText.includes("pending_integration");
408
+ const chainSegments = chainText.split("→").map(s => s.trim()).filter(Boolean);
409
+ if (isPendingIntegration) {
410
+ // 诚实标记: 入口已 export 但无生产消费者 — hard_fail 提醒集成未完成
411
+ hardFail("MAINLINE_PENDING_INTEGRATION", `${reg.label}: ${entry.issue_id} 标记为 pending_integration: ${chainText.replace("pending_integration: ", "")}`, [reg.filePath], entry.issue_id, "入口函数已实现但无真实生产消费路径", "补充消费者源码调用");
412
+ continue;
413
+ }
414
+ if (chainSegments.length < 2) {
415
+ hardFail("MAINLINE_CHAIN_TOO_SHORT", `${reg.label}: ${entry.issue_id} 的 mainline_consumption_check 调用链不足 2 级: "${chainText}"`, [reg.filePath], entry.issue_id, "调用链必须包含入口→调用→效果至少 2 级", "补充调用链");
416
+ continue;
417
+ }
418
+ // ── 检查 4: 调用链中声称的消费者必须真实 import/call required_entrypoints ──
419
+ const consumerFiles = resolveConsumerFiles(chainText);
420
+ if (consumerFiles.length === 0) {
421
+ // 调用链中的入口无法映射到任何消费者文件
422
+ hardFail("MAINLINE_CONSUMER_NOT_FOUND", `${reg.label}: ${entry.issue_id} 的调用链入口无法映射到已知消费者文件: "${chainSegments[0]}"`, [reg.filePath], entry.issue_id, "调用链声称的入口没有对应的消费者文件", "补充消费源码或修正调用链描述");
423
+ continue;
424
+ }
425
+ // 对每个 required_entrypoint,验证至少有一条真实消费路径
426
+ // 路径 A: 消费者文件直接 import + call 该 entrypoint
427
+ // 路径 B: entrypoint 在 owner_file 内部被同一模块的另一个已消费函数调用 (传递消费)
428
+ // 条件: 消费者 import 了 owner_file 的某个函数 + entrypoint 在 owner_file 内被调用
429
+ for (const ep of entry.required_entrypoints) {
430
+ let consumedByRealCode = false;
431
+ // 路径 A: 直接消费
432
+ for (const consumerFile of consumerFiles) {
433
+ const consumerContent = safeRead(path.join(rootDir, consumerFile));
434
+ if (!consumerContent)
435
+ continue;
436
+ const staticImportPattern = new RegExp(`import\\s+\\{[^}]*\\b${ep}\\b[^}]*\\}\\s+from`);
437
+ const dynamicImportPattern = new RegExp(`\\{[^}]*\\b${ep}\\b[^}]*\\}\\s*=\\s*await\\s+import\\(`);
438
+ const hasImport = staticImportPattern.test(consumerContent) || dynamicImportPattern.test(consumerContent);
439
+ if (!hasImport)
440
+ continue;
441
+ const importLinePattern = new RegExp(`import\\s+\\{[^}]*\\b${ep}\\b|\\{[^}]*\\b${ep}\\b[^}]*\\}\\s*=\\s*await\\s+import`);
442
+ const callLines = consumerContent.split("\n").filter(l => !importLinePattern.test(l) && l.includes(ep));
443
+ if (callLines.length > 0) {
444
+ consumedByRealCode = true;
445
+ break;
446
+ }
447
+ }
448
+ // 路径 B: 传递消费 — entrypoint 在 owner_file 内部被另一个函数调用
449
+ // 且消费者 import 了 owner_file 中的某个函数
450
+ if (!consumedByRealCode) {
451
+ for (const ownerFile of entry.owner_files) {
452
+ const ownerContent = safeRead(path.join(rootDir, ownerFile));
453
+ if (!ownerContent)
454
+ continue;
455
+ // 检查 entrypoint 在 owner_file 内部被非 export 行调用
456
+ const ownerLines = ownerContent.split("\n");
457
+ const exportLinePattern = new RegExp(`export\\s+(async\\s+)?function\\s+${ep}\\b|export\\s+const\\s+${ep}\\b`);
458
+ const internalCalls = ownerLines.filter(l => !exportLinePattern.test(l) && l.includes(ep));
459
+ if (internalCalls.length === 0)
460
+ continue; // entrypoint 在 owner_file 内部未被调用
461
+ // entrypoint 在 owner_file 内部被调用 — 检查消费者是否 import 了 owner_file 的任何函数
462
+ for (const consumerFile of consumerFiles) {
463
+ const consumerContent = safeRead(path.join(rootDir, consumerFile));
464
+ if (!consumerContent)
465
+ continue;
466
+ // 检查消费者是否从 owner_file import 了任何东西
467
+ const ownerBasename = ownerFile.replace(/^src\/engine\//, "").replace(/\.ts$/, ".js");
468
+ const ownerImportPattern = new RegExp(`from\\s+["']\\./${ownerBasename.replace(".js", "")}\\.js["']|from\\s+["']\\.\\./engine/${ownerBasename.replace(".js", "")}\\.js["']`);
469
+ // 对于 CLI: from "../engine/xxx.js"
470
+ const cliImportPattern = new RegExp(`\\bimport\\s*\\([^)]*${ownerBasename.replace(/\.js$/, "")}`);
471
+ if (ownerImportPattern.test(consumerContent) || cliImportPattern.test(consumerContent)) {
472
+ consumedByRealCode = true;
473
+ break;
474
+ }
475
+ }
476
+ if (consumedByRealCode)
477
+ break;
478
+ }
479
+ }
480
+ if (!consumedByRealCode) {
481
+ hardFail("MAINLINE_ENTRYPOINT_NOT_CONSUMED", `${reg.label}: ${entry.issue_id} 的 required_entrypoint "${ep}" 无真实消费路径 (直接或传递)`, [reg.filePath, ...consumerFiles, ...entry.owner_files], entry.issue_id, "旧 gate 不校验消费者是否真实调用入口函数", "补充消费者源码调用或修正 required_entrypoints");
482
+ }
483
+ }
484
+ // ── 检查 5: owner_files 源码中必须包含调用链提到的函数名 ──
485
+ let funcInSource = false;
486
+ for (const ownerFile of entry.owner_files) {
487
+ const srcContent = safeRead(path.join(rootDir, ownerFile));
488
+ if (!srcContent)
489
+ continue;
490
+ for (const seg of chainSegments) {
491
+ const funcName = seg.match(/([a-z][a-zA-Z_]{4,})/)?.[1];
492
+ if (funcName && srcContent.includes(funcName)) {
493
+ funcInSource = true;
494
+ break;
495
+ }
496
+ }
497
+ if (funcInSource)
498
+ break;
499
+ }
500
+ if (!funcInSource) {
501
+ hardFail("MAINLINE_CHAIN_FUNC_NOT_IN_OWNER", `${reg.label}: ${entry.issue_id} 的调用链函数名未在 owner_files 源码中找到`, [reg.filePath, ...entry.owner_files], entry.issue_id, "旧 gate 对调用链与 owner_files 交叉引用失败时仅发 _info", "修正调用链或 owner_files");
502
+ }
503
+ }
504
+ }
505
+ }
506
+ // ── 4. 模板/adapter 更新空洞 ──
507
+ function checkTemplateAdapterGaps(rootDir, hardFail) {
508
+ const registryFiles = [
509
+ { filePath: "tests/engine/extension_acceptance_registry.ts", label: "Extension 验收" },
510
+ { filePath: "src/engine/knowledge_acceptance_registry.ts", label: "知识验收" },
511
+ ];
512
+ for (const reg of registryFiles) {
513
+ const content = safeRead(path.join(rootDir, reg.filePath));
514
+ if (!content)
515
+ continue;
516
+ const lines = content.split("\n");
517
+ for (let i = 0; i < lines.length; i++) {
518
+ const line = lines[i];
519
+ if (!line.includes("required_template_or_adapter_updates:"))
520
+ continue;
521
+ if (line.includes("[]") || line.includes("[ ]")) {
522
+ const contextBefore = lines.slice(Math.max(0, i - 20), i);
523
+ const issueMatch = contextBefore.find(l => l.includes("issue_id:"));
524
+ const issueId = issueMatch ? (issueMatch.match(/issue_id:\s*["']([^"']+)["']/)?.[1] ?? "未知") : "未知";
525
+ const contextAfter = lines.slice(i, Math.min(lines.length, i + 10));
526
+ const notApplicable = contextAfter.some(l => l.includes("not_applicable") || l.includes("N/A") || l.includes("不适用"));
527
+ if (!notApplicable) {
528
+ hardFail("TEMPLATE_ADAPTER_GAP", `${reg.label}: ${issueId} 的 required_template_or_adapter_updates 为空,无 not_applicable 说明`, [reg.filePath], issueId, "旧 gate 不检查空数组是否有合理说明", "清理");
529
+ }
530
+ }
531
+ }
532
+ }
533
+ }
534
+ // ── 5. 旧 gate 误导 ──
535
+ function checkOldGateMisdirection(rootDir, hardFail, _info) {
536
+ const gateFiles = ["scripts/validate_batch1_gate.mjs", "scripts/validate_batch2_gate.mjs", "scripts/validate_batch3_gate.mjs", "scripts/validate_batch4_gate.mjs", "scripts/validate_batch5_gate.mjs"];
537
+ // 检查 package.json 中对应脚本是否先输出历史警告
538
+ const pkgPath = path.join(rootDir, "package.json");
539
+ const pkgContent = safeRead(pkgPath);
540
+ const noticeModule = "validate_batch_historical_notice.mjs";
541
+ let pkgNoticeOk = true;
542
+ if (pkgContent) {
543
+ for (let i = 1; i <= 5; i++) {
544
+ const scriptKey = `"validate-batch${i}"`;
545
+ const scriptLine = pkgContent.split("\n").find(l => l.includes(scriptKey));
546
+ if (!scriptLine || !scriptLine.includes(noticeModule)) {
547
+ hardFail("HISTORICAL_GATE_NOT_RELEASE_PROOF", `package.json 中 ${scriptKey} 未在测试前输出历史 gate 警告(缺少 ${noticeModule})`, ["package.json"], `validate-batch${i}`, "旧 gate 可能让用户误以为是正式发布门禁", "添加历史声明");
548
+ pkgNoticeOk = false;
549
+ }
550
+ }
551
+ }
552
+ // 检查每个旧 gate 脚本是否已降级为历史施工 gate
553
+ for (const gf of gateFiles) {
554
+ const content = safeRead(path.join(rootDir, gf));
555
+ if (!content)
556
+ continue;
557
+ const batchNum = gf.match(/batch(\d)/)?.[1] ?? "?";
558
+ const issues = [];
559
+ // 1. 顶部注释不得自称 Release Gate
560
+ if (/Release Gate/.test(content) && !/历史施工 gate/.test(content)) {
561
+ issues.push("仍自称 Release Gate,未改为历史施工 gate");
562
+ }
563
+ // 2. 必须导入 printHistoricalNotice
564
+ if (!content.includes("printHistoricalNotice")) {
565
+ issues.push("缺少 printHistoricalNotice 调用");
566
+ }
567
+ // 3. 必须包含 historical_only: true(JSON 输出场景)
568
+ if (!content.includes("historical_only") && !content.includes("getHistoricalJsonFields")) {
569
+ issues.push("JSON 输出缺少 historical_only: true / getHistoricalJsonFields()");
570
+ }
571
+ // 4. 底部消息不得称 Release Gate(应为历史施工 Gate)
572
+ if (/Release Gate/.test(content)) {
573
+ issues.push("底部消息仍称 Release Gate");
574
+ }
575
+ if (issues.length > 0) {
576
+ hardFail("HISTORICAL_GATE_NOT_RELEASE_PROOF", `旧 gate ${gf} 未完成历史降级: ${issues.join("; ")}`, [gf], `validate-batch${batchNum}`, "旧 gate 误导性的通过结论被标记为不可作为发布依据", "完成历史降级");
577
+ }
578
+ }
579
+ _info(` 已检查 ${gateFiles.length} 个旧 gate 和 package.json 历史声明`);
580
+ }
581
+ // ── 6. 测试污染初筛 ──
582
+ function checkTestPollution(rootDir, hardFail, _info) {
583
+ const categories = { product_test: [], useful_contract_test: [], batch_construction_test: [], suspicious_test_pollution: [] };
584
+ const usefulContractExemptions = new Set([
585
+ "tests/engine/implementation_roadmap_registry.test.ts",
586
+ ]);
587
+ const testDir = path.join(rootDir, "tests");
588
+ function scanTestDir(dir) {
589
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
590
+ for (const entry of entries) {
591
+ const full = path.join(dir, entry.name);
592
+ if (entry.isDirectory()) {
593
+ scanTestDir(full);
594
+ }
595
+ else if (entry.isFile() && (entry.name.endsWith(".test.ts") || entry.name.endsWith(".test.js"))) {
596
+ const content = safeRead(full);
597
+ if (!content)
598
+ continue;
599
+ const rel = path.relative(rootDir, full);
600
+ const isScenarioMatrix = rel.includes("scenario_matrix");
601
+ const isBatchGateRelated = /batch\d/.test(content) && !rel.includes("scripts/");
602
+ const checksImplementedVerified = content.includes("implemented_verified");
603
+ const checksFileExists = /existsSync/.test(content) && /required.*file/i.test(content);
604
+ const checksScenarioSelfAttest = /fixture_status.*ready|scenario.*status.*PASS/.test(content);
605
+ if (isScenarioMatrix) {
606
+ categories.batch_construction_test.push(rel);
607
+ }
608
+ else if (usefulContractExemptions.has(rel)) {
609
+ categories.useful_contract_test.push(rel);
610
+ }
611
+ else if (isBatchGateRelated && (checksImplementedVerified || checksFileExists)) {
612
+ categories.suspicious_test_pollution.push(rel);
613
+ }
614
+ else if (checksScenarioSelfAttest && !content.includes("真实") && !content.includes("real")) {
615
+ categories.suspicious_test_pollution.push(rel);
616
+ }
617
+ else if (checksFileExists && !isBatchGateRelated) {
618
+ categories.useful_contract_test.push(rel);
619
+ }
620
+ else {
621
+ categories.product_test.push(rel);
622
+ }
623
+ }
624
+ }
625
+ }
626
+ scanTestDir(testDir);
627
+ _info(` product_test: ${categories.product_test.length} 个`);
628
+ _info(` useful_contract_test: ${categories.useful_contract_test.length} 个`);
629
+ _info(` batch_construction_test: ${categories.batch_construction_test.length} 个`);
630
+ _info(` suspicious_test_pollution: ${categories.suspicious_test_pollution.length} 个`);
631
+ for (const t of categories.suspicious_test_pollution) {
632
+ _info(` [可疑] ${t}`);
633
+ }
634
+ if (categories.suspicious_test_pollution.length > 0) {
635
+ hardFail("SUSPICIOUS_TEST_POLLUTION", `发现 ${categories.suspicious_test_pollution.length} 个可疑测试文件: 可能只为 Batch 状态、implemented_verified、文件存在、scenario 自证而存在`, categories.suspicious_test_pollution, "测试体系", "旧 gate 把这些测试作为通过证据,但它们可能是循环自证", "删除测试污染");
636
+ }
637
+ }
638
+ // ── 8. 关键问题消费验证 (problem-17/38/57) ──
639
+ function checkCriticalProblemConsumption(rootDir, hardFail, _info) {
640
+ const taskContextPath = path.join(rootDir, "src/engine/task_context.ts");
641
+ const cliPath = path.join(rootDir, "src/bin/soloforge.ts");
642
+ // problem-17: StateFact 分区 — save() 必须调用 validateStateFactPartition,hard_fail 必须 throw
643
+ const stateFactPath = path.join(rootDir, "src/engine/state_fact_classifier.ts");
644
+ if (!fs.existsSync(stateFactPath)) {
645
+ hardFail("CRITICAL_PROBLEM_FILE_MISSING", "problem-17: state_fact_classifier.ts 不存在", ["src/engine/state_fact_classifier.ts"], "problem-17", "发布门禁不检查 problem-17 实现", "创建 state_fact_classifier.ts");
646
+ }
647
+ else {
648
+ const sfContent = safeRead(stateFactPath);
649
+ const tcContent = safeRead(taskContextPath);
650
+ if (!sfContent || !sfContent.includes("validateStateFactPartition")) {
651
+ hardFail("CRITICAL_PROBLEM_EXPORT_MISSING", "problem-17: state_fact_classifier.ts 未导出 validateStateFactPartition", ["src/engine/state_fact_classifier.ts"], "problem-17", "StateFact 分类器缺少核心导出函数", "添加 validateStateFactPartition 导出");
652
+ }
653
+ if (!tcContent || !tcContent.includes("validateStateFactPartition")) {
654
+ hardFail("CRITICAL_PROBLEM_NOT_CONSUMED", "problem-17: task_context.ts save() 未调用 validateStateFactPartition", ["src/engine/task_context.ts", "src/engine/state_fact_classifier.ts"], "problem-17", "StateFact 分区定义存在但未接入 TaskContext 保存路径", "在 task_context.ts save() 中接入 validateStateFactPartition");
655
+ }
656
+ else {
657
+ // 验证 hard_fail 时 throw(不是静默跳过)
658
+ const tcLines = tcContent.split("\n");
659
+ const vspLine = tcLines.findIndex(l => l.includes("validateStateFactPartition"));
660
+ if (vspLine === -1) {
661
+ hardFail("CRITICAL_PROBLEM_NOT_CONSUMED", "problem-17: task_context.ts save() 未调用 validateStateFactPartition", ["src/engine/task_context.ts"], "problem-17", "StateFact 分区定义存在但未接入 TaskContext 保存路径", "接入 validateStateFactPartition");
662
+ }
663
+ else {
664
+ // 检查调用后有 hard_fail throw 路径
665
+ const afterVsp = tcLines.slice(vspLine, vspLine + 15).join("\n");
666
+ if (!afterVsp.includes("throw") || !afterVsp.includes("hardFails") && !afterVsp.includes("hard_fail")) {
667
+ hardFail("CRITICAL_PROBLEM_SOFT_ENFORCEMENT", "problem-17: task_context.ts 中 validateStateFactPartition 调用后缺少 hard_fail throw 路径", ["src/engine/task_context.ts"], "problem-17", "StateFact 校验结果被忽略而非阻断", "校验 hard_fail 时 throw Error");
668
+ }
669
+ }
670
+ }
671
+ }
672
+ // problem-38: Retention Policy — cleanup 必须调用 evaluateCleanup/checkForbiddenContent,存在 referenced evidence 保护
673
+ const retentionPath = path.join(rootDir, "src/engine/retention_policy.ts");
674
+ if (!fs.existsSync(retentionPath)) {
675
+ hardFail("CRITICAL_PROBLEM_FILE_MISSING", "problem-38: retention_policy.ts 不存在", ["src/engine/retention_policy.ts"], "problem-38", "发布门禁不检查 problem-38 实现", "创建 retention_policy.ts");
676
+ }
677
+ else {
678
+ const retContent = safeRead(retentionPath);
679
+ if (!retContent || !retContent.includes("evaluateCleanup") || !retContent.includes("checkForbiddenContent")) {
680
+ hardFail("CRITICAL_PROBLEM_EXPORT_MISSING", "problem-38: retention_policy.ts 未导出 evaluateCleanup 或 checkForbiddenContent", ["src/engine/retention_policy.ts"], "problem-38", "Retention Policy 缺少核心清理函数", "添加 evaluateCleanup 和 checkForbiddenContent 导出");
681
+ }
682
+ const tcContent = safeRead(taskContextPath);
683
+ const cliContent = safeRead(cliPath);
684
+ const tcHasCleanup = tcContent?.includes("evaluateCleanup") ?? false;
685
+ const cliHasCleanup = cliContent?.includes("evaluateCleanup") ?? false;
686
+ const cliHasCheck = cliContent?.includes("checkForbiddenContent") ?? false;
687
+ if (!tcHasCleanup && !cliHasCleanup) {
688
+ hardFail("CRITICAL_PROBLEM_NOT_CONSUMED", "problem-38: evaluateCleanup 未被 task_context.ts 或 soloforge.ts 调用", ["src/engine/task_context.ts", "src/bin/soloforge.ts", "src/engine/retention_policy.ts"], "problem-38", "Retention Policy 定义存在但无清理消费者", "将 evaluateCleanup 接入 TaskContext cleanup 或 CLI cleanup 命令");
689
+ }
690
+ // 验证 CLI cleanup 中有 referenced evidence 保护逻辑
691
+ if (cliContent) {
692
+ const cliLines = cliContent.split("\n");
693
+ const cleanupFn = cliLines.findIndex(l => l.match(/^(async\s+)?function\s+cmdCleanup/));
694
+ if (cleanupFn !== -1) {
695
+ // 搜索到下一个顶层函数或文件末尾
696
+ let cleanupEnd = cliLines.length;
697
+ for (let i = cleanupFn + 3; i < cliLines.length; i++) {
698
+ if (cliLines[i].match(/^async function\s+\w+|^function\s+\w+/)) {
699
+ cleanupEnd = i;
700
+ break;
701
+ }
702
+ }
703
+ const cleanupBody = cliLines.slice(cleanupFn, cleanupEnd).join("\n");
704
+ if (!cleanupBody.includes("referencedEvidenceIds") || !cleanupBody.includes("is_referenced")) {
705
+ hardFail("CRITICAL_PROBLEM_SOFT_ENFORCEMENT", "problem-38: CLI cleanup 缺少真实 evidence 引用扫描(无 referencedEvidenceIds 或 is_referenced 逻辑)", ["src/bin/soloforge.ts"], "problem-38", "cleanup 未扫描 task context / governance report 中的 evidence 引用", "添加真实引用扫描");
706
+ }
707
+ // 验证策略异常导致非零退出
708
+ if (!cleanupBody.includes("process.exit(1)")) {
709
+ hardFail("CRITICAL_PROBLEM_SOFT_ENFORCEMENT", "problem-38: CLI cleanup 策略异常时未非零退出", ["src/bin/soloforge.ts"], "problem-38", "策略异常被吞而非阻断", "添加 process.exit(1) 在 catch 中");
710
+ }
711
+ }
712
+ }
713
+ }
714
+ // problem-57: Knowledge Asset Audit — audit-template-mechanisms 必须调用 auditKnowledgeAssets 且 hard_fail/异常 process.exit(1)
715
+ const kaAuditPath = path.join(rootDir, "src/engine/knowledge_asset_audit.ts");
716
+ if (!fs.existsSync(kaAuditPath)) {
717
+ hardFail("CRITICAL_PROBLEM_FILE_MISSING", "problem-57: knowledge_asset_audit.ts 不存在", ["src/engine/knowledge_asset_audit.ts"], "problem-57", "发布门禁不检查 problem-57 实现", "创建 knowledge_asset_audit.ts");
718
+ }
719
+ else {
720
+ const kaContent = safeRead(kaAuditPath);
721
+ if (!kaContent || !kaContent.includes("auditKnowledgeAssets")) {
722
+ hardFail("CRITICAL_PROBLEM_EXPORT_MISSING", "problem-57: knowledge_asset_audit.ts 未导出 auditKnowledgeAssets", ["src/engine/knowledge_asset_audit.ts"], "problem-57", "Knowledge Asset Audit 缺少核心审计函数", "添加 auditKnowledgeAssets 导出");
723
+ }
724
+ const cliContent = safeRead(cliPath);
725
+ if (!cliContent?.includes("auditKnowledgeAssets")) {
726
+ hardFail("CRITICAL_PROBLEM_NOT_CONSUMED", "problem-57: auditKnowledgeAssets 未被 soloforge.ts CLI 消费", ["src/bin/soloforge.ts", "src/engine/knowledge_asset_audit.ts"], "problem-57", "Knowledge Asset Audit 定义存在但未接入 CLI", "将 auditKnowledgeAssets 接入 audit-template-mechanisms 命令");
727
+ }
728
+ else {
729
+ // 验证 hard_fail 阻断路径
730
+ const cliLines = cliContent.split("\n");
731
+ const kaCallLine = cliLines.findIndex(l => l.includes("auditKnowledgeAssets") && l.includes("await"));
732
+ if (kaCallLine !== -1) {
733
+ // 搜索到函数末尾(下一个 async function 或文件末尾)
734
+ let kaEnd = cliLines.length;
735
+ for (let i = kaCallLine + 1; i < cliLines.length; i++) {
736
+ if (cliLines[i].match(/^async function\s+\w+|^function\s+\w+/)) {
737
+ kaEnd = i;
738
+ break;
739
+ }
740
+ }
741
+ const afterKaCall = cliLines.slice(kaCallLine, kaEnd).join("\n");
742
+ if (!afterKaCall.includes("hard_fail_count") || !afterKaCall.includes("process.exit(1)")) {
743
+ hardFail("CRITICAL_PROBLEM_SOFT_ENFORCEMENT", "problem-57: auditKnowledgeAssets 调用后 hard_fail 未阻断(缺少 process.exit(1))", ["src/bin/soloforge.ts"], "problem-57", "知识资产审计 hard_fail 未阻断命令", "添加 hard_fail_count > 0 时 process.exit(1)");
744
+ }
745
+ // 验证异常也阻断(搜索整个函数体中的 catch 块)
746
+ const catchBlocks = afterKaCall.match(/catch\s*\(e[^)]*\)\s*\{[^}]+\}/g);
747
+ const hasKaAudit = afterKaCall.includes("auditKnowledgeAssets");
748
+ if (catchBlocks && hasKaAudit) {
749
+ for (const cb of catchBlocks) {
750
+ // 只检查紧跟 auditKnowledgeAssets 的 catch
751
+ if (cb.includes("process.exit(1)"))
752
+ continue;
753
+ // 检查是否是 auditKnowledgeAssets 的 catch(通过位置判断)
754
+ }
755
+ }
756
+ // 简化: 检查 auditKnowledgeAssets 后面的 catch 块中是否有 process.exit(1)
757
+ const kaCatchIdx = afterKaCall.lastIndexOf("catch");
758
+ if (kaCatchIdx !== -1) {
759
+ const afterCatch = afterKaCall.slice(kaCatchIdx);
760
+ if (!afterCatch.includes("process.exit(1)")) {
761
+ hardFail("CRITICAL_PROBLEM_SOFT_ENFORCEMENT", "problem-57: auditKnowledgeAssets 异常时未阻断(catch 中缺少 process.exit(1))", ["src/bin/soloforge.ts"], "problem-57", "知识资产审计异常被吞而非阻断", "catch 中添加 process.exit(1)");
762
+ }
763
+ }
764
+ }
765
+ }
766
+ }
767
+ _info(" problem-17/38/57 消费验证完成");
768
+ }
769
+ // ── 7. Batch 问题文档格式一致性 ──
770
+ async function checkBatchIssueFormatConsistency(rootDir, hardFail, _info) {
771
+ // 复用 scripts/batch_issue_details.mjs 的共享解析逻辑,不维护独立的问题识别规则
772
+ const scriptPath = path.join(rootDir, "scripts", "batch_issue_details.mjs");
773
+ let loadBatchIssueDetails;
774
+ try {
775
+ const mod = await import(scriptPath);
776
+ loadBatchIssueDetails = mod.loadBatchIssueDetails;
777
+ }
778
+ catch (e) {
779
+ hardFail("BATCH_ISSUE_FORMAT_INCONSISTENT", `无法加载共享解析脚本: ${e.message}`, ["scripts/batch_issue_details.mjs"], "构建系统", "共享解析脚本不可用", "修复脚本");
780
+ return;
781
+ }
782
+ if (!loadBatchIssueDetails) {
783
+ hardFail("BATCH_ISSUE_FORMAT_INCONSISTENT", "loadBatchIssueDetails 导出未找到", ["scripts/batch_issue_details.mjs"], "构建系统", "共享解析脚本导出不正确", "修复脚本");
784
+ return;
785
+ }
786
+ const expectedCounts = { 1: 19, 2: 12, 3: 9, 4: 13, 5: 5 };
787
+ const requiredPerProblemSections = [
788
+ "问题背景", "用户反馈 / 触发场景", "根因分析", "解决方案", "方案细节",
789
+ "硬规则", "非目标", "影响范围", "落地文件", "验收标准", "回归风险",
790
+ "与其他问题的关联", "发布门禁要求",
791
+ ];
792
+ for (let batch = 1; batch <= 5; batch++) {
793
+ const details = loadBatchIssueDetails(batch, rootDir);
794
+ if (!details.loaded) {
795
+ hardFail("BATCH_ISSUE_FORMAT_INCONSISTENT", `Batch${batch} 问题集未加载: ${details.error}`, [`docs/SoloForge-Batch${batch}问题集.md`], `Batch${batch}`, "旧 gate 只检查文档存在,不验证是否可解析", "第 3 步统一格式");
796
+ continue;
797
+ }
798
+ // 检查问题数量(问题X 已被 loadBatchIssueDetails 过滤)
799
+ const expected = expectedCounts[batch];
800
+ if (details.issue_count !== expected) {
801
+ hardFail("BATCH_ISSUE_COUNT_MISMATCH", `Batch${batch} 实际问题数=${details.issue_count},期望=${expected}`, [`docs/SoloForge-Batch${batch}问题集.md`], `Batch${batch}`, "旧 gate 不检查问题数量一致性", "第 3 步统一格式");
802
+ }
803
+ // 检查方案细节表和落点表
804
+ const content = details.markdown;
805
+ if (!/Batch\s+\d+\s+全问题方案细节表/.test(content)) {
806
+ hardFail("BATCH_ISSUE_FORMAT_INCONSISTENT", `Batch${batch} 缺少全问题方案细节表`, [`docs/SoloForge-Batch${batch}问题集.md`], `Batch${batch}`, "旧 gate 不检查文档结构一致性", "第 3 步统一格式");
807
+ }
808
+ if (!/Batch\s+\d+\s+全问题(细节)?落点表/.test(content)) {
809
+ hardFail("BATCH_ISSUE_FORMAT_INCONSISTENT", `Batch${batch} 缺少全问题落点表`, [`docs/SoloForge-Batch${batch}问题集.md`], `Batch${batch}`, "旧 gate 不检查文档结构一致性", "第 3 步统一格式");
810
+ }
811
+ if (!/Batch\s+\d+\s+全问题真实性落点表/.test(content)) {
812
+ hardFail("BATCH_ISSUE_FORMAT_INCONSISTENT", `Batch${batch} 缺少全问题真实性落点表`, [`docs/SoloForge-Batch${batch}问题集.md`], `Batch${batch}`, "旧 gate 不检查文档结构一致性", "第 3 步统一格式");
813
+ }
814
+ // 基于 loadBatchIssueDetails 结果检查必备章节
815
+ for (const issue of details.issues) {
816
+ const sectionNames = (issue.sections || []).map((s) => s.heading);
817
+ const missing = requiredPerProblemSections.filter(s => !sectionNames.some(sn => sn.includes(s)));
818
+ if (missing.length > 0) {
819
+ hardFail("BATCH_ISSUE_FORMAT_INCONSISTENT", `Batch${batch} ${issue.issue_label} 缺少必备章节: ${missing.join(", ")}(其他 Batch 的问题均有这些章节)`, [`docs/SoloForge-Batch${batch}问题集.md`], `Batch${batch}/${issue.issue_label}`, "旧 gate 只检查文档存在和行数,不检查问题内部结构完整性", "第 3 步统一格式");
820
+ }
821
+ // 检查章节顺序
822
+ const expectedOrder = [
823
+ "问题背景", "用户反馈 / 触发场景", "根因分析", "解决方案", "方案细节",
824
+ "硬规则", "非目标", "影响范围", "落地文件", "验收标准", "回归风险",
825
+ "与其他问题的关联", "发布门禁要求",
826
+ ];
827
+ if (sectionNames.length >= expectedOrder.length) {
828
+ const orderOk = expectedOrder.length === sectionNames.length
829
+ && expectedOrder.every((v, i) => sectionNames[i] === v);
830
+ if (!orderOk) {
831
+ hardFail("BATCH_ISSUE_FORMAT_INCONSISTENT", `Batch${batch} ${issue.issue_label} 章节顺序不符合模板要求: 实际 ${sectionNames.slice(0, 5).join(", ")}...`, [`docs/SoloForge-Batch${batch}问题集.md`], `Batch${batch}/${issue.issue_label}`, "旧 gate 只检查章节存在,不检查章节顺序", "第 3 步统一格式");
832
+ }
833
+ }
834
+ }
835
+ _info(` Batch${batch}: 已检查 (${details.issue_count} 个问题)`);
836
+ }
837
+ _info(" 说明: 本检查不修改文档。格式不一致问题将在第 3 步统一处理。");
838
+ }
839
+ // ── 机制身份一致性 ──
840
+ async function checkMechanismIdentityConsistency(rootDir, hardFail, _info) {
841
+ // 加载 DL registry
842
+ const dlPath = path.join(rootDir, "dist/engine/dual_layer_mechanism_registry.js");
843
+ if (!fs.existsSync(dlPath)) {
844
+ hardFail("MECHANISM_IDENTITY", "dual_layer_mechanism_registry.js 未编译", ["dist/engine/"], "机制身份一致性", "旧 gate 不检查机制身份一致性", "npm run build");
845
+ return;
846
+ }
847
+ let dlModule;
848
+ try {
849
+ dlModule = await import(dlPath);
850
+ }
851
+ catch (e) {
852
+ hardFail("MECHANISM_IDENTITY", `无法加载 dual_layer_mechanism_registry: ${e.message}`, ["dist/engine/"], "机制身份一致性", "旧 gate 不检查机制身份一致性", "修复编译错误");
853
+ return;
854
+ }
855
+ const canonicalIds = dlModule.getAllCanonicalMechanismIds();
856
+ const resolveId = dlModule.resolveMechanismId;
857
+ const aliases = dlModule.MECHANISM_ALIASES;
858
+ // 加载 MC registry
859
+ const mcPath = path.join(rootDir, "dist/engine/mechanism_contract_registry.js");
860
+ if (!fs.existsSync(mcPath)) {
861
+ hardFail("MECHANISM_IDENTITY", "mechanism_contract_registry.js 未编译", ["dist/engine/"], "机制身份一致性", "旧 gate 不检查机制身份一致性", "npm run build");
862
+ return;
863
+ }
864
+ let mcModule;
865
+ try {
866
+ mcModule = await import(mcPath);
867
+ }
868
+ catch (e) {
869
+ hardFail("MECHANISM_IDENTITY", `无法加载 mechanism_contract_registry: ${e.message}`, ["dist/engine/"], "机制身份一致性", "旧 gate 不检查机制身份一致性", "修复编译错误");
870
+ return;
871
+ }
872
+ const mcContracts = mcModule.listMechanismContracts();
873
+ // 检查 MC 中 active/enforced 的机制必须能解析到 DL canonical ID
874
+ for (const c of mcContracts) {
875
+ if (c.status === "deprecated")
876
+ continue;
877
+ const resolved = resolveId(c.id);
878
+ if (!canonicalIds.has(resolved)) {
879
+ hardFail("MECHANISM_IDENTITY", `mechanism_contract_registry 中 ${c.id} (status=${c.status}) 无法解析到 dual_layer_mechanism_registry 的正式机制 ID (resolved=${resolved})`, ["src/engine/mechanism_contract_registry.ts", "src/engine/dual_layer_mechanism_registry.ts"], c.id, "旧 gate 不检查 MC 与 DL 的机制身份一致性", `在 dual_layer_mechanism_registry.ts 中添加 ${resolved} 或建立 alias 映射`);
880
+ }
881
+ }
882
+ // 检查 DL 中的机制必须能解析到 MC 中(canonical 或 deprecated alias)
883
+ const mcIds = new Set(mcContracts.map((c) => c.id));
884
+ for (const id of canonicalIds) {
885
+ if (!mcIds.has(id)) {
886
+ hardFail("MECHANISM_IDENTITY", `dual_layer_mechanism_registry 中 ${id} 在 mechanism_contract_registry 中不存在`, ["src/engine/dual_layer_mechanism_registry.ts", "src/engine/mechanism_contract_registry.ts"], id, "旧 gate 不检查 DL 与 MC 的双向一致性", `在 mechanism_contract_registry.ts 中添加 ${id}`);
887
+ }
888
+ }
889
+ // 检查 templates/knowledge frontmatter owner_mechanism_id 可解析
890
+ const knowledgeDir = path.join(rootDir, "templates/knowledge");
891
+ if (fs.existsSync(knowledgeDir)) {
892
+ const knowledgeFiles = findFilesRecursive(knowledgeDir, ".md");
893
+ for (const f of knowledgeFiles) {
894
+ const content = safeRead(f);
895
+ if (!content)
896
+ continue;
897
+ const match = content.match(/^owner_mechanism_id:\s*(.+)$/m);
898
+ if (match) {
899
+ const ownerId = match[1].trim();
900
+ const resolved = resolveId(ownerId);
901
+ if (!canonicalIds.has(resolved)) {
902
+ hardFail("MECHANISM_IDENTITY", `模板 ${path.relative(rootDir, f)} 的 owner_mechanism_id="${ownerId}" 无法解析到正式机制 ID (resolved=${resolved})`, [path.relative(rootDir, f)], ownerId, "旧 gate 不检查知识模板的 owner_mechanism_id 可解析性", `将 owner_mechanism_id 改为正式机制 ID 或建立 alias 映射`);
903
+ }
904
+ }
905
+ }
906
+ }
907
+ // 检查 consumable_asset_registry owner_mechanism_id 可解析
908
+ const carPath = path.join(rootDir, "dist/engine/consumable_asset_registry.js");
909
+ if (fs.existsSync(carPath)) {
910
+ try {
911
+ const carModule = await import(carPath);
912
+ const assets = carModule.listBuiltinConsumableAssets();
913
+ for (const a of assets) {
914
+ if (!a.owner_mechanism_id)
915
+ continue;
916
+ const resolved = resolveId(a.owner_mechanism_id);
917
+ if (!canonicalIds.has(resolved)) {
918
+ hardFail("MECHANISM_IDENTITY", `consumable_asset_registry 中 ${a.id} 的 owner_mechanism_id="${a.owner_mechanism_id}" 无法解析到正式机制 ID`, ["src/engine/consumable_asset_registry.ts"], a.owner_mechanism_id, "旧 gate 不检查 consumable_asset 的 owner_mechanism_id 可解析性", `将 owner_mechanism_id 改为正式机制 ID 或建立 alias 映射`);
919
+ }
920
+ }
921
+ }
922
+ catch { /* 模块加载失败,跳过 */ }
923
+ }
924
+ // 检查 workflow_contract_registry required_mechanisms/advisory_mechanisms 可解析
925
+ const wcPath = path.join(rootDir, "dist/engine/workflow_contract_registry.js");
926
+ if (fs.existsSync(wcPath)) {
927
+ try {
928
+ const wcModule = await import(wcPath);
929
+ const contracts = wcModule.listWorkflowContracts();
930
+ for (const c of contracts) {
931
+ for (const mId of [...c.required_mechanisms, ...c.advisory_mechanisms]) {
932
+ const resolved = resolveId(mId);
933
+ if (!canonicalIds.has(resolved)) {
934
+ hardFail("MECHANISM_IDENTITY", `workflow_contract_registry 中 ${c.id} 引用机制 "${mId}" 无法解析到正式机制 ID (resolved=${resolved})`, ["src/engine/workflow_contract_registry.ts"], mId, "旧 gate 不检查 workflow required_mechanisms 的可解析性", `将 ${mId} 改为正式机制 ID 或建立 alias 映射`);
935
+ }
936
+ }
937
+ }
938
+ }
939
+ catch { /* 模块加载失败,跳过 */ }
940
+ }
941
+ // 检查 asset_manifest owner_mechanism_id 可解析
942
+ const amSrcPath = path.join(rootDir, "src/engine/asset_manifest.ts");
943
+ if (fs.existsSync(amSrcPath)) {
944
+ const amContent = safeRead(amSrcPath);
945
+ if (amContent) {
946
+ const ownerMatches = amContent.matchAll(/owner_mechanism_id:\s*"([^"]+)"/g);
947
+ for (const m of ownerMatches) {
948
+ const ownerId = m[1];
949
+ const resolved = resolveId(ownerId);
950
+ if (!canonicalIds.has(resolved)) {
951
+ hardFail("MECHANISM_IDENTITY", `asset_manifest.ts 中 owner_mechanism_id="${ownerId}" 无法解析到正式机制 ID`, ["src/engine/asset_manifest.ts"], ownerId, "旧 gate 不检查 asset_manifest 的 owner_mechanism_id 可解析性", `将 owner_mechanism_id 改为正式机制 ID 或建立 alias 映射`);
952
+ }
953
+ }
954
+ }
955
+ }
956
+ }
957
+ function findFilesRecursive(dir, ext) {
958
+ const results = [];
959
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
960
+ const full = path.join(dir, entry.name);
961
+ if (entry.isDirectory())
962
+ results.push(...findFilesRecursive(full, ext));
963
+ else if (entry.name.endsWith(ext))
964
+ results.push(full);
965
+ }
966
+ return results;
967
+ }
968
+ // ── 主入口 ──
969
+ export async function runReleaseReadinessGate(rootDir) {
970
+ const hardFails = [];
971
+ const phases = [];
972
+ let capturedNoiseCount = 0;
973
+ // 初始化日志器为静默模式,防止 debug/internalWarn 输出
974
+ const { initLogger, resetLogger } = await import("./logger.js");
975
+ initLogger({ silent: true });
976
+ // 兜底: 仍然拦截 console.error,捕获任何绕过日志器的直接调用
977
+ const origConsoleError = console.error;
978
+ const noiseLogs = [];
979
+ console.error = (...args) => { noiseLogs.push(args.join(" ")); };
980
+ function hardFail(code, message, files, issueOrMech, oldGateMissed, nextStep) {
981
+ hardFails.push({ code, message, files, issueOrMech, oldGateMissed, nextStep });
982
+ }
983
+ function _info(_msg) { }
984
+ function beginPhase(name) {
985
+ phases.push({ name, hard_fail_count: -1 }); // -1 标记进行中
986
+ }
987
+ function endPhase(name) {
988
+ const phase = phases.find(p => p.name === name && p.hard_fail_count === -1);
989
+ if (phase)
990
+ phase.hard_fail_count = hardFails.length - (phases.filter(p => p.hard_fail_count >= 0).reduce((s, p) => s + p.hard_fail_count, 0));
991
+ else
992
+ phases.push({ name, hard_fail_count: 0 });
993
+ }
994
+ // 0
995
+ beginPhase("dist 旧产物风险");
996
+ checkDistFreshness(rootDir, hardFail);
997
+ endPhase("dist 旧产物风险");
998
+ // 1
999
+ beginPhase("Batch 施工痕迹泄漏");
1000
+ checkBatchTraceLeakage(rootDir, hardFail, _info);
1001
+ endPhase("Batch 施工痕迹泄漏");
1002
+ // 2
1003
+ beginPhase("双层模型语义归位");
1004
+ await checkDualLayerSemantics(rootDir, hardFail, _info);
1005
+ endPhase("双层模型语义归位");
1006
+ // 3
1007
+ beginPhase("主链路真实消费");
1008
+ checkMainlineConsumption(rootDir, hardFail, _info);
1009
+ endPhase("主链路真实消费");
1010
+ // 4
1011
+ beginPhase("模板/adapter 更新空洞");
1012
+ checkTemplateAdapterGaps(rootDir, hardFail);
1013
+ endPhase("模板/adapter 更新空洞");
1014
+ // 5
1015
+ beginPhase("旧 gate 误导标记");
1016
+ checkOldGateMisdirection(rootDir, hardFail, _info);
1017
+ endPhase("旧 gate 误导标记");
1018
+ // 6
1019
+ beginPhase("测试污染初筛");
1020
+ checkTestPollution(rootDir, hardFail, _info);
1021
+ endPhase("测试污染初筛");
1022
+ // 7
1023
+ beginPhase("Batch 问题文档格式一致性");
1024
+ await checkBatchIssueFormatConsistency(rootDir, hardFail, _info);
1025
+ endPhase("Batch 问题文档格式一致性");
1026
+ // 8
1027
+ beginPhase("关键问题消费验证");
1028
+ checkCriticalProblemConsumption(rootDir, hardFail, _info);
1029
+ endPhase("关键问题消费验证");
1030
+ // 9
1031
+ beginPhase("机制身份一致性");
1032
+ await checkMechanismIdentityConsistency(rootDir, hardFail, _info);
1033
+ endPhase("机制身份一致性");
1034
+ // 恢复 console.error 和日志器
1035
+ console.error = origConsoleError;
1036
+ resetLogger();
1037
+ // 噪音检测: 捕获任何绕过日志器的直接 console.error("[soloForge]...") 调用
1038
+ capturedNoiseCount = noiseLogs.filter(l => l.includes("[soloForge]")).length;
1039
+ if (capturedNoiseCount > 0) {
1040
+ hardFail("OUTPUT_NOISE", `发布门禁运行时产生 ${capturedNoiseCount} 条模块噪音日志`, ["src/engine/logger.ts"], "发布门禁输出质量", "旧 gate 不检查自身输出噪音", "日志治理");
1041
+ }
1042
+ return {
1043
+ passed: hardFails.length === 0,
1044
+ hard_fail_count: hardFails.length,
1045
+ hard_fails: hardFails,
1046
+ phases: phases.map(p => ({ name: p.name, hard_fail_count: p.hard_fail_count >= 0 ? p.hard_fail_count : 0 })),
1047
+ noise_log_count: capturedNoiseCount,
1048
+ };
1049
+ }
1050
+ //# sourceMappingURL=release_readiness_gate.js.map