soloforge 1.2.20 → 1.3.1

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 (688) hide show
  1. package/README.md +150 -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 +282 -1
  12. package/dist/adapters/claude_code/tools.d.ts.map +1 -1
  13. package/dist/adapters/claude_code/tools.js +1366 -40
  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 +8 -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 +1256 -160
  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_decision_workshop.d.ts +58 -0
  42. package/dist/engine/architecture_decision_workshop.d.ts.map +1 -0
  43. package/dist/engine/architecture_decision_workshop.js +118 -0
  44. package/dist/engine/architecture_decision_workshop.js.map +1 -0
  45. package/dist/engine/architecture_design_contract.d.ts +49 -0
  46. package/dist/engine/architecture_design_contract.d.ts.map +1 -0
  47. package/dist/engine/architecture_design_contract.js +169 -0
  48. package/dist/engine/architecture_design_contract.js.map +1 -0
  49. package/dist/engine/artifact_contract_registry.d.ts.map +1 -1
  50. package/dist/engine/artifact_contract_registry.js +7 -14
  51. package/dist/engine/artifact_contract_registry.js.map +1 -1
  52. package/dist/engine/{batch1_manifest.d.ts → asset_manifest.d.ts} +8 -8
  53. package/dist/engine/asset_manifest.d.ts.map +1 -0
  54. package/dist/engine/{batch1_manifest.js → asset_manifest.js} +63 -9
  55. package/dist/engine/asset_manifest.js.map +1 -0
  56. package/dist/engine/audit_pool.d.ts.map +1 -1
  57. package/dist/engine/audit_pool.js +5 -4
  58. package/dist/engine/audit_pool.js.map +1 -1
  59. package/dist/engine/audit_sampler.d.ts.map +1 -1
  60. package/dist/engine/audit_sampler.js +2 -1
  61. package/dist/engine/audit_sampler.js.map +1 -1
  62. package/dist/engine/audit_verifier.d.ts.map +1 -1
  63. package/dist/engine/audit_verifier.js +5 -4
  64. package/dist/engine/audit_verifier.js.map +1 -1
  65. package/dist/engine/brainstorm_contract.d.ts +46 -0
  66. package/dist/engine/brainstorm_contract.d.ts.map +1 -0
  67. package/dist/engine/brainstorm_contract.js +136 -0
  68. package/dist/engine/brainstorm_contract.js.map +1 -0
  69. package/dist/engine/capability_action_advisor.d.ts.map +1 -1
  70. package/dist/engine/capability_action_advisor.js +8 -7
  71. package/dist/engine/capability_action_advisor.js.map +1 -1
  72. package/dist/engine/capability_registry.d.ts.map +1 -1
  73. package/dist/engine/capability_registry.js +0 -7
  74. package/dist/engine/capability_registry.js.map +1 -1
  75. package/dist/engine/capability_state_store.d.ts.map +1 -1
  76. package/dist/engine/capability_state_store.js +7 -6
  77. package/dist/engine/capability_state_store.js.map +1 -1
  78. package/dist/engine/change_coordinator.d.ts.map +1 -1
  79. package/dist/engine/change_coordinator.js +4 -3
  80. package/dist/engine/change_coordinator.js.map +1 -1
  81. package/dist/engine/chinese_semantic_priority.d.ts +62 -0
  82. package/dist/engine/chinese_semantic_priority.d.ts.map +1 -0
  83. package/dist/engine/chinese_semantic_priority.js +153 -0
  84. package/dist/engine/chinese_semantic_priority.js.map +1 -0
  85. package/dist/engine/coding_readiness_gate.d.ts +46 -0
  86. package/dist/engine/coding_readiness_gate.d.ts.map +1 -0
  87. package/dist/engine/coding_readiness_gate.js +175 -0
  88. package/dist/engine/coding_readiness_gate.js.map +1 -0
  89. package/dist/engine/cognitive_anchor.d.ts.map +1 -1
  90. package/dist/engine/cognitive_anchor.js +7 -6
  91. package/dist/engine/cognitive_anchor.js.map +1 -1
  92. package/dist/engine/command_execution_contract.d.ts.map +1 -1
  93. package/dist/engine/command_execution_contract.js +13 -12
  94. package/dist/engine/command_execution_contract.js.map +1 -1
  95. package/dist/engine/confidence_scorer.d.ts.map +1 -1
  96. package/dist/engine/confidence_scorer.js +2 -1
  97. package/dist/engine/confidence_scorer.js.map +1 -1
  98. package/dist/engine/config_precedence_contract.d.ts.map +1 -1
  99. package/dist/engine/config_precedence_contract.js +9 -8
  100. package/dist/engine/config_precedence_contract.js.map +1 -1
  101. package/dist/engine/conflict_gate.d.ts.map +1 -1
  102. package/dist/engine/conflict_gate.js +4 -3
  103. package/dist/engine/conflict_gate.js.map +1 -1
  104. package/dist/engine/consumable_asset_registry.d.ts +4 -0
  105. package/dist/engine/consumable_asset_registry.d.ts.map +1 -1
  106. package/dist/engine/consumable_asset_registry.js +370 -0
  107. package/dist/engine/consumable_asset_registry.js.map +1 -1
  108. package/dist/engine/consumption_trace_store.d.ts +50 -0
  109. package/dist/engine/consumption_trace_store.d.ts.map +1 -0
  110. package/dist/engine/consumption_trace_store.js +84 -0
  111. package/dist/engine/consumption_trace_store.js.map +1 -0
  112. package/dist/engine/contract_guard.d.ts.map +1 -1
  113. package/dist/engine/contract_guard.js +7 -6
  114. package/dist/engine/contract_guard.js.map +1 -1
  115. package/dist/engine/contract_registry.d.ts +1 -1
  116. package/dist/engine/contract_registry.d.ts.map +1 -1
  117. package/dist/engine/contract_registry.js +511 -38
  118. package/dist/engine/contract_registry.js.map +1 -1
  119. package/dist/engine/convention_detector.d.ts.map +1 -1
  120. package/dist/engine/convention_detector.js +4 -3
  121. package/dist/engine/convention_detector.js.map +1 -1
  122. package/dist/engine/core_engineering_principles.d.ts.map +1 -1
  123. package/dist/engine/core_engineering_principles.js +4 -14
  124. package/dist/engine/core_engineering_principles.js.map +1 -1
  125. package/dist/engine/core_experience_principle.d.ts +194 -0
  126. package/dist/engine/core_experience_principle.d.ts.map +1 -0
  127. package/dist/engine/core_experience_principle.js +349 -0
  128. package/dist/engine/core_experience_principle.js.map +1 -0
  129. package/dist/engine/debt_reporter.d.ts.map +1 -1
  130. package/dist/engine/debt_reporter.js +3 -2
  131. package/dist/engine/debt_reporter.js.map +1 -1
  132. package/dist/engine/debt_tracker.d.ts.map +1 -1
  133. package/dist/engine/debt_tracker.js +8 -7
  134. package/dist/engine/debt_tracker.js.map +1 -1
  135. package/dist/engine/debug_log.d.ts +4 -1
  136. package/dist/engine/debug_log.d.ts.map +1 -1
  137. package/dist/engine/debug_log.js +4 -6
  138. package/dist/engine/debug_log.js.map +1 -1
  139. package/dist/engine/debugger.d.ts.map +1 -1
  140. package/dist/engine/debugger.js +5 -4
  141. package/dist/engine/debugger.js.map +1 -1
  142. package/dist/engine/decision_contract.d.ts.map +1 -1
  143. package/dist/engine/decision_contract.js +4 -3
  144. package/dist/engine/decision_contract.js.map +1 -1
  145. package/dist/engine/delivery.d.ts.map +1 -1
  146. package/dist/engine/delivery.js +16 -15
  147. package/dist/engine/delivery.js.map +1 -1
  148. package/dist/engine/delivery_readiness.d.ts +5 -1
  149. package/dist/engine/delivery_readiness.d.ts.map +1 -1
  150. package/dist/engine/delivery_readiness.js +24 -2
  151. package/dist/engine/delivery_readiness.js.map +1 -1
  152. package/dist/engine/dependency_scanner.d.ts.map +1 -1
  153. package/dist/engine/dependency_scanner.js +6 -5
  154. package/dist/engine/dependency_scanner.js.map +1 -1
  155. package/dist/engine/design_artifact_pack.d.ts +44 -0
  156. package/dist/engine/design_artifact_pack.d.ts.map +1 -0
  157. package/dist/engine/design_artifact_pack.js +167 -0
  158. package/dist/engine/design_artifact_pack.js.map +1 -0
  159. package/dist/engine/detail_discipline.d.ts +40 -0
  160. package/dist/engine/detail_discipline.d.ts.map +1 -0
  161. package/dist/engine/detail_discipline.js +107 -0
  162. package/dist/engine/detail_discipline.js.map +1 -0
  163. package/dist/engine/developer_sovereignty.d.ts.map +1 -1
  164. package/dist/engine/developer_sovereignty.js +6 -5
  165. package/dist/engine/developer_sovereignty.js.map +1 -1
  166. package/dist/engine/diff_ownership.d.ts.map +1 -1
  167. package/dist/engine/diff_ownership.js +9 -8
  168. package/dist/engine/diff_ownership.js.map +1 -1
  169. package/dist/engine/diff_ownership_store.d.ts.map +1 -1
  170. package/dist/engine/diff_ownership_store.js +8 -7
  171. package/dist/engine/diff_ownership_store.js.map +1 -1
  172. package/dist/engine/documentation_governance.d.ts +55 -0
  173. package/dist/engine/documentation_governance.d.ts.map +1 -0
  174. package/dist/engine/documentation_governance.js +249 -0
  175. package/dist/engine/documentation_governance.js.map +1 -0
  176. package/dist/engine/dual_layer_mechanism_registry.d.ts +6 -4
  177. package/dist/engine/dual_layer_mechanism_registry.d.ts.map +1 -1
  178. package/dist/engine/dual_layer_mechanism_registry.js +851 -11
  179. package/dist/engine/dual_layer_mechanism_registry.js.map +1 -1
  180. package/dist/engine/enforcement_guard.d.ts.map +1 -1
  181. package/dist/engine/enforcement_guard.js +14 -0
  182. package/dist/engine/enforcement_guard.js.map +1 -1
  183. package/dist/engine/escape_report.d.ts.map +1 -1
  184. package/dist/engine/escape_report.js +4 -3
  185. package/dist/engine/escape_report.js.map +1 -1
  186. package/dist/engine/evidence_grounding_contract.d.ts +137 -0
  187. package/dist/engine/evidence_grounding_contract.d.ts.map +1 -0
  188. package/dist/engine/evidence_grounding_contract.js +410 -0
  189. package/dist/engine/evidence_grounding_contract.js.map +1 -0
  190. package/dist/engine/evolution_regression_gate.d.ts +42 -0
  191. package/dist/engine/evolution_regression_gate.d.ts.map +1 -0
  192. package/dist/engine/evolution_regression_gate.js +159 -0
  193. package/dist/engine/evolution_regression_gate.js.map +1 -0
  194. package/dist/engine/existing_system_analysis.d.ts +37 -0
  195. package/dist/engine/existing_system_analysis.d.ts.map +1 -0
  196. package/dist/engine/existing_system_analysis.js +151 -0
  197. package/dist/engine/existing_system_analysis.js.map +1 -0
  198. package/dist/engine/exploration.d.ts.map +1 -1
  199. package/dist/engine/exploration.js +7 -6
  200. package/dist/engine/exploration.js.map +1 -1
  201. package/dist/engine/extension_contract.d.ts +50 -0
  202. package/dist/engine/extension_contract.d.ts.map +1 -0
  203. package/dist/engine/extension_contract.js +158 -0
  204. package/dist/engine/extension_contract.js.map +1 -0
  205. package/dist/engine/extension_platform_contracts.d.ts +712 -0
  206. package/dist/engine/extension_platform_contracts.d.ts.map +1 -0
  207. package/dist/engine/extension_platform_contracts.js +42 -0
  208. package/dist/engine/extension_platform_contracts.js.map +1 -0
  209. package/dist/engine/extension_scenario_registry.d.ts +30 -0
  210. package/dist/engine/extension_scenario_registry.d.ts.map +1 -0
  211. package/dist/engine/extension_scenario_registry.js +976 -0
  212. package/dist/engine/extension_scenario_registry.js.map +1 -0
  213. package/dist/engine/failure_classifier.d.ts.map +1 -1
  214. package/dist/engine/failure_classifier.js +9 -8
  215. package/dist/engine/failure_classifier.js.map +1 -1
  216. package/dist/engine/feasibility_checker.d.ts.map +1 -1
  217. package/dist/engine/feasibility_checker.js +5 -4
  218. package/dist/engine/feasibility_checker.js.map +1 -1
  219. package/dist/engine/first_principles.d.ts +35 -0
  220. package/dist/engine/first_principles.d.ts.map +1 -0
  221. package/dist/engine/first_principles.js +128 -0
  222. package/dist/engine/first_principles.js.map +1 -0
  223. package/dist/engine/{batch1_scenario_registry.d.ts → foundation_scenario_registry.d.ts} +15 -15
  224. package/dist/engine/foundation_scenario_registry.d.ts.map +1 -0
  225. package/dist/engine/{batch1_scenario_registry.js → foundation_scenario_registry.js} +22 -25
  226. package/dist/engine/foundation_scenario_registry.js.map +1 -0
  227. package/dist/engine/{batch1_scenario_runners.d.ts → foundation_scenario_runners.d.ts} +1 -1
  228. package/dist/engine/foundation_scenario_runners.d.ts.map +1 -0
  229. package/dist/engine/{batch1_scenario_runners.js → foundation_scenario_runners.js} +8 -7
  230. package/dist/engine/foundation_scenario_runners.js.map +1 -0
  231. package/dist/engine/git_deps.d.ts.map +1 -1
  232. package/dist/engine/git_deps.js +2 -1
  233. package/dist/engine/git_deps.js.map +1 -1
  234. package/dist/engine/governance_report.d.ts.map +1 -1
  235. package/dist/engine/governance_report.js +10 -9
  236. package/dist/engine/governance_report.js.map +1 -1
  237. package/dist/engine/impact_analyzer.d.ts.map +1 -1
  238. package/dist/engine/impact_analyzer.js +5 -4
  239. package/dist/engine/impact_analyzer.js.map +1 -1
  240. package/dist/engine/implementation_roadmap_registry.d.ts +1 -1
  241. package/dist/engine/implementation_roadmap_registry.d.ts.map +1 -1
  242. package/dist/engine/implementation_roadmap_registry.js +348 -82
  243. package/dist/engine/implementation_roadmap_registry.js.map +1 -1
  244. package/dist/engine/input_material_contract_registry.d.ts.map +1 -1
  245. package/dist/engine/input_material_contract_registry.js +4 -3
  246. package/dist/engine/input_material_contract_registry.js.map +1 -1
  247. package/dist/engine/instruction_contract.d.ts +75 -0
  248. package/dist/engine/instruction_contract.d.ts.map +1 -0
  249. package/dist/engine/instruction_contract.js +185 -0
  250. package/dist/engine/instruction_contract.js.map +1 -0
  251. package/dist/engine/intent_expander.d.ts.map +1 -1
  252. package/dist/engine/intent_expander.js +353 -1
  253. package/dist/engine/intent_expander.js.map +1 -1
  254. package/dist/engine/intent_router.d.ts +11 -2
  255. package/dist/engine/intent_router.d.ts.map +1 -1
  256. package/dist/engine/intent_router.js +121 -1
  257. package/dist/engine/intent_router.js.map +1 -1
  258. package/dist/engine/intent_signal_extractor.d.ts +3 -0
  259. package/dist/engine/intent_signal_extractor.d.ts.map +1 -1
  260. package/dist/engine/intent_signal_extractor.js +49 -0
  261. package/dist/engine/intent_signal_extractor.js.map +1 -1
  262. package/dist/engine/io_controller.d.ts.map +1 -1
  263. package/dist/engine/io_controller.js +8 -7
  264. package/dist/engine/io_controller.js.map +1 -1
  265. package/dist/engine/java_quality_guard.d.ts.map +1 -1
  266. package/dist/engine/java_quality_guard.js +5 -18
  267. package/dist/engine/java_quality_guard.js.map +1 -1
  268. package/dist/engine/job_manager.d.ts.map +1 -1
  269. package/dist/engine/job_manager.js +8 -7
  270. package/dist/engine/job_manager.js.map +1 -1
  271. package/dist/engine/knowledge_acceptance_registry.d.ts +35 -0
  272. package/dist/engine/knowledge_acceptance_registry.d.ts.map +1 -0
  273. package/dist/engine/knowledge_acceptance_registry.js +271 -0
  274. package/dist/engine/knowledge_acceptance_registry.js.map +1 -0
  275. package/dist/engine/knowledge_asset_audit.d.ts +65 -0
  276. package/dist/engine/knowledge_asset_audit.d.ts.map +1 -0
  277. package/dist/engine/knowledge_asset_audit.js +230 -0
  278. package/dist/engine/knowledge_asset_audit.js.map +1 -0
  279. package/dist/engine/knowledge_asset_consumer.d.ts +150 -0
  280. package/dist/engine/knowledge_asset_consumer.d.ts.map +1 -0
  281. package/dist/engine/knowledge_asset_consumer.js +279 -0
  282. package/dist/engine/knowledge_asset_consumer.js.map +1 -0
  283. package/dist/engine/knowledge_asset_generation_gate.d.ts +38 -0
  284. package/dist/engine/knowledge_asset_generation_gate.d.ts.map +1 -0
  285. package/dist/engine/knowledge_asset_generation_gate.js +131 -0
  286. package/dist/engine/knowledge_asset_generation_gate.js.map +1 -0
  287. package/dist/engine/knowledge_asset_migration.d.ts +117 -0
  288. package/dist/engine/knowledge_asset_migration.d.ts.map +1 -0
  289. package/dist/engine/knowledge_asset_migration.js +204 -0
  290. package/dist/engine/knowledge_asset_migration.js.map +1 -0
  291. package/dist/engine/knowledge_asset_schema.d.ts +97 -0
  292. package/dist/engine/knowledge_asset_schema.d.ts.map +1 -0
  293. package/dist/engine/knowledge_asset_schema.js +413 -0
  294. package/dist/engine/knowledge_asset_schema.js.map +1 -0
  295. package/dist/engine/knowledge_config_loader.d.ts.map +1 -1
  296. package/dist/engine/knowledge_config_loader.js +5 -4
  297. package/dist/engine/knowledge_config_loader.js.map +1 -1
  298. package/dist/engine/knowledge_consumption_snapshot.d.ts +91 -0
  299. package/dist/engine/knowledge_consumption_snapshot.d.ts.map +1 -0
  300. package/dist/engine/knowledge_consumption_snapshot.js +113 -0
  301. package/dist/engine/knowledge_consumption_snapshot.js.map +1 -0
  302. package/dist/engine/knowledge_evolution.d.ts +82 -0
  303. package/dist/engine/knowledge_evolution.d.ts.map +1 -0
  304. package/dist/engine/knowledge_evolution.js +272 -0
  305. package/dist/engine/knowledge_evolution.js.map +1 -0
  306. package/dist/engine/knowledge_lifecycle.d.ts +70 -10
  307. package/dist/engine/knowledge_lifecycle.d.ts.map +1 -1
  308. package/dist/engine/knowledge_lifecycle.js +238 -4
  309. package/dist/engine/knowledge_lifecycle.js.map +1 -1
  310. package/dist/engine/knowledge_manager.d.ts.map +1 -1
  311. package/dist/engine/knowledge_manager.js +9 -8
  312. package/dist/engine/knowledge_manager.js.map +1 -1
  313. package/dist/engine/knowledge_scenario_registry.d.ts +21 -0
  314. package/dist/engine/knowledge_scenario_registry.d.ts.map +1 -0
  315. package/dist/engine/knowledge_scenario_registry.js +337 -0
  316. package/dist/engine/knowledge_scenario_registry.js.map +1 -0
  317. package/dist/engine/knowledge_sovereignty.d.ts.map +1 -1
  318. package/dist/engine/knowledge_sovereignty.js +5 -4
  319. package/dist/engine/knowledge_sovereignty.js.map +1 -1
  320. package/dist/engine/knowledge_template_contracts.d.ts +244 -0
  321. package/dist/engine/knowledge_template_contracts.d.ts.map +1 -0
  322. package/dist/engine/knowledge_template_contracts.js +26 -0
  323. package/dist/engine/knowledge_template_contracts.js.map +1 -0
  324. package/dist/engine/language_policy.d.ts +69 -12
  325. package/dist/engine/language_policy.d.ts.map +1 -1
  326. package/dist/engine/language_policy.js +129 -8
  327. package/dist/engine/language_policy.js.map +1 -1
  328. package/dist/engine/llm_gateway.d.ts.map +1 -1
  329. package/dist/engine/llm_gateway.js +10 -9
  330. package/dist/engine/llm_gateway.js.map +1 -1
  331. package/dist/engine/local_docker_acceptance.d.ts +94 -0
  332. package/dist/engine/local_docker_acceptance.d.ts.map +1 -0
  333. package/dist/engine/local_docker_acceptance.js +312 -0
  334. package/dist/engine/local_docker_acceptance.js.map +1 -0
  335. package/dist/engine/logger.d.ts +64 -0
  336. package/dist/engine/logger.d.ts.map +1 -0
  337. package/dist/engine/logger.js +115 -0
  338. package/dist/engine/logger.js.map +1 -0
  339. package/dist/engine/main_path_integration_contract.d.ts.map +1 -1
  340. package/dist/engine/main_path_integration_contract.js +43 -42
  341. package/dist/engine/main_path_integration_contract.js.map +1 -1
  342. package/dist/engine/mechanism_contract_registry.d.ts.map +1 -1
  343. package/dist/engine/mechanism_contract_registry.js +514 -17
  344. package/dist/engine/mechanism_contract_registry.js.map +1 -1
  345. package/dist/engine/metric_governance.d.ts +51 -0
  346. package/dist/engine/metric_governance.d.ts.map +1 -0
  347. package/dist/engine/metric_governance.js +138 -0
  348. package/dist/engine/metric_governance.js.map +1 -0
  349. package/dist/engine/migration_guard.d.ts.map +1 -1
  350. package/dist/engine/migration_guard.js +6 -5
  351. package/dist/engine/migration_guard.js.map +1 -1
  352. package/dist/engine/mutation_audit.d.ts.map +1 -1
  353. package/dist/engine/mutation_audit.js +6 -5
  354. package/dist/engine/mutation_audit.js.map +1 -1
  355. package/dist/engine/observability.d.ts +11 -0
  356. package/dist/engine/observability.d.ts.map +1 -1
  357. package/dist/engine/observability.js +60 -8
  358. package/dist/engine/observability.js.map +1 -1
  359. package/dist/engine/onboarding.d.ts.map +1 -1
  360. package/dist/engine/onboarding.js +17 -16
  361. package/dist/engine/onboarding.js.map +1 -1
  362. package/dist/engine/plan_proposal_gate.d.ts +131 -0
  363. package/dist/engine/plan_proposal_gate.d.ts.map +1 -0
  364. package/dist/engine/plan_proposal_gate.js +340 -0
  365. package/dist/engine/plan_proposal_gate.js.map +1 -0
  366. package/dist/engine/platform_context.d.ts +44 -0
  367. package/dist/engine/platform_context.d.ts.map +1 -0
  368. package/dist/engine/platform_context.js +169 -0
  369. package/dist/engine/platform_context.js.map +1 -0
  370. package/dist/engine/policy_drift_detector.d.ts.map +1 -1
  371. package/dist/engine/policy_drift_detector.js +8 -7
  372. package/dist/engine/policy_drift_detector.js.map +1 -1
  373. package/dist/engine/regression_matrix.d.ts.map +1 -1
  374. package/dist/engine/regression_matrix.js +15 -14
  375. package/dist/engine/regression_matrix.js.map +1 -1
  376. package/dist/engine/release_compatibility.d.ts +62 -0
  377. package/dist/engine/release_compatibility.d.ts.map +1 -0
  378. package/dist/engine/release_compatibility.js +145 -0
  379. package/dist/engine/release_compatibility.js.map +1 -0
  380. package/dist/engine/release_gate.d.ts +29 -0
  381. package/dist/engine/release_gate.d.ts.map +1 -0
  382. package/dist/engine/release_gate.js +675 -0
  383. package/dist/engine/release_gate.js.map +1 -0
  384. package/dist/engine/release_gate_scenario_registry.d.ts +65 -0
  385. package/dist/engine/release_gate_scenario_registry.d.ts.map +1 -0
  386. package/dist/engine/release_gate_scenario_registry.js +717 -0
  387. package/dist/engine/release_gate_scenario_registry.js.map +1 -0
  388. package/dist/engine/release_readiness_gate.d.ts +44 -0
  389. package/dist/engine/release_readiness_gate.d.ts.map +1 -0
  390. package/dist/engine/release_readiness_gate.js +1660 -0
  391. package/dist/engine/release_readiness_gate.js.map +1 -0
  392. package/dist/engine/risk_sampler.d.ts.map +1 -1
  393. package/dist/engine/risk_sampler.js +4 -3
  394. package/dist/engine/risk_sampler.js.map +1 -1
  395. package/dist/engine/runtime_safety.d.ts.map +1 -1
  396. package/dist/engine/runtime_safety.js +18 -17
  397. package/dist/engine/runtime_safety.js.map +1 -1
  398. package/dist/engine/scaffolder.d.ts.map +1 -1
  399. package/dist/engine/scaffolder.js +4 -3
  400. package/dist/engine/scaffolder.js.map +1 -1
  401. package/dist/engine/scope_lease.d.ts.map +1 -1
  402. package/dist/engine/scope_lease.js +4 -3
  403. package/dist/engine/scope_lease.js.map +1 -1
  404. package/dist/engine/semantic_evidence.d.ts.map +1 -1
  405. package/dist/engine/semantic_evidence.js +4 -3
  406. package/dist/engine/semantic_evidence.js.map +1 -1
  407. package/dist/engine/state_fact_classifier.d.ts +47 -0
  408. package/dist/engine/state_fact_classifier.d.ts.map +1 -0
  409. package/dist/engine/state_fact_classifier.js +158 -0
  410. package/dist/engine/state_fact_classifier.js.map +1 -0
  411. package/dist/engine/task_context.d.ts +34 -5
  412. package/dist/engine/task_context.d.ts.map +1 -1
  413. package/dist/engine/task_context.js +175 -49
  414. package/dist/engine/task_context.js.map +1 -1
  415. package/dist/engine/task_planner.d.ts.map +1 -1
  416. package/dist/engine/task_planner.js +6 -5
  417. package/dist/engine/task_planner.js.map +1 -1
  418. package/dist/engine/team_awareness.d.ts.map +1 -1
  419. package/dist/engine/team_awareness.js +2 -1
  420. package/dist/engine/team_awareness.js.map +1 -1
  421. package/dist/engine/technology_decision.d.ts +38 -0
  422. package/dist/engine/technology_decision.d.ts.map +1 -0
  423. package/dist/engine/technology_decision.js +120 -0
  424. package/dist/engine/technology_decision.js.map +1 -0
  425. package/dist/engine/template_manifest_io.d.ts +47 -0
  426. package/dist/engine/template_manifest_io.d.ts.map +1 -0
  427. package/dist/engine/template_manifest_io.js +151 -0
  428. package/dist/engine/template_manifest_io.js.map +1 -0
  429. package/dist/engine/template_mechanism_auditor.d.ts.map +1 -1
  430. package/dist/engine/template_mechanism_auditor.js +5 -4
  431. package/dist/engine/template_mechanism_auditor.js.map +1 -1
  432. package/dist/engine/template_sync.d.ts +98 -0
  433. package/dist/engine/template_sync.d.ts.map +1 -0
  434. package/dist/engine/template_sync.js +355 -0
  435. package/dist/engine/template_sync.js.map +1 -0
  436. package/dist/engine/test_generator.d.ts.map +1 -1
  437. package/dist/engine/test_generator.js +5 -4
  438. package/dist/engine/test_generator.js.map +1 -1
  439. package/dist/engine/test_quality.d.ts.map +1 -1
  440. package/dist/engine/test_quality.js +5 -4
  441. package/dist/engine/test_quality.js.map +1 -1
  442. package/dist/engine/tool_invocation_contract_registry.d.ts.map +1 -1
  443. package/dist/engine/tool_invocation_contract_registry.js +32 -31
  444. package/dist/engine/tool_invocation_contract_registry.js.map +1 -1
  445. package/dist/engine/traceability.d.ts.map +1 -1
  446. package/dist/engine/traceability.js +6 -5
  447. package/dist/engine/traceability.js.map +1 -1
  448. package/dist/engine/user_feedback_contract.d.ts.map +1 -1
  449. package/dist/engine/user_feedback_contract.js +81 -19
  450. package/dist/engine/user_feedback_contract.js.map +1 -1
  451. package/dist/engine/user_promise.d.ts +67 -0
  452. package/dist/engine/user_promise.d.ts.map +1 -0
  453. package/dist/engine/user_promise.js +436 -0
  454. package/dist/engine/user_promise.js.map +1 -0
  455. package/dist/engine/verifier.d.ts +6 -10
  456. package/dist/engine/verifier.d.ts.map +1 -1
  457. package/dist/engine/verifier.js +112 -1
  458. package/dist/engine/verifier.js.map +1 -1
  459. package/dist/engine/workflow_contract_registry.d.ts.map +1 -1
  460. package/dist/engine/workflow_contract_registry.js +128 -10
  461. package/dist/engine/workflow_contract_registry.js.map +1 -1
  462. package/dist/engine/workflow_template_pack.d.ts +71 -0
  463. package/dist/engine/workflow_template_pack.d.ts.map +1 -0
  464. package/dist/engine/workflow_template_pack.js +246 -0
  465. package/dist/engine/workflow_template_pack.js.map +1 -0
  466. package/dist/engine/workspace_resumer.d.ts.map +1 -1
  467. package/dist/engine/workspace_resumer.js +9 -8
  468. package/dist/engine/workspace_resumer.js.map +1 -1
  469. package/dist/engine/zero_config_init.d.ts.map +1 -1
  470. package/dist/engine/zero_config_init.js +16 -15
  471. package/dist/engine/zero_config_init.js.map +1 -1
  472. package/dist/git/operations.d.ts.map +1 -1
  473. package/dist/git/operations.js +18 -17
  474. package/dist/git/operations.js.map +1 -1
  475. package/dist/index.js +10 -9
  476. package/dist/index.js.map +1 -1
  477. package/dist/knowledge/conflict_detector.d.ts.map +1 -1
  478. package/dist/knowledge/conflict_detector.js +2 -1
  479. package/dist/knowledge/conflict_detector.js.map +1 -1
  480. package/dist/knowledge/health_checker.d.ts.map +1 -1
  481. package/dist/knowledge/health_checker.js +5 -4
  482. package/dist/knowledge/health_checker.js.map +1 -1
  483. package/dist/knowledge/index_manager.js +4 -4
  484. package/dist/knowledge/index_manager.js.map +1 -1
  485. package/dist/knowledge/loader.d.ts.map +1 -1
  486. package/dist/knowledge/loader.js +20 -14
  487. package/dist/knowledge/loader.js.map +1 -1
  488. package/dist/knowledge/writer.d.ts.map +1 -1
  489. package/dist/knowledge/writer.js +7 -6
  490. package/dist/knowledge/writer.js.map +1 -1
  491. package/dist/types.d.ts +40 -8
  492. package/dist/types.d.ts.map +1 -1
  493. package/package.json +14 -5
  494. package/templates/knowledge/acceptance_templates/API/346/216/245/345/217/243/350/247/204/346/240/274/346/226/207/346/241/243/346/250/241/347/211/210.md +74 -0
  495. package/templates/knowledge/acceptance_templates/Bug/345/210/206/346/236/220/346/250/241/347/211/210.md +27 -3
  496. package/templates/knowledge/acceptance_templates/POC/347/273/223/350/256/272/346/250/241/347/211/210.md +27 -3
  497. 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
  498. 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
  499. 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
  500. 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
  501. 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
  502. 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
  503. 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
  504. 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
  505. 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
  506. 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
  507. 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
  508. package/templates/knowledge/acceptance_templates//346/225/260/346/215/256/345/272/223/350/256/276/350/256/241/346/226/207/346/241/243/346/250/241/347/211/210.md +59 -0
  509. package/templates/knowledge/acceptance_templates//346/236/266/346/236/204/350/256/276/350/256/241/346/250/241/347/211/210.md +54 -10
  510. 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
  511. package/templates/knowledge/acceptance_templates//350/256/276/350/256/241/344/270/200/350/207/264/346/200/247/351/252/214/346/224/266/346/212/245/345/221/212/346/250/241/347/211/210.md +47 -0
  512. 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
  513. 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
  514. 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
  515. 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
  516. 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
  517. 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
  518. package/templates/knowledge/checklists//344/274/232/350/257/235/346/201/242/345/244/215.md +30 -8
  519. 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
  520. 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
  521. 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
  522. 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
  523. 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
  524. package/templates/knowledge/domain//345/244/232/347/247/237/346/210/267.md +28 -3
  525. package/templates/knowledge/domain//345/256/241/350/256/241/346/227/245/345/277/227.md +27 -3
  526. 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
  527. package/templates/knowledge/domain//345/267/245/344/275/234/346/265/201/345/274/225/346/223/216.md +32 -3
  528. package/templates/knowledge/domain//346/212/245/350/241/250/347/273/237/350/256/241.md +31 -3
  529. package/templates/knowledge/domain//346/224/257/344/273/230/350/247/204/345/210/231.md +31 -3
  530. package/templates/knowledge/domain//346/225/260/346/215/256/346/235/203/351/231/220.md +28 -3
  531. 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
  532. package/templates/knowledge/domain//351/200/232/347/237/245/350/247/204/345/210/231.md +31 -3
  533. package/templates/knowledge/patterns/core/Diff/345/275/222/345/261/236/350/277/275/350/270/252.md +24 -7
  534. package/templates/knowledge/patterns/core/Java/350/264/250/351/207/217/351/227/250/347/246/201.md +25 -7
  535. package/templates/knowledge/patterns/core/LLM/351/242/204/347/256/227/347/275/221/345/205/263.md +24 -7
  536. 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
  537. package/templates/knowledge/patterns/core//344/273/273/345/212/241/347/256/241/347/220/206/345/231/250.md +25 -7
  538. 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
  539. package/templates/knowledge/patterns/core//344/275/234/347/224/250/345/237/237/347/247/237/347/272/246.md +25 -7
  540. package/templates/knowledge/patterns/core//345/206/262/347/252/201/351/227/250/347/246/201.md +24 -7
  541. package/templates/knowledge/patterns/core//345/206/263/347/255/226/347/275/221/345/205/263.md +26 -7
  542. package/templates/knowledge/patterns/core//345/217/230/345/274/202/345/256/241/350/256/241.md +25 -7
  543. package/templates/knowledge/patterns/core//345/233/236/345/275/222/347/237/251/351/230/265.md +24 -7
  544. 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
  545. package/templates/knowledge/patterns/core//345/267/245/344/275/234/345/214/272/345/224/244/351/206/222.md +24 -7
  546. package/templates/knowledge/patterns/core//345/271/266/345/217/221/351/224/201.md +26 -7
  547. package/templates/knowledge/patterns/core//345/274/200/345/217/221/350/200/205/345/256/252/346/263/225.md +26 -7
  548. 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
  549. 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
  550. package/templates/knowledge/patterns/core//346/265/201/345/274/217/345/277/203/350/267/263.md +25 -7
  551. package/templates/knowledge/patterns/core//347/237/245/350/257/206/344/270/273/346/235/203.md +25 -7
  552. package/templates/knowledge/patterns/core//350/257/255/344/271/211/350/257/201/346/215/256.md +24 -7
  553. package/templates/knowledge/patterns/core//350/277/220/350/241/214/345/256/211/345/205/250/345/214/205.md +25 -7
  554. 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
  555. 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
  556. package/templates/knowledge/procedures/Schema/345/217/230/346/233/264/346/265/201/346/260/264/347/272/277.md +29 -3
  557. 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
  558. 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
  559. 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
  560. 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
  561. 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
  562. 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
  563. 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
  564. package/templates/knowledge/procedures//346/200/247/350/203/275/346/265/201/346/260/264/347/272/277.md +30 -3
  565. 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
  566. 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
  567. 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
  568. 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
  569. package/templates/knowledge/procedures//346/236/266/346/236/204/345/206/263/347/255/226/347/240/224/350/256/250/345/267/245/344/275/234/346/265/201.md +51 -0
  570. 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 +104 -0
  571. 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
  572. 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
  573. 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
  574. 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
  575. 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
  576. 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
  577. 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
  578. 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
  579. 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
  580. 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
  581. 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
  582. package/templates/knowledge/procedures//350/256/276/350/256/241/344/272/247/347/211/251/347/224/237/346/210/220/344/270/216/345/244/215/351/252/214/345/267/245/344/275/234/346/265/201.md +45 -0
  583. 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
  584. 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
  585. package/templates/knowledge/procedures//350/277/201/347/247/273/346/265/201/346/260/264/347/272/277.md +30 -3
  586. 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
  587. package/templates/knowledge/procedures//351/207/215/346/236/204/346/265/201/346/260/264/347/272/277.md +30 -3
  588. 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
  589. 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
  590. 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
  591. 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
  592. 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
  593. 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
  594. 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
  595. 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
  596. 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
  597. 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
  598. 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
  599. 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
  600. 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
  601. 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
  602. 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
  603. 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 +48 -0
  604. 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
  605. 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
  606. 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
  607. 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 +48 -0
  608. 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
  609. 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
  610. 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 +78 -0
  611. package/templates/knowledge/rules//346/236/266/346/236/204/345/206/263/347/255/226/347/240/224/350/256/250/350/247/204/345/210/231.md +49 -0
  612. 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
  613. 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
  614. 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
  615. 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
  616. 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
  617. 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
  618. 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
  619. 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
  620. 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
  621. 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
  622. 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
  623. 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
  624. package/templates/knowledge/rules//350/256/276/350/256/241/344/272/247/347/211/251/345/214/205/350/247/204/345/210/231.md +55 -0
  625. package/templates/knowledge/rules//350/257/201/346/215/256/351/251/261/345/212/250/344/270/216/345/217/215/345/271/273/350/247/211/350/247/204/345/210/231.md +75 -0
  626. 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 +48 -0
  627. 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
  628. 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
  629. 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
  630. 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
  631. 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
  632. package/templates/knowledge/templates//345/256/241/346/237/245/346/221/230/350/246/201.md +26 -7
  633. package/templates/patterns/API/350/256/276/350/256/241/350/247/204/350/214/203.md +30 -3
  634. package/templates/patterns/Docker/351/203/250/347/275/262/350/247/204/350/214/203.md +29 -3
  635. package/templates/patterns/Git/346/223/215/344/275/234/350/247/204/350/214/203.md +33 -3
  636. package/templates/patterns/N/345/212/2401/346/237/245/350/257/242/350/247/204/350/214/203.md +31 -3
  637. 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
  638. 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
  639. 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
  640. package/templates/patterns/React/347/273/204/344/273/266/350/247/204/350/214/203.md +30 -3
  641. package/templates/patterns/React/350/241/250/345/215/225/350/247/204/350/214/203.md +30 -3
  642. package/templates/patterns/React/350/267/257/347/224/261/350/247/204/350/214/203.md +31 -3
  643. package/templates/patterns/Schema/345/205/274/345/256/271/350/247/204/350/214/203.md +30 -3
  644. 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
  645. package/templates/patterns/Vue/347/273/204/344/273/266/350/247/204/350/214/203.md +33 -3
  646. package/templates/patterns/Vue/350/267/257/347/224/261/350/247/204/350/214/203.md +28 -3
  647. package/templates/patterns//344/272/213/344/273/266/351/251/261/345/212/250/350/247/204/350/214/203.md +32 -3
  648. package/templates/patterns//344/272/213/345/212/241/346/250/241/345/274/217/350/247/204/350/214/203.md +31 -3
  649. package/templates/patterns//344/274/230/351/233/205/345/201/234/346/234/272/350/247/204/350/214/203.md +31 -3
  650. package/templates/patterns//345/205/250/346/240/210/346/265/201/347/250/213/344/277/256/345/244/215.md +30 -3
  651. package/templates/patterns//345/210/206/351/241/265/346/237/245/350/257/242/350/247/204/350/214/203.md +34 -3
  652. package/templates/patterns//345/211/215/347/253/257/346/200/247/350/203/275/350/247/204/350/214/203.md +32 -3
  653. package/templates/patterns//345/221/275/345/220/215/350/247/204/350/214/203.md +30 -3
  654. package/templates/patterns//345/233/275/351/231/205/345/214/226/350/247/204/350/214/203.md +31 -3
  655. package/templates/patterns//345/242/236/345/210/240/346/224/271/346/237/245/350/247/204/350/214/203.md +31 -3
  656. package/templates/patterns//345/244/226/351/203/250/344/276/235/350/265/226/350/247/204/350/214/203.md +31 -3
  657. package/templates/patterns//345/245/221/347/272/246/345/205/274/345/256/271/350/247/204/350/214/203.md +28 -3
  658. package/templates/patterns//345/256/232/346/227/266/344/273/273/345/212/241/350/247/204/350/214/203.md +32 -3
  659. package/templates/patterns//345/256/236/346/227/266/346/216/250/351/200/201/350/247/204/350/214/203.md +31 -3
  660. package/templates/patterns//345/267/245/347/250/213/347/272/252/345/276/213.md +30 -3
  661. package/templates/patterns//345/271/266/345/217/221/346/216/247/345/210/266/350/247/204/350/214/203.md +34 -3
  662. package/templates/patterns//345/274/202/346/255/245/345/257/274/345/207/272/350/247/204/350/214/203.md +31 -3
  663. package/templates/patterns//346/216/245/345/217/243/345/245/221/347/272/246/350/247/204/350/214/203.md +29 -3
  664. package/templates/patterns//346/220/234/347/264/242/346/250/241/345/274/217/350/247/204/350/214/203.md +33 -3
  665. package/templates/patterns//346/225/260/346/215/256/351/232/220/347/247/201/350/247/204/350/214/203.md +34 -3
  666. package/templates/patterns//346/226/207/344/273/266/344/270/212/344/274/240/350/247/204/350/214/203.md +30 -3
  667. package/templates/patterns//346/227/240/351/232/234/347/242/215/350/247/204/350/214/203.md +30 -3
  668. package/templates/patterns//346/227/245/345/277/227/350/247/204/350/214/203.md +31 -3
  669. package/templates/patterns//346/235/203/351/231/220/350/256/244/350/257/201/350/247/204/350/214/203.md +34 -3
  670. package/templates/patterns//346/236/266/346/236/204/347/272/242/347/272/277.md +28 -3
  671. package/templates/patterns//346/265/213/350/257/225/350/264/250/351/207/217/350/247/204/350/214/203.md +30 -3
  672. package/templates/patterns//347/206/224/346/226/255/351/231/215/347/272/247/350/247/204/350/214/203.md +32 -3
  673. package/templates/patterns//347/212/266/346/200/201/346/265/201/350/275/254/350/247/204/350/214/203.md +29 -3
  674. package/templates/patterns//347/272/246/346/235/237/345/256/236/347/216/260/350/247/204/350/214/203.md +32 -3
  675. package/templates/patterns//347/274/223/345/255/230/347/255/226/347/225/245/350/247/204/350/214/203.md +31 -3
  676. package/templates/patterns//347/274/226/347/240/201/350/264/250/351/207/217/350/247/204/350/214/203.md +30 -3
  677. package/templates/patterns//347/274/272/351/231/267/347/256/241/347/220/206/350/247/204/350/214/203.md +29 -3
  678. package/templates/patterns//350/260/203/350/257/225/346/226/271/346/263/225/350/256/272.md +30 -3
  679. package/templates/patterns//350/276/223/345/205/245/346/240/241/351/252/214/350/247/204/350/214/203.md +31 -3
  680. package/templates/patterns//351/224/231/350/257/257/345/244/204/347/220/206/350/247/204/350/214/203.md +31 -3
  681. package/templates/patterns//351/224/231/350/257/257/350/276/271/347/225/214/350/247/204/350/214/203.md +33 -3
  682. 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
  683. package/dist/engine/batch1_manifest.d.ts.map +0 -1
  684. package/dist/engine/batch1_manifest.js.map +0 -1
  685. package/dist/engine/batch1_scenario_registry.d.ts.map +0 -1
  686. package/dist/engine/batch1_scenario_registry.js.map +0 -1
  687. package/dist/engine/batch1_scenario_runners.d.ts.map +0 -1
  688. package/dist/engine/batch1_scenario_runners.js.map +0 -1
