soloforge 1.2.20 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +140 -3
- package/dist/adapters/claude_code/claude_md.d.ts +1 -2
- package/dist/adapters/claude_code/claude_md.d.ts.map +1 -1
- package/dist/adapters/claude_code/claude_md.js +47 -4
- package/dist/adapters/claude_code/claude_md.js.map +1 -1
- package/dist/adapters/claude_code/hooks.d.ts.map +1 -1
- package/dist/adapters/claude_code/hooks.js +2 -1
- package/dist/adapters/claude_code/hooks.js.map +1 -1
- package/dist/adapters/claude_code/server.js +4 -3
- package/dist/adapters/claude_code/server.js.map +1 -1
- package/dist/adapters/claude_code/tools.d.ts +255 -1
- package/dist/adapters/claude_code/tools.d.ts.map +1 -1
- package/dist/adapters/claude_code/tools.js +855 -39
- package/dist/adapters/claude_code/tools.js.map +1 -1
- package/dist/adapters/codex/codex_config.d.ts.map +1 -1
- package/dist/adapters/codex/codex_config.js +3 -2
- package/dist/adapters/codex/codex_config.js.map +1 -1
- package/dist/adapters/codex/codex_rules.d.ts.map +1 -1
- package/dist/adapters/codex/codex_rules.js +2 -1
- package/dist/adapters/codex/codex_rules.js.map +1 -1
- package/dist/adapters/shared/workflow_template.d.ts.map +1 -1
- package/dist/adapters/shared/workflow_template.js +2 -1
- package/dist/adapters/shared/workflow_template.js.map +1 -1
- package/dist/adapters/trae/trae_config.d.ts +0 -5
- package/dist/adapters/trae/trae_config.d.ts.map +1 -1
- package/dist/adapters/trae/trae_config.js +2 -1
- package/dist/adapters/trae/trae_config.js.map +1 -1
- package/dist/adapters/trae/trae_rules.d.ts.map +1 -1
- package/dist/adapters/trae/trae_rules.js +2 -1
- package/dist/adapters/trae/trae_rules.js.map +1 -1
- package/dist/bin/config_commands.d.ts.map +1 -1
- package/dist/bin/config_commands.js +34 -33
- package/dist/bin/config_commands.js.map +1 -1
- package/dist/bin/soloforge.d.ts.map +1 -1
- package/dist/bin/soloforge.js +1110 -157
- package/dist/bin/soloforge.js.map +1 -1
- package/dist/engine/adapter_prompt_contract.d.ts +60 -0
- package/dist/engine/adapter_prompt_contract.d.ts.map +1 -0
- package/dist/engine/adapter_prompt_contract.js +163 -0
- package/dist/engine/adapter_prompt_contract.js.map +1 -0
- package/dist/engine/architecture_design_contract.d.ts +49 -0
- package/dist/engine/architecture_design_contract.d.ts.map +1 -0
- package/dist/engine/architecture_design_contract.js +169 -0
- package/dist/engine/architecture_design_contract.js.map +1 -0
- package/dist/engine/artifact_contract_registry.d.ts.map +1 -1
- package/dist/engine/artifact_contract_registry.js +7 -14
- package/dist/engine/artifact_contract_registry.js.map +1 -1
- package/dist/engine/{batch1_manifest.d.ts → asset_manifest.d.ts} +8 -8
- package/dist/engine/asset_manifest.d.ts.map +1 -0
- package/dist/engine/{batch1_manifest.js → asset_manifest.js} +52 -9
- package/dist/engine/asset_manifest.js.map +1 -0
- package/dist/engine/audit_pool.d.ts.map +1 -1
- package/dist/engine/audit_pool.js +5 -4
- package/dist/engine/audit_pool.js.map +1 -1
- package/dist/engine/audit_sampler.d.ts.map +1 -1
- package/dist/engine/audit_sampler.js +2 -1
- package/dist/engine/audit_sampler.js.map +1 -1
- package/dist/engine/audit_verifier.d.ts.map +1 -1
- package/dist/engine/audit_verifier.js +5 -4
- package/dist/engine/audit_verifier.js.map +1 -1
- package/dist/engine/brainstorm_contract.d.ts +46 -0
- package/dist/engine/brainstorm_contract.d.ts.map +1 -0
- package/dist/engine/brainstorm_contract.js +136 -0
- package/dist/engine/brainstorm_contract.js.map +1 -0
- package/dist/engine/capability_action_advisor.d.ts.map +1 -1
- package/dist/engine/capability_action_advisor.js +8 -7
- package/dist/engine/capability_action_advisor.js.map +1 -1
- package/dist/engine/capability_registry.d.ts.map +1 -1
- package/dist/engine/capability_registry.js +0 -7
- package/dist/engine/capability_registry.js.map +1 -1
- package/dist/engine/capability_state_store.d.ts.map +1 -1
- package/dist/engine/capability_state_store.js +7 -6
- package/dist/engine/capability_state_store.js.map +1 -1
- package/dist/engine/change_coordinator.d.ts.map +1 -1
- package/dist/engine/change_coordinator.js +4 -3
- package/dist/engine/change_coordinator.js.map +1 -1
- package/dist/engine/chinese_semantic_priority.d.ts +62 -0
- package/dist/engine/chinese_semantic_priority.d.ts.map +1 -0
- package/dist/engine/chinese_semantic_priority.js +153 -0
- package/dist/engine/chinese_semantic_priority.js.map +1 -0
- package/dist/engine/coding_readiness_gate.d.ts +46 -0
- package/dist/engine/coding_readiness_gate.d.ts.map +1 -0
- package/dist/engine/coding_readiness_gate.js +175 -0
- package/dist/engine/coding_readiness_gate.js.map +1 -0
- package/dist/engine/cognitive_anchor.d.ts.map +1 -1
- package/dist/engine/cognitive_anchor.js +7 -6
- package/dist/engine/cognitive_anchor.js.map +1 -1
- package/dist/engine/command_execution_contract.d.ts.map +1 -1
- package/dist/engine/command_execution_contract.js +13 -12
- package/dist/engine/command_execution_contract.js.map +1 -1
- package/dist/engine/confidence_scorer.d.ts.map +1 -1
- package/dist/engine/confidence_scorer.js +2 -1
- package/dist/engine/confidence_scorer.js.map +1 -1
- package/dist/engine/config_precedence_contract.d.ts.map +1 -1
- package/dist/engine/config_precedence_contract.js +9 -8
- package/dist/engine/config_precedence_contract.js.map +1 -1
- package/dist/engine/conflict_gate.d.ts.map +1 -1
- package/dist/engine/conflict_gate.js +4 -3
- package/dist/engine/conflict_gate.js.map +1 -1
- package/dist/engine/consumable_asset_registry.d.ts +4 -0
- package/dist/engine/consumable_asset_registry.d.ts.map +1 -1
- package/dist/engine/consumable_asset_registry.js +307 -0
- package/dist/engine/consumable_asset_registry.js.map +1 -1
- package/dist/engine/consumption_trace_store.d.ts +50 -0
- package/dist/engine/consumption_trace_store.d.ts.map +1 -0
- package/dist/engine/consumption_trace_store.js +84 -0
- package/dist/engine/consumption_trace_store.js.map +1 -0
- package/dist/engine/contract_guard.d.ts.map +1 -1
- package/dist/engine/contract_guard.js +7 -6
- package/dist/engine/contract_guard.js.map +1 -1
- package/dist/engine/contract_registry.d.ts +1 -1
- package/dist/engine/contract_registry.d.ts.map +1 -1
- package/dist/engine/contract_registry.js +511 -38
- package/dist/engine/contract_registry.js.map +1 -1
- package/dist/engine/convention_detector.d.ts.map +1 -1
- package/dist/engine/convention_detector.js +4 -3
- package/dist/engine/convention_detector.js.map +1 -1
- package/dist/engine/core_engineering_principles.d.ts.map +1 -1
- package/dist/engine/core_engineering_principles.js +4 -14
- package/dist/engine/core_engineering_principles.js.map +1 -1
- package/dist/engine/core_experience_principle.d.ts +194 -0
- package/dist/engine/core_experience_principle.d.ts.map +1 -0
- package/dist/engine/core_experience_principle.js +349 -0
- package/dist/engine/core_experience_principle.js.map +1 -0
- package/dist/engine/debt_reporter.d.ts.map +1 -1
- package/dist/engine/debt_reporter.js +3 -2
- package/dist/engine/debt_reporter.js.map +1 -1
- package/dist/engine/debt_tracker.d.ts.map +1 -1
- package/dist/engine/debt_tracker.js +8 -7
- package/dist/engine/debt_tracker.js.map +1 -1
- package/dist/engine/debug_log.d.ts +4 -1
- package/dist/engine/debug_log.d.ts.map +1 -1
- package/dist/engine/debug_log.js +4 -6
- package/dist/engine/debug_log.js.map +1 -1
- package/dist/engine/debugger.d.ts.map +1 -1
- package/dist/engine/debugger.js +5 -4
- package/dist/engine/debugger.js.map +1 -1
- package/dist/engine/decision_contract.d.ts.map +1 -1
- package/dist/engine/decision_contract.js +4 -3
- package/dist/engine/decision_contract.js.map +1 -1
- package/dist/engine/delivery.d.ts.map +1 -1
- package/dist/engine/delivery.js +16 -15
- package/dist/engine/delivery.js.map +1 -1
- package/dist/engine/delivery_readiness.d.ts +5 -1
- package/dist/engine/delivery_readiness.d.ts.map +1 -1
- package/dist/engine/delivery_readiness.js +24 -2
- package/dist/engine/delivery_readiness.js.map +1 -1
- package/dist/engine/dependency_scanner.d.ts.map +1 -1
- package/dist/engine/dependency_scanner.js +6 -5
- package/dist/engine/dependency_scanner.js.map +1 -1
- package/dist/engine/detail_discipline.d.ts +40 -0
- package/dist/engine/detail_discipline.d.ts.map +1 -0
- package/dist/engine/detail_discipline.js +107 -0
- package/dist/engine/detail_discipline.js.map +1 -0
- package/dist/engine/developer_sovereignty.d.ts.map +1 -1
- package/dist/engine/developer_sovereignty.js +6 -5
- package/dist/engine/developer_sovereignty.js.map +1 -1
- package/dist/engine/diff_ownership.d.ts.map +1 -1
- package/dist/engine/diff_ownership.js +9 -8
- package/dist/engine/diff_ownership.js.map +1 -1
- package/dist/engine/diff_ownership_store.d.ts.map +1 -1
- package/dist/engine/diff_ownership_store.js +8 -7
- package/dist/engine/diff_ownership_store.js.map +1 -1
- package/dist/engine/documentation_governance.d.ts +55 -0
- package/dist/engine/documentation_governance.d.ts.map +1 -0
- package/dist/engine/documentation_governance.js +249 -0
- package/dist/engine/documentation_governance.js.map +1 -0
- package/dist/engine/dual_layer_mechanism_registry.d.ts +6 -4
- package/dist/engine/dual_layer_mechanism_registry.d.ts.map +1 -1
- package/dist/engine/dual_layer_mechanism_registry.js +731 -11
- package/dist/engine/dual_layer_mechanism_registry.js.map +1 -1
- package/dist/engine/enforcement_guard.d.ts.map +1 -1
- package/dist/engine/enforcement_guard.js +14 -0
- package/dist/engine/enforcement_guard.js.map +1 -1
- package/dist/engine/escape_report.d.ts.map +1 -1
- package/dist/engine/escape_report.js +4 -3
- package/dist/engine/escape_report.js.map +1 -1
- package/dist/engine/evolution_regression_gate.d.ts +42 -0
- package/dist/engine/evolution_regression_gate.d.ts.map +1 -0
- package/dist/engine/evolution_regression_gate.js +159 -0
- package/dist/engine/evolution_regression_gate.js.map +1 -0
- package/dist/engine/existing_system_analysis.d.ts +37 -0
- package/dist/engine/existing_system_analysis.d.ts.map +1 -0
- package/dist/engine/existing_system_analysis.js +151 -0
- package/dist/engine/existing_system_analysis.js.map +1 -0
- package/dist/engine/exploration.d.ts.map +1 -1
- package/dist/engine/exploration.js +7 -6
- package/dist/engine/exploration.js.map +1 -1
- package/dist/engine/extension_contract.d.ts +50 -0
- package/dist/engine/extension_contract.d.ts.map +1 -0
- package/dist/engine/extension_contract.js +158 -0
- package/dist/engine/extension_contract.js.map +1 -0
- package/dist/engine/extension_platform_contracts.d.ts +712 -0
- package/dist/engine/extension_platform_contracts.d.ts.map +1 -0
- package/dist/engine/extension_platform_contracts.js +42 -0
- package/dist/engine/extension_platform_contracts.js.map +1 -0
- package/dist/engine/extension_scenario_registry.d.ts +30 -0
- package/dist/engine/extension_scenario_registry.d.ts.map +1 -0
- package/dist/engine/extension_scenario_registry.js +976 -0
- package/dist/engine/extension_scenario_registry.js.map +1 -0
- package/dist/engine/failure_classifier.d.ts.map +1 -1
- package/dist/engine/failure_classifier.js +9 -8
- package/dist/engine/failure_classifier.js.map +1 -1
- package/dist/engine/feasibility_checker.d.ts.map +1 -1
- package/dist/engine/feasibility_checker.js +5 -4
- package/dist/engine/feasibility_checker.js.map +1 -1
- package/dist/engine/first_principles.d.ts +35 -0
- package/dist/engine/first_principles.d.ts.map +1 -0
- package/dist/engine/first_principles.js +128 -0
- package/dist/engine/first_principles.js.map +1 -0
- package/dist/engine/{batch1_scenario_registry.d.ts → foundation_scenario_registry.d.ts} +15 -15
- package/dist/engine/foundation_scenario_registry.d.ts.map +1 -0
- package/dist/engine/{batch1_scenario_registry.js → foundation_scenario_registry.js} +22 -25
- package/dist/engine/foundation_scenario_registry.js.map +1 -0
- package/dist/engine/{batch1_scenario_runners.d.ts → foundation_scenario_runners.d.ts} +1 -1
- package/dist/engine/foundation_scenario_runners.d.ts.map +1 -0
- package/dist/engine/{batch1_scenario_runners.js → foundation_scenario_runners.js} +8 -7
- package/dist/engine/foundation_scenario_runners.js.map +1 -0
- package/dist/engine/git_deps.d.ts.map +1 -1
- package/dist/engine/git_deps.js +2 -1
- package/dist/engine/git_deps.js.map +1 -1
- package/dist/engine/governance_report.d.ts.map +1 -1
- package/dist/engine/governance_report.js +10 -9
- package/dist/engine/governance_report.js.map +1 -1
- package/dist/engine/impact_analyzer.d.ts.map +1 -1
- package/dist/engine/impact_analyzer.js +5 -4
- package/dist/engine/impact_analyzer.js.map +1 -1
- package/dist/engine/implementation_roadmap_registry.d.ts.map +1 -1
- package/dist/engine/implementation_roadmap_registry.js +217 -80
- package/dist/engine/implementation_roadmap_registry.js.map +1 -1
- package/dist/engine/input_material_contract_registry.d.ts.map +1 -1
- package/dist/engine/input_material_contract_registry.js +4 -3
- package/dist/engine/input_material_contract_registry.js.map +1 -1
- package/dist/engine/instruction_contract.d.ts +68 -0
- package/dist/engine/instruction_contract.d.ts.map +1 -0
- package/dist/engine/instruction_contract.js +123 -0
- package/dist/engine/instruction_contract.js.map +1 -0
- package/dist/engine/intent_expander.d.ts.map +1 -1
- package/dist/engine/intent_expander.js +339 -1
- package/dist/engine/intent_expander.js.map +1 -1
- package/dist/engine/intent_router.d.ts +11 -2
- package/dist/engine/intent_router.d.ts.map +1 -1
- package/dist/engine/intent_router.js +121 -1
- package/dist/engine/intent_router.js.map +1 -1
- package/dist/engine/intent_signal_extractor.d.ts +3 -0
- package/dist/engine/intent_signal_extractor.d.ts.map +1 -1
- package/dist/engine/intent_signal_extractor.js +49 -0
- package/dist/engine/intent_signal_extractor.js.map +1 -1
- package/dist/engine/io_controller.d.ts.map +1 -1
- package/dist/engine/io_controller.js +8 -7
- package/dist/engine/io_controller.js.map +1 -1
- package/dist/engine/java_quality_guard.d.ts.map +1 -1
- package/dist/engine/java_quality_guard.js +5 -18
- package/dist/engine/java_quality_guard.js.map +1 -1
- package/dist/engine/job_manager.d.ts.map +1 -1
- package/dist/engine/job_manager.js +8 -7
- package/dist/engine/job_manager.js.map +1 -1
- package/dist/engine/knowledge_acceptance_registry.d.ts +35 -0
- package/dist/engine/knowledge_acceptance_registry.d.ts.map +1 -0
- package/dist/engine/knowledge_acceptance_registry.js +271 -0
- package/dist/engine/knowledge_acceptance_registry.js.map +1 -0
- package/dist/engine/knowledge_asset_audit.d.ts +65 -0
- package/dist/engine/knowledge_asset_audit.d.ts.map +1 -0
- package/dist/engine/knowledge_asset_audit.js +230 -0
- package/dist/engine/knowledge_asset_audit.js.map +1 -0
- package/dist/engine/knowledge_asset_consumer.d.ts +150 -0
- package/dist/engine/knowledge_asset_consumer.d.ts.map +1 -0
- package/dist/engine/knowledge_asset_consumer.js +279 -0
- package/dist/engine/knowledge_asset_consumer.js.map +1 -0
- package/dist/engine/knowledge_asset_generation_gate.d.ts +38 -0
- package/dist/engine/knowledge_asset_generation_gate.d.ts.map +1 -0
- package/dist/engine/knowledge_asset_generation_gate.js +131 -0
- package/dist/engine/knowledge_asset_generation_gate.js.map +1 -0
- package/dist/engine/knowledge_asset_migration.d.ts +117 -0
- package/dist/engine/knowledge_asset_migration.d.ts.map +1 -0
- package/dist/engine/knowledge_asset_migration.js +204 -0
- package/dist/engine/knowledge_asset_migration.js.map +1 -0
- package/dist/engine/knowledge_asset_schema.d.ts +97 -0
- package/dist/engine/knowledge_asset_schema.d.ts.map +1 -0
- package/dist/engine/knowledge_asset_schema.js +413 -0
- package/dist/engine/knowledge_asset_schema.js.map +1 -0
- package/dist/engine/knowledge_config_loader.d.ts.map +1 -1
- package/dist/engine/knowledge_config_loader.js +5 -4
- package/dist/engine/knowledge_config_loader.js.map +1 -1
- package/dist/engine/knowledge_consumption_snapshot.d.ts +91 -0
- package/dist/engine/knowledge_consumption_snapshot.d.ts.map +1 -0
- package/dist/engine/knowledge_consumption_snapshot.js +113 -0
- package/dist/engine/knowledge_consumption_snapshot.js.map +1 -0
- package/dist/engine/knowledge_evolution.d.ts +82 -0
- package/dist/engine/knowledge_evolution.d.ts.map +1 -0
- package/dist/engine/knowledge_evolution.js +272 -0
- package/dist/engine/knowledge_evolution.js.map +1 -0
- package/dist/engine/knowledge_lifecycle.d.ts +70 -10
- package/dist/engine/knowledge_lifecycle.d.ts.map +1 -1
- package/dist/engine/knowledge_lifecycle.js +238 -4
- package/dist/engine/knowledge_lifecycle.js.map +1 -1
- package/dist/engine/knowledge_manager.d.ts.map +1 -1
- package/dist/engine/knowledge_manager.js +9 -8
- package/dist/engine/knowledge_manager.js.map +1 -1
- package/dist/engine/knowledge_scenario_registry.d.ts +21 -0
- package/dist/engine/knowledge_scenario_registry.d.ts.map +1 -0
- package/dist/engine/knowledge_scenario_registry.js +337 -0
- package/dist/engine/knowledge_scenario_registry.js.map +1 -0
- package/dist/engine/knowledge_sovereignty.d.ts.map +1 -1
- package/dist/engine/knowledge_sovereignty.js +5 -4
- package/dist/engine/knowledge_sovereignty.js.map +1 -1
- package/dist/engine/knowledge_template_contracts.d.ts +244 -0
- package/dist/engine/knowledge_template_contracts.d.ts.map +1 -0
- package/dist/engine/knowledge_template_contracts.js +26 -0
- package/dist/engine/knowledge_template_contracts.js.map +1 -0
- package/dist/engine/language_policy.d.ts +69 -12
- package/dist/engine/language_policy.d.ts.map +1 -1
- package/dist/engine/language_policy.js +129 -8
- package/dist/engine/language_policy.js.map +1 -1
- package/dist/engine/llm_gateway.d.ts.map +1 -1
- package/dist/engine/llm_gateway.js +10 -9
- package/dist/engine/llm_gateway.js.map +1 -1
- package/dist/engine/local_docker_acceptance.d.ts +94 -0
- package/dist/engine/local_docker_acceptance.d.ts.map +1 -0
- package/dist/engine/local_docker_acceptance.js +312 -0
- package/dist/engine/local_docker_acceptance.js.map +1 -0
- package/dist/engine/logger.d.ts +64 -0
- package/dist/engine/logger.d.ts.map +1 -0
- package/dist/engine/logger.js +115 -0
- package/dist/engine/logger.js.map +1 -0
- package/dist/engine/main_path_integration_contract.d.ts.map +1 -1
- package/dist/engine/main_path_integration_contract.js +43 -42
- package/dist/engine/main_path_integration_contract.js.map +1 -1
- package/dist/engine/mechanism_contract_registry.d.ts.map +1 -1
- package/dist/engine/mechanism_contract_registry.js +448 -17
- package/dist/engine/mechanism_contract_registry.js.map +1 -1
- package/dist/engine/metric_governance.d.ts +51 -0
- package/dist/engine/metric_governance.d.ts.map +1 -0
- package/dist/engine/metric_governance.js +138 -0
- package/dist/engine/metric_governance.js.map +1 -0
- package/dist/engine/migration_guard.d.ts.map +1 -1
- package/dist/engine/migration_guard.js +6 -5
- package/dist/engine/migration_guard.js.map +1 -1
- package/dist/engine/mutation_audit.d.ts.map +1 -1
- package/dist/engine/mutation_audit.js +6 -5
- package/dist/engine/mutation_audit.js.map +1 -1
- package/dist/engine/observability.d.ts +11 -0
- package/dist/engine/observability.d.ts.map +1 -1
- package/dist/engine/observability.js +60 -8
- package/dist/engine/observability.js.map +1 -1
- package/dist/engine/onboarding.d.ts.map +1 -1
- package/dist/engine/onboarding.js +17 -16
- package/dist/engine/onboarding.js.map +1 -1
- package/dist/engine/plan_proposal_gate.d.ts +131 -0
- package/dist/engine/plan_proposal_gate.d.ts.map +1 -0
- package/dist/engine/plan_proposal_gate.js +340 -0
- package/dist/engine/plan_proposal_gate.js.map +1 -0
- package/dist/engine/platform_context.d.ts +44 -0
- package/dist/engine/platform_context.d.ts.map +1 -0
- package/dist/engine/platform_context.js +165 -0
- package/dist/engine/platform_context.js.map +1 -0
- package/dist/engine/policy_drift_detector.d.ts.map +1 -1
- package/dist/engine/policy_drift_detector.js +8 -7
- package/dist/engine/policy_drift_detector.js.map +1 -1
- package/dist/engine/regression_matrix.d.ts.map +1 -1
- package/dist/engine/regression_matrix.js +15 -14
- package/dist/engine/regression_matrix.js.map +1 -1
- package/dist/engine/release_compatibility.d.ts +62 -0
- package/dist/engine/release_compatibility.d.ts.map +1 -0
- package/dist/engine/release_compatibility.js +145 -0
- package/dist/engine/release_compatibility.js.map +1 -0
- package/dist/engine/release_gate.d.ts +29 -0
- package/dist/engine/release_gate.d.ts.map +1 -0
- package/dist/engine/release_gate.js +675 -0
- package/dist/engine/release_gate.js.map +1 -0
- package/dist/engine/release_gate_scenario_registry.d.ts +50 -0
- package/dist/engine/release_gate_scenario_registry.d.ts.map +1 -0
- package/dist/engine/release_gate_scenario_registry.js +514 -0
- package/dist/engine/release_gate_scenario_registry.js.map +1 -0
- package/dist/engine/release_readiness_gate.d.ts +36 -0
- package/dist/engine/release_readiness_gate.d.ts.map +1 -0
- package/dist/engine/release_readiness_gate.js +1050 -0
- package/dist/engine/release_readiness_gate.js.map +1 -0
- package/dist/engine/risk_sampler.d.ts.map +1 -1
- package/dist/engine/risk_sampler.js +4 -3
- package/dist/engine/risk_sampler.js.map +1 -1
- package/dist/engine/runtime_safety.d.ts.map +1 -1
- package/dist/engine/runtime_safety.js +18 -17
- package/dist/engine/runtime_safety.js.map +1 -1
- package/dist/engine/scaffolder.d.ts.map +1 -1
- package/dist/engine/scaffolder.js +4 -3
- package/dist/engine/scaffolder.js.map +1 -1
- package/dist/engine/scope_lease.d.ts.map +1 -1
- package/dist/engine/scope_lease.js +4 -3
- package/dist/engine/scope_lease.js.map +1 -1
- package/dist/engine/semantic_evidence.d.ts.map +1 -1
- package/dist/engine/semantic_evidence.js +4 -3
- package/dist/engine/semantic_evidence.js.map +1 -1
- package/dist/engine/state_fact_classifier.d.ts +47 -0
- package/dist/engine/state_fact_classifier.d.ts.map +1 -0
- package/dist/engine/state_fact_classifier.js +158 -0
- package/dist/engine/state_fact_classifier.js.map +1 -0
- package/dist/engine/task_context.d.ts +25 -3
- package/dist/engine/task_context.d.ts.map +1 -1
- package/dist/engine/task_context.js +126 -37
- package/dist/engine/task_context.js.map +1 -1
- package/dist/engine/task_planner.d.ts.map +1 -1
- package/dist/engine/task_planner.js +6 -5
- package/dist/engine/task_planner.js.map +1 -1
- package/dist/engine/team_awareness.d.ts.map +1 -1
- package/dist/engine/team_awareness.js +2 -1
- package/dist/engine/team_awareness.js.map +1 -1
- package/dist/engine/technology_decision.d.ts +38 -0
- package/dist/engine/technology_decision.d.ts.map +1 -0
- package/dist/engine/technology_decision.js +120 -0
- package/dist/engine/technology_decision.js.map +1 -0
- package/dist/engine/template_manifest_io.d.ts +47 -0
- package/dist/engine/template_manifest_io.d.ts.map +1 -0
- package/dist/engine/template_manifest_io.js +151 -0
- package/dist/engine/template_manifest_io.js.map +1 -0
- package/dist/engine/template_mechanism_auditor.d.ts.map +1 -1
- package/dist/engine/template_mechanism_auditor.js +5 -4
- package/dist/engine/template_mechanism_auditor.js.map +1 -1
- package/dist/engine/template_sync.d.ts +98 -0
- package/dist/engine/template_sync.d.ts.map +1 -0
- package/dist/engine/template_sync.js +355 -0
- package/dist/engine/template_sync.js.map +1 -0
- package/dist/engine/test_generator.d.ts.map +1 -1
- package/dist/engine/test_generator.js +5 -4
- package/dist/engine/test_generator.js.map +1 -1
- package/dist/engine/test_quality.d.ts.map +1 -1
- package/dist/engine/test_quality.js +5 -4
- package/dist/engine/test_quality.js.map +1 -1
- package/dist/engine/tool_invocation_contract_registry.d.ts.map +1 -1
- package/dist/engine/tool_invocation_contract_registry.js +32 -31
- package/dist/engine/tool_invocation_contract_registry.js.map +1 -1
- package/dist/engine/traceability.d.ts.map +1 -1
- package/dist/engine/traceability.js +6 -5
- package/dist/engine/traceability.js.map +1 -1
- package/dist/engine/user_feedback_contract.d.ts.map +1 -1
- package/dist/engine/user_feedback_contract.js +81 -19
- package/dist/engine/user_feedback_contract.js.map +1 -1
- package/dist/engine/user_promise.d.ts +67 -0
- package/dist/engine/user_promise.d.ts.map +1 -0
- package/dist/engine/user_promise.js +436 -0
- package/dist/engine/user_promise.js.map +1 -0
- package/dist/engine/verifier.d.ts +6 -10
- package/dist/engine/verifier.d.ts.map +1 -1
- package/dist/engine/verifier.js +149 -1
- package/dist/engine/verifier.js.map +1 -1
- package/dist/engine/workflow_contract_registry.d.ts.map +1 -1
- package/dist/engine/workflow_contract_registry.js +127 -10
- package/dist/engine/workflow_contract_registry.js.map +1 -1
- package/dist/engine/workflow_template_pack.d.ts +71 -0
- package/dist/engine/workflow_template_pack.d.ts.map +1 -0
- package/dist/engine/workflow_template_pack.js +246 -0
- package/dist/engine/workflow_template_pack.js.map +1 -0
- package/dist/engine/workspace_resumer.d.ts.map +1 -1
- package/dist/engine/workspace_resumer.js +9 -8
- package/dist/engine/workspace_resumer.js.map +1 -1
- package/dist/engine/zero_config_init.d.ts.map +1 -1
- package/dist/engine/zero_config_init.js +16 -15
- package/dist/engine/zero_config_init.js.map +1 -1
- package/dist/git/operations.d.ts.map +1 -1
- package/dist/git/operations.js +18 -17
- package/dist/git/operations.js.map +1 -1
- package/dist/index.js +10 -9
- package/dist/index.js.map +1 -1
- package/dist/knowledge/conflict_detector.d.ts.map +1 -1
- package/dist/knowledge/conflict_detector.js +2 -1
- package/dist/knowledge/conflict_detector.js.map +1 -1
- package/dist/knowledge/health_checker.d.ts.map +1 -1
- package/dist/knowledge/health_checker.js +5 -4
- package/dist/knowledge/health_checker.js.map +1 -1
- package/dist/knowledge/index_manager.js +4 -4
- package/dist/knowledge/index_manager.js.map +1 -1
- package/dist/knowledge/loader.d.ts.map +1 -1
- package/dist/knowledge/loader.js +20 -14
- package/dist/knowledge/loader.js.map +1 -1
- package/dist/knowledge/writer.d.ts.map +1 -1
- package/dist/knowledge/writer.js +7 -6
- package/dist/knowledge/writer.js.map +1 -1
- package/dist/types.d.ts +28 -8
- package/dist/types.d.ts.map +1 -1
- package/package.json +13 -5
- package/templates/knowledge/acceptance_templates/Bug/345/210/206/346/236/220/346/250/241/347/211/210.md +27 -3
- package/templates/knowledge/acceptance_templates/POC/347/273/223/350/256/272/346/250/241/347/211/210.md +27 -3
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/templates/knowledge/acceptance_templates//346/236/266/346/236/204/350/256/276/350/256/241/346/250/241/347/211/210.md +27 -3
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/templates/knowledge/checklists//344/274/232/350/257/235/346/201/242/345/244/215.md +30 -8
- 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
- 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
- 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
- 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
- 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
- package/templates/knowledge/domain//345/244/232/347/247/237/346/210/267.md +28 -3
- package/templates/knowledge/domain//345/256/241/350/256/241/346/227/245/345/277/227.md +27 -3
- 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
- package/templates/knowledge/domain//345/267/245/344/275/234/346/265/201/345/274/225/346/223/216.md +32 -3
- package/templates/knowledge/domain//346/212/245/350/241/250/347/273/237/350/256/241.md +31 -3
- package/templates/knowledge/domain//346/224/257/344/273/230/350/247/204/345/210/231.md +31 -3
- package/templates/knowledge/domain//346/225/260/346/215/256/346/235/203/351/231/220.md +28 -3
- 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
- package/templates/knowledge/domain//351/200/232/347/237/245/350/247/204/345/210/231.md +31 -3
- package/templates/knowledge/patterns/core/Diff/345/275/222/345/261/236/350/277/275/350/270/252.md +24 -7
- package/templates/knowledge/patterns/core/Java/350/264/250/351/207/217/351/227/250/347/246/201.md +25 -7
- package/templates/knowledge/patterns/core/LLM/351/242/204/347/256/227/347/275/221/345/205/263.md +24 -7
- 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
- package/templates/knowledge/patterns/core//344/273/273/345/212/241/347/256/241/347/220/206/345/231/250.md +25 -7
- 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
- package/templates/knowledge/patterns/core//344/275/234/347/224/250/345/237/237/347/247/237/347/272/246.md +25 -7
- package/templates/knowledge/patterns/core//345/206/262/347/252/201/351/227/250/347/246/201.md +24 -7
- package/templates/knowledge/patterns/core//345/206/263/347/255/226/347/275/221/345/205/263.md +26 -7
- package/templates/knowledge/patterns/core//345/217/230/345/274/202/345/256/241/350/256/241.md +25 -7
- package/templates/knowledge/patterns/core//345/233/236/345/275/222/347/237/251/351/230/265.md +24 -7
- 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
- package/templates/knowledge/patterns/core//345/267/245/344/275/234/345/214/272/345/224/244/351/206/222.md +24 -7
- package/templates/knowledge/patterns/core//345/271/266/345/217/221/351/224/201.md +26 -7
- package/templates/knowledge/patterns/core//345/274/200/345/217/221/350/200/205/345/256/252/346/263/225.md +26 -7
- 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
- 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
- package/templates/knowledge/patterns/core//346/265/201/345/274/217/345/277/203/350/267/263.md +25 -7
- package/templates/knowledge/patterns/core//347/237/245/350/257/206/344/270/273/346/235/203.md +25 -7
- package/templates/knowledge/patterns/core//350/257/255/344/271/211/350/257/201/346/215/256.md +24 -7
- package/templates/knowledge/patterns/core//350/277/220/350/241/214/345/256/211/345/205/250/345/214/205.md +25 -7
- 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
- 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
- package/templates/knowledge/procedures/Schema/345/217/230/346/233/264/346/265/201/346/260/264/347/272/277.md +29 -3
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/templates/knowledge/procedures//346/200/247/350/203/275/346/265/201/346/260/264/347/272/277.md +30 -3
- 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
- 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
- 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
- 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
- package/templates/knowledge/procedures//346/236/266/346/236/204/350/256/276/350/256/241/345/267/245/344/275/234/346/265/201.md +95 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/templates/knowledge/procedures//350/277/201/347/247/273/346/265/201/346/260/264/347/272/277.md +30 -3
- 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
- package/templates/knowledge/procedures//351/207/215/346/236/204/346/265/201/346/260/264/347/272/277.md +30 -3
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/templates/knowledge/rules//345/267/245/344/275/234/346/265/201/346/250/241/346/235/277/345/214/205/350/247/204/345/210/231.md +38 -0
- 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
- 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
- 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
- package/templates/knowledge/rules//346/211/251/345/261/225/347/224/237/345/221/275/345/221/250/346/234/237/350/247/204/345/210/231.md +38 -0
- 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
- 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
- package/templates/knowledge/rules//346/226/275/345/267/245/346/214/207/344/273/244/345/245/221/347/272/246/350/247/204/345/210/231.md +49 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/templates/knowledge/rules//350/267/250/345/271/263/345/217/260/350/267/257/345/276/204/345/256/211/345/205/250/350/247/204/345/210/231.md +38 -0
- 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
- 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
- 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
- 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
- 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
- package/templates/knowledge/templates//345/256/241/346/237/245/346/221/230/350/246/201.md +26 -7
- package/templates/patterns/API/350/256/276/350/256/241/350/247/204/350/214/203.md +30 -3
- package/templates/patterns/Docker/351/203/250/347/275/262/350/247/204/350/214/203.md +29 -3
- package/templates/patterns/Git/346/223/215/344/275/234/350/247/204/350/214/203.md +33 -3
- package/templates/patterns/N/345/212/2401/346/237/245/350/257/242/350/247/204/350/214/203.md +31 -3
- 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
- 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
- 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
- package/templates/patterns/React/347/273/204/344/273/266/350/247/204/350/214/203.md +30 -3
- package/templates/patterns/React/350/241/250/345/215/225/350/247/204/350/214/203.md +30 -3
- package/templates/patterns/React/350/267/257/347/224/261/350/247/204/350/214/203.md +31 -3
- package/templates/patterns/Schema/345/205/274/345/256/271/350/247/204/350/214/203.md +30 -3
- 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
- package/templates/patterns/Vue/347/273/204/344/273/266/350/247/204/350/214/203.md +33 -3
- package/templates/patterns/Vue/350/267/257/347/224/261/350/247/204/350/214/203.md +28 -3
- package/templates/patterns//344/272/213/344/273/266/351/251/261/345/212/250/350/247/204/350/214/203.md +32 -3
- package/templates/patterns//344/272/213/345/212/241/346/250/241/345/274/217/350/247/204/350/214/203.md +31 -3
- package/templates/patterns//344/274/230/351/233/205/345/201/234/346/234/272/350/247/204/350/214/203.md +31 -3
- package/templates/patterns//345/205/250/346/240/210/346/265/201/347/250/213/344/277/256/345/244/215.md +30 -3
- package/templates/patterns//345/210/206/351/241/265/346/237/245/350/257/242/350/247/204/350/214/203.md +34 -3
- package/templates/patterns//345/211/215/347/253/257/346/200/247/350/203/275/350/247/204/350/214/203.md +32 -3
- package/templates/patterns//345/221/275/345/220/215/350/247/204/350/214/203.md +30 -3
- package/templates/patterns//345/233/275/351/231/205/345/214/226/350/247/204/350/214/203.md +31 -3
- package/templates/patterns//345/242/236/345/210/240/346/224/271/346/237/245/350/247/204/350/214/203.md +31 -3
- package/templates/patterns//345/244/226/351/203/250/344/276/235/350/265/226/350/247/204/350/214/203.md +31 -3
- package/templates/patterns//345/245/221/347/272/246/345/205/274/345/256/271/350/247/204/350/214/203.md +28 -3
- package/templates/patterns//345/256/232/346/227/266/344/273/273/345/212/241/350/247/204/350/214/203.md +32 -3
- package/templates/patterns//345/256/236/346/227/266/346/216/250/351/200/201/350/247/204/350/214/203.md +31 -3
- package/templates/patterns//345/267/245/347/250/213/347/272/252/345/276/213.md +30 -3
- package/templates/patterns//345/271/266/345/217/221/346/216/247/345/210/266/350/247/204/350/214/203.md +34 -3
- package/templates/patterns//345/274/202/346/255/245/345/257/274/345/207/272/350/247/204/350/214/203.md +31 -3
- package/templates/patterns//346/216/245/345/217/243/345/245/221/347/272/246/350/247/204/350/214/203.md +29 -3
- package/templates/patterns//346/220/234/347/264/242/346/250/241/345/274/217/350/247/204/350/214/203.md +33 -3
- package/templates/patterns//346/225/260/346/215/256/351/232/220/347/247/201/350/247/204/350/214/203.md +34 -3
- package/templates/patterns//346/226/207/344/273/266/344/270/212/344/274/240/350/247/204/350/214/203.md +30 -3
- package/templates/patterns//346/227/240/351/232/234/347/242/215/350/247/204/350/214/203.md +30 -3
- package/templates/patterns//346/227/245/345/277/227/350/247/204/350/214/203.md +31 -3
- package/templates/patterns//346/235/203/351/231/220/350/256/244/350/257/201/350/247/204/350/214/203.md +34 -3
- package/templates/patterns//346/236/266/346/236/204/347/272/242/347/272/277.md +28 -3
- package/templates/patterns//346/265/213/350/257/225/350/264/250/351/207/217/350/247/204/350/214/203.md +30 -3
- package/templates/patterns//347/206/224/346/226/255/351/231/215/347/272/247/350/247/204/350/214/203.md +32 -3
- package/templates/patterns//347/212/266/346/200/201/346/265/201/350/275/254/350/247/204/350/214/203.md +29 -3
- package/templates/patterns//347/272/246/346/235/237/345/256/236/347/216/260/350/247/204/350/214/203.md +32 -3
- package/templates/patterns//347/274/223/345/255/230/347/255/226/347/225/245/350/247/204/350/214/203.md +31 -3
- package/templates/patterns//347/274/226/347/240/201/350/264/250/351/207/217/350/247/204/350/214/203.md +30 -3
- package/templates/patterns//347/274/272/351/231/267/347/256/241/347/220/206/350/247/204/350/214/203.md +29 -3
- package/templates/patterns//350/260/203/350/257/225/346/226/271/346/263/225/350/256/272.md +30 -3
- package/templates/patterns//350/276/223/345/205/245/346/240/241/351/252/214/350/247/204/350/214/203.md +31 -3
- package/templates/patterns//351/224/231/350/257/257/345/244/204/347/220/206/350/247/204/350/214/203.md +31 -3
- package/templates/patterns//351/224/231/350/257/257/350/276/271/347/225/214/350/247/204/350/214/203.md +33 -3
- 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
- package/dist/engine/batch1_manifest.d.ts.map +0 -1
- package/dist/engine/batch1_manifest.js.map +0 -1
- package/dist/engine/batch1_scenario_registry.d.ts.map +0 -1
- package/dist/engine/batch1_scenario_registry.js.map +0 -1
- package/dist/engine/batch1_scenario_runners.d.ts.map +0 -1
- 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,15 @@ 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"));
|
|
70
81
|
// ── Zod Schema 定义 ──
|
|
71
82
|
const ClassifySchema = {
|
|
72
83
|
intent: z.string().describe("开发者意图描述"),
|
|
@@ -188,13 +199,524 @@ const ExploreSchema = {
|
|
|
188
199
|
* @param server - MCP 服务器实例
|
|
189
200
|
* @param deps - SoloForge 核心依赖项
|
|
190
201
|
*/
|
|
202
|
+
/**
|
|
203
|
+
* Plan Gate 写工具拦截 — 从 registerSafeTool 中间件提取的纯函数。
|
|
204
|
+
* gate 和外部测试可直接调用,无需 MCP server mock。
|
|
205
|
+
*/
|
|
206
|
+
export function checkWriteToolPlanGate(params) {
|
|
207
|
+
if (!hasWriteSideEffect(params.sideEffects))
|
|
208
|
+
return { allowed: true };
|
|
209
|
+
if (!params.ctx || !params.ctx.plan_proposal_gate) {
|
|
210
|
+
return {
|
|
211
|
+
allowed: false,
|
|
212
|
+
diagnostic_code: "SF-PLAN-5001",
|
|
213
|
+
violation_type: "guard_blocked",
|
|
214
|
+
reason: `工具 ${params.toolName} 执行前缺少 Plan Proposal Gate`,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
return { allowed: true };
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* 施工指令契约门 — 写操作前检查施工指令完整性。
|
|
221
|
+
* 问题五十八: 通过引擎模块函数真实消费。
|
|
222
|
+
* 调用链 1: registerInstructionIssueCandidate(无契约时创建候选 draft)
|
|
223
|
+
* 调用链 2: enforceInstructionBeforeImplementation → checkInstructionCompleteness → validateInstructionContract
|
|
224
|
+
*/
|
|
225
|
+
export async function checkInstructionContractGate(params) {
|
|
226
|
+
if (!hasWriteSideEffect(params.sideEffects))
|
|
227
|
+
return { allowed: true };
|
|
228
|
+
if (!params.ctx)
|
|
229
|
+
return { allowed: true };
|
|
230
|
+
let instruction = params.ctx.instruction_contract;
|
|
231
|
+
const instrModule = await lazyInstructionContract();
|
|
232
|
+
// 无契约时消费 registerInstructionIssueCandidate — 创建 draft 候选并保存
|
|
233
|
+
if (!instruction && params.task_id) {
|
|
234
|
+
instruction = instrModule.registerInstructionIssueCandidate({
|
|
235
|
+
task_id: params.task_id,
|
|
236
|
+
description: params.toolName,
|
|
237
|
+
source: "auto_detected",
|
|
238
|
+
suggested_fields: {},
|
|
239
|
+
});
|
|
240
|
+
params.ctx.instruction_contract = instruction;
|
|
241
|
+
if (params.taskContextMgr) {
|
|
242
|
+
await params.taskContextMgr.save(params.ctx);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
if (!instruction)
|
|
246
|
+
return { allowed: true };
|
|
247
|
+
// 消费 enforceInstructionBeforeImplementation(链式消费 checkInstructionCompleteness + validateInstructionContract)
|
|
248
|
+
const result = instrModule.enforceInstructionBeforeImplementation(instruction, params.toolName);
|
|
249
|
+
// Draft 状态不阻断 — 仅在 confirmed/executing/blocked 状态时强制
|
|
250
|
+
if (instruction.status === "draft") {
|
|
251
|
+
return { allowed: true, findings: result.allowed ? [] : [result.reason_zh] };
|
|
252
|
+
}
|
|
253
|
+
if (!result.allowed) {
|
|
254
|
+
return {
|
|
255
|
+
allowed: false,
|
|
256
|
+
diagnostic_code: result.diagnostic_code,
|
|
257
|
+
violation_type: "guard_blocked",
|
|
258
|
+
reason: result.reason_zh,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
return { allowed: true };
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* 架构设计门 — 架构设计类任务膨胀前执行 reviewArchitectureDesign。
|
|
265
|
+
* 问题四十九: Architecture Design Contract enforcement。
|
|
266
|
+
*/
|
|
267
|
+
export async function checkArchitectureDesignGate(params) {
|
|
268
|
+
const route = params.route;
|
|
269
|
+
if (route !== "artifact_generation" && route !== "analysis")
|
|
270
|
+
return { allowed: true };
|
|
271
|
+
if (!params.ctx)
|
|
272
|
+
return { allowed: true };
|
|
273
|
+
const expansion = params.ctx.expansion;
|
|
274
|
+
if (!expansion)
|
|
275
|
+
return { allowed: true };
|
|
276
|
+
const archModule = await lazyArchitectureDesign();
|
|
277
|
+
const contract = expansion.architecture_contract;
|
|
278
|
+
if (contract) {
|
|
279
|
+
const result = archModule.reviewArchitectureDesign(contract);
|
|
280
|
+
if (!result.passed) {
|
|
281
|
+
return {
|
|
282
|
+
allowed: false,
|
|
283
|
+
reason_zh: "架构设计审查未通过",
|
|
284
|
+
findings: result.review.missing_sections ?? ["架构设计审查失败"],
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return { allowed: true };
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* 现有系统分析门 — 现有项目编码前必须先做分析。
|
|
292
|
+
* 问题五十: Existing System Analysis Contract enforcement。
|
|
293
|
+
*/
|
|
294
|
+
export async function checkExistingSystemAnalysisGate(params) {
|
|
295
|
+
const archModule = await lazyExistingSystemAnalysis();
|
|
296
|
+
const context = archModule.detectProjectContext(params.hasExistingCode, params.hasPackageJson, params.hasSrcDir);
|
|
297
|
+
const gateResult = archModule.checkAnalysisGate(context, params.hasAnalysis, params.hasGapAnalysis);
|
|
298
|
+
if (!gateResult.allowed) {
|
|
299
|
+
return {
|
|
300
|
+
allowed: false,
|
|
301
|
+
reason_zh: gateResult.reason,
|
|
302
|
+
missing_analysis: gateResult.missing_analysis,
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
return { allowed: true };
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* 编码就绪门 — 编码前必须有测试计划 + 验收标准。
|
|
309
|
+
* 问题五十一: Coding Readiness / Test-First enforcement。
|
|
310
|
+
*/
|
|
311
|
+
export async function checkCodingReadinessGate(params) {
|
|
312
|
+
if (!params.ctx)
|
|
313
|
+
return { allowed: true };
|
|
314
|
+
const readinessModule = await lazyCodingReadiness();
|
|
315
|
+
const contract = params.ctx.coding_readiness_contract;
|
|
316
|
+
if (!contract) {
|
|
317
|
+
return {
|
|
318
|
+
allowed: true,
|
|
319
|
+
reason_zh: "无编码就绪契约(非编码任务),放行",
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
const result = readinessModule.evaluateCodingReadiness(contract, false, false, false);
|
|
323
|
+
if (!result.allowed) {
|
|
324
|
+
return {
|
|
325
|
+
allowed: false,
|
|
326
|
+
reason_zh: result.reason,
|
|
327
|
+
missing_preconditions: result.missing_preconditions,
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
return { allowed: true };
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* 本地验收门 — 前端/全栈交付前必须有本地访问证据。
|
|
334
|
+
* 问题五十二: Local Docker / Browser Acceptance enforcement。
|
|
335
|
+
*/
|
|
336
|
+
export async function checkLocalAcceptanceGate(params) {
|
|
337
|
+
const acceptanceModule = await lazyLocalAcceptance();
|
|
338
|
+
const requirement = acceptanceModule.requiresLocalAcceptance(params.hasFrontend, params.hasBackend, params.hasDockerCompose, params.hasDockerfile);
|
|
339
|
+
if (!requirement.required)
|
|
340
|
+
return { allowed: true };
|
|
341
|
+
if (!params.ctx) {
|
|
342
|
+
return {
|
|
343
|
+
allowed: false,
|
|
344
|
+
reason_zh: "需要本地验收但无任务上下文",
|
|
345
|
+
required_but_missing: ["local_acceptance_evidence"],
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
const evidence = params.ctx.local_acceptance_evidence;
|
|
349
|
+
if (!evidence) {
|
|
350
|
+
return {
|
|
351
|
+
allowed: false,
|
|
352
|
+
reason_zh: `项目需要本地验收(模式: ${requirement.run_mode})但缺少验收证据`,
|
|
353
|
+
required_but_missing: ["local_acceptance_evidence", "final_access_url"],
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
return { allowed: true };
|
|
357
|
+
}
|
|
358
|
+
// ── S4 触发判定函数 ──
|
|
359
|
+
// 不依赖 hasInstructionContract,基于 route + intent 风险信号判断是否需要 enforcement。
|
|
360
|
+
// 关键设计: 不是所有 code_change 都触发,只有 intent 含高风险/复杂信号时才触发。
|
|
361
|
+
// 低风险场景(skip_chat / direct_answer / 无风险信号的 code_change)不触发。
|
|
362
|
+
const HIGH_IMPACT_KEYWORDS = /架构|技术选型|数据库|框架|多端|跨模块|高影响|高风险|migration|技术路线|选型|rework/i;
|
|
363
|
+
const UNCERTAINTY_KEYWORDS = /不确定|方案选择|多选项|权衡|脑暴|brainstorm|多方案|选型|比较/i;
|
|
364
|
+
const DETAIL_INTENSIVE_KEYWORDS = /多步骤|复杂|跨模块|高风险|多端|分布式|微服务/i;
|
|
365
|
+
const LOW_RISK_ROUTES = new Set(["skip_chat", "direct_answer", "operation", "planning", "review", "source_extraction"]);
|
|
366
|
+
/** 技术选型/架构/数据库/框架/高影响决策 → 需 decision sovereignty gate */
|
|
367
|
+
export function requiresDecisionSovereignty(ctx, route) {
|
|
368
|
+
if (!ctx)
|
|
369
|
+
return false;
|
|
370
|
+
const routeVal = route ?? ctx.classification?.route_decision?.route ?? ctx.route_decision?.route;
|
|
371
|
+
if (!routeVal || LOW_RISK_ROUTES.has(routeVal))
|
|
372
|
+
return false;
|
|
373
|
+
// 所有路由都要求 intent 含高影响信号
|
|
374
|
+
const hasHighImpact = ctx.intent && HIGH_IMPACT_KEYWORDS.test(ctx.intent);
|
|
375
|
+
if (!hasHighImpact) {
|
|
376
|
+
// instruction_contract 的 risk/high_impact 也可作为信号
|
|
377
|
+
const ic = ctx.instruction_contract;
|
|
378
|
+
if (!ic || (!ic.risk && !ic.high_impact))
|
|
379
|
+
return false;
|
|
380
|
+
if (ic.risk !== "high" && !ic.high_impact)
|
|
381
|
+
return false;
|
|
382
|
+
}
|
|
383
|
+
// artifact_generation / analysis / code_change + 高影响 intent → 触发
|
|
384
|
+
return true;
|
|
385
|
+
}
|
|
386
|
+
/** 多步骤/不确定/高风险任务 → 需 detail discipline gate */
|
|
387
|
+
export function requiresDetailDiscipline(ctx, route) {
|
|
388
|
+
if (!ctx)
|
|
389
|
+
return false;
|
|
390
|
+
const routeVal = route ?? ctx.classification?.route_decision?.route ?? ctx.route_decision?.route;
|
|
391
|
+
if (!routeVal || LOW_RISK_ROUTES.has(routeVal))
|
|
392
|
+
return false;
|
|
393
|
+
// 复杂 intent 触发
|
|
394
|
+
const hasComplexSignals = ctx.intent && DETAIL_INTENSIVE_KEYWORDS.test(ctx.intent);
|
|
395
|
+
if (!hasComplexSignals) {
|
|
396
|
+
const ic = ctx.instruction_contract;
|
|
397
|
+
if (!ic || (!ic.risk && !ic.high_impact))
|
|
398
|
+
return false;
|
|
399
|
+
if (ic.risk !== "high" && !ic.high_impact)
|
|
400
|
+
return false;
|
|
401
|
+
}
|
|
402
|
+
return true;
|
|
403
|
+
}
|
|
404
|
+
/** 高影响任务/架构设计/复杂编码/跨模块变更 → 需 first principles gate */
|
|
405
|
+
export function requiresFirstPrinciples(ctx, route) {
|
|
406
|
+
if (!ctx)
|
|
407
|
+
return false;
|
|
408
|
+
const routeVal = route ?? ctx.classification?.route_decision?.route ?? ctx.route_decision?.route;
|
|
409
|
+
if (!routeVal || LOW_RISK_ROUTES.has(routeVal))
|
|
410
|
+
return false;
|
|
411
|
+
// 所有路由都要求 intent 含高影响信号
|
|
412
|
+
const hasHighImpact = ctx.intent && HIGH_IMPACT_KEYWORDS.test(ctx.intent);
|
|
413
|
+
if (!hasHighImpact) {
|
|
414
|
+
const ic = ctx.instruction_contract;
|
|
415
|
+
if (!ic || (!ic.risk && !ic.high_impact))
|
|
416
|
+
return false;
|
|
417
|
+
if (ic.risk !== "high" && !ic.high_impact)
|
|
418
|
+
return false;
|
|
419
|
+
}
|
|
420
|
+
return true;
|
|
421
|
+
}
|
|
422
|
+
/** 不确定项/方案选择/多选项 → 需 brainstorm gate */
|
|
423
|
+
export function requiresBrainstorm(ctx, route) {
|
|
424
|
+
if (!ctx)
|
|
425
|
+
return false;
|
|
426
|
+
const routeVal = route ?? ctx.classification?.route_decision?.route ?? ctx.route_decision?.route;
|
|
427
|
+
if (!routeVal || LOW_RISK_ROUTES.has(routeVal))
|
|
428
|
+
return false;
|
|
429
|
+
// 仅当 intent 含不确定性信号时才触发
|
|
430
|
+
const hasUncertainty = ctx.intent && UNCERTAINTY_KEYWORDS.test(ctx.intent);
|
|
431
|
+
if (!hasUncertainty)
|
|
432
|
+
return false;
|
|
433
|
+
if (routeVal === "analysis" || routeVal === "artifact_generation")
|
|
434
|
+
return true;
|
|
435
|
+
if (routeVal === "code_change")
|
|
436
|
+
return true;
|
|
437
|
+
const ic = ctx.instruction_contract;
|
|
438
|
+
if (ic && ic.uncertainty)
|
|
439
|
+
return true;
|
|
440
|
+
return false;
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* 技术选型决策门 — 高影响技术决策需用户确认。
|
|
444
|
+
* 问题十六: Decision Sovereignty enforcement。
|
|
445
|
+
* 不依赖 hasInstructionContract — 触发由 requiresDecisionSovereignty 判定。
|
|
446
|
+
*/
|
|
447
|
+
export async function checkDecisionSovereigntyGate(params) {
|
|
448
|
+
if (!params.ctx)
|
|
449
|
+
return { allowed: true, not_applicable_with_reason: "无任务上下文" };
|
|
450
|
+
const triggered = requiresDecisionSovereignty(params.ctx, params.route);
|
|
451
|
+
if (!triggered) {
|
|
452
|
+
return { allowed: true, not_applicable_with_reason: "非高影响技术决策场景,跳过 decision sovereignty gate" };
|
|
453
|
+
}
|
|
454
|
+
const decisionContract = params.ctx.technology_decision_contract;
|
|
455
|
+
if (!decisionContract) {
|
|
456
|
+
return { allowed: false, reason_zh: "高影响技术决策场景缺 technology_decision_contract,无法执行决策主权校验" };
|
|
457
|
+
}
|
|
458
|
+
const decisionModule = await lazyTechnologyDecision();
|
|
459
|
+
const validation = decisionModule.validateTechnologyDecision(decisionContract);
|
|
460
|
+
if (!validation.valid) {
|
|
461
|
+
return { allowed: false, reason_zh: `技术选型决策校验失败: ${validation.violations.join("; ")}` };
|
|
462
|
+
}
|
|
463
|
+
// 有决策记录时评估执行状态
|
|
464
|
+
const decisionRecord = params.ctx.technology_decision_record;
|
|
465
|
+
if (decisionRecord) {
|
|
466
|
+
const evaluation = decisionModule.evaluateDecisionExecution(decisionContract, decisionRecord);
|
|
467
|
+
if (evaluation.requires_human_gate && !decisionContract.human_gate_evidence) {
|
|
468
|
+
return { allowed: false, reason_zh: "高影响技术决策需用户确认(human gate),请提供确认证据", requires_human_gate: true };
|
|
469
|
+
}
|
|
470
|
+
if (!evaluation.allowed) {
|
|
471
|
+
return { allowed: false, reason_zh: evaluation.reason };
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
else {
|
|
475
|
+
// 无决策记录: 契约已验证通过,但需 human_gate_evidence 确认(如有高范围决策)
|
|
476
|
+
if (decisionContract.human_gate_required && !decisionContract.human_gate_evidence) {
|
|
477
|
+
return { allowed: false, reason_zh: "高影响技术决策需用户确认(human gate),请提供确认证据", requires_human_gate: true };
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
return { allowed: true };
|
|
481
|
+
}
|
|
482
|
+
/**
|
|
483
|
+
* 细节纪律门 — 复杂任务缺关键细节维度时阻断。
|
|
484
|
+
* 问题二十六: Detail Discipline enforcement。
|
|
485
|
+
* 不依赖 hasInstructionContract — 触发由 requiresDetailDiscipline 判定。
|
|
486
|
+
*/
|
|
487
|
+
export async function checkDetailDisciplineGate(params) {
|
|
488
|
+
if (!params.ctx)
|
|
489
|
+
return { allowed: true, not_applicable_with_reason: "无任务上下文" };
|
|
490
|
+
const triggered = requiresDetailDiscipline(params.ctx, params.route);
|
|
491
|
+
if (!triggered) {
|
|
492
|
+
return { allowed: true, not_applicable_with_reason: "非复杂/多步骤任务场景,跳过 detail discipline gate" };
|
|
493
|
+
}
|
|
494
|
+
const detailContract = params.ctx.detail_discipline_contract;
|
|
495
|
+
if (!detailContract) {
|
|
496
|
+
return { allowed: false, reason_zh: "多步骤/复杂任务缺 detail_discipline_contract,无法执行细节纪律校验" };
|
|
497
|
+
}
|
|
498
|
+
const detailModule = await lazyDetailDiscipline();
|
|
499
|
+
const check = detailModule.performDetailCheck(detailContract, detailContract.contract_id ?? "unknown", "implementation", params.ctx.provided_details ?? {});
|
|
500
|
+
if (check.blocking) {
|
|
501
|
+
const riskItems = detailModule.generateRiskItems(check);
|
|
502
|
+
const blockingLabels = riskItems.filter(r => r.severity === "blocking").map(r => r.dimension ?? r.description);
|
|
503
|
+
return { allowed: false, reason_zh: `任务方案缺关键细节: ${blockingLabels.join("; ")}`, missing_details: blockingLabels };
|
|
504
|
+
}
|
|
505
|
+
return { allowed: true };
|
|
506
|
+
}
|
|
507
|
+
/**
|
|
508
|
+
* 第一性原理门 — 高影响任务需目标/约束/本质问题/权衡。
|
|
509
|
+
* 问题二十七: First Principles enforcement。
|
|
510
|
+
* 不依赖 hasInstructionContract — 触发由 requiresFirstPrinciples 判定。
|
|
511
|
+
*/
|
|
512
|
+
export async function checkFirstPrinciplesGate(params) {
|
|
513
|
+
if (!params.ctx)
|
|
514
|
+
return { allowed: true, not_applicable_with_reason: "无任务上下文" };
|
|
515
|
+
const triggered = requiresFirstPrinciples(params.ctx, params.route);
|
|
516
|
+
if (!triggered) {
|
|
517
|
+
return { allowed: true, not_applicable_with_reason: "非高影响任务场景,跳过 first principles gate" };
|
|
518
|
+
}
|
|
519
|
+
const fpFrame = params.ctx.first_principles_frame;
|
|
520
|
+
if (!fpFrame) {
|
|
521
|
+
return { allowed: false, reason_zh: "高影响任务缺 first_principles_frame,无法执行第一性原理校验" };
|
|
522
|
+
}
|
|
523
|
+
const fpModule = await lazyFirstPrinciples();
|
|
524
|
+
const validation = fpModule.validateFirstPrinciplesForHighImpact(fpFrame);
|
|
525
|
+
if (!validation.passed) {
|
|
526
|
+
return { allowed: false, reason_zh: `高影响任务缺第一性原理推理: ${validation.violations.join("; ")}`, failures: validation.violations };
|
|
527
|
+
}
|
|
528
|
+
return { allowed: true };
|
|
529
|
+
}
|
|
530
|
+
/**
|
|
531
|
+
* 脑暴/方案探索门 — 不确定项需多方案+推荐理由+用户确认。
|
|
532
|
+
* 问题四十一-brainstorm: Brainstorm Contract enforcement。
|
|
533
|
+
* 不依赖 hasInstructionContract — 触发由 requiresBrainstorm 判定。
|
|
534
|
+
*/
|
|
535
|
+
export async function checkBrainstormGate(params) {
|
|
536
|
+
if (!params.ctx)
|
|
537
|
+
return { allowed: true, not_applicable_with_reason: "无任务上下文" };
|
|
538
|
+
const triggered = requiresBrainstorm(params.ctx, params.route);
|
|
539
|
+
if (!triggered) {
|
|
540
|
+
return { allowed: true, not_applicable_with_reason: "非不确定/方案选择场景,跳过 brainstorm gate" };
|
|
541
|
+
}
|
|
542
|
+
const brainstormSession = params.ctx.brainstorm_session;
|
|
543
|
+
if (!brainstormSession) {
|
|
544
|
+
return { allowed: false, reason_zh: "不确定项/方案选择缺 brainstorm_session,无法执行方案探索校验" };
|
|
545
|
+
}
|
|
546
|
+
const brainstormModule = await lazyBrainstormContract();
|
|
547
|
+
const validation = brainstormModule.validateBrainstormSession(brainstormSession);
|
|
548
|
+
if (!validation.valid) {
|
|
549
|
+
return { allowed: false, reason_zh: `方案探索不完整: ${validation.violations.join("; ")}`, violations: validation.violations };
|
|
550
|
+
}
|
|
551
|
+
// 脑暴推荐永远不能自动执行 — 需 Decision Sovereignty human gate
|
|
552
|
+
const canAutoExec = brainstormModule.canBrainstormAutoExecute(brainstormSession);
|
|
553
|
+
if (canAutoExec) {
|
|
554
|
+
return { allowed: false, reason_zh: "脑暴推荐不能绕过用户确认,需通过 Decision Sovereignty human gate" };
|
|
555
|
+
}
|
|
556
|
+
return { allowed: true };
|
|
557
|
+
}
|
|
558
|
+
/**
|
|
559
|
+
*/
|
|
560
|
+
export async function assessCepAfterVerification(params) {
|
|
561
|
+
const cepModule = await import("../../engine/core_experience_principle.js");
|
|
562
|
+
const result = cepModule.evaluateCoreExperiencePrinciple({
|
|
563
|
+
task_id: params.task_id,
|
|
564
|
+
workflow_id: "sf_verify",
|
|
565
|
+
has_mainline_hooks: true,
|
|
566
|
+
has_owner_contracts: true,
|
|
567
|
+
natural_language_entry: true,
|
|
568
|
+
requires_internal_contract_knowledge: false,
|
|
569
|
+
user_path_steps: 3,
|
|
570
|
+
has_failures: params.has_failures ?? false,
|
|
571
|
+
hard_fail_downgraded: params.hard_fail_downgraded ?? false,
|
|
572
|
+
forced_heavy_process: false,
|
|
573
|
+
has_sufficient_evidence: params.has_verification_evidence,
|
|
574
|
+
output_too_long_no_summary: false,
|
|
575
|
+
report_only_no_repair: false,
|
|
576
|
+
failed_but_marked_done: params.failed_but_marked_done ?? false,
|
|
577
|
+
auto_repair_overreach: false,
|
|
578
|
+
repair_reverified: false,
|
|
579
|
+
outputs_raw_noise: false,
|
|
580
|
+
});
|
|
581
|
+
return {
|
|
582
|
+
passed: result.passed,
|
|
583
|
+
violations: result.violations.map((v) => ({
|
|
584
|
+
principle: v.principle,
|
|
585
|
+
severity: v.severity,
|
|
586
|
+
reason_zh: v.reason_zh ?? "",
|
|
587
|
+
required_action: v.required_action,
|
|
588
|
+
})),
|
|
589
|
+
evaluated_principles: result.evaluated_principles,
|
|
590
|
+
};
|
|
591
|
+
}
|
|
592
|
+
/**
|
|
593
|
+
* CEP 集成: 交付前 false completion 检查 — 从 sf_deliver handler 提取的真实主链路函数。
|
|
594
|
+
* 返回 CEP 决策(blocked/repair_reverify/allowed),由 handler 和 gate 共用。
|
|
595
|
+
*/
|
|
596
|
+
export async function assessCepBeforeDelivery(params) {
|
|
597
|
+
const cepModule = await import("../../engine/core_experience_principle.js");
|
|
598
|
+
const nfcResult = cepModule.evaluateNoFalseCompletion({
|
|
599
|
+
verification_passed: params.verification_passed,
|
|
600
|
+
build_passed: params.build_passed,
|
|
601
|
+
browser_acceptance_passed: params.browser_acceptance_passed,
|
|
602
|
+
guard_passed: params.guard_passed,
|
|
603
|
+
evidence_sufficient: params.evidence_sufficient,
|
|
604
|
+
current_status: params.current_status,
|
|
605
|
+
});
|
|
606
|
+
return {
|
|
607
|
+
decision: nfcResult.decision,
|
|
608
|
+
reason_zh: nfcResult.reason_zh ?? "",
|
|
609
|
+
passed: nfcResult.decision === "completed",
|
|
610
|
+
};
|
|
611
|
+
}
|
|
612
|
+
/**
|
|
613
|
+
* CEP 集成: 工作流解析后评估 — 检查机制是否接入真实主链路、用户路径是否过短。
|
|
614
|
+
*/
|
|
615
|
+
export async function assessCepAfterWorkflowResolve(params) {
|
|
616
|
+
const cepModule = await import("../../engine/core_experience_principle.js");
|
|
617
|
+
const result = cepModule.evaluateCoreExperiencePrinciple({
|
|
618
|
+
task_id: params.task_id,
|
|
619
|
+
workflow_id: "workflow_resolve",
|
|
620
|
+
has_mainline_hooks: params.workflow_resolved,
|
|
621
|
+
has_owner_contracts: params.workflow_resolved,
|
|
622
|
+
natural_language_entry: true,
|
|
623
|
+
requires_internal_contract_knowledge: false,
|
|
624
|
+
user_path_steps: 3,
|
|
625
|
+
has_failures: !params.workflow_resolved,
|
|
626
|
+
hard_fail_downgraded: false,
|
|
627
|
+
forced_heavy_process: false,
|
|
628
|
+
has_sufficient_evidence: params.workflow_resolved,
|
|
629
|
+
output_too_long_no_summary: false,
|
|
630
|
+
report_only_no_repair: false,
|
|
631
|
+
failed_but_marked_done: false,
|
|
632
|
+
auto_repair_overreach: false,
|
|
633
|
+
repair_reverified: false,
|
|
634
|
+
outputs_raw_noise: false,
|
|
635
|
+
});
|
|
636
|
+
return {
|
|
637
|
+
passed: result.passed,
|
|
638
|
+
violations: result.violations.map((v) => ({
|
|
639
|
+
principle: v.principle,
|
|
640
|
+
severity: v.severity,
|
|
641
|
+
reason_zh: v.reason_zh ?? "",
|
|
642
|
+
})),
|
|
643
|
+
evaluated_principles: result.evaluated_principles,
|
|
644
|
+
};
|
|
645
|
+
}
|
|
646
|
+
/**
|
|
647
|
+
* CEP 集成: 护栏评估后检查 — 硬规则是否被降级、低风险是否过重。
|
|
648
|
+
*/
|
|
649
|
+
export async function assessCepAfterGuardEvaluation(params) {
|
|
650
|
+
const cepModule = await import("../../engine/core_experience_principle.js");
|
|
651
|
+
const result = cepModule.evaluateCoreExperiencePrinciple({
|
|
652
|
+
task_id: params.task_id,
|
|
653
|
+
workflow_id: "guard_evaluation",
|
|
654
|
+
has_mainline_hooks: true,
|
|
655
|
+
has_owner_contracts: true,
|
|
656
|
+
natural_language_entry: true,
|
|
657
|
+
requires_internal_contract_knowledge: false,
|
|
658
|
+
user_path_steps: 3,
|
|
659
|
+
has_failures: !params.guard_passed,
|
|
660
|
+
hard_fail_downgraded: params.hard_fail_downgraded,
|
|
661
|
+
forced_heavy_process: params.is_low_risk && !params.guard_passed,
|
|
662
|
+
has_sufficient_evidence: params.guard_passed,
|
|
663
|
+
output_too_long_no_summary: false,
|
|
664
|
+
report_only_no_repair: false,
|
|
665
|
+
failed_but_marked_done: false,
|
|
666
|
+
auto_repair_overreach: false,
|
|
667
|
+
repair_reverified: false,
|
|
668
|
+
outputs_raw_noise: false,
|
|
669
|
+
});
|
|
670
|
+
return {
|
|
671
|
+
passed: result.passed,
|
|
672
|
+
violations: result.violations.map((v) => ({
|
|
673
|
+
principle: v.principle,
|
|
674
|
+
severity: v.severity,
|
|
675
|
+
reason_zh: v.reason_zh ?? "",
|
|
676
|
+
})),
|
|
677
|
+
evaluated_principles: result.evaluated_principles,
|
|
678
|
+
};
|
|
679
|
+
}
|
|
680
|
+
/**
|
|
681
|
+
* CEP 集成: 修复重验证决策 — 检查是否假完成、是否进入正确修复路径。
|
|
682
|
+
*/
|
|
683
|
+
export async function assessCepForRepairReverify(params) {
|
|
684
|
+
const cepModule = await import("../../engine/core_experience_principle.js");
|
|
685
|
+
const nfcResult = cepModule.evaluateNoFalseCompletion({
|
|
686
|
+
verification_passed: params.verification_passed,
|
|
687
|
+
build_passed: params.build_passed,
|
|
688
|
+
browser_acceptance_passed: true,
|
|
689
|
+
guard_passed: true,
|
|
690
|
+
evidence_sufficient: params.evidence_sufficient,
|
|
691
|
+
current_status: params.current_status,
|
|
692
|
+
});
|
|
693
|
+
return {
|
|
694
|
+
decision: nfcResult.decision,
|
|
695
|
+
reason_zh: nfcResult.reason_zh ?? "",
|
|
696
|
+
passed: nfcResult.decision === "completed",
|
|
697
|
+
};
|
|
698
|
+
}
|
|
699
|
+
/**
|
|
700
|
+
* CEP 集成: 用户反馈输出质量 — 检查结论优先、摘要清晰、不隐藏失败、中文语义。
|
|
701
|
+
*/
|
|
702
|
+
export async function assessCepForUserFeedback(params) {
|
|
703
|
+
const cepModule = await import("../../engine/core_experience_principle.js");
|
|
704
|
+
return cepModule.evaluateUserVisibleOutput({
|
|
705
|
+
has_conclusion_first: params.has_conclusion_first,
|
|
706
|
+
has_clear_summary: params.has_clear_summary,
|
|
707
|
+
has_actionable_next_step: params.has_actionable_next_step,
|
|
708
|
+
exposes_internal_noise: params.exposes_internal_noise,
|
|
709
|
+
hides_critical_failure: params.hides_critical_failure,
|
|
710
|
+
chinese_semantic_first: params.chinese_semantic_first,
|
|
711
|
+
});
|
|
712
|
+
}
|
|
191
713
|
/**
|
|
192
714
|
* 注册所有 MCP 工具到服务器实例。
|
|
193
715
|
* @param server - McpServer 实例
|
|
194
716
|
* @param deps - 工具依赖项(配置、知识索引、任务上下文)
|
|
195
717
|
*/
|
|
196
718
|
export async function registerTools(server, deps) {
|
|
197
|
-
|
|
719
|
+
debug("工具注册", "开始注册 MCP 工具...");
|
|
198
720
|
const { config, knowledgeIndex, taskContext } = deps;
|
|
199
721
|
const projectPath = config._projectPath || process.cwd();
|
|
200
722
|
// H1: LLM Gateway — Token 预算熔断,防止单任务 Token 超支
|
|
@@ -349,6 +871,91 @@ export async function registerTools(server, deps) {
|
|
|
349
871
|
// read_only_bypass 的旁路处理
|
|
350
872
|
const bypass = effectiveCategory === "read_only_bypass"
|
|
351
873
|
? { allowed: true, reason: "read_only" } : undefined;
|
|
874
|
+
// 计划前置门: 在合同验证之前检查 — 写工具必须有 plan_proposal_gate
|
|
875
|
+
const hasWriteEffect = hasWriteSideEffect(effectiveSideEffects);
|
|
876
|
+
if (hasWriteEffect && taskId) {
|
|
877
|
+
const pgResult = checkWriteToolPlanGate({ ctx, toolName: name, sideEffects: effectiveSideEffects });
|
|
878
|
+
if (!pgResult.allowed) {
|
|
879
|
+
const planViolation = {
|
|
880
|
+
invocation_id: invocationId, tool_name: name,
|
|
881
|
+
violation_type: "guard_blocked", severity: "hard_fail",
|
|
882
|
+
reason: pgResult.reason ?? "执行前缺少 Plan Proposal Gate",
|
|
883
|
+
recovery: "先调用 sf_classify → sf_expand → 设置 plan_proposal_gate 后再执行此工具",
|
|
884
|
+
};
|
|
885
|
+
const blockedTrace = createToolTrace({
|
|
886
|
+
tool_name: name, invocation_id: invocationId, task_id: taskId,
|
|
887
|
+
actual_side_effects: effectiveSideEffects,
|
|
888
|
+
next_allowed_tools: contract.default_next_tools,
|
|
889
|
+
forbidden_tools: contract.forbidden_next_tools,
|
|
890
|
+
authorization, bypass,
|
|
891
|
+
});
|
|
892
|
+
await taskContext.setToolTrace(taskId, blockedTrace, [planViolation]);
|
|
893
|
+
return {
|
|
894
|
+
content: [{ type: "text", text: JSON.stringify({
|
|
895
|
+
error: planViolation.reason,
|
|
896
|
+
violation: planViolation,
|
|
897
|
+
diagnostic_code: pgResult.diagnostic_code ?? "SF-PLAN-5001",
|
|
898
|
+
recovery: planViolation.recovery,
|
|
899
|
+
}) }],
|
|
900
|
+
isError: true,
|
|
901
|
+
};
|
|
902
|
+
}
|
|
903
|
+
const planGateCheck = taskContext.checkPlanGateBeforeWrite(ctx);
|
|
904
|
+
if (!planGateCheck.allowed) {
|
|
905
|
+
const planViolation = {
|
|
906
|
+
invocation_id: invocationId, tool_name: name,
|
|
907
|
+
violation_type: "guard_blocked", severity: "hard_fail",
|
|
908
|
+
reason: planGateCheck.reason_zh,
|
|
909
|
+
recovery: "请先通过 PlanProposalFirstGate 生成并确认执行计划",
|
|
910
|
+
};
|
|
911
|
+
const blockedTrace = createToolTrace({
|
|
912
|
+
tool_name: name, invocation_id: invocationId, task_id: taskId,
|
|
913
|
+
actual_side_effects: effectiveSideEffects,
|
|
914
|
+
next_allowed_tools: contract.default_next_tools,
|
|
915
|
+
forbidden_tools: contract.forbidden_next_tools,
|
|
916
|
+
authorization, bypass,
|
|
917
|
+
});
|
|
918
|
+
await taskContext.setToolTrace(taskId, blockedTrace, [planViolation]);
|
|
919
|
+
return {
|
|
920
|
+
content: [{ type: "text", text: JSON.stringify({
|
|
921
|
+
error: planViolation.reason,
|
|
922
|
+
violation: planViolation,
|
|
923
|
+
diagnostic_code: "SF-PLAN-5001",
|
|
924
|
+
recovery: planViolation.recovery,
|
|
925
|
+
}) }],
|
|
926
|
+
isError: true,
|
|
927
|
+
};
|
|
928
|
+
}
|
|
929
|
+
}
|
|
930
|
+
// 施工指令契约门: 写操作前检查 instruction_contract 状态
|
|
931
|
+
if (hasWriteEffect && taskId) {
|
|
932
|
+
const instrResult = await checkInstructionContractGate({ ctx, toolName: name, sideEffects: effectiveSideEffects, task_id: taskId, taskContextMgr: taskContext });
|
|
933
|
+
if (!instrResult.allowed) {
|
|
934
|
+
const instrViolation = {
|
|
935
|
+
invocation_id: invocationId, tool_name: name,
|
|
936
|
+
violation_type: "guard_blocked", severity: "hard_fail",
|
|
937
|
+
reason: instrResult.reason ?? "施工指令未就绪",
|
|
938
|
+
recovery: "请先完善施工指令(目标、范围、非目标、落点、验收标准、禁止绕过项)",
|
|
939
|
+
};
|
|
940
|
+
const instrTrace = createToolTrace({
|
|
941
|
+
tool_name: name, invocation_id: invocationId, task_id: taskId,
|
|
942
|
+
actual_side_effects: effectiveSideEffects,
|
|
943
|
+
next_allowed_tools: contract.default_next_tools,
|
|
944
|
+
forbidden_tools: contract.forbidden_next_tools,
|
|
945
|
+
authorization, bypass,
|
|
946
|
+
});
|
|
947
|
+
await taskContext.setToolTrace(taskId, instrTrace, [instrViolation]);
|
|
948
|
+
return {
|
|
949
|
+
content: [{ type: "text", text: JSON.stringify({
|
|
950
|
+
error: instrViolation.reason,
|
|
951
|
+
violation: instrViolation,
|
|
952
|
+
diagnostic_code: instrResult.diagnostic_code ?? "SF-INSTR-5801",
|
|
953
|
+
recovery: instrViolation.recovery,
|
|
954
|
+
}) }],
|
|
955
|
+
isError: true,
|
|
956
|
+
};
|
|
957
|
+
}
|
|
958
|
+
}
|
|
352
959
|
// 合同验证
|
|
353
960
|
const lastTrace = ctx?.last_tool_trace;
|
|
354
961
|
// 为动态工具构建有效的合同覆盖(如 sf_status cancel)
|
|
@@ -468,7 +1075,7 @@ export async function registerTools(server, deps) {
|
|
|
468
1075
|
}
|
|
469
1076
|
// 加载认知锚点上下文 — 必须提供相关性参数,禁止全量加载
|
|
470
1077
|
async function loadRelevantAnchors(query) {
|
|
471
|
-
|
|
1078
|
+
debug("工具注册", "加载认知锚点");
|
|
472
1079
|
return _loadRelevantAnchorsInner(query);
|
|
473
1080
|
}
|
|
474
1081
|
async function _loadRelevantAnchorsInner(query) {
|
|
@@ -522,7 +1129,7 @@ export async function registerTools(server, deps) {
|
|
|
522
1129
|
stale_anchor: a.stale_anchor,
|
|
523
1130
|
}));
|
|
524
1131
|
}
|
|
525
|
-
|
|
1132
|
+
debug("工具注册", "批量注册核心/辅助/知识维护工具...");
|
|
526
1133
|
// ── sf_classify: 意图分类入口,创建任务上下文并返回分类结果 ──
|
|
527
1134
|
registerSafeTool("sf_classify", "分析开发者意图,返回任务类型、风险、复杂度和执行策略", ClassifySchema, async (args) => {
|
|
528
1135
|
// 检查是否存在进行中的任务
|
|
@@ -640,6 +1247,101 @@ export async function registerTools(server, deps) {
|
|
|
640
1247
|
gateway.endTask();
|
|
641
1248
|
}
|
|
642
1249
|
expansion.task_id = args.task_id;
|
|
1250
|
+
// 问题四十九/五十: 架构设计 Contract + 现有系统分析门 — 仅在有施工指令契约时强制执行
|
|
1251
|
+
const expansionRoute = expansion.workflow_trace
|
|
1252
|
+
? expansion.workflow_trace?.route
|
|
1253
|
+
: undefined;
|
|
1254
|
+
const hasInstructionContract = !!ctx?.instruction_contract;
|
|
1255
|
+
if (hasInstructionContract) {
|
|
1256
|
+
if (expansionRoute === "artifact_generation" || expansionRoute === "analysis") {
|
|
1257
|
+
const archGate = await checkArchitectureDesignGate({ ctx, route: expansionRoute });
|
|
1258
|
+
if (!archGate.allowed) {
|
|
1259
|
+
return {
|
|
1260
|
+
result: {
|
|
1261
|
+
error: archGate.reason_zh,
|
|
1262
|
+
architecture_gate_findings: archGate.findings,
|
|
1263
|
+
status: "blocked",
|
|
1264
|
+
recovery: "架构设计审查未通过,请补充缺失项后重新 sf_expand",
|
|
1265
|
+
},
|
|
1266
|
+
};
|
|
1267
|
+
}
|
|
1268
|
+
}
|
|
1269
|
+
if (expansionRoute === "code_change" || expansionRoute === "artifact_generation") {
|
|
1270
|
+
const analysisGate = await checkExistingSystemAnalysisGate({
|
|
1271
|
+
hasExistingCode: !!config?.tech_stack,
|
|
1272
|
+
hasPackageJson: !!projectPath,
|
|
1273
|
+
hasSrcDir: true,
|
|
1274
|
+
hasAnalysis: !!ctx.existing_system_analysis,
|
|
1275
|
+
hasGapAnalysis: !!ctx.requirement_gap_analysis,
|
|
1276
|
+
});
|
|
1277
|
+
if (!analysisGate.allowed) {
|
|
1278
|
+
return {
|
|
1279
|
+
result: {
|
|
1280
|
+
error: `现有系统分析门禁未通过: ${analysisGate.reason_zh}`,
|
|
1281
|
+
missing_analysis: analysisGate.missing_analysis,
|
|
1282
|
+
status: "blocked",
|
|
1283
|
+
recovery: "请先对现有项目执行系统分析和差距分析,再继续架构设计或编码",
|
|
1284
|
+
},
|
|
1285
|
+
};
|
|
1286
|
+
}
|
|
1287
|
+
}
|
|
1288
|
+
}
|
|
1289
|
+
// ── S4 gates: 独立于 hasInstructionContract,由 requires* 触发判定 ──
|
|
1290
|
+
// 问题十六: 技术选型决策主权 gate — 高影响技术决策缺证据时 blocked
|
|
1291
|
+
{
|
|
1292
|
+
const decisionGate = await checkDecisionSovereigntyGate({ ctx, route: expansionRoute });
|
|
1293
|
+
if (!decisionGate.allowed) {
|
|
1294
|
+
return {
|
|
1295
|
+
result: {
|
|
1296
|
+
error: decisionGate.reason_zh,
|
|
1297
|
+
status: "blocked",
|
|
1298
|
+
recovery: decisionGate.requires_human_gate ? "请提供技术决策确认证据(human_gate_evidence)" : "技术选型决策校验失败,请提供 technology_decision_contract",
|
|
1299
|
+
},
|
|
1300
|
+
};
|
|
1301
|
+
}
|
|
1302
|
+
}
|
|
1303
|
+
// 问题二十六: 细节纪律 gate — 复杂任务缺关键细节时 blocked
|
|
1304
|
+
{
|
|
1305
|
+
const detailGate = await checkDetailDisciplineGate({ ctx, route: expansionRoute });
|
|
1306
|
+
if (!detailGate.allowed) {
|
|
1307
|
+
return {
|
|
1308
|
+
result: {
|
|
1309
|
+
error: detailGate.reason_zh,
|
|
1310
|
+
missing_details: detailGate.missing_details,
|
|
1311
|
+
status: "blocked",
|
|
1312
|
+
recovery: "多步骤/复杂任务缺 detail_discipline_contract,请提供后重新 sf_expand",
|
|
1313
|
+
},
|
|
1314
|
+
};
|
|
1315
|
+
}
|
|
1316
|
+
}
|
|
1317
|
+
// 问题二十七: 第一性原理 gate — 高影响任务缺推理时 blocked
|
|
1318
|
+
{
|
|
1319
|
+
const fpGate = await checkFirstPrinciplesGate({ ctx, route: expansionRoute });
|
|
1320
|
+
if (!fpGate.allowed) {
|
|
1321
|
+
return {
|
|
1322
|
+
result: {
|
|
1323
|
+
error: fpGate.reason_zh,
|
|
1324
|
+
failures: fpGate.failures,
|
|
1325
|
+
status: "blocked",
|
|
1326
|
+
recovery: "高影响任务缺 first_principles_frame,请提供后重新 sf_expand",
|
|
1327
|
+
},
|
|
1328
|
+
};
|
|
1329
|
+
}
|
|
1330
|
+
}
|
|
1331
|
+
// 问题四十一(brainstorm): 脑暴契约 gate — 不确定项缺方案探索时 blocked
|
|
1332
|
+
{
|
|
1333
|
+
const brainstormGate = await checkBrainstormGate({ ctx, route: expansionRoute });
|
|
1334
|
+
if (!brainstormGate.allowed) {
|
|
1335
|
+
return {
|
|
1336
|
+
result: {
|
|
1337
|
+
error: brainstormGate.reason_zh,
|
|
1338
|
+
violations: brainstormGate.violations,
|
|
1339
|
+
status: "blocked",
|
|
1340
|
+
recovery: "不确定项/方案选择缺 brainstorm_session,请提供后重新 sf_expand",
|
|
1341
|
+
},
|
|
1342
|
+
};
|
|
1343
|
+
}
|
|
1344
|
+
}
|
|
643
1345
|
// Input Material Contract: 处理 hard-blocking 结果
|
|
644
1346
|
// Privacy Gate: 隐私/敏感信息策略阻断
|
|
645
1347
|
const isBlocked = expansion.prompt.startsWith("## 阻塞:输入材料禁止读取")
|
|
@@ -763,22 +1465,22 @@ export async function registerTools(server, deps) {
|
|
|
763
1465
|
: undefined;
|
|
764
1466
|
const verifyResult = (await lazyVerifier()).generateVerifyCommands(config, args.changed_files, acceptanceItems, ctx?.expansion?.workflow_trace?.route);
|
|
765
1467
|
verifyResult.task_id = args.task_id;
|
|
766
|
-
//
|
|
1468
|
+
// 创建 VerificationPlan(plan_only,非执行结果)
|
|
767
1469
|
const vcModule = await lazyVerificationContract();
|
|
768
1470
|
const allCommands = [
|
|
769
1471
|
...(verifyResult.checks?.build ?? []),
|
|
770
1472
|
...(verifyResult.checks?.tests ?? []),
|
|
771
1473
|
].map((c) => c.command);
|
|
772
|
-
const
|
|
773
|
-
//
|
|
1474
|
+
const vPlan = vcModule.createVerificationPlan(args.task_id, allCommands, acceptanceItems.map((a) => a.description));
|
|
1475
|
+
// sf_verify 仅生成计划,不执行命令 — 始终保存 not_executed
|
|
774
1476
|
// 真实执行结果必须通过 recordVerificationExecution 单独录入
|
|
775
|
-
const
|
|
776
|
-
//
|
|
777
|
-
const
|
|
778
|
-
if (
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
await taskContext.save(
|
|
1477
|
+
const vResult = vcModule.createNotExecutedResult(args.task_id, vPlan.plan_id, "sf_verify 生成命令,等待执行");
|
|
1478
|
+
// 存储验证契约到任务上下文
|
|
1479
|
+
const ctxForV = await taskContext.load(args.task_id);
|
|
1480
|
+
if (ctxForV) {
|
|
1481
|
+
ctxForV.verification_plan = vPlan;
|
|
1482
|
+
ctxForV.verification_result = vResult;
|
|
1483
|
+
await taskContext.save(ctxForV);
|
|
782
1484
|
}
|
|
783
1485
|
// 产物生命周期检查: draft → verified 需要 ArtifactVerificationResult.passed
|
|
784
1486
|
let artifactVerificationResult;
|
|
@@ -810,7 +1512,7 @@ export async function registerTools(server, deps) {
|
|
|
810
1512
|
artifactVerificationResult = verifyArtifact(artifact.kind, artifact);
|
|
811
1513
|
}
|
|
812
1514
|
// 记录变更文件
|
|
813
|
-
//
|
|
1515
|
+
// 写入护栏 — 检查变更文件是否在允许范围
|
|
814
1516
|
if (args.changed_files.length > 0) {
|
|
815
1517
|
const guardModule = await lazyEnforcementGuard();
|
|
816
1518
|
const scopePaths = ctx.expansion?.scope?.allowed_paths ?? [];
|
|
@@ -819,7 +1521,7 @@ export async function registerTools(server, deps) {
|
|
|
819
1521
|
if (writeFindings.some((f) => f.blocked)) {
|
|
820
1522
|
return {
|
|
821
1523
|
result: {
|
|
822
|
-
error:
|
|
1524
|
+
error: `写入护栏阻断: ${writeFindings[0].reason_zh}`,
|
|
823
1525
|
blocked_file: cf,
|
|
824
1526
|
guard_id: writeFindings[0].guard_id,
|
|
825
1527
|
},
|
|
@@ -875,9 +1577,37 @@ export async function registerTools(server, deps) {
|
|
|
875
1577
|
const verifyPayload = Object.keys(verifyExtras).length > 0
|
|
876
1578
|
? { ...verifyResult, ...verifyExtras }
|
|
877
1579
|
: { ...verifyResult };
|
|
878
|
-
//
|
|
879
|
-
verifyPayload.
|
|
880
|
-
verifyPayload.
|
|
1580
|
+
// 附加验证契约引用到返回结果
|
|
1581
|
+
verifyPayload.verification_plan = vPlan;
|
|
1582
|
+
verifyPayload.verification_result = vResult;
|
|
1583
|
+
// 验证后核心体验评估
|
|
1584
|
+
try {
|
|
1585
|
+
const hasVerificationEvidence = (verifyResult.checks?.build?.length ?? 0) > 0 || (verifyResult.checks?.tests?.length ?? 0) > 0;
|
|
1586
|
+
const cepEvalResult = await assessCepAfterVerification({
|
|
1587
|
+
task_id: args.task_id,
|
|
1588
|
+
has_verification_evidence: hasVerificationEvidence,
|
|
1589
|
+
});
|
|
1590
|
+
// 将完整 CEP 结果写入 TaskContext
|
|
1591
|
+
const cepModule = await import("../../engine/core_experience_principle.js");
|
|
1592
|
+
const fullCepEval = cepModule.evaluateCoreExperiencePrinciple({
|
|
1593
|
+
task_id: args.task_id, workflow_id: "sf_verify",
|
|
1594
|
+
has_mainline_hooks: true, has_owner_contracts: true, natural_language_entry: true,
|
|
1595
|
+
requires_internal_contract_knowledge: false, user_path_steps: 3,
|
|
1596
|
+
has_failures: false, hard_fail_downgraded: false, forced_heavy_process: false,
|
|
1597
|
+
has_sufficient_evidence: hasVerificationEvidence,
|
|
1598
|
+
output_too_long_no_summary: false, report_only_no_repair: false,
|
|
1599
|
+
failed_but_marked_done: false, auto_repair_overreach: false,
|
|
1600
|
+
repair_reverified: false, outputs_raw_noise: false,
|
|
1601
|
+
});
|
|
1602
|
+
const ctxForCep = await taskContext.load(args.task_id);
|
|
1603
|
+
if (ctxForCep) {
|
|
1604
|
+
ctxForCep.core_experience_evaluation = fullCepEval;
|
|
1605
|
+
await taskContext.save(ctxForCep);
|
|
1606
|
+
}
|
|
1607
|
+
}
|
|
1608
|
+
catch (cepErr) {
|
|
1609
|
+
internalWarn("CEP评估", "评估异常 (task=" + args.task_id + "):", cepErr?.message ?? cepErr);
|
|
1610
|
+
}
|
|
881
1611
|
return {
|
|
882
1612
|
result: verifyPayload,
|
|
883
1613
|
};
|
|
@@ -889,24 +1619,25 @@ export async function registerTools(server, deps) {
|
|
|
889
1619
|
return { result: { error: "任务不存在" } };
|
|
890
1620
|
}
|
|
891
1621
|
// 必须有 VerificationPlan
|
|
892
|
-
|
|
1622
|
+
const currentPlan = ctx.verification_plan ?? ctx.batch2_verification_plan;
|
|
1623
|
+
if (!currentPlan) {
|
|
893
1624
|
return { result: { error: "任务无 VerificationPlan,先执行 sf_verify 生成计划" } };
|
|
894
1625
|
}
|
|
895
1626
|
// plan_id 必须与 TaskContext 中当前 plan 一致
|
|
896
|
-
if (args.plan_id !==
|
|
1627
|
+
if (args.plan_id !== currentPlan.plan_id) {
|
|
897
1628
|
return {
|
|
898
1629
|
result: {
|
|
899
|
-
error: `plan_id 不匹配: 请求 "${args.plan_id}",当前任务计划 "${
|
|
1630
|
+
error: `plan_id 不匹配: 请求 "${args.plan_id}",当前任务计划 "${currentPlan.plan_id}" [SF-VERIFY-5002]`,
|
|
900
1631
|
diagnostic_code: "SF-VERIFY-5002",
|
|
901
1632
|
},
|
|
902
1633
|
};
|
|
903
1634
|
}
|
|
904
1635
|
const vcModule = await lazyVerificationContract();
|
|
905
|
-
const result = vcModule.recordVerificationExecution(args.task_id, args.plan_id, args.execution_records,
|
|
1636
|
+
const result = vcModule.recordVerificationExecution(args.task_id, args.plan_id, args.execution_records, currentPlan);
|
|
906
1637
|
// 持久化到 TaskContext
|
|
907
1638
|
const ctxForSave = await taskContext.load(args.task_id);
|
|
908
1639
|
if (ctxForSave) {
|
|
909
|
-
ctxForSave.
|
|
1640
|
+
ctxForSave.verification_result = result;
|
|
910
1641
|
await taskContext.save(ctxForSave);
|
|
911
1642
|
}
|
|
912
1643
|
return { result };
|
|
@@ -935,7 +1666,7 @@ export async function registerTools(server, deps) {
|
|
|
935
1666
|
: "unknown failure",
|
|
936
1667
|
timestamp: new Date().toISOString(),
|
|
937
1668
|
});
|
|
938
|
-
//
|
|
1669
|
+
// 创建 FailureReport(脱敏,非 raw error_output)
|
|
939
1670
|
const frModule = await lazyFailureReport();
|
|
940
1671
|
const failureClass = args.failure_type;
|
|
941
1672
|
const errorOutput = args.verify_output
|
|
@@ -943,21 +1674,21 @@ export async function registerTools(server, deps) {
|
|
|
943
1674
|
: "unknown failure";
|
|
944
1675
|
const retryCount = (ctx.execution?.attempt_count ?? 0) + 1;
|
|
945
1676
|
const policy = frModule.getRecoveryPolicy(failureClass);
|
|
946
|
-
const
|
|
1677
|
+
const failureReport = frModule.createFailureReport(args.task_id, failureClass, errorOutput, retryCount, policy?.max_retries ?? 0);
|
|
947
1678
|
// 存储 FailureReport 到任务上下文
|
|
948
1679
|
const ctxForFailure = await taskContext.load(args.task_id);
|
|
949
1680
|
if (ctxForFailure) {
|
|
950
|
-
ctxForFailure.
|
|
1681
|
+
ctxForFailure.failure_report = failureReport;
|
|
951
1682
|
await taskContext.save(ctxForFailure);
|
|
952
1683
|
}
|
|
953
|
-
//
|
|
1684
|
+
// verifier 不可用时创建 DegradationEvent
|
|
954
1685
|
if (!args.verify_output) {
|
|
955
1686
|
const degModule = await lazyDegradation();
|
|
956
1687
|
const degradationEvent = degModule.createDegradationEvent(args.task_id, "verifier", "full", "验证器输出不可用,无法判断 build/test 结果", ["verification_execution"]);
|
|
957
1688
|
if (degradationEvent) {
|
|
958
1689
|
const ctxForDeg = await taskContext.load(args.task_id);
|
|
959
1690
|
if (ctxForDeg) {
|
|
960
|
-
ctxForDeg.
|
|
1691
|
+
ctxForDeg.degradation_event = degradationEvent;
|
|
961
1692
|
await taskContext.save(ctxForDeg);
|
|
962
1693
|
}
|
|
963
1694
|
}
|
|
@@ -1062,7 +1793,7 @@ export async function registerTools(server, deps) {
|
|
|
1062
1793
|
await taskContext.autoFailStale();
|
|
1063
1794
|
}
|
|
1064
1795
|
catch (e) {
|
|
1065
|
-
|
|
1796
|
+
internalWarn("autoFailStale", "出错:", e);
|
|
1066
1797
|
}
|
|
1067
1798
|
switch (action) {
|
|
1068
1799
|
case "current": {
|
|
@@ -1360,7 +2091,7 @@ export async function registerTools(server, deps) {
|
|
|
1360
2091
|
}
|
|
1361
2092
|
}
|
|
1362
2093
|
}
|
|
1363
|
-
//
|
|
2094
|
+
// 交付 lease 互斥检查
|
|
1364
2095
|
const leaseModule = await lazyWorkspaceLease();
|
|
1365
2096
|
const deliverLease = leaseModule.acquireLease(args.task_id, "delivery", [projectPath]);
|
|
1366
2097
|
if (deliverLease.lease?.status === "conflicted" || deliverLease.conflicts.length > 0) {
|
|
@@ -1371,18 +2102,39 @@ export async function registerTools(server, deps) {
|
|
|
1371
2102
|
},
|
|
1372
2103
|
};
|
|
1373
2104
|
}
|
|
1374
|
-
//
|
|
2105
|
+
// 交付就绪评估 — delivery_allowed=false 必须阻断交付
|
|
1375
2106
|
const drModule = await lazyDeliveryReadiness();
|
|
1376
2107
|
const guardModule = await lazyEnforcementGuard();
|
|
1377
|
-
const
|
|
1378
|
-
const
|
|
2108
|
+
const currentVResult = ctx.verification_result ?? ctx.batch2_verification_result;
|
|
2109
|
+
const currentVPlan = ctx.verification_plan ?? ctx.batch2_verification_plan;
|
|
2110
|
+
const guardFindings = guardModule.evaluateDeliveryReadinessGuard(currentVResult, currentVPlan);
|
|
2111
|
+
// 问题五十一: 编码就绪门 — 交付前检查 coding readiness
|
|
2112
|
+
const codingGate = await checkCodingReadinessGate({ ctx });
|
|
2113
|
+
if (!codingGate.allowed) {
|
|
2114
|
+
if (deliverLease.lease) {
|
|
2115
|
+
leaseModule.releaseLease(deliverLease.lease.lease_id);
|
|
2116
|
+
}
|
|
2117
|
+
return {
|
|
2118
|
+
result: {
|
|
2119
|
+
error: `编码就绪检查未通过: ${codingGate.reason_zh}`,
|
|
2120
|
+
missing_preconditions: codingGate.missing_preconditions,
|
|
2121
|
+
status: "blocked",
|
|
2122
|
+
recovery: "请先满足编码就绪条件(测试计划、验收标准、主链路入口)",
|
|
2123
|
+
},
|
|
2124
|
+
};
|
|
2125
|
+
}
|
|
2126
|
+
const metricsData = await (await lazyObservability()).collectDeliveryMetricSamples(taskContext.getStateDir());
|
|
2127
|
+
// acceptanceConfig: 从项目配置推断 project_run_mode
|
|
2128
|
+
const projectHasFrontend = config.tech_stack.frontend.lang && config.tech_stack.frontend.lang !== "none";
|
|
2129
|
+
const readinessReport = drModule.evaluateDeliveryReadiness(args.task_id, currentVResult, guardFindings, true, // scope_check — 已在 sf_verify 写入护栏中检查
|
|
1379
2130
|
deliverLease.conflicts.length === 0, // lease_check — 无冲突即通过
|
|
1380
2131
|
true, // privacy_check — 已在任务创建时脱敏
|
|
1381
|
-
true
|
|
2132
|
+
true, // artifact_acceptance — 上面已检查产物状态
|
|
2133
|
+
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
2134
|
// 保存就绪报告到任务上下文
|
|
1383
2135
|
const ctxForReadiness = await taskContext.load(args.task_id);
|
|
1384
2136
|
if (ctxForReadiness) {
|
|
1385
|
-
ctxForReadiness.
|
|
2137
|
+
ctxForReadiness.delivery_readiness = readinessReport;
|
|
1386
2138
|
await taskContext.save(ctxForReadiness);
|
|
1387
2139
|
}
|
|
1388
2140
|
if (!readinessReport.delivery_allowed) {
|
|
@@ -1392,11 +2144,75 @@ export async function registerTools(server, deps) {
|
|
|
1392
2144
|
}
|
|
1393
2145
|
return {
|
|
1394
2146
|
result: {
|
|
1395
|
-
error:
|
|
2147
|
+
error: `交付就绪检查未通过: ${readinessReport.blocking_findings.map((f) => f.message_zh).join("; ")}`,
|
|
1396
2148
|
delivery_readiness: readinessReport,
|
|
1397
2149
|
},
|
|
1398
2150
|
};
|
|
1399
2151
|
}
|
|
2152
|
+
// 问题五十二: 本地验收门 — 前端/全栈交付前必须有本地访问证据(仅在有施工指令契约时强制)
|
|
2153
|
+
const hasInstructionContract = !!ctx?.instruction_contract;
|
|
2154
|
+
if (hasInstructionContract) {
|
|
2155
|
+
const localAcceptanceGate = await checkLocalAcceptanceGate({
|
|
2156
|
+
ctx,
|
|
2157
|
+
hasFrontend: !!projectHasFrontend,
|
|
2158
|
+
hasBackend: !!config.tech_stack,
|
|
2159
|
+
hasDockerCompose: false,
|
|
2160
|
+
hasDockerfile: false,
|
|
2161
|
+
});
|
|
2162
|
+
if (!localAcceptanceGate.allowed) {
|
|
2163
|
+
if (deliverLease.lease) {
|
|
2164
|
+
leaseModule.releaseLease(deliverLease.lease.lease_id);
|
|
2165
|
+
}
|
|
2166
|
+
return {
|
|
2167
|
+
result: {
|
|
2168
|
+
error: `本地验收检查未通过: ${localAcceptanceGate.reason_zh}`,
|
|
2169
|
+
required_but_missing: localAcceptanceGate.required_but_missing,
|
|
2170
|
+
status: "blocked",
|
|
2171
|
+
recovery: "请提供本地运行证据或说明 not_applicable 原因(如纯后端 API 项目)",
|
|
2172
|
+
},
|
|
2173
|
+
};
|
|
2174
|
+
}
|
|
2175
|
+
}
|
|
2176
|
+
// 交付前检查 false completion(通过提取的主链路函数)
|
|
2177
|
+
const cepNfcResult = await assessCepBeforeDelivery({
|
|
2178
|
+
task_id: args.task_id,
|
|
2179
|
+
verification_passed: currentVResult?.status === "passed",
|
|
2180
|
+
build_passed: (currentVResult?.passed_commands ?? 0) > 0,
|
|
2181
|
+
browser_acceptance_passed: ctx.artifact_output?.status === "verified" || ctx.artifact_output === undefined,
|
|
2182
|
+
guard_passed: guardFindings.length === 0 || guardFindings.every((f) => f.severity !== "hard_fail"),
|
|
2183
|
+
evidence_sufficient: (currentVResult?.evidence_ids?.length ?? 0) > 0,
|
|
2184
|
+
current_status: ctx.status === "done" ? "completed" : ctx.status,
|
|
2185
|
+
});
|
|
2186
|
+
if (cepNfcResult.decision === "blocked" || cepNfcResult.decision === "repair_reverify") {
|
|
2187
|
+
if (deliverLease.lease) {
|
|
2188
|
+
leaseModule.releaseLease(deliverLease.lease.lease_id);
|
|
2189
|
+
}
|
|
2190
|
+
const ctxForCep = await taskContext.load(args.task_id);
|
|
2191
|
+
if (ctxForCep) {
|
|
2192
|
+
ctxForCep.core_experience_evaluation = {
|
|
2193
|
+
task_id: args.task_id,
|
|
2194
|
+
workflow_id: "sf_deliver",
|
|
2195
|
+
evaluated_principles: ["auto_repair_no_fake_completion"],
|
|
2196
|
+
violations: [{
|
|
2197
|
+
principle: "auto_repair_no_fake_completion",
|
|
2198
|
+
severity: "blocking",
|
|
2199
|
+
reason_zh: cepNfcResult.reason_zh,
|
|
2200
|
+
evidence_refs: [],
|
|
2201
|
+
required_action: cepNfcResult.decision === "blocked" ? "block_delivery" : "repair_reverify",
|
|
2202
|
+
}],
|
|
2203
|
+
user_facing_summary_zh: `CEP 检查未通过: ${cepNfcResult.reason_zh}`,
|
|
2204
|
+
internal_trace_refs: [],
|
|
2205
|
+
passed: false,
|
|
2206
|
+
};
|
|
2207
|
+
await taskContext.save(ctxForCep);
|
|
2208
|
+
}
|
|
2209
|
+
return {
|
|
2210
|
+
result: {
|
|
2211
|
+
error: `CEP false completion 检查未通过: ${cepNfcResult.reason_zh}`,
|
|
2212
|
+
cep_decision: cepNfcResult.decision,
|
|
2213
|
+
},
|
|
2214
|
+
};
|
|
2215
|
+
}
|
|
1400
2216
|
const result = await (await lazyDelivery()).deliver({
|
|
1401
2217
|
taskContext: ctx,
|
|
1402
2218
|
config,
|
|
@@ -1407,7 +2223,7 @@ export async function registerTools(server, deps) {
|
|
|
1407
2223
|
skipPr: args.skip_pr,
|
|
1408
2224
|
});
|
|
1409
2225
|
await taskContext.setDelivery(args.task_id, result);
|
|
1410
|
-
//
|
|
2226
|
+
// 交付完成后释放 lease
|
|
1411
2227
|
if (deliverLease.lease) {
|
|
1412
2228
|
leaseModule.releaseLease(deliverLease.lease.lease_id);
|
|
1413
2229
|
}
|
|
@@ -1781,7 +2597,7 @@ export async function registerTools(server, deps) {
|
|
|
1781
2597
|
configEntries = resolved.entries;
|
|
1782
2598
|
}
|
|
1783
2599
|
catch (e) {
|
|
1784
|
-
|
|
2600
|
+
internalWarn("配置报告", "解析失败:", e instanceof Error ? e.message : String(e));
|
|
1785
2601
|
}
|
|
1786
2602
|
// 同时包含近期任务上下文中的报告
|
|
1787
2603
|
for (const t of recentTasks) {
|