@@ -1,10 +1,11 @@
1
+ import { debug, internalWarn } from "../../engine/logger.js";
1
2
  import { z } from "zod";
2
3
  import path from "node:path";
3
4
  import fss from "node:fs";
4
5
  import crypto from "node:crypto";
5
6
  import { verifyArtifact } from "../../engine/artifact_contract_registry.js";
6
7
  import { verifyRouteDecisionContract } from "../../engine/route_decision_contract_verifier.js";
7
- import { findToolInvocationContractByName, createToolTrace, validateToolInvocation, } from "../../engine/tool_invocation_contract_registry.js";
8
+ import { findToolInvocationContractByName, createToolTrace, validateToolInvocation, hasWriteSideEffect, } from "../../engine/tool_invocation_contract_registry.js";
8
9
  function createLazy(loader) {
9
10
  let mod = { loaded: null, promise: null };
10
11
  return () => {
@@ -37,6 +38,7 @@ const lazyDebugger = createLazy(() => import("../../engine/debugger.js"));
37
38
  const lazyObservability = createLazy(() => import("../../engine/observability.js"));
38
39
  const lazyGovernance = createLazy(() => import("../../engine/governance_report.js"));
39
40
  const lazyMigration = createLazy(() => import("../../engine/migration_guard.js"));
41
+ const lazyPlanGate = createLazy(() => import("../../engine/plan_proposal_gate.js"));
40
42
  const lazyTestGen = createLazy(() => import("../../engine/test_generator.js"));
41
43
  const lazyTestQuality = createLazy(() => import("../../engine/test_quality.js"));
42
44
  const lazyDepScan = createLazy(() => import("../../engine/dependency_scanner.js"));
@@ -67,6 +69,17 @@ const lazyFailureReport = createLazy(() => import("../../engine/failure_report.j
67
69
  const lazyDegradation = createLazy(() => import("../../engine/degradation.js"));
68
70
  const lazyRetentionPolicy = createLazy(() => import("../../engine/retention_policy.js"));
69
71
  const lazyDiagnosticRegistry = createLazy(() => import("../../engine/diagnostic_registry.js"));
72
+ const lazyArchitectureDesign = createLazy(() => import("../../engine/architecture_design_contract.js"));
73
+ const lazyExistingSystemAnalysis = createLazy(() => import("../../engine/existing_system_analysis.js"));
74
+ const lazyCodingReadiness = createLazy(() => import("../../engine/coding_readiness_gate.js"));
75
+ const lazyLocalAcceptance = createLazy(() => import("../../engine/local_docker_acceptance.js"));
76
+ const lazyInstructionContract = createLazy(() => import("../../engine/instruction_contract.js"));
77
+ const lazyTechnologyDecision = createLazy(() => import("../../engine/technology_decision.js"));
78
+ const lazyDetailDiscipline = createLazy(() => import("../../engine/detail_discipline.js"));
79
+ const lazyFirstPrinciples = createLazy(() => import("../../engine/first_principles.js"));
80
+ const lazyBrainstormContract = createLazy(() => import("../../engine/brainstorm_contract.js"));
81
+ const lazyArchitectureWorkshop = createLazy(() => import("../../engine/architecture_decision_workshop.js"));
82
+ const lazyDesignArtifactPack = createLazy(() => import("../../engine/design_artifact_pack.js"));
70
83
  // ── Zod Schema 定义 ──
71
84
  const ClassifySchema = {
72
85
  intent: z.string().describe("开发者意图描述"),
@@ -76,6 +89,8 @@ const ExpandSchema = {
76
89
  task_id: z.string().describe("sf_classify 返回的任务 ID"),
77
90
  clarification_answers: z.array(z.string()).optional().describe("对澄清问题的回答"),
78
91
  input_material_confirmations: z.array(z.string()).optional().describe("已确认安全的输入材料路径列表"),
92
+ architecture_decision_workshop: z.unknown().optional().describe("架构设计前已讨论并确认的六域决策记录"),
93
+ design_artifact_pack: z.unknown().optional().describe("设计产物包路径映射或已复验状态"),
79
94
  };
80
95
  const VerifySchema = {
81
96
  task_id: z.string().describe("任务 ID"),
@@ -188,13 +203,564 @@ const ExploreSchema = {
188
203
  * @param server - MCP 服务器实例
189
204
  * @param deps - SoloForge 核心依赖项
190
205
  */
206
+ /**
207
+ * Plan Gate 写工具拦截 — 从 registerSafeTool 中间件提取的纯函数。
208
+ * gate 和外部测试可直接调用,无需 MCP server mock。
209
+ */
210
+ export function checkWriteToolPlanGate(params) {
211
+ if (!hasWriteSideEffect(params.sideEffects))
212
+ return { allowed: true };
213
+ if (!params.ctx || !params.ctx.plan_proposal_gate) {
214
+ return {
215
+ allowed: false,
216
+ diagnostic_code: "SF-PLAN-5001",
217
+ violation_type: "guard_blocked",
218
+ reason: `工具 ${params.toolName} 执行前缺少 Plan Proposal Gate`,
219
+ };
220
+ }
221
+ return { allowed: true };
222
+ }
223
+ /**
224
+ * 施工指令契约门 — 写操作前检查施工指令完整性。
225
+ * 问题五十八: 通过引擎模块函数真实消费。
226
+ * 调用链 1: registerInstructionIssueCandidate(无契约时创建候选 draft)
227
+ * 调用链 2: enforceInstructionBeforeImplementation → checkInstructionCompleteness → validateInstructionContract
228
+ */
229
+ export async function checkInstructionContractGate(params) {
230
+ if (!hasWriteSideEffect(params.sideEffects))
231
+ return { allowed: true };
232
+ if (!params.ctx)
233
+ return { allowed: true };
234
+ let instruction = params.ctx.instruction_contract;
235
+ const instrModule = await lazyInstructionContract();
236
+ // 无契约时消费 registerInstructionIssueCandidate — 创建 draft 候选并保存
237
+ if (!instruction && params.task_id) {
238
+ instruction = instrModule.registerInstructionIssueCandidate({
239
+ task_id: params.task_id,
240
+ description: params.toolName,
241
+ source: "auto_detected",
242
+ suggested_fields: {},
243
+ });
244
+ params.ctx.instruction_contract = instruction;
245
+ if (params.taskContextMgr) {
246
+ await params.taskContextMgr.save(params.ctx);
247
+ }
248
+ }
249
+ if (!instruction)
250
+ return { allowed: true };
251
+ // 消费 enforceInstructionBeforeImplementation(链式消费 checkInstructionCompleteness + validateInstructionContract)
252
+ const result = await instrModule.enforceInstructionBeforeImplementation(instruction, params.toolName);
253
+ // Draft 状态不阻断 — 仅在 confirmed/executing/blocked 状态时强制
254
+ if (instruction.status === "draft") {
255
+ return { allowed: true, findings: result.allowed ? [] : [result.reason_zh] };
256
+ }
257
+ if (!result.allowed) {
258
+ return {
259
+ allowed: false,
260
+ diagnostic_code: result.diagnostic_code,
261
+ violation_type: "guard_blocked",
262
+ reason: result.reason_zh,
263
+ };
264
+ }
265
+ return { allowed: true };
266
+ }
267
+ /**
268
+ * 设计产物编码门 — 依赖设计包的任务,在真实复验完成前不得写入业务实现。
269
+ * 仅阻断文件/配置/外部交付写入;任务状态、设计文档复验和讨论本身仍可推进。
270
+ */
271
+ export function checkDesignArtifactWriteGate(params) {
272
+ const implementationWrite = params.sideEffects.some((effect) => ["file_write", "config_write", "external_write", "git_commit", "git_push", "pr_create"].includes(effect));
273
+ if (!implementationWrite || !params.ctx?.design_artifact_pack)
274
+ return { allowed: true };
275
+ if (params.ctx.design_artifact_pack.status === "implementation_ready")
276
+ return { allowed: true };
277
+ return {
278
+ allowed: false,
279
+ diagnostic_code: "SF-DESIGN-PACK-NOT-READY",
280
+ reason: `工具 ${params.toolName} 依赖的设计产物包状态为 ${params.ctx.design_artifact_pack.status},未完成真实复验,不得写入实现或交付`,
281
+ };
282
+ }
283
+ /**
284
+ * 架构设计门 — 架构设计类任务膨胀前执行 reviewArchitectureDesign。
285
+ * 问题四十九: Architecture Design Contract enforcement。
286
+ */
287
+ export async function checkArchitectureDesignGate(params) {
288
+ const route = params.route;
289
+ if (route !== "artifact_generation" && route !== "analysis")
290
+ return { allowed: true };
291
+ if (!params.ctx)
292
+ return { allowed: true };
293
+ const expansion = params.ctx.expansion;
294
+ if (!expansion)
295
+ return { allowed: true };
296
+ const archModule = await lazyArchitectureDesign();
297
+ const contract = expansion.architecture_contract;
298
+ if (contract) {
299
+ const result = archModule.reviewArchitectureDesign(contract);
300
+ if (!result.passed) {
301
+ return {
302
+ allowed: false,
303
+ reason_zh: "架构设计审查未通过",
304
+ findings: result.review.missing_sections ?? ["架构设计审查失败"],
305
+ };
306
+ }
307
+ }
308
+ return { allowed: true };
309
+ }
310
+ /**
311
+ * 架构决策研讨门 — 正式架构设计前六域决策必须闭合。
312
+ * 问题六十一: 与是否存在施工指令契约无关,架构设计路由必经此门。
313
+ */
314
+ export async function checkArchitectureDecisionWorkshopGate(params) {
315
+ const workshopModule = await lazyArchitectureWorkshop();
316
+ if (!workshopModule.requiresArchitectureDecisionWorkshop(params.workflowIntent, params.ctx.intent)) {
317
+ return { allowed: true };
318
+ }
319
+ const existing = params.ctx.architecture_decision_workshop;
320
+ const contract = existing ?? workshopModule.createArchitectureDecisionWorkshop(params.ctx.task_id, params.projectContext ?? "new_system");
321
+ if (params.projectContext === "existing_system" && contract.project_context !== "existing_system") {
322
+ contract.project_context = "existing_system";
323
+ }
324
+ const evaluatedContract = workshopModule.applyArchitectureWorkshopGate(contract) ?? contract;
325
+ const gate = workshopModule.evaluateArchitectureDecisionWorkshop(evaluatedContract);
326
+ params.ctx.architecture_decision_workshop = evaluatedContract;
327
+ return {
328
+ allowed: gate.allowed,
329
+ findings: gate.blocking_findings,
330
+ next_domain: gate.next_domain,
331
+ contract: evaluatedContract,
332
+ };
333
+ }
334
+ /**
335
+ * 现有系统分析门 — 现有项目编码前必须先做分析。
336
+ * 问题五十: Existing System Analysis Contract enforcement。
337
+ */
338
+ export async function checkExistingSystemAnalysisGate(params) {
339
+ const archModule = await lazyExistingSystemAnalysis();
340
+ const context = archModule.detectProjectContext(params.hasExistingCode, params.hasPackageJson, params.hasSrcDir);
341
+ const gateResult = archModule.checkAnalysisGate(context, params.hasAnalysis, params.hasGapAnalysis);
342
+ if (!gateResult.allowed) {
343
+ return {
344
+ allowed: false,
345
+ reason_zh: gateResult.reason,
346
+ missing_analysis: gateResult.missing_analysis,
347
+ };
348
+ }
349
+ return { allowed: true };
350
+ }
351
+ /**
352
+ * 编码就绪门 — 编码前必须有测试计划 + 验收标准。
353
+ * 问题五十一: Coding Readiness / Test-First enforcement。
354
+ */
355
+ export async function checkCodingReadinessGate(params) {
356
+ if (!params.ctx)
357
+ return { allowed: true };
358
+ const readinessModule = await lazyCodingReadiness();
359
+ const contract = params.ctx.coding_readiness_contract;
360
+ if (!contract) {
361
+ return {
362
+ allowed: true,
363
+ reason_zh: "无编码就绪契约(非编码任务),放行",
364
+ };
365
+ }
366
+ const result = readinessModule.evaluateCodingReadiness(contract, false, false, false);
367
+ if (!result.allowed) {
368
+ return {
369
+ allowed: false,
370
+ reason_zh: result.reason,
371
+ missing_preconditions: result.missing_preconditions,
372
+ };
373
+ }
374
+ return { allowed: true };
375
+ }
376
+ /**
377
+ * 本地验收门 — 前端/全栈交付前必须有本地访问证据。
378
+ * 问题五十二: Local Docker / Browser Acceptance enforcement。
379
+ */
380
+ export async function checkLocalAcceptanceGate(params) {
381
+ const acceptanceModule = await lazyLocalAcceptance();
382
+ const requirement = acceptanceModule.requiresLocalAcceptance(params.hasFrontend, params.hasBackend, params.hasDockerCompose, params.hasDockerfile);
383
+ if (!requirement.required)
384
+ return { allowed: true };
385
+ if (!params.ctx) {
386
+ return {
387
+ allowed: false,
388
+ reason_zh: "需要本地验收但无任务上下文",
389
+ required_but_missing: ["local_acceptance_evidence"],
390
+ };
391
+ }
392
+ const evidence = params.ctx.local_acceptance_evidence;
393
+ if (!evidence) {
394
+ return {
395
+ allowed: false,
396
+ reason_zh: `项目需要本地验收(模式: ${requirement.run_mode})但缺少验收证据`,
397
+ required_but_missing: ["local_acceptance_evidence", "final_access_url"],
398
+ };
399
+ }
400
+ return { allowed: true };
401
+ }
402
+ // ── S4 触发判定函数 ──
403
+ // 不依赖 hasInstructionContract,基于 route + intent 风险信号判断是否需要 enforcement。
404
+ // 关键设计: 不是所有 code_change 都触发,只有 intent 含高风险/复杂信号时才触发。
405
+ // 低风险场景(skip_chat / direct_answer / 无风险信号的 code_change)不触发。
406
+ const HIGH_IMPACT_KEYWORDS = /架构|技术选型|数据库|框架|多端|跨模块|高影响|高风险|migration|技术路线|选型|rework/i;
407
+ const UNCERTAINTY_KEYWORDS = /不确定|方案选择|多选项|权衡|脑暴|brainstorm|多方案|选型|比较/i;
408
+ const DETAIL_INTENSIVE_KEYWORDS = /多步骤|复杂|跨模块|高风险|多端|分布式|微服务/i;
409
+ const LOW_RISK_ROUTES = new Set(["skip_chat", "direct_answer", "operation", "planning", "review", "source_extraction"]);
410
+ /** 技术选型/架构/数据库/框架/高影响决策 → 需 decision sovereignty gate */
411
+ export function requiresDecisionSovereignty(ctx, route) {
412
+ if (!ctx)
413
+ return false;
414
+ const routeVal = route ?? ctx.classification?.route_decision?.route ?? ctx.route_decision?.route;
415
+ if (!routeVal || LOW_RISK_ROUTES.has(routeVal))
416
+ return false;
417
+ // 所有路由都要求 intent 含高影响信号
418
+ const hasHighImpact = ctx.intent && HIGH_IMPACT_KEYWORDS.test(ctx.intent);
419
+ if (!hasHighImpact) {
420
+ // instruction_contract 的 risk/high_impact 也可作为信号
421
+ const ic = ctx.instruction_contract;
422
+ if (!ic || (!ic.risk && !ic.high_impact))
423
+ return false;
424
+ if (ic.risk !== "high" && !ic.high_impact)
425
+ return false;
426
+ }
427
+ // artifact_generation / analysis / code_change + 高影响 intent → 触发
428
+ return true;
429
+ }
430
+ /** 多步骤/不确定/高风险任务 → 需 detail discipline gate */
431
+ export function requiresDetailDiscipline(ctx, route) {
432
+ if (!ctx)
433
+ return false;
434
+ const routeVal = route ?? ctx.classification?.route_decision?.route ?? ctx.route_decision?.route;
435
+ if (!routeVal || LOW_RISK_ROUTES.has(routeVal))
436
+ return false;
437
+ // 复杂 intent 触发
438
+ const hasComplexSignals = ctx.intent && DETAIL_INTENSIVE_KEYWORDS.test(ctx.intent);
439
+ if (!hasComplexSignals) {
440
+ const ic = ctx.instruction_contract;
441
+ if (!ic || (!ic.risk && !ic.high_impact))
442
+ return false;
443
+ if (ic.risk !== "high" && !ic.high_impact)
444
+ return false;
445
+ }
446
+ return true;
447
+ }
448
+ /** 高影响任务/架构设计/复杂编码/跨模块变更 → 需 first principles gate */
449
+ export function requiresFirstPrinciples(ctx, route) {
450
+ if (!ctx)
451
+ return false;
452
+ const routeVal = route ?? ctx.classification?.route_decision?.route ?? ctx.route_decision?.route;
453
+ if (!routeVal || LOW_RISK_ROUTES.has(routeVal))
454
+ return false;
455
+ // 所有路由都要求 intent 含高影响信号
456
+ const hasHighImpact = ctx.intent && HIGH_IMPACT_KEYWORDS.test(ctx.intent);
457
+ if (!hasHighImpact) {
458
+ const ic = ctx.instruction_contract;
459
+ if (!ic || (!ic.risk && !ic.high_impact))
460
+ return false;
461
+ if (ic.risk !== "high" && !ic.high_impact)
462
+ return false;
463
+ }
464
+ return true;
465
+ }
466
+ /** 不确定项/方案选择/多选项 → 需 brainstorm gate */
467
+ export function requiresBrainstorm(ctx, route) {
468
+ if (!ctx)
469
+ return false;
470
+ const routeVal = route ?? ctx.classification?.route_decision?.route ?? ctx.route_decision?.route;
471
+ if (!routeVal || LOW_RISK_ROUTES.has(routeVal))
472
+ return false;
473
+ // 仅当 intent 含不确定性信号时才触发
474
+ const hasUncertainty = ctx.intent && UNCERTAINTY_KEYWORDS.test(ctx.intent);
475
+ if (!hasUncertainty)
476
+ return false;
477
+ if (routeVal === "analysis" || routeVal === "artifact_generation")
478
+ return true;
479
+ if (routeVal === "code_change")
480
+ return true;
481
+ const ic = ctx.instruction_contract;
482
+ if (ic && ic.uncertainty)
483
+ return true;
484
+ return false;
485
+ }
486
+ /**
487
+ * 技术选型决策门 — 高影响技术决策需用户确认。
488
+ * 问题十六: Decision Sovereignty enforcement。
489
+ * 不依赖 hasInstructionContract — 触发由 requiresDecisionSovereignty 判定。
490
+ */
491
+ export async function checkDecisionSovereigntyGate(params) {
492
+ if (!params.ctx)
493
+ return { allowed: true, not_applicable_with_reason: "无任务上下文" };
494
+ const triggered = requiresDecisionSovereignty(params.ctx, params.route);
495
+ if (!triggered) {
496
+ return { allowed: true, not_applicable_with_reason: "非高影响技术决策场景,跳过 decision sovereignty gate" };
497
+ }
498
+ const decisionContract = params.ctx.technology_decision_contract;
499
+ if (!decisionContract) {
500
+ return { allowed: false, reason_zh: "高影响技术决策场景缺 technology_decision_contract,无法执行决策主权校验" };
501
+ }
502
+ const decisionModule = await lazyTechnologyDecision();
503
+ const validation = decisionModule.validateTechnologyDecision(decisionContract);
504
+ if (!validation.valid) {
505
+ return { allowed: false, reason_zh: `技术选型决策校验失败: ${validation.violations.join("; ")}` };
506
+ }
507
+ // 有决策记录时评估执行状态
508
+ const decisionRecord = params.ctx.technology_decision_record;
509
+ if (decisionRecord) {
510
+ const evaluation = decisionModule.evaluateDecisionExecution(decisionContract, decisionRecord);
511
+ if (evaluation.requires_human_gate && !decisionContract.human_gate_evidence) {
512
+ return { allowed: false, reason_zh: "高影响技术决策需用户确认(human gate),请提供确认证据", requires_human_gate: true };
513
+ }
514
+ if (!evaluation.allowed) {
515
+ return { allowed: false, reason_zh: evaluation.reason };
516
+ }
517
+ }
518
+ else {
519
+ // 无决策记录: 契约已验证通过,但需 human_gate_evidence 确认(如有高范围决策)
520
+ if (decisionContract.human_gate_required && !decisionContract.human_gate_evidence) {
521
+ return { allowed: false, reason_zh: "高影响技术决策需用户确认(human gate),请提供确认证据", requires_human_gate: true };
522
+ }
523
+ }
524
+ return { allowed: true };
525
+ }
526
+ /**
527
+ * 细节纪律门 — 复杂任务缺关键细节维度时阻断。
528
+ * 问题二十六: Detail Discipline enforcement。
529
+ * 不依赖 hasInstructionContract — 触发由 requiresDetailDiscipline 判定。
530
+ */
531
+ export async function checkDetailDisciplineGate(params) {
532
+ if (!params.ctx)
533
+ return { allowed: true, not_applicable_with_reason: "无任务上下文" };
534
+ const triggered = requiresDetailDiscipline(params.ctx, params.route);
535
+ if (!triggered) {
536
+ return { allowed: true, not_applicable_with_reason: "非复杂/多步骤任务场景,跳过 detail discipline gate" };
537
+ }
538
+ const detailContract = params.ctx.detail_discipline_contract;
539
+ if (!detailContract) {
540
+ return { allowed: false, reason_zh: "多步骤/复杂任务缺 detail_discipline_contract,无法执行细节纪律校验" };
541
+ }
542
+ const detailModule = await lazyDetailDiscipline();
543
+ const check = detailModule.performDetailCheck(detailContract, detailContract.contract_id ?? "unknown", "implementation", params.ctx.provided_details ?? {});
544
+ if (check.blocking) {
545
+ const riskItems = detailModule.generateRiskItems(check);
546
+ const blockingLabels = riskItems.filter(r => r.severity === "blocking").map(r => r.dimension ?? r.description);
547
+ return { allowed: false, reason_zh: `任务方案缺关键细节: ${blockingLabels.join("; ")}`, missing_details: blockingLabels };
548
+ }
549
+ return { allowed: true };
550
+ }
551
+ /**
552
+ * 第一性原理门 — 高影响任务需目标/约束/本质问题/权衡。
553
+ * 问题二十七: First Principles enforcement。
554
+ * 不依赖 hasInstructionContract — 触发由 requiresFirstPrinciples 判定。
555
+ */
556
+ export async function checkFirstPrinciplesGate(params) {
557
+ if (!params.ctx)
558
+ return { allowed: true, not_applicable_with_reason: "无任务上下文" };
559
+ const triggered = requiresFirstPrinciples(params.ctx, params.route);
560
+ if (!triggered) {
561
+ return { allowed: true, not_applicable_with_reason: "非高影响任务场景,跳过 first principles gate" };
562
+ }
563
+ const fpFrame = params.ctx.first_principles_frame;
564
+ if (!fpFrame) {
565
+ return { allowed: false, reason_zh: "高影响任务缺 first_principles_frame,无法执行第一性原理校验" };
566
+ }
567
+ const fpModule = await lazyFirstPrinciples();
568
+ const validation = fpModule.validateFirstPrinciplesForHighImpact(fpFrame);
569
+ if (!validation.passed) {
570
+ return { allowed: false, reason_zh: `高影响任务缺第一性原理推理: ${validation.violations.join("; ")}`, failures: validation.violations };
571
+ }
572
+ return { allowed: true };
573
+ }
574
+ /**
575
+ * 脑暴/方案探索门 — 不确定项需多方案+推荐理由+用户确认。
576
+ * 问题四十一-brainstorm: Brainstorm Contract enforcement。
577
+ * 不依赖 hasInstructionContract — 触发由 requiresBrainstorm 判定。
578
+ */
579
+ export async function checkBrainstormGate(params) {
580
+ if (!params.ctx)
581
+ return { allowed: true, not_applicable_with_reason: "无任务上下文" };
582
+ const triggered = requiresBrainstorm(params.ctx, params.route);
583
+ if (!triggered) {
584
+ return { allowed: true, not_applicable_with_reason: "非不确定/方案选择场景,跳过 brainstorm gate" };
585
+ }
586
+ const brainstormSession = params.ctx.brainstorm_session;
587
+ if (!brainstormSession) {
588
+ return { allowed: false, reason_zh: "不确定项/方案选择缺 brainstorm_session,无法执行方案探索校验" };
589
+ }
590
+ const brainstormModule = await lazyBrainstormContract();
591
+ const validation = brainstormModule.validateBrainstormSession(brainstormSession);
592
+ if (!validation.valid) {
593
+ return { allowed: false, reason_zh: `方案探索不完整: ${validation.violations.join("; ")}`, violations: validation.violations };
594
+ }
595
+ // 脑暴推荐永远不能自动执行 — 需 Decision Sovereignty human gate
596
+ const canAutoExec = brainstormModule.canBrainstormAutoExecute(brainstormSession);
597
+ if (canAutoExec) {
598
+ return { allowed: false, reason_zh: "脑暴推荐不能绕过用户确认,需通过 Decision Sovereignty human gate" };
599
+ }
600
+ return { allowed: true };
601
+ }
602
+ /**
603
+ */
604
+ export async function assessCepAfterVerification(params) {
605
+ const cepModule = await import("../../engine/core_experience_principle.js");
606
+ const result = cepModule.evaluateCoreExperiencePrinciple({
607
+ task_id: params.task_id,
608
+ workflow_id: "sf_verify",
609
+ has_mainline_hooks: true,
610
+ has_owner_contracts: true,
611
+ natural_language_entry: true,
612
+ requires_internal_contract_knowledge: false,
613
+ user_path_steps: 3,
614
+ has_failures: params.has_failures ?? false,
615
+ hard_fail_downgraded: params.hard_fail_downgraded ?? false,
616
+ forced_heavy_process: false,
617
+ has_sufficient_evidence: params.has_verification_evidence,
618
+ output_too_long_no_summary: false,
619
+ report_only_no_repair: false,
620
+ failed_but_marked_done: params.failed_but_marked_done ?? false,
621
+ auto_repair_overreach: false,
622
+ repair_reverified: false,
623
+ outputs_raw_noise: false,
624
+ });
625
+ return {
626
+ passed: result.passed,
627
+ violations: result.violations.map((v) => ({
628
+ principle: v.principle,
629
+ severity: v.severity,
630
+ reason_zh: v.reason_zh ?? "",
631
+ required_action: v.required_action,
632
+ })),
633
+ evaluated_principles: result.evaluated_principles,
634
+ };
635
+ }
636
+ /**
637
+ * CEP 集成: 交付前 false completion 检查 — 从 sf_deliver handler 提取的真实主链路函数。
638
+ * 返回 CEP 决策(blocked/repair_reverify/allowed),由 handler 和 gate 共用。
639
+ */
640
+ export async function assessCepBeforeDelivery(params) {
641
+ const cepModule = await import("../../engine/core_experience_principle.js");
642
+ const nfcResult = cepModule.evaluateNoFalseCompletion({
643
+ verification_passed: params.verification_passed,
644
+ build_passed: params.build_passed,
645
+ browser_acceptance_passed: params.browser_acceptance_passed,
646
+ guard_passed: params.guard_passed,
647
+ evidence_sufficient: params.evidence_sufficient,
648
+ current_status: params.current_status,
649
+ });
650
+ return {
651
+ decision: nfcResult.decision,
652
+ reason_zh: nfcResult.reason_zh ?? "",
653
+ passed: nfcResult.decision === "completed",
654
+ };
655
+ }
656
+ /**
657
+ * CEP 集成: 工作流解析后评估 — 检查机制是否接入真实主链路、用户路径是否过短。
658
+ */
659
+ export async function assessCepAfterWorkflowResolve(params) {
660
+ const cepModule = await import("../../engine/core_experience_principle.js");
661
+ const result = cepModule.evaluateCoreExperiencePrinciple({
662
+ task_id: params.task_id,
663
+ workflow_id: "workflow_resolve",
664
+ has_mainline_hooks: params.workflow_resolved,
665
+ has_owner_contracts: params.workflow_resolved,
666
+ natural_language_entry: true,
667
+ requires_internal_contract_knowledge: false,
668
+ user_path_steps: 3,
669
+ has_failures: !params.workflow_resolved,
670
+ hard_fail_downgraded: false,
671
+ forced_heavy_process: false,
672
+ has_sufficient_evidence: params.workflow_resolved,
673
+ output_too_long_no_summary: false,
674
+ report_only_no_repair: false,
675
+ failed_but_marked_done: false,
676
+ auto_repair_overreach: false,
677
+ repair_reverified: false,
678
+ outputs_raw_noise: false,
679
+ });
680
+ return {
681
+ passed: result.passed,
682
+ violations: result.violations.map((v) => ({
683
+ principle: v.principle,
684
+ severity: v.severity,
685
+ reason_zh: v.reason_zh ?? "",
686
+ })),
687
+ evaluated_principles: result.evaluated_principles,
688
+ };
689
+ }
690
+ /**
691
+ * CEP 集成: 护栏评估后检查 — 硬规则是否被降级、低风险是否过重。
692
+ */
693
+ export async function assessCepAfterGuardEvaluation(params) {
694
+ const cepModule = await import("../../engine/core_experience_principle.js");
695
+ const result = cepModule.evaluateCoreExperiencePrinciple({
696
+ task_id: params.task_id,
697
+ workflow_id: "guard_evaluation",
698
+ has_mainline_hooks: true,
699
+ has_owner_contracts: true,
700
+ natural_language_entry: true,
701
+ requires_internal_contract_knowledge: false,
702
+ user_path_steps: 3,
703
+ has_failures: !params.guard_passed,
704
+ hard_fail_downgraded: params.hard_fail_downgraded,
705
+ forced_heavy_process: params.is_low_risk && !params.guard_passed,
706
+ has_sufficient_evidence: params.guard_passed,
707
+ output_too_long_no_summary: false,
708
+ report_only_no_repair: false,
709
+ failed_but_marked_done: false,
710
+ auto_repair_overreach: false,
711
+ repair_reverified: false,
712
+ outputs_raw_noise: false,
713
+ });
714
+ return {
715
+ passed: result.passed,
716
+ violations: result.violations.map((v) => ({
717
+ principle: v.principle,
718
+ severity: v.severity,
719
+ reason_zh: v.reason_zh ?? "",
720
+ })),
721
+ evaluated_principles: result.evaluated_principles,
722
+ };
723
+ }
724
+ /**
725
+ * CEP 集成: 修复重验证决策 — 检查是否假完成、是否进入正确修复路径。
726
+ */
727
+ export async function assessCepForRepairReverify(params) {
728
+ const cepModule = await import("../../engine/core_experience_principle.js");
729
+ const nfcResult = cepModule.evaluateNoFalseCompletion({
730
+ verification_passed: params.verification_passed,
731
+ build_passed: params.build_passed,
732
+ browser_acceptance_passed: true,
733
+ guard_passed: true,
734
+ evidence_sufficient: params.evidence_sufficient,
735
+ current_status: params.current_status,
736
+ });
737
+ return {
738
+ decision: nfcResult.decision,
739
+ reason_zh: nfcResult.reason_zh ?? "",
740
+ passed: nfcResult.decision === "completed",
741
+ };
742
+ }
743
+ /**
744
+ * CEP 集成: 用户反馈输出质量 — 检查结论优先、摘要清晰、不隐藏失败、中文语义。
745
+ */
746
+ export async function assessCepForUserFeedback(params) {
747
+ const cepModule = await import("../../engine/core_experience_principle.js");
748
+ return cepModule.evaluateUserVisibleOutput({
749
+ has_conclusion_first: params.has_conclusion_first,
750
+ has_clear_summary: params.has_clear_summary,
751
+ has_actionable_next_step: params.has_actionable_next_step,
752
+ exposes_internal_noise: params.exposes_internal_noise,
753
+ hides_critical_failure: params.hides_critical_failure,
754
+ chinese_semantic_first: params.chinese_semantic_first,
755
+ });
756
+ }
191
757
  /**
192
758
  * 注册所有 MCP 工具到服务器实例。
193
759
  * @param server - McpServer 实例
194
760
  * @param deps - 工具依赖项(配置、知识索引、任务上下文)
195
761
  */
196
762
  export async function registerTools(server, deps) {
197
- console.error("[soloForge] 工具注册: 开始注册 MCP 工具...");
763
+ debug("工具注册", "开始注册 MCP 工具...");
198
764
  const { config, knowledgeIndex, taskContext } = deps;
199
765
  const projectPath = config._projectPath || process.cwd();
200
766
  // H1: LLM Gateway — Token 预算熔断,防止单任务 Token 超支
@@ -349,6 +915,120 @@ export async function registerTools(server, deps) {
349
915
  // read_only_bypass 的旁路处理
350
916
  const bypass = effectiveCategory === "read_only_bypass"
351
917
  ? { allowed: true, reason: "read_only" } : undefined;
918
+ // 计划前置门: 在合同验证之前检查 — 写工具必须有 plan_proposal_gate
919
+ const hasWriteEffect = hasWriteSideEffect(effectiveSideEffects);
920
+ if (hasWriteEffect && taskId) {
921
+ const pgResult = checkWriteToolPlanGate({ ctx, toolName: name, sideEffects: effectiveSideEffects });
922
+ if (!pgResult.allowed) {
923
+ const planViolation = {
924
+ invocation_id: invocationId, tool_name: name,
925
+ violation_type: "guard_blocked", severity: "hard_fail",
926
+ reason: pgResult.reason ?? "执行前缺少 Plan Proposal Gate",
927
+ recovery: "先调用 sf_classify → sf_expand → 设置 plan_proposal_gate 后再执行此工具",
928
+ };
929
+ const blockedTrace = createToolTrace({
930
+ tool_name: name, invocation_id: invocationId, task_id: taskId,
931
+ actual_side_effects: effectiveSideEffects,
932
+ next_allowed_tools: contract.default_next_tools,
933
+ forbidden_tools: contract.forbidden_next_tools,
934
+ authorization, bypass,
935
+ });
936
+ await taskContext.setToolTrace(taskId, blockedTrace, [planViolation]);
937
+ return {
938
+ content: [{ type: "text", text: JSON.stringify({
939
+ error: planViolation.reason,
940
+ violation: planViolation,
941
+ diagnostic_code: pgResult.diagnostic_code ?? "SF-PLAN-5001",
942
+ recovery: planViolation.recovery,
943
+ }) }],
944
+ isError: true,
945
+ };
946
+ }
947
+ const planGateCheck = taskContext.checkPlanGateBeforeWrite(ctx);
948
+ if (!planGateCheck.allowed) {
949
+ const planViolation = {
950
+ invocation_id: invocationId, tool_name: name,
951
+ violation_type: "guard_blocked", severity: "hard_fail",
952
+ reason: planGateCheck.reason_zh,
953
+ recovery: "请先通过 PlanProposalFirstGate 生成并确认执行计划",
954
+ };
955
+ const blockedTrace = createToolTrace({
956
+ tool_name: name, invocation_id: invocationId, task_id: taskId,
957
+ actual_side_effects: effectiveSideEffects,
958
+ next_allowed_tools: contract.default_next_tools,
959
+ forbidden_tools: contract.forbidden_next_tools,
960
+ authorization, bypass,
961
+ });
962
+ await taskContext.setToolTrace(taskId, blockedTrace, [planViolation]);
963
+ return {
964
+ content: [{ type: "text", text: JSON.stringify({
965
+ error: planViolation.reason,
966
+ violation: planViolation,
967
+ diagnostic_code: "SF-PLAN-5001",
968
+ recovery: planViolation.recovery,
969
+ }) }],
970
+ isError: true,
971
+ };
972
+ }
973
+ }
974
+ // 施工指令契约门: 写操作前检查 instruction_contract 状态
975
+ if (hasWriteEffect && taskId) {
976
+ const instrResult = await checkInstructionContractGate({ ctx, toolName: name, sideEffects: effectiveSideEffects, task_id: taskId, taskContextMgr: taskContext });
977
+ if (!instrResult.allowed) {
978
+ const instrViolation = {
979
+ invocation_id: invocationId, tool_name: name,
980
+ violation_type: "guard_blocked", severity: "hard_fail",
981
+ reason: instrResult.reason ?? "施工指令未就绪",
982
+ recovery: "请先完善施工指令(目标、范围、非目标、落点、验收标准、禁止绕过项)",
983
+ };
984
+ const instrTrace = createToolTrace({
985
+ tool_name: name, invocation_id: invocationId, task_id: taskId,
986
+ actual_side_effects: effectiveSideEffects,
987
+ next_allowed_tools: contract.default_next_tools,
988
+ forbidden_tools: contract.forbidden_next_tools,
989
+ authorization, bypass,
990
+ });
991
+ await taskContext.setToolTrace(taskId, instrTrace, [instrViolation]);
992
+ return {
993
+ content: [{ type: "text", text: JSON.stringify({
994
+ error: instrViolation.reason,
995
+ violation: instrViolation,
996
+ diagnostic_code: instrResult.diagnostic_code ?? "SF-INSTR-5801",
997
+ recovery: instrViolation.recovery,
998
+ }) }],
999
+ isError: true,
1000
+ };
1001
+ }
1002
+ }
1003
+ // 问题六十二: MCP 写入路径同样必须消费设计产物包状态,不能绕开 CLI hook。
1004
+ if (hasWriteEffect && taskId) {
1005
+ const designWriteGate = checkDesignArtifactWriteGate({ ctx, toolName: name, sideEffects: effectiveSideEffects });
1006
+ if (!designWriteGate.allowed) {
1007
+ const designViolation = {
1008
+ invocation_id: invocationId, tool_name: name,
1009
+ violation_type: "guard_blocked", severity: "hard_fail",
1010
+ reason: designWriteGate.reason ?? "设计产物包未达到实现就绪状态",
1011
+ recovery: "仅可继续补充设计资产并执行 sf_verify 真实复验;通过前不得写入业务实现",
1012
+ };
1013
+ const designTrace = createToolTrace({
1014
+ tool_name: name, invocation_id: invocationId, task_id: taskId,
1015
+ actual_side_effects: effectiveSideEffects,
1016
+ next_allowed_tools: contract.default_next_tools,
1017
+ forbidden_tools: contract.forbidden_next_tools,
1018
+ authorization, bypass,
1019
+ });
1020
+ await taskContext.setToolTrace(taskId, designTrace, [designViolation]);
1021
+ return {
1022
+ content: [{ type: "text", text: JSON.stringify({
1023
+ error: designViolation.reason,
1024
+ violation: designViolation,
1025
+ diagnostic_code: designWriteGate.diagnostic_code,
1026
+ recovery: designViolation.recovery,
1027
+ }) }],
1028
+ isError: true,
1029
+ };
1030
+ }
1031
+ }
352
1032
  // 合同验证
353
1033
  const lastTrace = ctx?.last_tool_trace;
354
1034
  // 为动态工具构建有效的合同覆盖(如 sf_status cancel)
@@ -468,7 +1148,7 @@ export async function registerTools(server, deps) {
468
1148
  }
469
1149
  // 加载认知锚点上下文 — 必须提供相关性参数,禁止全量加载
470
1150
  async function loadRelevantAnchors(query) {
471
- console.error("[soloForge] 工具注册: 加载认知锚点");
1151
+ debug("工具注册", "加载认知锚点");
472
1152
  return _loadRelevantAnchorsInner(query);
473
1153
  }
474
1154
  async function _loadRelevantAnchorsInner(query) {
@@ -522,7 +1202,7 @@ export async function registerTools(server, deps) {
522
1202
  stale_anchor: a.stale_anchor,
523
1203
  }));
524
1204
  }
525
- console.error("[soloForge] 工具注册: 批量注册核心/辅助/知识维护工具...");
1205
+ debug("工具注册", "批量注册核心/辅助/知识维护工具...");
526
1206
  // ── sf_classify: 意图分类入口,创建任务上下文并返回分类结果 ──
527
1207
  registerSafeTool("sf_classify", "分析开发者意图,返回任务类型、风险、复杂度和执行策略", ClassifySchema, async (args) => {
528
1208
  // 检查是否存在进行中的任务
@@ -561,9 +1241,19 @@ export async function registerTools(server, deps) {
561
1241
  if (!ctx || !ctx.classification) {
562
1242
  return { result: { error: "任务不存在或尚未分类,请先调用 sf_classify" } };
563
1243
  }
1244
+ if (args.architecture_decision_workshop) {
1245
+ ctx.architecture_decision_workshop = args.architecture_decision_workshop;
1246
+ }
1247
+ if (args.design_artifact_pack) {
1248
+ ctx.design_artifact_pack = args.design_artifact_pack;
1249
+ }
1250
+ if (args.architecture_decision_workshop || args.design_artifact_pack) {
1251
+ await taskContext.save(ctx);
1252
+ }
564
1253
  // 状态守卫:classifying/expanding/clarifying → expanding
565
1254
  if (ctx.status === "classifying" || ctx.status === "clarifying") {
566
1255
  await taskContext.updateStatus(args.task_id, "expanding");
1256
+ ctx.status = "expanding";
567
1257
  }
568
1258
  else if (ctx.status !== "expanding") {
569
1259
  return {
@@ -640,6 +1330,234 @@ export async function registerTools(server, deps) {
640
1330
  gateway.endTask();
641
1331
  }
642
1332
  expansion.task_id = args.task_id;
1333
+ const workflowIntent = ctx.route_decision?.workflow_intent ?? ctx.classification.route_decision?.workflow_intent;
1334
+ // 问题六十: 高风险项目事实声明先过证据门,避免后续架构研讨门遮蔽无证据问题。
1335
+ {
1336
+ const evRoute = ctx.route_decision?.route ?? ctx.classification?.route_decision?.route;
1337
+ const evWorkflowIntent = ctx.route_decision?.workflow_intent ?? ctx.classification?.route_decision?.workflow_intent;
1338
+ const evRisk = (await import("../../engine/evidence_grounding_contract.js")).assessTaskRisk(ctx.classification?.task_type, evRoute, ctx.intent);
1339
+ const isArchitectureContext = evWorkflowIntent === "architecture_design"
1340
+ || evWorkflowIntent === "existing_system_gap_analysis"
1341
+ || evRoute === "artifact_generation"
1342
+ || /架构|architecture|系统设计|技术方案|现有系统|差距分析|gap.?analysis/i.test(ctx.intent ?? "");
1343
+ if (isArchitectureContext && (evRisk === "high" || evRisk === "critical")) {
1344
+ const { createEvidenceGroundingSystem } = await import("../../engine/evidence_grounding_contract.js");
1345
+ const evg = createEvidenceGroundingSystem();
1346
+ evg.registry.register({
1347
+ source_type: "task_context",
1348
+ evidence_role: "classification",
1349
+ authority: "authoritative",
1350
+ freshness: "current",
1351
+ permission: "allowed",
1352
+ scope: "classification",
1353
+ description: "任务分类结果",
1354
+ source_ref: `task:${args.task_id}`,
1355
+ });
1356
+ if (knowledgeIndex) {
1357
+ const { project } = knowledgeIndex.getAllEntries();
1358
+ for (const entry of project) {
1359
+ if (entry.status !== "active")
1360
+ continue;
1361
+ evg.registry.register({
1362
+ source_type: "knowledge_asset",
1363
+ evidence_role: "template_guidance",
1364
+ authority: "trusted",
1365
+ freshness: "current",
1366
+ permission: "allowed",
1367
+ scope: entry.scope?.join(",") ?? "knowledge",
1368
+ description: entry.name,
1369
+ source_ref: entry.file_path,
1370
+ });
1371
+ }
1372
+ }
1373
+ const tdc = ctx?.technology_decision_contract;
1374
+ if (tdc?.human_gate_evidence) {
1375
+ evg.registry.register({
1376
+ source_type: "user_confirmation",
1377
+ evidence_role: "user_confirmation",
1378
+ authority: "authoritative",
1379
+ freshness: "current",
1380
+ permission: "allowed",
1381
+ scope: "technology_decision",
1382
+ description: `技术决策确认: ${tdc.decision_scope ?? "general"}`,
1383
+ source_ref: `decision:${tdc.decision_id ?? args.task_id}`,
1384
+ });
1385
+ }
1386
+ const evClaims = [
1387
+ {
1388
+ id: "claim-expand-0",
1389
+ category: "user_confirmation",
1390
+ claim_text: "任务路由和执行范围已确认",
1391
+ evidence_ids: evg.registry.query({ source_type: "task_context" }).map((e) => e.id),
1392
+ is_uncertain: false,
1393
+ risk_level: evRisk,
1394
+ },
1395
+ {
1396
+ id: "claim-expand-1",
1397
+ category: "architecture",
1398
+ claim_text: "技术方案基于现有系统分析",
1399
+ evidence_ids: evg.registry.query({}).filter((e) => e.evidence_role && e.evidence_role !== "template_guidance" && e.evidence_role !== "classification").map((e) => e.id),
1400
+ is_uncertain: false,
1401
+ risk_level: evRisk,
1402
+ },
1403
+ ];
1404
+ const evMatrix = evg.builder.buildContext(evClaims, {
1405
+ target_claims: evClaims.map((c) => c.claim_text),
1406
+ source_types: [],
1407
+ keywords: [],
1408
+ max_results: 10,
1409
+ });
1410
+ evMatrix.task_id = args.task_id;
1411
+ const evGate = evg.gate.evaluate(evMatrix, evRisk);
1412
+ await taskContext.setEvidenceGroundingResult(args.task_id, {
1413
+ evidence_matrix: evMatrix,
1414
+ evidence_gate_result: evGate,
1415
+ unsupported_claims: evGate.unsupported_claims,
1416
+ conflict_resolutions: evMatrix.conflicts,
1417
+ });
1418
+ if (!evGate.allowed) {
1419
+ return {
1420
+ result: {
1421
+ error: `证据驱动门禁阻断: ${evGate.reason_zh}`,
1422
+ diagnostic_code: evGate.diagnostic_code,
1423
+ reason_zh: evGate.reason_zh,
1424
+ unsupported_claims: evGate.unsupported_claims,
1425
+ missing_evidence: evGate.missing_evidence,
1426
+ status: "blocked",
1427
+ recovery: "请提供项目文件、命令输出或其他权威证据支撑关键声明后重新 sf_expand",
1428
+ },
1429
+ };
1430
+ }
1431
+ }
1432
+ }
1433
+ // 问题六十一: 架构设计前的六域研讨门独立执行,不得被施工指令契约有无绕过。
1434
+ const existingSourceRoot = ["src", "backend", "frontend", "apps", "services"].some((candidate) => fss.existsSync(path.join(projectPath, candidate)));
1435
+ const existingManifest = ["package.json", "pom.xml", "build.gradle", "settings.gradle"].some((candidate) => fss.existsSync(path.join(projectPath, candidate)));
1436
+ const detectedArchitectureContext = existingSourceRoot && existingManifest
1437
+ ? "existing_system"
1438
+ : (!existingSourceRoot && !existingManifest ? "empty_project" : "new_system");
1439
+ const workshopGate = await checkArchitectureDecisionWorkshopGate({
1440
+ ctx,
1441
+ workflowIntent,
1442
+ projectContext: detectedArchitectureContext,
1443
+ });
1444
+ await taskContext.save(ctx);
1445
+ if (!workshopGate.allowed) {
1446
+ return {
1447
+ result: {
1448
+ error: "架构设计前必须先完成六类架构决策研讨与用户确认",
1449
+ status: "awaiting_confirmation",
1450
+ architecture_decision_workshop: workshopGate.contract,
1451
+ blocking_findings: workshopGate.findings,
1452
+ next_domain: workshopGate.next_domain,
1453
+ recovery: "请从当前待讨论域开始,提供候选方案、推荐理由、风险和用户确认后重新调用 sf_expand",
1454
+ },
1455
+ };
1456
+ }
1457
+ // 六域决策闭合后创建设计产物生命周期;正式设计与后续实现必须以其复验结果为准。
1458
+ if (workflowIntent === "architecture_design" && !ctx.design_artifact_pack) {
1459
+ const designModule = await lazyDesignArtifactPack();
1460
+ ctx.design_artifact_pack = designModule.createDesignArtifactPack(args.task_id);
1461
+ ctx.design_artifact_pack.status = "awaiting_decisions";
1462
+ ctx.design_artifact_pack.decision_workshop_ref = `task:${args.task_id}:architecture_decision_workshop`;
1463
+ ctx.design_artifact_pack.user_confirmation_ref = ctx.architecture_decision_workshop?.document_output_confirmation_ref;
1464
+ await taskContext.save(ctx);
1465
+ }
1466
+ // 问题四十九/五十: 已有架构合同或现有系统证据的进一步审查。
1467
+ const expansionRoute = expansion.workflow_trace
1468
+ ? expansion.workflow_trace?.route
1469
+ : undefined;
1470
+ const hasInstructionContract = !!ctx?.instruction_contract;
1471
+ if (hasInstructionContract) {
1472
+ if (expansionRoute === "artifact_generation" || expansionRoute === "analysis") {
1473
+ const archGate = await checkArchitectureDesignGate({ ctx, route: expansionRoute });
1474
+ if (!archGate.allowed) {
1475
+ return {
1476
+ result: {
1477
+ error: archGate.reason_zh,
1478
+ architecture_gate_findings: archGate.findings,
1479
+ status: "blocked",
1480
+ recovery: "架构设计审查未通过,请补充缺失项后重新 sf_expand",
1481
+ },
1482
+ };
1483
+ }
1484
+ }
1485
+ if (expansionRoute === "code_change" || expansionRoute === "artifact_generation") {
1486
+ const analysisGate = await checkExistingSystemAnalysisGate({
1487
+ hasExistingCode: !!config?.tech_stack,
1488
+ hasPackageJson: !!projectPath,
1489
+ hasSrcDir: true,
1490
+ hasAnalysis: !!ctx.existing_system_analysis,
1491
+ hasGapAnalysis: !!ctx.requirement_gap_analysis,
1492
+ });
1493
+ if (!analysisGate.allowed) {
1494
+ return {
1495
+ result: {
1496
+ error: `现有系统分析门禁未通过: ${analysisGate.reason_zh}`,
1497
+ missing_analysis: analysisGate.missing_analysis,
1498
+ status: "blocked",
1499
+ recovery: "请先对现有项目执行系统分析和差距分析,再继续架构设计或编码",
1500
+ },
1501
+ };
1502
+ }
1503
+ }
1504
+ }
1505
+ // ── S4 gates: 独立于 hasInstructionContract,由 requires* 触发判定 ──
1506
+ // 问题十六: 技术选型决策主权 gate — 高影响技术决策缺证据时 blocked
1507
+ {
1508
+ const decisionGate = await checkDecisionSovereigntyGate({ ctx, route: expansionRoute });
1509
+ if (!decisionGate.allowed) {
1510
+ return {
1511
+ result: {
1512
+ error: decisionGate.reason_zh,
1513
+ status: "blocked",
1514
+ recovery: decisionGate.requires_human_gate ? "请提供技术决策确认证据(human_gate_evidence)" : "技术选型决策校验失败,请提供 technology_decision_contract",
1515
+ },
1516
+ };
1517
+ }
1518
+ }
1519
+ // 问题二十六: 细节纪律 gate — 复杂任务缺关键细节时 blocked
1520
+ {
1521
+ const detailGate = await checkDetailDisciplineGate({ ctx, route: expansionRoute });
1522
+ if (!detailGate.allowed) {
1523
+ return {
1524
+ result: {
1525
+ error: detailGate.reason_zh,
1526
+ missing_details: detailGate.missing_details,
1527
+ status: "blocked",
1528
+ recovery: "多步骤/复杂任务缺 detail_discipline_contract,请提供后重新 sf_expand",
1529
+ },
1530
+ };
1531
+ }
1532
+ }
1533
+ // 问题二十七: 第一性原理 gate — 高影响任务缺推理时 blocked
1534
+ {
1535
+ const fpGate = await checkFirstPrinciplesGate({ ctx, route: expansionRoute });
1536
+ if (!fpGate.allowed) {
1537
+ return {
1538
+ result: {
1539
+ error: fpGate.reason_zh,
1540
+ failures: fpGate.failures,
1541
+ status: "blocked",
1542
+ recovery: "高影响任务缺 first_principles_frame,请提供后重新 sf_expand",
1543
+ },
1544
+ };
1545
+ }
1546
+ }
1547
+ // 问题四十一(brainstorm): 脑暴契约 gate — 不确定项缺方案探索时 blocked
1548
+ {
1549
+ const brainstormGate = await checkBrainstormGate({ ctx, route: expansionRoute });
1550
+ if (!brainstormGate.allowed) {
1551
+ return {
1552
+ result: {
1553
+ error: brainstormGate.reason_zh,
1554
+ violations: brainstormGate.violations,
1555
+ status: "blocked",
1556
+ recovery: "不确定项/方案选择缺 brainstorm_session,请提供后重新 sf_expand",
1557
+ },
1558
+ };
1559
+ }
1560
+ }
643
1561
  // Input Material Contract: 处理 hard-blocking 结果
644
1562
  // Privacy Gate: 隐私/敏感信息策略阻断
645
1563
  const isBlocked = expansion.prompt.startsWith("## 阻塞:输入材料禁止读取")
@@ -659,7 +1577,124 @@ export async function registerTools(server, deps) {
659
1577
  advisories.h1_advisory = h1Warning;
660
1578
  if (h4LockWarning)
661
1579
  advisories.h4_advisory = h4LockWarning;
662
- // 配置优先级警告
1580
+ // 问题六十:证据驱动门禁 — 高风险任务必须阻断无证据声明
1581
+ const _evRoute = ctx.route_decision?.route ?? ctx.classification?.route_decision?.route;
1582
+ const _evRisk = (await import("../../engine/evidence_grounding_contract.js")).assessTaskRisk(ctx.classification?.task_type, _evRoute, ctx.intent);
1583
+ if (_evRisk === "high" || _evRisk === "critical") {
1584
+ const { createEvidenceGroundingSystem } = await import("../../engine/evidence_grounding_contract.js");
1585
+ const _evg = createEvidenceGroundingSystem();
1586
+ if (ctx.classification) {
1587
+ _evg.registry.register({
1588
+ source_type: "task_context",
1589
+ evidence_role: "classification",
1590
+ authority: "authoritative",
1591
+ freshness: "current",
1592
+ permission: "allowed",
1593
+ scope: "classification",
1594
+ description: "任务分类结果",
1595
+ source_ref: `task:${args.task_id}`,
1596
+ });
1597
+ }
1598
+ // 注册知识索引中的项目知识作为证据(仅项目级,不含全局通用规则)
1599
+ // 所有知识索引条目都是 template_guidance 角色,不得支撑项目事实声明
1600
+ if (knowledgeIndex) {
1601
+ const { project } = knowledgeIndex.getAllEntries();
1602
+ for (const entry of project) {
1603
+ if (entry.status !== "active")
1604
+ continue;
1605
+ _evg.registry.register({
1606
+ source_type: "knowledge_asset",
1607
+ evidence_role: "template_guidance",
1608
+ authority: "trusted",
1609
+ freshness: "current",
1610
+ permission: "allowed",
1611
+ scope: entry.scope?.join(",") ?? "knowledge",
1612
+ description: entry.name,
1613
+ source_ref: entry.file_path,
1614
+ });
1615
+ }
1616
+ }
1617
+ // 技术决策契约含 human_gate_evidence → 注册为 user_confirmation(真实项目证据)
1618
+ const _tdc = ctx?.technology_decision_contract;
1619
+ if (_tdc?.human_gate_evidence) {
1620
+ _evg.registry.register({
1621
+ source_type: "user_confirmation",
1622
+ evidence_role: "user_confirmation",
1623
+ authority: "authoritative",
1624
+ freshness: "current",
1625
+ permission: "allowed",
1626
+ scope: "technology_decision",
1627
+ description: `技术决策确认: ${_tdc.decision_scope ?? "general"}`,
1628
+ source_ref: `decision:${_tdc.decision_id ?? args.task_id}`,
1629
+ });
1630
+ }
1631
+ const _evClaims = [
1632
+ {
1633
+ id: "claim-expand-0",
1634
+ category: "user_confirmation",
1635
+ claim_text: "任务路由和执行范围已确认",
1636
+ evidence_ids: _evg.registry.query({ source_type: "task_context" }).map((e) => e.id),
1637
+ is_uncertain: false,
1638
+ risk_level: _evRisk,
1639
+ },
1640
+ ];
1641
+ // 只在架构设计/现有系统分析场景生成 architecture claim
1642
+ const _evWorkflowIntent = ctx.route_decision?.workflow_intent ?? ctx.classification?.route_decision?.workflow_intent;
1643
+ const _evIntentText = (ctx.intent ?? "").toLowerCase();
1644
+ const _isArchitectureContext = _evWorkflowIntent === "architecture_design"
1645
+ || _evWorkflowIntent === "existing_system_gap_analysis"
1646
+ || _evRoute === "artifact_generation"
1647
+ || /架构|architecture|系统设计|技术方案|现有系统|差距分析|gap.?analysis/i.test(_evIntentText);
1648
+ if (_isArchitectureContext) {
1649
+ _evClaims.push({
1650
+ id: "claim-expand-1",
1651
+ category: "architecture",
1652
+ claim_text: "技术方案基于现有系统分析",
1653
+ evidence_ids: _evg.registry.query({}).filter((e) => e.evidence_role && e.evidence_role !== "template_guidance" && e.evidence_role !== "classification").map((e) => e.id),
1654
+ is_uncertain: false,
1655
+ risk_level: _evRisk,
1656
+ });
1657
+ }
1658
+ const _evVerify = _evg.verifier.verify(_evClaims, _evRisk);
1659
+ const _evMatrix = _evg.builder.buildContext(_evClaims, {
1660
+ target_claims: _evClaims.map((c) => c.claim_text),
1661
+ source_types: [], keywords: [], max_results: 10,
1662
+ });
1663
+ _evMatrix.task_id = args.task_id;
1664
+ const _evGate = _evg.gate.evaluate(_evMatrix, _evRisk);
1665
+ // 写回 TaskContext(blocked 也保存)
1666
+ await taskContext.setEvidenceGroundingResult(args.task_id, {
1667
+ evidence_matrix: _evMatrix,
1668
+ evidence_gate_result: _evGate,
1669
+ unsupported_claims: _evGate.unsupported_claims,
1670
+ conflict_resolutions: _evMatrix.conflicts,
1671
+ });
1672
+ if (!_evGate.allowed) {
1673
+ return {
1674
+ result: {
1675
+ error: `证据驱动门禁阻断: ${_evGate.reason_zh}`,
1676
+ diagnostic_code: _evGate.diagnostic_code,
1677
+ reason_zh: _evGate.reason_zh,
1678
+ unsupported_claims: _evGate.unsupported_claims,
1679
+ missing_evidence: _evGate.missing_evidence,
1680
+ status: "blocked",
1681
+ recovery: "请提供项目文件、命令输出或其他权威证据支撑关键声明后重新 sf_expand",
1682
+ },
1683
+ };
1684
+ }
1685
+ if (_evGate.requires_user_confirmation.length > 0) {
1686
+ advisories.evidence_advisory = {
1687
+ level: "requires_confirmation",
1688
+ items: _evGate.requires_user_confirmation,
1689
+ diagnostic_code: _evGate.diagnostic_code,
1690
+ };
1691
+ }
1692
+ }
1693
+ else {
1694
+ // 低风险通用问答:标注为通用建议
1695
+ advisories.evidence_advisory = "通用建议,非项目事实;证据驱动门禁低风险放行";
1696
+ }
1697
+ // 配置优先级警告
663
1698
  if (expansion.config_resolution_reports && expansion.config_resolution_reports.length > 0) {
664
1699
  const configWarnings = expansion.config_resolution_reports
665
1700
  .filter(r => r.conflicts.length > 0)
@@ -726,6 +1761,34 @@ export async function registerTools(server, deps) {
726
1761
  result: { error: "任务不存在" },
727
1762
  };
728
1763
  }
1764
+ // 问题六十二: 设计产物验证必须读取用户项目真实文件,不接受占位合同自证通过。
1765
+ const verifyWorkflowIntent = ctx.route_decision?.workflow_intent ?? ctx.classification?.route_decision?.workflow_intent;
1766
+ const touchesDesignArtifacts = args.changed_files.some((file) => /docs\/architecture\/|docs\/api\/|openapi|db\/(?:migrations|schema)|架构设计|数据库设计|API接口规格/i.test(file));
1767
+ if (verifyWorkflowIntent === "architecture_design" || touchesDesignArtifacts) {
1768
+ const designModule = await lazyDesignArtifactPack();
1769
+ const designPack = ctx.design_artifact_pack ?? designModule.createDesignArtifactPack(args.task_id);
1770
+ const designVerification = designModule.verifyDesignArtifactPack(projectPath, designPack);
1771
+ ctx.design_artifact_pack = {
1772
+ ...designPack,
1773
+ status: designVerification.status,
1774
+ findings: designVerification.findings,
1775
+ baseline_hashes: designVerification.hashes,
1776
+ verified_at: new Date().toISOString(),
1777
+ };
1778
+ await taskContext.save(ctx);
1779
+ if (!designVerification.passed) {
1780
+ return {
1781
+ result: {
1782
+ error: "设计产物包复验未通过,不得继续生成编码或交付结论",
1783
+ status: "blocked",
1784
+ diagnostic_code: "SF-DESIGN-PACK-VERIFY-FAILED",
1785
+ design_artifact_findings: designVerification.findings,
1786
+ checked_files: designVerification.checked_files,
1787
+ recovery: "修复设计产物、补充用户确认并重新执行 sf_verify;不得只提交报告绕过缺口",
1788
+ },
1789
+ };
1790
+ }
1791
+ }
729
1792
  // RouteDecision 合同验证 — 无条件,在状态预检之前
730
1793
  const rdFromCtx = ctx.route_decision ?? ctx.classification?.route_decision ?? null;
731
1794
  const wtFromCtx = ctx.workflow_trace ?? ctx.expansion?.workflow_trace ?? null;
@@ -763,22 +1826,22 @@ export async function registerTools(server, deps) {
763
1826
  : undefined;
764
1827
  const verifyResult = (await lazyVerifier()).generateVerifyCommands(config, args.changed_files, acceptanceItems, ctx?.expansion?.workflow_trace?.route);
765
1828
  verifyResult.task_id = args.task_id;
766
- // Batch2: 创建 VerificationPlan(plan_only,非执行结果)
1829
+ // 创建 VerificationPlan(plan_only,非执行结果)
767
1830
  const vcModule = await lazyVerificationContract();
768
1831
  const allCommands = [
769
1832
  ...(verifyResult.checks?.build ?? []),
770
1833
  ...(verifyResult.checks?.tests ?? []),
771
1834
  ].map((c) => c.command);
772
- const batch2Plan = vcModule.createVerificationPlan(args.task_id, allCommands, acceptanceItems.map((a) => a.description));
773
- // Batch2: sf_verify 仅生成计划,不执行命令 — 始终保存 not_executed
1835
+ const vPlan = vcModule.createVerificationPlan(args.task_id, allCommands, acceptanceItems.map((a) => a.description));
1836
+ // sf_verify 仅生成计划,不执行命令 — 始终保存 not_executed
774
1837
  // 真实执行结果必须通过 recordVerificationExecution 单独录入
775
- const batch2Result = vcModule.createNotExecutedResult(args.task_id, batch2Plan.plan_id, "sf_verify 生成命令,等待执行");
776
- // 存储 Batch2 验证契约到任务上下文
777
- const ctxForBatch2 = await taskContext.load(args.task_id);
778
- if (ctxForBatch2) {
779
- ctxForBatch2.batch2_verification_plan = batch2Plan;
780
- ctxForBatch2.batch2_verification_result = batch2Result;
781
- await taskContext.save(ctxForBatch2);
1838
+ const vResult = vcModule.createNotExecutedResult(args.task_id, vPlan.plan_id, "sf_verify 生成命令,等待执行");
1839
+ // 存储验证契约到任务上下文
1840
+ const ctxForV = await taskContext.load(args.task_id);
1841
+ if (ctxForV) {
1842
+ ctxForV.verification_plan = vPlan;
1843
+ ctxForV.verification_result = vResult;
1844
+ await taskContext.save(ctxForV);
782
1845
  }
783
1846
  // 产物生命周期检查: draft → verified 需要 ArtifactVerificationResult.passed
784
1847
  let artifactVerificationResult;
@@ -810,7 +1873,7 @@ export async function registerTools(server, deps) {
810
1873
  artifactVerificationResult = verifyArtifact(artifact.kind, artifact);
811
1874
  }
812
1875
  // 记录变更文件
813
- // Batch2: 写入护栏 — 检查变更文件是否在允许范围
1876
+ // 写入护栏 — 检查变更文件是否在允许范围
814
1877
  if (args.changed_files.length > 0) {
815
1878
  const guardModule = await lazyEnforcementGuard();
816
1879
  const scopePaths = ctx.expansion?.scope?.allowed_paths ?? [];
@@ -819,7 +1882,7 @@ export async function registerTools(server, deps) {
819
1882
  if (writeFindings.some((f) => f.blocked)) {
820
1883
  return {
821
1884
  result: {
822
- error: `Batch2 写入护栏阻断: ${writeFindings[0].reason_zh}`,
1885
+ error: `写入护栏阻断: ${writeFindings[0].reason_zh}`,
823
1886
  blocked_file: cf,
824
1887
  guard_id: writeFindings[0].guard_id,
825
1888
  },
@@ -875,9 +1938,113 @@ export async function registerTools(server, deps) {
875
1938
  const verifyPayload = Object.keys(verifyExtras).length > 0
876
1939
  ? { ...verifyResult, ...verifyExtras }
877
1940
  : { ...verifyResult };
878
- // Batch2: 附加验证契约引用到返回结果
879
- verifyPayload.batch2_verification_plan = batch2Plan;
880
- verifyPayload.batch2_verification_result = batch2Result;
1941
+ // 附加验证契约引用到返回结果
1942
+ verifyPayload.verification_plan = vPlan;
1943
+ verifyPayload.verification_result = vResult;
1944
+ // 问题六十:验证结论必须经过 FactClaimVerifier,不得把计划当结果
1945
+ {
1946
+ const { createEvidenceGroundingSystem, assessTaskRisk } = await import("../../engine/evidence_grounding_contract.js");
1947
+ const _vRoute = ctx.route_decision?.route ?? ctx.classification?.route_decision?.route;
1948
+ const _vRisk = assessTaskRisk(ctx.classification?.task_type, _vRoute, ctx.intent);
1949
+ if (_vRisk !== "low") {
1950
+ const _veg = createEvidenceGroundingSystem();
1951
+ // 只有真实执行结果才能作为 validation_result 证据
1952
+ const _hasRealPassed = ctx.verification_result && ctx.verification_result.status === "passed";
1953
+ if (_hasRealPassed) {
1954
+ _veg.registry.register({
1955
+ source_type: "validation_result",
1956
+ authority: "authoritative",
1957
+ freshness: "current",
1958
+ permission: "allowed",
1959
+ scope: "verification",
1960
+ description: `验证状态: ${ctx.verification_result.status}`,
1961
+ source_ref: `verification:${args.task_id}`,
1962
+ });
1963
+ }
1964
+ // 验证计划注册为 task_context,不冒充 validation_result
1965
+ _veg.registry.register({
1966
+ source_type: "task_context",
1967
+ authority: "supporting",
1968
+ freshness: "current",
1969
+ permission: "allowed",
1970
+ scope: "verification_plan",
1971
+ description: `验证计划: ${vPlan ? "已生成" : "未生成"}`,
1972
+ source_ref: `verification-plan:${args.task_id}`,
1973
+ });
1974
+ if (args.changed_files.length > 0) {
1975
+ _veg.registry.register({
1976
+ source_type: "project_file",
1977
+ authority: "authoritative",
1978
+ freshness: "current",
1979
+ permission: "allowed",
1980
+ scope: "changed_files",
1981
+ description: `变更文件: ${args.changed_files.join(", ")}`,
1982
+ source_ref: `files:${args.changed_files.join(",")}`,
1983
+ });
1984
+ }
1985
+ const _vClaims = [{
1986
+ id: "claim-verify-1",
1987
+ category: "validation_result",
1988
+ claim_text: "验证结果基于真实命令执行",
1989
+ evidence_ids: _veg.registry.query({ source_type: "validation_result" }).map((e) => e.id),
1990
+ is_uncertain: false,
1991
+ risk_level: _vRisk,
1992
+ }];
1993
+ const _vVerResult = _veg.verifier.verify(_vClaims, _vRisk);
1994
+ const _vMatrix = _veg.builder.buildContext(_vClaims, {
1995
+ target_claims: _vClaims.map((c) => c.claim_text),
1996
+ source_types: [], keywords: [], max_results: 10,
1997
+ });
1998
+ _vMatrix.task_id = args.task_id;
1999
+ const _vGate = _veg.gate.evaluate(_vMatrix, _vRisk);
2000
+ // 写回 TaskContext
2001
+ await taskContext.setEvidenceGroundingResult(args.task_id, {
2002
+ evidence_matrix: _vMatrix,
2003
+ evidence_gate_result: _vGate,
2004
+ unsupported_claims: _vGate.unsupported_claims,
2005
+ conflict_resolutions: _vMatrix.conflicts,
2006
+ });
2007
+ if (_vVerResult.unsupported.length > 0) {
2008
+ // 高风险:只有 plan 无 result → 写入 payload(不用 verifyExtras)
2009
+ verifyPayload._evidence_status = "not_verified";
2010
+ verifyPayload._evidence_reason = "验证结论需真实命令执行结果支撑,验证计划不能当作验证结果。请通过 sf_record_verification_execution 录入真实验证结果。";
2011
+ if (_vRisk === "high" || _vRisk === "critical") {
2012
+ verifyPayload._evidence_blocked = true;
2013
+ }
2014
+ else {
2015
+ verifyPayload._evidence_advisory = "验证结论需真实命令执行结果支撑,验证计划不能当作验证结果";
2016
+ }
2017
+ }
2018
+ }
2019
+ }
2020
+ // 验证后核心体验评估
2021
+ try {
2022
+ const hasVerificationEvidence = (verifyResult.checks?.build?.length ?? 0) > 0 || (verifyResult.checks?.tests?.length ?? 0) > 0;
2023
+ const cepEvalResult = await assessCepAfterVerification({
2024
+ task_id: args.task_id,
2025
+ has_verification_evidence: hasVerificationEvidence,
2026
+ });
2027
+ // 将完整 CEP 结果写入 TaskContext
2028
+ const cepModule = await import("../../engine/core_experience_principle.js");
2029
+ const fullCepEval = cepModule.evaluateCoreExperiencePrinciple({
2030
+ task_id: args.task_id, workflow_id: "sf_verify",
2031
+ has_mainline_hooks: true, has_owner_contracts: true, natural_language_entry: true,
2032
+ requires_internal_contract_knowledge: false, user_path_steps: 3,
2033
+ has_failures: false, hard_fail_downgraded: false, forced_heavy_process: false,
2034
+ has_sufficient_evidence: hasVerificationEvidence,
2035
+ output_too_long_no_summary: false, report_only_no_repair: false,
2036
+ failed_but_marked_done: false, auto_repair_overreach: false,
2037
+ repair_reverified: false, outputs_raw_noise: false,
2038
+ });
2039
+ const ctxForCep = await taskContext.load(args.task_id);
2040
+ if (ctxForCep) {
2041
+ ctxForCep.core_experience_evaluation = fullCepEval;
2042
+ await taskContext.save(ctxForCep);
2043
+ }
2044
+ }
2045
+ catch (cepErr) {
2046
+ internalWarn("CEP评估", "评估异常 (task=" + args.task_id + "):", cepErr?.message ?? cepErr);
2047
+ }
881
2048
  return {
882
2049
  result: verifyPayload,
883
2050
  };
@@ -889,24 +2056,25 @@ export async function registerTools(server, deps) {
889
2056
  return { result: { error: "任务不存在" } };
890
2057
  }
891
2058
  // 必须有 VerificationPlan
892
- if (!ctx.batch2_verification_plan) {
2059
+ const currentPlan = ctx.verification_plan ?? ctx.batch2_verification_plan;
2060
+ if (!currentPlan) {
893
2061
  return { result: { error: "任务无 VerificationPlan,先执行 sf_verify 生成计划" } };
894
2062
  }
895
2063
  // plan_id 必须与 TaskContext 中当前 plan 一致
896
- if (args.plan_id !== ctx.batch2_verification_plan.plan_id) {
2064
+ if (args.plan_id !== currentPlan.plan_id) {
897
2065
  return {
898
2066
  result: {
899
- error: `plan_id 不匹配: 请求 "${args.plan_id}",当前任务计划 "${ctx.batch2_verification_plan.plan_id}" [SF-VERIFY-5002]`,
2067
+ error: `plan_id 不匹配: 请求 "${args.plan_id}",当前任务计划 "${currentPlan.plan_id}" [SF-VERIFY-5002]`,
900
2068
  diagnostic_code: "SF-VERIFY-5002",
901
2069
  },
902
2070
  };
903
2071
  }
904
2072
  const vcModule = await lazyVerificationContract();
905
- const result = vcModule.recordVerificationExecution(args.task_id, args.plan_id, args.execution_records, ctx.batch2_verification_plan);
2073
+ const result = vcModule.recordVerificationExecution(args.task_id, args.plan_id, args.execution_records, currentPlan);
906
2074
  // 持久化到 TaskContext
907
2075
  const ctxForSave = await taskContext.load(args.task_id);
908
2076
  if (ctxForSave) {
909
- ctxForSave.batch2_verification_result = result;
2077
+ ctxForSave.verification_result = result;
910
2078
  await taskContext.save(ctxForSave);
911
2079
  }
912
2080
  return { result };
@@ -935,7 +2103,7 @@ export async function registerTools(server, deps) {
935
2103
  : "unknown failure",
936
2104
  timestamp: new Date().toISOString(),
937
2105
  });
938
- // Batch2: 创建 FailureReport(脱敏,非 raw error_output)
2106
+ // 创建 FailureReport(脱敏,非 raw error_output)
939
2107
  const frModule = await lazyFailureReport();
940
2108
  const failureClass = args.failure_type;
941
2109
  const errorOutput = args.verify_output
@@ -943,21 +2111,21 @@ export async function registerTools(server, deps) {
943
2111
  : "unknown failure";
944
2112
  const retryCount = (ctx.execution?.attempt_count ?? 0) + 1;
945
2113
  const policy = frModule.getRecoveryPolicy(failureClass);
946
- const batch2FailureReport = frModule.createFailureReport(args.task_id, failureClass, errorOutput, retryCount, policy?.max_retries ?? 0);
2114
+ const failureReport = frModule.createFailureReport(args.task_id, failureClass, errorOutput, retryCount, policy?.max_retries ?? 0);
947
2115
  // 存储 FailureReport 到任务上下文
948
2116
  const ctxForFailure = await taskContext.load(args.task_id);
949
2117
  if (ctxForFailure) {
950
- ctxForFailure.batch2_failure_report = batch2FailureReport;
2118
+ ctxForFailure.failure_report = failureReport;
951
2119
  await taskContext.save(ctxForFailure);
952
2120
  }
953
- // Batch2: verifier 不可用时创建 DegradationEvent
2121
+ // verifier 不可用时创建 DegradationEvent
954
2122
  if (!args.verify_output) {
955
2123
  const degModule = await lazyDegradation();
956
2124
  const degradationEvent = degModule.createDegradationEvent(args.task_id, "verifier", "full", "验证器输出不可用,无法判断 build/test 结果", ["verification_execution"]);
957
2125
  if (degradationEvent) {
958
2126
  const ctxForDeg = await taskContext.load(args.task_id);
959
2127
  if (ctxForDeg) {
960
- ctxForDeg.batch2_degradation_event = degradationEvent;
2128
+ ctxForDeg.degradation_event = degradationEvent;
961
2129
  await taskContext.save(ctxForDeg);
962
2130
  }
963
2131
  }
@@ -1062,7 +2230,7 @@ export async function registerTools(server, deps) {
1062
2230
  await taskContext.autoFailStale();
1063
2231
  }
1064
2232
  catch (e) {
1065
- console.error("[soloForge] autoFailStale 出错:", e);
2233
+ internalWarn("autoFailStale", "出错:", e);
1066
2234
  }
1067
2235
  switch (action) {
1068
2236
  case "current": {
@@ -1360,7 +2528,18 @@ export async function registerTools(server, deps) {
1360
2528
  }
1361
2529
  }
1362
2530
  }
1363
- // Batch2: 交付 lease 互斥检查
2531
+ // 问题六十二: 依赖设计产物的任务只有 implementation_ready 后才可交付。
2532
+ if (ctx.design_artifact_pack && ctx.design_artifact_pack.status !== "implementation_ready") {
2533
+ return {
2534
+ result: {
2535
+ error: `设计产物包状态为 ${ctx.design_artifact_pack.status},未达到 implementation_ready,不得交付`,
2536
+ diagnostic_code: "SF-DESIGN-PACK-NOT-READY",
2537
+ findings: ctx.design_artifact_pack.findings,
2538
+ recovery: "请完成设计产物真实复验并修复所有阻断项后重新交付",
2539
+ },
2540
+ };
2541
+ }
2542
+ // 交付 lease 互斥检查
1364
2543
  const leaseModule = await lazyWorkspaceLease();
1365
2544
  const deliverLease = leaseModule.acquireLease(args.task_id, "delivery", [projectPath]);
1366
2545
  if (deliverLease.lease?.status === "conflicted" || deliverLease.conflicts.length > 0) {
@@ -1371,18 +2550,39 @@ export async function registerTools(server, deps) {
1371
2550
  },
1372
2551
  };
1373
2552
  }
1374
- // Batch2: 交付就绪评估 — delivery_allowed=false 必须阻断交付
2553
+ // 交付就绪评估 — delivery_allowed=false 必须阻断交付
1375
2554
  const drModule = await lazyDeliveryReadiness();
1376
2555
  const guardModule = await lazyEnforcementGuard();
1377
- const guardFindings = guardModule.evaluateDeliveryReadinessGuard(ctx.batch2_verification_result, ctx.batch2_verification_plan);
1378
- const readinessReport = drModule.evaluateDeliveryReadiness(args.task_id, ctx.batch2_verification_result, guardFindings, true, // scope_check — 已在 sf_verify 写入护栏中检查
2556
+ const currentVResult = ctx.verification_result ?? ctx.batch2_verification_result;
2557
+ const currentVPlan = ctx.verification_plan ?? ctx.batch2_verification_plan;
2558
+ const guardFindings = guardModule.evaluateDeliveryReadinessGuard(currentVResult, currentVPlan);
2559
+ // 问题五十一: 编码就绪门 — 交付前检查 coding readiness
2560
+ const codingGate = await checkCodingReadinessGate({ ctx });
2561
+ if (!codingGate.allowed) {
2562
+ if (deliverLease.lease) {
2563
+ leaseModule.releaseLease(deliverLease.lease.lease_id);
2564
+ }
2565
+ return {
2566
+ result: {
2567
+ error: `编码就绪检查未通过: ${codingGate.reason_zh}`,
2568
+ missing_preconditions: codingGate.missing_preconditions,
2569
+ status: "blocked",
2570
+ recovery: "请先满足编码就绪条件(测试计划、验收标准、主链路入口)",
2571
+ },
2572
+ };
2573
+ }
2574
+ const metricsData = await (await lazyObservability()).collectDeliveryMetricSamples(taskContext.getStateDir());
2575
+ // acceptanceConfig: 从项目配置推断 project_run_mode
2576
+ const projectHasFrontend = config.tech_stack.frontend.lang && config.tech_stack.frontend.lang !== "none";
2577
+ const readinessReport = drModule.evaluateDeliveryReadiness(args.task_id, currentVResult, guardFindings, true, // scope_check — 已在 sf_verify 写入护栏中检查
1379
2578
  deliverLease.conflicts.length === 0, // lease_check — 无冲突即通过
1380
2579
  true, // privacy_check — 已在任务创建时脱敏
1381
- true);
2580
+ true, // artifact_acceptance — 上面已检查产物状态
2581
+ metricsData, projectHasFrontend ? { final_access: { frontend_urls: [], backend_urls: [], docs_or_swagger_urls: [], start_commands: [], stop_commands: [], running_status: "not_started", manual_review_steps_zh: [], known_limits_zh: [] }, project_run_mode: "local_dev_server" } : undefined);
1382
2582
  // 保存就绪报告到任务上下文
1383
2583
  const ctxForReadiness = await taskContext.load(args.task_id);
1384
2584
  if (ctxForReadiness) {
1385
- ctxForReadiness.batch2_delivery_readiness = readinessReport;
2585
+ ctxForReadiness.delivery_readiness = readinessReport;
1386
2586
  await taskContext.save(ctxForReadiness);
1387
2587
  }
1388
2588
  if (!readinessReport.delivery_allowed) {
@@ -1392,11 +2592,137 @@ export async function registerTools(server, deps) {
1392
2592
  }
1393
2593
  return {
1394
2594
  result: {
1395
- error: `Batch2 交付就绪检查未通过: ${readinessReport.blocking_findings.map((f) => f.message_zh).join("; ")}`,
2595
+ error: `交付就绪检查未通过: ${readinessReport.blocking_findings.map((f) => f.message_zh).join("; ")}`,
1396
2596
  delivery_readiness: readinessReport,
1397
2597
  },
1398
2598
  };
1399
2599
  }
2600
+ // 问题五十二: 本地验收门 — 前端/全栈交付前必须有本地访问证据(仅在有施工指令契约时强制)
2601
+ const hasInstructionContract = !!ctx?.instruction_contract;
2602
+ if (hasInstructionContract) {
2603
+ const localAcceptanceGate = await checkLocalAcceptanceGate({
2604
+ ctx,
2605
+ hasFrontend: !!projectHasFrontend,
2606
+ hasBackend: !!config.tech_stack,
2607
+ hasDockerCompose: false,
2608
+ hasDockerfile: false,
2609
+ });
2610
+ if (!localAcceptanceGate.allowed) {
2611
+ if (deliverLease.lease) {
2612
+ leaseModule.releaseLease(deliverLease.lease.lease_id);
2613
+ }
2614
+ return {
2615
+ result: {
2616
+ error: `本地验收检查未通过: ${localAcceptanceGate.reason_zh}`,
2617
+ required_but_missing: localAcceptanceGate.required_but_missing,
2618
+ status: "blocked",
2619
+ recovery: "请提供本地运行证据或说明 not_applicable 原因(如纯后端 API 项目)",
2620
+ },
2621
+ };
2622
+ }
2623
+ }
2624
+ // 问题六十:交付结论必须经过 UnsupportedClaimGate
2625
+ {
2626
+ const { createEvidenceGroundingSystem, assessTaskRisk } = await import("../../engine/evidence_grounding_contract.js");
2627
+ const _dRoute = ctx.route_decision?.route ?? ctx.classification?.route_decision?.route;
2628
+ const _dRisk = assessTaskRisk(ctx.classification?.task_type, _dRoute, ctx.intent);
2629
+ if (_dRisk !== "low") {
2630
+ const _deg = createEvidenceGroundingSystem();
2631
+ // 注册验证结果和交付上下文
2632
+ if (currentVResult) {
2633
+ _deg.registry.register({
2634
+ source_type: "validation_result",
2635
+ authority: "authoritative",
2636
+ freshness: "current",
2637
+ permission: "allowed",
2638
+ scope: "verification",
2639
+ description: `验证状态: ${currentVResult.status}`,
2640
+ source_ref: `verification:${args.task_id}`,
2641
+ });
2642
+ }
2643
+ _deg.registry.register({
2644
+ source_type: "task_context",
2645
+ authority: "authoritative",
2646
+ freshness: "current",
2647
+ permission: "allowed",
2648
+ scope: "delivery",
2649
+ description: "交付上下文",
2650
+ source_ref: `task:${args.task_id}`,
2651
+ });
2652
+ const _dClaims = [
2653
+ {
2654
+ id: "claim-deliver-1",
2655
+ category: "release_status",
2656
+ claim_text: "交付基于真实验证结果",
2657
+ evidence_ids: _deg.registry.query({ source_type: "validation_result" }).map((e) => e.id),
2658
+ is_uncertain: false,
2659
+ risk_level: _dRisk,
2660
+ },
2661
+ ];
2662
+ const _dMatrix = _deg.builder.buildContext(_dClaims, { target_claims: ["交付验证"], source_types: ["validation_result", "task_context"], keywords: ["验证", "交付"], max_results: 10 });
2663
+ _dMatrix.task_id = args.task_id;
2664
+ const _dGateResult = _deg.gate.evaluate(_dMatrix, _dRisk);
2665
+ // 写回 TaskContext(blocked 也保存)
2666
+ await taskContext.setEvidenceGroundingResult(args.task_id, {
2667
+ evidence_matrix: _dMatrix,
2668
+ evidence_gate_result: _dGateResult,
2669
+ unsupported_claims: _dGateResult.unsupported_claims,
2670
+ conflict_resolutions: _dMatrix.conflicts,
2671
+ });
2672
+ if (!_dGateResult.allowed) {
2673
+ if (deliverLease.lease) {
2674
+ leaseModule.releaseLease(deliverLease.lease.lease_id);
2675
+ }
2676
+ return {
2677
+ result: {
2678
+ error: `证据驱动门禁未通过: ${_dGateResult.reason_zh}`,
2679
+ diagnostic_code: _dGateResult.diagnostic_code,
2680
+ unsupported_claims: _dGateResult.unsupported_claims,
2681
+ },
2682
+ };
2683
+ }
2684
+ }
2685
+ }
2686
+ // 交付前检查 false completion(通过提取的主链路函数)
2687
+ const cepNfcResult = await assessCepBeforeDelivery({
2688
+ task_id: args.task_id,
2689
+ verification_passed: currentVResult?.status === "passed",
2690
+ build_passed: (currentVResult?.passed_commands ?? 0) > 0,
2691
+ browser_acceptance_passed: ctx.artifact_output?.status === "verified" || ctx.artifact_output === undefined,
2692
+ guard_passed: guardFindings.length === 0 || guardFindings.every((f) => f.severity !== "hard_fail"),
2693
+ evidence_sufficient: (currentVResult?.evidence_ids?.length ?? 0) > 0,
2694
+ current_status: ctx.status === "done" ? "completed" : ctx.status,
2695
+ });
2696
+ if (cepNfcResult.decision === "blocked" || cepNfcResult.decision === "repair_reverify") {
2697
+ if (deliverLease.lease) {
2698
+ leaseModule.releaseLease(deliverLease.lease.lease_id);
2699
+ }
2700
+ const ctxForCep = await taskContext.load(args.task_id);
2701
+ if (ctxForCep) {
2702
+ ctxForCep.core_experience_evaluation = {
2703
+ task_id: args.task_id,
2704
+ workflow_id: "sf_deliver",
2705
+ evaluated_principles: ["auto_repair_no_fake_completion"],
2706
+ violations: [{
2707
+ principle: "auto_repair_no_fake_completion",
2708
+ severity: "blocking",
2709
+ reason_zh: cepNfcResult.reason_zh,
2710
+ evidence_refs: [],
2711
+ required_action: cepNfcResult.decision === "blocked" ? "block_delivery" : "repair_reverify",
2712
+ }],
2713
+ user_facing_summary_zh: `CEP 检查未通过: ${cepNfcResult.reason_zh}`,
2714
+ internal_trace_refs: [],
2715
+ passed: false,
2716
+ };
2717
+ await taskContext.save(ctxForCep);
2718
+ }
2719
+ return {
2720
+ result: {
2721
+ error: `CEP false completion 检查未通过: ${cepNfcResult.reason_zh}`,
2722
+ cep_decision: cepNfcResult.decision,
2723
+ },
2724
+ };
2725
+ }
1400
2726
  const result = await (await lazyDelivery()).deliver({
1401
2727
  taskContext: ctx,
1402
2728
  config,
@@ -1407,7 +2733,7 @@ export async function registerTools(server, deps) {
1407
2733
  skipPr: args.skip_pr,
1408
2734
  });
1409
2735
  await taskContext.setDelivery(args.task_id, result);
1410
- // Batch2: 交付完成后释放 lease
2736
+ // 交付完成后释放 lease
1411
2737
  if (deliverLease.lease) {
1412
2738
  leaseModule.releaseLease(deliverLease.lease.lease_id);
1413
2739
  }
@@ -1781,7 +3107,7 @@ export async function registerTools(server, deps) {
1781
3107
  configEntries = resolved.entries;
1782
3108
  }
1783
3109
  catch (e) {
1784
- console.error(`[soloForge] 配置报告解析失败: ${e instanceof Error ? e.message : String(e)}`);
3110
+ internalWarn("配置报告", "解析失败:", e instanceof Error ? e.message : String(e));
1785
3111
  }
1786
3112
  // 同时包含近期任务上下文中的报告
1787
3113
  for (const t of recentTasks) {