soloforge 1.4.15 → 1.5.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 +76 -3
- package/dist/adapters/claude_code/claude_md.d.ts +1 -1
- package/dist/adapters/claude_code/claude_md.d.ts.map +1 -1
- package/dist/adapters/claude_code/claude_md.js.map +1 -1
- package/dist/adapters/claude_code/pre_prompt_contract.d.ts +4 -59
- package/dist/adapters/claude_code/pre_prompt_contract.d.ts.map +1 -1
- package/dist/adapters/claude_code/pre_prompt_contract.js +3 -111
- package/dist/adapters/claude_code/pre_prompt_contract.js.map +1 -1
- package/dist/adapters/claude_code/server.d.ts +1 -1
- package/dist/adapters/claude_code/server.d.ts.map +1 -1
- package/dist/adapters/claude_code/server.js.map +1 -1
- package/dist/adapters/claude_code/tools.d.ts +1 -1
- package/dist/adapters/claude_code/tools.d.ts.map +1 -1
- package/dist/adapters/claude_code/tools.js +71 -47
- package/dist/adapters/claude_code/tools.js.map +1 -1
- package/dist/adapters/codex/codex_rules.d.ts +1 -1
- package/dist/adapters/codex/codex_rules.d.ts.map +1 -1
- package/dist/adapters/codex/codex_rules.js +1 -24
- package/dist/adapters/codex/codex_rules.js.map +1 -1
- package/dist/adapters/shared/workflow_template.d.ts +8 -12
- package/dist/adapters/shared/workflow_template.d.ts.map +1 -1
- package/dist/adapters/shared/workflow_template.js +16 -78
- package/dist/adapters/shared/workflow_template.js.map +1 -1
- package/dist/adapters/trae/trae_rules.d.ts +1 -1
- package/dist/adapters/trae/trae_rules.d.ts.map +1 -1
- package/dist/adapters/trae/trae_rules.js +1 -10
- package/dist/adapters/trae/trae_rules.js.map +1 -1
- package/dist/bin/soloforge.d.ts.map +1 -1
- package/dist/bin/soloforge.js +53 -100
- package/dist/bin/soloforge.js.map +1 -1
- package/dist/engine/asset_manifest.d.ts.map +1 -1
- package/dist/engine/asset_manifest.js +118 -120
- package/dist/engine/asset_manifest.js.map +1 -1
- package/dist/engine/audit_pool.js.map +1 -1
- package/dist/engine/capability_registry.js +25 -25
- package/dist/engine/capability_registry.js.map +1 -1
- package/dist/engine/capability_state_store.js.map +1 -1
- package/dist/engine/change_coordinator.d.ts +1 -1
- package/dist/engine/change_coordinator.d.ts.map +1 -1
- package/dist/engine/change_coordinator.js.map +1 -1
- package/dist/engine/classifier.d.ts +1 -1
- package/dist/engine/classifier.d.ts.map +1 -1
- package/dist/engine/classifier.js +1 -1
- package/dist/engine/classifier.js.map +1 -1
- package/dist/engine/code_reviewer.d.ts +1 -1
- package/dist/engine/code_reviewer.d.ts.map +1 -1
- package/dist/engine/code_reviewer.js +1 -1
- package/dist/engine/code_reviewer.js.map +1 -1
- package/dist/engine/confidence_scorer.d.ts +1 -1
- package/dist/engine/confidence_scorer.d.ts.map +1 -1
- package/dist/engine/config_auto_repair.js.map +1 -1
- package/dist/engine/config_precedence_contract.js.map +1 -1
- package/dist/engine/consumable_asset_registry.d.ts +1 -1
- package/dist/engine/consumable_asset_registry.d.ts.map +1 -1
- package/dist/engine/consumable_asset_registry.js +236 -126
- package/dist/engine/consumable_asset_registry.js.map +1 -1
- package/dist/engine/consumption_trace_store.d.ts +40 -6
- package/dist/engine/consumption_trace_store.d.ts.map +1 -1
- package/dist/engine/consumption_trace_store.js +90 -47
- package/dist/engine/consumption_trace_store.js.map +1 -1
- package/dist/engine/contract_guard.d.ts +1 -1
- package/dist/engine/contract_guard.d.ts.map +1 -1
- package/dist/engine/contract_guard.js +9 -8
- package/dist/engine/contract_guard.js.map +1 -1
- package/dist/engine/contract_registry.d.ts.map +1 -1
- package/dist/engine/contract_registry.js +9 -11
- package/dist/engine/contract_registry.js.map +1 -1
- package/dist/engine/control_plane_contract.d.ts.map +1 -1
- package/dist/engine/control_plane_contract.js +7 -3
- package/dist/engine/control_plane_contract.js.map +1 -1
- package/dist/engine/convention_detector.js.map +1 -1
- package/dist/engine/core_engineering_principles.d.ts +1 -1
- package/dist/engine/core_engineering_principles.d.ts.map +1 -1
- package/dist/engine/core_engineering_principles.js +6 -6
- package/dist/engine/core_engineering_principles.js.map +1 -1
- package/dist/engine/core_experience_principle.d.ts +2 -2
- package/dist/engine/core_experience_principle.d.ts.map +1 -1
- package/dist/engine/core_experience_principle.js +4 -4
- package/dist/engine/core_experience_principle.js.map +1 -1
- package/dist/engine/debt_reporter.d.ts +1 -1
- package/dist/engine/debt_reporter.d.ts.map +1 -1
- package/dist/engine/debt_tracker.d.ts +1 -1
- package/dist/engine/debt_tracker.d.ts.map +1 -1
- package/dist/engine/debt_tracker.js.map +1 -1
- package/dist/engine/debugger.d.ts +1 -1
- package/dist/engine/debugger.d.ts.map +1 -1
- package/dist/engine/delivery.d.ts +1 -1
- package/dist/engine/delivery.d.ts.map +1 -1
- package/dist/engine/delivery.js.map +1 -1
- package/dist/engine/delivery_readiness.d.ts +2 -2
- package/dist/engine/delivery_readiness.d.ts.map +1 -1
- package/dist/engine/delivery_readiness.js.map +1 -1
- package/dist/engine/dependency_scanner.d.ts +1 -1
- package/dist/engine/dependency_scanner.d.ts.map +1 -1
- package/dist/engine/design_lifecycle_contract.js +2 -2
- package/dist/engine/design_lifecycle_contract.js.map +1 -1
- package/dist/engine/developer_sovereignty.d.ts +1 -1
- package/dist/engine/developer_sovereignty.d.ts.map +1 -1
- package/dist/engine/developer_sovereignty.js.map +1 -1
- package/dist/engine/diff_ownership_store.js.map +1 -1
- package/dist/engine/dual_layer_mechanism_registry.d.ts +1 -1
- package/dist/engine/dual_layer_mechanism_registry.d.ts.map +1 -1
- package/dist/engine/dual_layer_mechanism_registry.js +206 -84
- package/dist/engine/dual_layer_mechanism_registry.js.map +1 -1
- package/dist/engine/evolution_regression_gate.d.ts +2 -2
- package/dist/engine/evolution_regression_gate.js +3 -3
- package/dist/engine/evolution_regression_gate.js.map +1 -1
- package/dist/engine/evolver.d.ts +1 -1
- package/dist/engine/evolver.d.ts.map +1 -1
- package/dist/engine/evolver.js +1 -1
- package/dist/engine/evolver.js.map +1 -1
- package/dist/engine/expand_pipeline.d.ts +1 -1
- package/dist/engine/expand_pipeline.d.ts.map +1 -1
- package/dist/engine/explicit_asset_registry.d.ts.map +1 -1
- package/dist/engine/explicit_asset_registry.js +641 -268
- package/dist/engine/explicit_asset_registry.js.map +1 -1
- package/dist/engine/exploration.d.ts +1 -1
- package/dist/engine/exploration.d.ts.map +1 -1
- package/dist/engine/extension_platform_contracts.d.ts +2 -4
- package/dist/engine/extension_platform_contracts.d.ts.map +1 -1
- package/dist/engine/extension_platform_contracts.js +2 -3
- package/dist/engine/extension_platform_contracts.js.map +1 -1
- package/dist/engine/extension_scenario_registry.d.ts.map +1 -1
- package/dist/engine/extension_scenario_registry.js +5 -18
- package/dist/engine/extension_scenario_registry.js.map +1 -1
- package/dist/engine/failure_classifier.d.ts +1 -1
- package/dist/engine/failure_classifier.d.ts.map +1 -1
- package/dist/engine/feasibility_checker.d.ts +1 -1
- package/dist/engine/feasibility_checker.d.ts.map +1 -1
- package/dist/engine/foundation_scenario_registry.d.ts +3 -35
- package/dist/engine/foundation_scenario_registry.d.ts.map +1 -1
- package/dist/engine/foundation_scenario_registry.js +4 -181
- package/dist/engine/foundation_scenario_registry.js.map +1 -1
- package/dist/engine/foundation_scenario_runners.js +5 -5
- package/dist/engine/foundation_scenario_runners.js.map +1 -1
- package/dist/engine/gate_checks/checkAdapterLayerConsistency.d.ts +6 -0
- package/dist/engine/gate_checks/checkAdapterLayerConsistency.d.ts.map +1 -0
- package/dist/engine/gate_checks/checkAdapterLayerConsistency.js +117 -0
- package/dist/engine/gate_checks/checkAdapterLayerConsistency.js.map +1 -0
- package/dist/engine/gate_checks/checkCodeObservability.d.ts +6 -0
- package/dist/engine/gate_checks/checkCodeObservability.d.ts.map +1 -0
- package/dist/engine/gate_checks/checkCodeObservability.js +252 -0
- package/dist/engine/gate_checks/checkCodeObservability.js.map +1 -0
- package/dist/engine/gate_checks/checkCodeStyleEnforcement.d.ts +7 -0
- package/dist/engine/gate_checks/checkCodeStyleEnforcement.d.ts.map +1 -0
- package/dist/engine/gate_checks/checkCodeStyleEnforcement.js +73 -0
- package/dist/engine/gate_checks/checkCodeStyleEnforcement.js.map +1 -0
- package/dist/engine/gate_checks/checkControlPlaneTrust.d.ts +9 -0
- package/dist/engine/gate_checks/checkControlPlaneTrust.d.ts.map +1 -0
- package/dist/engine/gate_checks/checkControlPlaneTrust.js +111 -0
- package/dist/engine/gate_checks/checkControlPlaneTrust.js.map +1 -0
- package/dist/engine/gate_checks/checkCriticalProblemConsumption.d.ts +6 -0
- package/dist/engine/gate_checks/checkCriticalProblemConsumption.d.ts.map +1 -0
- package/dist/engine/gate_checks/checkCriticalProblemConsumption.js +476 -0
- package/dist/engine/gate_checks/checkCriticalProblemConsumption.js.map +1 -0
- package/dist/engine/gate_checks/checkDependencyAudit.d.ts +6 -0
- package/dist/engine/gate_checks/checkDependencyAudit.d.ts.map +1 -0
- package/dist/engine/gate_checks/checkDependencyAudit.js +40 -0
- package/dist/engine/gate_checks/checkDependencyAudit.js.map +1 -0
- package/dist/engine/gate_checks/checkDeprecatedCode.d.ts +6 -0
- package/dist/engine/gate_checks/checkDeprecatedCode.d.ts.map +1 -0
- package/dist/engine/gate_checks/checkDeprecatedCode.js +262 -0
- package/dist/engine/gate_checks/checkDeprecatedCode.js.map +1 -0
- package/dist/engine/gate_checks/checkDiagnosticCentralization.d.ts +9 -0
- package/dist/engine/gate_checks/checkDiagnosticCentralization.d.ts.map +1 -0
- package/dist/engine/gate_checks/checkDiagnosticCentralization.js +24 -0
- package/dist/engine/gate_checks/checkDiagnosticCentralization.js.map +1 -0
- package/dist/engine/gate_checks/checkDistFreshness.d.ts +6 -0
- package/dist/engine/gate_checks/checkDistFreshness.d.ts.map +1 -0
- package/dist/engine/gate_checks/checkDistFreshness.js +57 -0
- package/dist/engine/gate_checks/checkDistFreshness.js.map +1 -0
- package/dist/engine/gate_checks/checkDualLayerSemantics.d.ts +6 -0
- package/dist/engine/gate_checks/checkDualLayerSemantics.d.ts.map +1 -0
- package/dist/engine/gate_checks/checkDualLayerSemantics.js +88 -0
- package/dist/engine/gate_checks/checkDualLayerSemantics.js.map +1 -0
- package/dist/engine/gate_checks/checkImplementationContract.d.ts +6 -0
- package/dist/engine/gate_checks/checkImplementationContract.d.ts.map +1 -0
- package/dist/engine/gate_checks/checkImplementationContract.js +90 -0
- package/dist/engine/gate_checks/checkImplementationContract.js.map +1 -0
- package/dist/engine/gate_checks/checkKnowledgeAssetSchemaP0.d.ts +6 -0
- package/dist/engine/gate_checks/checkKnowledgeAssetSchemaP0.d.ts.map +1 -0
- package/dist/engine/gate_checks/checkKnowledgeAssetSchemaP0.js +30 -0
- package/dist/engine/gate_checks/checkKnowledgeAssetSchemaP0.js.map +1 -0
- package/dist/engine/gate_checks/checkKnowledgeLayer.d.ts +6 -0
- package/dist/engine/gate_checks/checkKnowledgeLayer.d.ts.map +1 -0
- package/dist/engine/gate_checks/checkKnowledgeLayer.js +163 -0
- package/dist/engine/gate_checks/checkKnowledgeLayer.js.map +1 -0
- package/dist/engine/gate_checks/checkLongTermMechanization.d.ts +6 -0
- package/dist/engine/gate_checks/checkLongTermMechanization.d.ts.map +1 -0
- package/dist/engine/gate_checks/checkLongTermMechanization.js +55 -0
- package/dist/engine/gate_checks/checkLongTermMechanization.js.map +1 -0
- package/dist/engine/gate_checks/checkMainlineConsumption.d.ts +6 -0
- package/dist/engine/gate_checks/checkMainlineConsumption.d.ts.map +1 -0
- package/dist/engine/gate_checks/checkMainlineConsumption.js +312 -0
- package/dist/engine/gate_checks/checkMainlineConsumption.js.map +1 -0
- package/dist/engine/gate_checks/checkMechanismChain.d.ts +6 -0
- package/dist/engine/gate_checks/checkMechanismChain.d.ts.map +1 -0
- package/dist/engine/gate_checks/checkMechanismChain.js +196 -0
- package/dist/engine/gate_checks/checkMechanismChain.js.map +1 -0
- package/dist/engine/gate_checks/checkMechanismIdentity.d.ts +6 -0
- package/dist/engine/gate_checks/checkMechanismIdentity.d.ts.map +1 -0
- package/dist/engine/gate_checks/checkMechanismIdentity.js +125 -0
- package/dist/engine/gate_checks/checkMechanismIdentity.js.map +1 -0
- package/dist/engine/gate_checks/checkReleaseIssueDesignPath.d.ts +6 -0
- package/dist/engine/gate_checks/checkReleaseIssueDesignPath.d.ts.map +1 -0
- package/dist/engine/gate_checks/checkReleaseIssueDesignPath.js +736 -0
- package/dist/engine/gate_checks/checkReleaseIssueDesignPath.js.map +1 -0
- package/dist/engine/gate_checks/checkStandardAssetCoverage.d.ts +6 -0
- package/dist/engine/gate_checks/checkStandardAssetCoverage.d.ts.map +1 -0
- package/dist/engine/gate_checks/checkStandardAssetCoverage.js +34 -0
- package/dist/engine/gate_checks/checkStandardAssetCoverage.js.map +1 -0
- package/dist/engine/gate_checks/checkStateChainHealth.d.ts +6 -0
- package/dist/engine/gate_checks/checkStateChainHealth.d.ts.map +1 -0
- package/dist/engine/gate_checks/checkStateChainHealth.js +147 -0
- package/dist/engine/gate_checks/checkStateChainHealth.js.map +1 -0
- package/dist/engine/gate_checks/checkTemplateKnowledgeHygiene.d.ts +10 -0
- package/dist/engine/gate_checks/checkTemplateKnowledgeHygiene.d.ts.map +1 -0
- package/dist/engine/gate_checks/checkTemplateKnowledgeHygiene.js +314 -0
- package/dist/engine/gate_checks/checkTemplateKnowledgeHygiene.js.map +1 -0
- package/dist/engine/gate_checks/checkTestPollution.d.ts +6 -0
- package/dist/engine/gate_checks/checkTestPollution.d.ts.map +1 -0
- package/dist/engine/gate_checks/checkTestPollution.js +67 -0
- package/dist/engine/gate_checks/checkTestPollution.js.map +1 -0
- package/dist/engine/gate_checks/checkWorkflowNavigation.d.ts +6 -0
- package/dist/engine/gate_checks/checkWorkflowNavigation.d.ts.map +1 -0
- package/dist/engine/gate_checks/checkWorkflowNavigation.js +168 -0
- package/dist/engine/gate_checks/checkWorkflowNavigation.js.map +1 -0
- package/dist/engine/gate_checks/helpers.d.ts +28 -0
- package/dist/engine/gate_checks/helpers.d.ts.map +1 -0
- package/dist/engine/gate_checks/helpers.js +91 -0
- package/dist/engine/gate_checks/helpers.js.map +1 -0
- package/dist/engine/gate_checks/types.d.ts +38 -0
- package/dist/engine/gate_checks/types.d.ts.map +1 -0
- package/dist/engine/gate_checks/types.js +5 -0
- package/dist/engine/gate_checks/types.js.map +1 -0
- package/dist/engine/governance_report.d.ts +1 -1
- package/dist/engine/governance_report.d.ts.map +1 -1
- package/dist/engine/helpers.d.ts +9 -0
- package/dist/engine/helpers.d.ts.map +1 -0
- package/dist/engine/helpers.js +13 -0
- package/dist/engine/helpers.js.map +1 -0
- package/dist/engine/hook_context_types.d.ts +66 -0
- package/dist/engine/hook_context_types.d.ts.map +1 -0
- package/dist/engine/hook_context_types.js +118 -0
- package/dist/engine/hook_context_types.js.map +1 -0
- package/dist/engine/impact_analyzer.d.ts +1 -1
- package/dist/engine/impact_analyzer.d.ts.map +1 -1
- package/dist/engine/impact_analyzer.js.map +1 -1
- package/dist/engine/input_material_extractor.d.ts.map +1 -1
- package/dist/engine/input_material_extractor.js +10 -9
- package/dist/engine/input_material_extractor.js.map +1 -1
- package/dist/engine/instruction_contract.d.ts +6 -0
- package/dist/engine/instruction_contract.d.ts.map +1 -1
- package/dist/engine/instruction_contract.js +2 -3
- package/dist/engine/instruction_contract.js.map +1 -1
- package/dist/engine/intent_expander.d.ts +10 -1
- package/dist/engine/intent_expander.d.ts.map +1 -1
- package/dist/engine/intent_expander.js +49 -9
- package/dist/engine/intent_expander.js.map +1 -1
- package/dist/engine/intent_router.d.ts +2 -0
- package/dist/engine/intent_router.d.ts.map +1 -1
- package/dist/engine/intent_router.js +1 -1
- package/dist/engine/intent_router.js.map +1 -1
- package/dist/engine/job_manager.js.map +1 -1
- package/dist/engine/knowledge_acceptance_registry.d.ts.map +1 -1
- package/dist/engine/knowledge_acceptance_registry.js +0 -10
- package/dist/engine/knowledge_acceptance_registry.js.map +1 -1
- package/dist/engine/knowledge_asset_consumer.d.ts +1 -1
- package/dist/engine/knowledge_asset_consumer.js +11 -11
- package/dist/engine/knowledge_asset_consumer.js.map +1 -1
- package/dist/engine/knowledge_asset_schema.d.ts +1 -1
- package/dist/engine/knowledge_asset_schema.js +1 -1
- package/dist/engine/knowledge_config_loader.d.ts.map +1 -1
- package/dist/engine/knowledge_config_loader.js +35 -4
- package/dist/engine/knowledge_config_loader.js.map +1 -1
- package/dist/engine/knowledge_injection_boundary.d.ts +1 -1
- package/dist/engine/knowledge_injection_boundary.d.ts.map +1 -1
- package/dist/engine/knowledge_injection_boundary.js +10 -4
- package/dist/engine/knowledge_injection_boundary.js.map +1 -1
- package/dist/engine/knowledge_manager.d.ts +1 -1
- package/dist/engine/knowledge_manager.d.ts.map +1 -1
- package/dist/engine/knowledge_scenario_registry.d.ts.map +1 -1
- package/dist/engine/knowledge_scenario_registry.js +0 -8
- package/dist/engine/knowledge_scenario_registry.js.map +1 -1
- package/dist/engine/knowledge_sovereignty.js.map +1 -1
- package/dist/engine/knowledge_template_contracts.d.ts +0 -1
- package/dist/engine/knowledge_template_contracts.d.ts.map +1 -1
- package/dist/engine/knowledge_template_contracts.js.map +1 -1
- package/dist/engine/legacy_type_migration.d.ts +63 -0
- package/dist/engine/legacy_type_migration.d.ts.map +1 -0
- package/dist/engine/legacy_type_migration.js +227 -0
- package/dist/engine/legacy_type_migration.js.map +1 -0
- package/dist/engine/lifecycle_knowledge_contract.d.ts +1 -1
- package/dist/engine/lifecycle_knowledge_contract.d.ts.map +1 -1
- package/dist/engine/local_docker_acceptance.js.map +1 -1
- package/dist/engine/log_governance.js +1 -1
- package/dist/engine/log_governance.js.map +1 -1
- 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 +79 -14
- package/dist/engine/mechanism_contract_registry.js.map +1 -1
- package/dist/engine/mechanism_health_check.d.ts.map +1 -1
- package/dist/engine/mechanism_health_check.js +2 -3
- package/dist/engine/mechanism_health_check.js.map +1 -1
- package/dist/engine/migration_guard.d.ts +1 -1
- package/dist/engine/migration_guard.d.ts.map +1 -1
- package/dist/engine/mutation_audit.d.ts +1 -1
- package/dist/engine/mutation_audit.d.ts.map +1 -1
- package/dist/engine/next_action_planner.d.ts +1 -1
- package/dist/engine/next_action_planner.d.ts.map +1 -1
- package/dist/engine/next_action_planner.js +32 -36
- package/dist/engine/next_action_planner.js.map +1 -1
- package/dist/engine/observability.d.ts +1 -1
- package/dist/engine/observability.d.ts.map +1 -1
- package/dist/engine/observability.js.map +1 -1
- package/dist/engine/observed_consumption.d.ts.map +1 -1
- package/dist/engine/observed_consumption.js +5 -2
- package/dist/engine/observed_consumption.js.map +1 -1
- package/dist/engine/onboarding.d.ts +1 -1
- package/dist/engine/onboarding.d.ts.map +1 -1
- package/dist/engine/privacy_secret_contract.js +1 -1
- package/dist/engine/privacy_secret_contract.js.map +1 -1
- package/dist/engine/project_knowledge_contract.d.ts +1 -1
- package/dist/engine/project_knowledge_contract.d.ts.map +1 -1
- package/dist/engine/project_knowledge_contract.js +2 -1
- package/dist/engine/project_knowledge_contract.js.map +1 -1
- package/dist/engine/project_stage_detector.js.map +1 -1
- package/dist/engine/regression_matrix.js.map +1 -1
- package/dist/engine/release_issue_scenario_registry.d.ts +1 -3
- package/dist/engine/release_issue_scenario_registry.d.ts.map +1 -1
- package/dist/engine/release_issue_scenario_registry.js +7 -49
- package/dist/engine/release_issue_scenario_registry.js.map +1 -1
- package/dist/engine/release_readiness_gate.d.ts +25 -39
- package/dist/engine/release_readiness_gate.d.ts.map +1 -1
- package/dist/engine/release_readiness_gate.js +129 -3353
- package/dist/engine/release_readiness_gate.js.map +1 -1
- package/dist/engine/release_tool_harness.d.ts +2 -2
- package/dist/engine/release_tool_harness.d.ts.map +1 -1
- package/dist/engine/release_tool_harness.js +1 -1
- package/dist/engine/rollback_router.d.ts +35 -0
- package/dist/engine/rollback_router.d.ts.map +1 -0
- package/dist/engine/rollback_router.js +50 -0
- package/dist/engine/rollback_router.js.map +1 -0
- package/dist/engine/scaffolder.d.ts +1 -1
- package/dist/engine/scaffolder.d.ts.map +1 -1
- package/dist/engine/scope_controller.d.ts +1 -1
- package/dist/engine/scope_controller.d.ts.map +1 -1
- package/dist/engine/scope_controller.js +1 -1
- package/dist/engine/scope_controller.js.map +1 -1
- package/dist/engine/scope_resolver.d.ts +1 -1
- package/dist/engine/scope_resolver.d.ts.map +1 -1
- package/dist/engine/semantic_evidence.d.ts +1 -1
- package/dist/engine/semantic_evidence.d.ts.map +1 -1
- package/dist/engine/slice_executor.d.ts +79 -0
- package/dist/engine/slice_executor.d.ts.map +1 -0
- package/dist/engine/slice_executor.js +100 -0
- package/dist/engine/slice_executor.js.map +1 -0
- package/dist/engine/source_code_matcher.js +1 -1
- package/dist/engine/source_code_matcher.js.map +1 -1
- package/dist/engine/stage_gate_engine.d.ts +32 -0
- package/dist/engine/stage_gate_engine.d.ts.map +1 -0
- package/dist/engine/stage_gate_engine.js +105 -0
- package/dist/engine/stage_gate_engine.js.map +1 -0
- package/dist/engine/stale_current_task_detector.js.map +1 -1
- package/dist/engine/standard_asset_contract.d.ts +1 -1
- package/dist/engine/standard_asset_contract.d.ts.map +1 -1
- package/dist/engine/standard_asset_contract.js +7 -7
- package/dist/engine/standard_asset_contract.js.map +1 -1
- package/dist/engine/standard_asset_coverage.js +19 -19
- package/dist/engine/standard_asset_coverage.js.map +1 -1
- package/dist/engine/task_context.d.ts +6 -6
- package/dist/engine/task_context.d.ts.map +1 -1
- package/dist/engine/task_context.js +22 -20
- package/dist/engine/task_context.js.map +1 -1
- package/dist/engine/task_planner.d.ts +2 -2
- package/dist/engine/task_planner.d.ts.map +1 -1
- package/dist/engine/task_planner.js.map +1 -1
- package/dist/engine/task_stage_detector.d.ts +7 -1
- package/dist/engine/task_stage_detector.d.ts.map +1 -1
- package/dist/engine/task_stage_detector.js +82 -123
- package/dist/engine/task_stage_detector.js.map +1 -1
- package/dist/engine/team_awareness.d.ts +1 -1
- package/dist/engine/team_awareness.d.ts.map +1 -1
- package/dist/engine/team_awareness.js.map +1 -1
- package/dist/engine/template_asset_contract_registry.d.ts +2 -2
- package/dist/engine/template_asset_contract_registry.d.ts.map +1 -1
- package/dist/engine/template_asset_contract_registry.js +37 -10
- package/dist/engine/template_asset_contract_registry.js.map +1 -1
- package/dist/engine/template_asset_visibility.js +1 -1
- package/dist/engine/template_asset_visibility.js.map +1 -1
- package/dist/engine/template_init_sync.d.ts +29 -0
- package/dist/engine/template_init_sync.d.ts.map +1 -1
- package/dist/engine/template_init_sync.js +246 -69
- package/dist/engine/template_init_sync.js.map +1 -1
- package/dist/engine/template_manifest_io.d.ts +1 -1
- package/dist/engine/template_manifest_io.d.ts.map +1 -1
- package/dist/engine/template_manifest_io.js +13 -9
- package/dist/engine/template_manifest_io.js.map +1 -1
- package/dist/engine/template_mechanism_auditor.d.ts +1 -1
- package/dist/engine/template_mechanism_auditor.d.ts.map +1 -1
- package/dist/engine/template_mechanism_auditor.js +10 -10
- package/dist/engine/template_mechanism_auditor.js.map +1 -1
- package/dist/engine/test_generator.d.ts +1 -1
- package/dist/engine/test_generator.d.ts.map +1 -1
- package/dist/engine/test_quality.d.ts +1 -1
- package/dist/engine/test_quality.d.ts.map +1 -1
- package/dist/engine/tool_invocation_contract_registry.js +7 -7
- package/dist/engine/tool_invocation_contract_registry.js.map +1 -1
- package/dist/engine/traceability.d.ts +3 -3
- package/dist/engine/traceability.d.ts.map +1 -1
- package/dist/engine/traceability.js +1 -1
- package/dist/engine/traceability.js.map +1 -1
- package/dist/engine/user_feedback_contract.d.ts +1 -1
- package/dist/engine/user_feedback_contract.d.ts.map +1 -1
- package/dist/engine/user_feedback_contract.js +5 -5
- package/dist/engine/user_feedback_contract.js.map +1 -1
- package/dist/engine/verifier.d.ts +1 -1
- package/dist/engine/verifier.d.ts.map +1 -1
- package/dist/engine/verifier.js +1 -1
- package/dist/engine/verifier.js.map +1 -1
- package/dist/engine/workflow_contract_registry.d.ts +80 -42
- package/dist/engine/workflow_contract_registry.d.ts.map +1 -1
- package/dist/engine/workflow_contract_registry.js +341 -152
- package/dist/engine/workflow_contract_registry.js.map +1 -1
- package/dist/engine/workflow_navigation_contract.d.ts +17 -3
- package/dist/engine/workflow_navigation_contract.d.ts.map +1 -1
- package/dist/engine/workflow_navigation_contract.js +8 -16
- package/dist/engine/workflow_navigation_contract.js.map +1 -1
- package/dist/engine/workflow_rule_generator.d.ts +22 -0
- package/dist/engine/workflow_rule_generator.d.ts.map +1 -0
- package/dist/engine/workflow_rule_generator.js +83 -0
- package/dist/engine/workflow_rule_generator.js.map +1 -0
- package/dist/engine/zero_config_init.js.map +1 -1
- package/dist/knowledge/conflict_detector.d.ts +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 +1 -1
- package/dist/knowledge/health_checker.d.ts.map +1 -1
- package/dist/knowledge/index_manager.d.ts +1 -1
- package/dist/knowledge/index_manager.d.ts.map +1 -1
- package/dist/knowledge/index_manager.js +7 -5
- package/dist/knowledge/index_manager.js.map +1 -1
- package/dist/knowledge/loader.d.ts +1 -1
- package/dist/knowledge/loader.d.ts.map +1 -1
- package/dist/knowledge/loader.js +7 -5
- package/dist/knowledge/loader.js.map +1 -1
- package/dist/knowledge/writer.d.ts +1 -1
- package/dist/knowledge/writer.d.ts.map +1 -1
- package/dist/types/analysis.d.ts +353 -0
- package/dist/types/analysis.d.ts.map +1 -0
- package/dist/types/analysis.js +2 -0
- package/dist/types/analysis.js.map +1 -0
- package/dist/types/base.d.ts +11 -0
- package/dist/types/base.d.ts.map +1 -0
- package/dist/{types.js → types/base.js} +1 -1
- package/dist/types/base.js.map +1 -0
- package/dist/types/config.d.ts +128 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/delivery.d.ts +261 -0
- package/dist/types/delivery.d.ts.map +1 -0
- package/dist/types/delivery.js +2 -0
- package/dist/types/delivery.js.map +1 -0
- package/dist/types/dual_layer.d.ts +97 -0
- package/dist/types/dual_layer.d.ts.map +1 -0
- package/dist/types/dual_layer.js +3 -0
- package/dist/types/dual_layer.js.map +1 -0
- package/dist/types/evidence.d.ts +41 -0
- package/dist/types/evidence.d.ts.map +1 -0
- package/dist/types/evidence.js +3 -0
- package/dist/types/evidence.js.map +1 -0
- package/dist/types/execution.d.ts +31 -0
- package/dist/types/execution.d.ts.map +1 -0
- package/dist/types/execution.js +3 -0
- package/dist/types/execution.js.map +1 -0
- package/dist/types/index.d.ts +13 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +13 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/knowledge.d.ts +105 -0
- package/dist/types/knowledge.d.ts.map +1 -0
- package/dist/types/knowledge.js +5 -0
- package/dist/types/knowledge.js.map +1 -0
- package/dist/types/phase.d.ts +50 -0
- package/dist/types/phase.d.ts.map +1 -0
- package/dist/types/phase.js +3 -0
- package/dist/types/phase.js.map +1 -0
- package/dist/types/pipeline.d.ts +353 -0
- package/dist/types/pipeline.d.ts.map +1 -0
- package/dist/types/pipeline.js +2 -0
- package/dist/types/pipeline.js.map +1 -0
- package/dist/types/review.d.ts +149 -0
- package/dist/types/review.d.ts.map +1 -0
- package/dist/types/review.js +2 -0
- package/dist/types/review.js.map +1 -0
- package/dist/types/task.d.ts +203 -0
- package/dist/types/task.d.ts.map +1 -0
- package/dist/types/task.js +2 -0
- package/dist/types/task.js.map +1 -0
- package/package.json +3 -6
- package/templates/artifacts/existing-system//344/270/200/351/224/256/345/274/200/345/205/263/351/205/215/347/275/256/346/250/241/347/211/210.json +24 -0
- package/templates/artifacts/existing-system//345/216/206/345/217/262/346/225/260/346/215/256/346/270/205/346/264/227/350/204/232/346/234/254/346/250/241/347/211/210.md +44 -0
- package/templates/artifacts/existing-system//345/216/206/345/217/262/351/201/227/347/225/231/351/233/267/345/214/272/346/270/205/345/215/225/346/250/241/347/211/210.md +43 -0
- package/templates/artifacts/existing-system//345/220/221/345/220/216/345/205/274/345/256/271/346/200/247/345/220/210/350/247/204/346/212/245/345/221/212/346/250/241/347/211/210.md +36 -0
- package/templates/artifacts/existing-system//345/242/236/351/207/217/350/276/271/347/225/214/347/225/214/345/256/232/346/226/207/346/241/243/346/250/241/347/211/210.md +36 -0
- package/templates/artifacts/existing-system//346/224/271/351/200/240/345/275/261/345/223/215/350/214/203/345/233/264/350/257/204/344/274/260/346/250/241/347/211/210.md +39 -0
- package/templates/artifacts/existing-system//346/225/260/346/215/256/350/241/200/347/274/230/345/233/276/346/250/241/347/211/210.md +36 -0
- package/templates/artifacts/existing-system//346/226/260/350/200/201/351/200/273/350/276/221/346/257/224/345/257/271/346/227/245/345/277/227/346/250/241/347/211/210.md +29 -0
- package/templates/artifacts/existing-system//347/264/247/346/200/245/345/233/236/346/273/232/346/211/213/345/206/214/346/250/241/347/211/210.md +38 -0
- package/templates/artifacts/existing-system//351/232/224/347/246/273/351/200/202/351/205/215/345/231/250/346/226/271/346/241/210/346/250/241/347/211/210.md +34 -0
- package/templates/artifacts/shared/ADR/346/250/241/347/211/210.md +41 -0
- package/templates/{knowledge/acceptance_templates → artifacts/shared}/API/346/216/245/345/217/243/350/247/204/346/240/274/346/226/207/346/241/243/346/250/241/347/211/210.md +25 -0
- package/templates/artifacts/shared//344/273/243/347/240/201/345/256/241/346/237/245/346/212/245/345/221/212/346/250/241/347/211/210.md +33 -0
- package/templates/artifacts/shared//345/210/207/347/211/207/350/256/241/345/210/222/346/250/241/347/211/210.md +45 -0
- package/templates/{knowledge/acceptance_templates → artifacts/shared}//345/216/237/345/236/213/350/257/264/346/230/216/346/250/241/347/211/210.md +2 -0
- package/templates/{knowledge/acceptance_templates → artifacts/shared}//346/236/266/346/236/204/350/256/276/350/256/241/346/250/241/347/211/210.md +7 -0
- package/templates/gates/existing-system/gate-/347/216/260/346/234/211/347/263/273/347/273/237/345/210/206/346/236/220.yaml +13 -0
- package/templates/gates/existing-system/gate-/347/274/226/347/240/201/344/270/216/345/215/225/345/205/203/346/265/213/350/257/225.yaml +18 -0
- package/templates/gates/existing-system/gate-/350/257/225/350/277/220/350/241/214.yaml +21 -0
- package/templates/gates/shared/gate-/344/273/273/345/212/241/350/247/204/345/210/222.yaml +18 -0
- package/templates/gates/shared/gate-/347/274/226/347/240/201/344/270/216/345/215/225/345/205/203/346/265/213/350/257/225.yaml +14 -0
- package/templates/{knowledge/rules//346/225/217/346/204/237/344/277/241/346/201/257/346/227/245/345/277/227 → internal/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 +42 -19
- package/templates/{knowledge → internal}/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 +2 -0
- package/templates/{knowledge/procedures → procedures}//346/236/266/346/236/204/350/256/276/350/256/241/345/267/245/344/275/234/346/265/201.md +1 -1
- package/templates/{knowledge/procedures → procedures}//347/264/247/346/200/245/344/277/256/345/244/215/346/265/201/346/260/264/347/272/277.md +1 -1
- package/templates/{knowledge/procedures → procedures}//350/260/203/350/257/225/346/216/222/346/237/245/346/265/201/347/250/213.md +1 -1
- package/templates/{knowledge/procedures → procedures}//351/252/214/346/224/266/346/265/213/350/257/225/350/247/204/345/210/222.md +1 -1
- package/templates/rules/existing-system//345/205/274/345/256/271/346/200/247/346/243/200/346/237/245/350/247/204/345/210/231.md +33 -0
- package/templates/rules/existing-system//350/200/246/345/220/210/346/243/200/346/265/213/350/247/204/345/210/231.md +35 -0
- package/templates/rules/existing-system//350/257/225/350/277/220/350/241/214/347/206/224/346/226/255/350/247/204/345/210/231.md +39 -0
- package/templates/rules/existing-system//351/230/262/345/276/241/346/200/247/347/274/226/347/240/201/350/247/204/345/210/231.md +35 -0
- package/templates/rules/existing-system//351/233/267/345/214/272/345/217/215/346/250/241/345/274/217/346/270/205/345/215/225.md +34 -0
- package/templates/rules/new-system//350/201/224/350/260/203/350/256/276/350/256/241/347/274/272/351/231/267/345/210/244/345/256/232/350/247/204/345/210/231.md +36 -0
- package/templates/rules/shared//344/270/200/350/207/264/346/200/247/346/240/241/351/252/214/350/247/204/345/210/231.md +21 -0
- package/templates/rules/shared//350/201/224/350/260/203/351/252/214/350/257/201/346/270/205/345/215/225.md +29 -0
- package/templates/rules/shared//350/246/206/347/233/226/347/216/207/346/240/207/345/207/206.md +26 -0
- package/dist/engine/deprecated_contract.d.ts +0 -21
- package/dist/engine/deprecated_contract.d.ts.map +0 -1
- package/dist/engine/deprecated_contract.js +0 -14
- package/dist/engine/deprecated_contract.js.map +0 -1
- package/dist/engine/historical_issue_mechanization_matrix.d.ts +0 -28
- package/dist/engine/historical_issue_mechanization_matrix.d.ts.map +0 -1
- package/dist/engine/historical_issue_mechanization_matrix.js +0 -134
- package/dist/engine/historical_issue_mechanization_matrix.js.map +0 -1
- package/dist/engine/implementation_roadmap_registry.d.ts +0 -105
- package/dist/engine/implementation_roadmap_registry.d.ts.map +0 -1
- package/dist/engine/implementation_roadmap_registry.js +0 -1340
- package/dist/engine/implementation_roadmap_registry.js.map +0 -1
- package/dist/engine/mechanism_family_registry.d.ts +0 -48
- package/dist/engine/mechanism_family_registry.d.ts.map +0 -1
- package/dist/engine/mechanism_family_registry.js +0 -197
- package/dist/engine/mechanism_family_registry.js.map +0 -1
- package/dist/engine/project_knowledge_system_regression_matrix.d.ts +0 -27
- package/dist/engine/project_knowledge_system_regression_matrix.d.ts.map +0 -1
- package/dist/engine/project_knowledge_system_regression_matrix.js +0 -295
- package/dist/engine/project_knowledge_system_regression_matrix.js.map +0 -1
- package/dist/engine/release_gate.d.ts +0 -29
- package/dist/engine/release_gate.d.ts.map +0 -1
- package/dist/engine/release_gate.js +0 -675
- package/dist/engine/release_gate.js.map +0 -1
- package/dist/types.d.ts +0 -1737
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- package/templates/knowledge/acceptance_templates//346/216/245/345/217/243/350/256/276/350/256/241/346/250/241/347/211/210.md +0 -82
- package/templates/knowledge/procedures//346/236/266/346/236/204/350/256/276/350/256/241/346/265/201/347/250/213.md +0 -57
- package/templates/knowledge/procedures//347/264/247/346/200/245/344/277/256/345/244/215/346/265/201/347/250/213.md +0 -60
- 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 +0 -55
- package/templates/knowledge/procedures//351/252/214/350/257/201/350/256/241/345/210/222/346/265/201/347/250/213.md +0 -59
- 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 +0 -56
- package/templates/knowledge/rules//346/274/224/350/277/233/345/233/236/345/275/222/350/247/204/345/210/231.md +0 -51
- /package/templates/{knowledge/acceptance_templates → artifacts/shared}/Bug/345/210/206/346/236/220/346/250/241/347/211/210.md" +0 -0
- /package/templates/{knowledge/acceptance_templates → artifacts/shared}/OOD/350/256/276/350/256/241/346/221/230/350/246/201/346/250/241/347/211/210.md" +0 -0
- /package/templates/{knowledge/acceptance_templates → artifacts/shared}/POC/347/273/223/350/256/272/346/250/241/347/211/210.md" +0 -0
- /package/templates/{knowledge/acceptance_templates → artifacts/shared}//344/273/243/347/240/201/346/263/250/351/207/212/344/270/216/346/227/245/345/277/227/351/252/214/346/224/266/346/250/241/346/235/277.md" +0 -0
- /package/templates/{knowledge/acceptance_templates → artifacts/shared}//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" +0 -0
- /package/templates/{knowledge/acceptance_templates → artifacts/shared}//345/220/216/347/253/257API/351/252/214/346/224/266/346/270/205/345/215/225.md" +0 -0
- /package/templates/{knowledge/acceptance_templates → artifacts/shared}//345/220/216/347/253/257/345/256/236/347/216/260/351/252/214/346/224/266/346/270/205/345/215/225.md" +0 -0
- /package/templates/{knowledge/acceptance_templates → artifacts/shared}//345/256/211/345/205/250/345/256/241/350/256/241/346/250/241/347/211/210.md" +0 -0
- /package/templates/{knowledge/templates → artifacts/shared}//345/256/241/346/237/245/346/221/230/350/246/201.md" +0 -0
- /package/templates/{knowledge/acceptance_templates → artifacts/shared}//346/200/247/350/203/275/345/210/206/346/236/220/346/250/241/347/211/210.md" +0 -0
- /package/templates/{knowledge/acceptance_templates → artifacts/shared}//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" +0 -0
- /package/templates/{knowledge/acceptance_templates → artifacts/shared}//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" +0 -0
- /package/templates/{knowledge/acceptance_templates → artifacts/shared}//346/225/205/351/232/234/345/244/215/347/233/230/346/250/241/347/211/210.md" +0 -0
- /package/templates/{knowledge/acceptance_templates → artifacts/shared}//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" +0 -0
- /package/templates/{knowledge/acceptance_templates → artifacts/shared}//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" +0 -0
- /package/templates/{knowledge/acceptance_templates → artifacts/shared}//346/225/260/346/215/256/345/272/223/350/256/276/350/256/241/346/226/207/346/241/243/346/250/241/347/211/210.md" +0 -0
- /package/templates/{knowledge/acceptance_templates → artifacts/shared}//346/265/213/350/257/225/350/256/241/345/210/222/346/250/241/347/211/210.md" +0 -0
- /package/templates/{knowledge/acceptance_templates → artifacts/shared}//350/256/276/350/256/241/344/270/200/350/207/264/346/200/247/351/252/214/346/224/266/346/212/245/345/221/212/346/250/241/347/211/210.md" +0 -0
- /package/templates/{knowledge/acceptance_templates → artifacts/shared}//350/257/246/347/273/206/350/256/276/350/256/241/346/250/241/347/211/210.md" +0 -0
- /package/templates/{knowledge/acceptance_templates → artifacts/shared}//350/277/201/347/247/273/350/257/204/344/274/260/346/250/241/347/211/210.md" +0 -0
- /package/templates/{knowledge/acceptance_templates → artifacts/shared}//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" +0 -0
- /package/templates/{knowledge/acceptance_templates → artifacts/shared}//351/207/215/346/236/204/346/226/271/346/241/210/346/250/241/347/211/210.md" +0 -0
- /package/templates/{knowledge/acceptance_templates → artifacts/shared}//351/234/200/346/261/202/345/210/206/346/236/220/346/250/241/347/211/210.md" +0 -0
- /package/templates/{knowledge/acceptance_templates → artifacts/shared}//351/234/200/346/261/202/345/216/237/345/236/213/350/256/276/350/256/241/345/256/236/347/216/260/350/277/275/350/270/252/347/237/251/351/230/265/346/250/241/347/211/210.md" +0 -0
- /package/templates/{knowledge/checklists → 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" +0 -0
- /package/templates/{knowledge/checklists → checklists}//344/274/232/350/257/235/346/201/242/345/244/215.md" +0 -0
- /package/templates/{knowledge/checklists → checklists}//345/267/245/344/275/234/346/265/201/351/252/214/346/224/266/346/270/205/345/215/225.md" +0 -0
- /package/templates/{knowledge/checklists → 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" +0 -0
- /package/templates/{knowledge/checklists → 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" +0 -0
- /package/templates/{knowledge/checklists → checklists}//351/232/220/347/247/201/345/256/241/346/237/245/346/270/205/345/215/225.md" +0 -0
- /package/templates/{knowledge/checklists → checklists}//351/252/214/350/257/201/351/252/214/346/224/266/346/270/205/345/215/225.md" +0 -0
- /package/templates/{knowledge/domain → domain}//345/244/232/347/247/237/346/210/267.md" +0 -0
- /package/templates/{knowledge/domain → domain}//345/256/241/350/256/241/346/227/245/345/277/227.md" +0 -0
- /package/templates/{knowledge/domain → domain}//345/257/274/345/205/245/345/257/274/345/207/272/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge/domain → domain}//345/267/245/344/275/234/346/265/201/345/274/225/346/223/216.md" +0 -0
- /package/templates/{knowledge/domain → domain}//346/212/245/350/241/250/347/273/237/350/256/241.md" +0 -0
- /package/templates/{knowledge/domain → domain}//346/224/257/344/273/230/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge/domain → domain}//346/225/260/346/215/256/346/235/203/351/231/220.md" +0 -0
- /package/templates/{knowledge/domain → domain}//351/200/232/347/224/250/346/234/272/346/242/260/346/235/241/346/254/276.md" +0 -0
- /package/templates/{knowledge/domain → domain}//351/200/232/347/237/245/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge/patterns/core → internal/patterns}/Diff/345/275/222/345/261/236/350/277/275/350/270/252.md" +0 -0
- /package/templates/{knowledge/patterns/core → internal/patterns}/Java/350/264/250/351/207/217/351/227/250/347/246/201.md" +0 -0
- /package/templates/{knowledge/patterns/core → internal/patterns}/LLM/351/242/204/347/256/227/347/275/221/345/205/263.md" +0 -0
- /package/templates/{knowledge/patterns/core → internal/patterns}//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" +0 -0
- /package/templates/{knowledge/patterns/core → internal/patterns}//344/273/273/345/212/241/347/256/241/347/220/206/345/231/250.md" +0 -0
- /package/templates/{knowledge/patterns/core → internal/patterns}//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" +0 -0
- /package/templates/{knowledge/patterns/core → internal/patterns}//344/275/234/347/224/250/345/237/237/347/247/237/347/272/246.md" +0 -0
- /package/templates/{knowledge/patterns/core → internal/patterns}//345/206/262/347/252/201/351/227/250/347/246/201.md" +0 -0
- /package/templates/{knowledge/patterns/core → internal/patterns}//345/206/263/347/255/226/347/275/221/345/205/263.md" +0 -0
- /package/templates/{knowledge/patterns/core → internal/patterns}//345/217/230/345/274/202/345/256/241/350/256/241.md" +0 -0
- /package/templates/{knowledge/patterns/core → internal/patterns}//345/233/236/345/275/222/347/237/251/351/230/265.md" +0 -0
- /package/templates/{knowledge/patterns/core → internal/patterns}//345/267/245/344/275/234/345/214/272/344/272/222/346/226/245/351/224/201.md" +0 -0
- /package/templates/{knowledge/patterns/core → internal/patterns}//345/267/245/344/275/234/345/214/272/345/224/244/351/206/222.md" +0 -0
- /package/templates/{knowledge/patterns/core → internal/patterns}//345/271/266/345/217/221/351/224/201.md" +0 -0
- /package/templates/{knowledge/patterns/core → internal/patterns}//345/274/200/345/217/221/350/200/205/345/256/252/346/263/225.md" +0 -0
- /package/templates/{knowledge/patterns/core → internal/patterns}//346/225/217/346/204/237/344/277/241/346/201/257/346/211/253/346/217/217.md" +0 -0
- /package/templates/{knowledge/patterns/core → internal/patterns}//346/262/273/347/220/206/350/277/220/350/241/214/346/227/266/345/276/252/347/216/257.md" +0 -0
- /package/templates/{knowledge/patterns/core → internal/patterns}//346/265/201/345/274/217/345/277/203/350/267/263.md" +0 -0
- /package/templates/{knowledge/patterns/core → internal/patterns}//347/237/245/350/257/206/344/270/273/346/235/203.md" +0 -0
- /package/templates/{knowledge/patterns/core → internal/patterns}//350/257/255/344/271/211/350/257/201/346/215/256.md" +0 -0
- /package/templates/{knowledge/patterns/core → internal/patterns}//350/277/220/350/241/214/345/256/211/345/205/250/345/214/205.md" +0 -0
- /package/templates/{knowledge/patterns/core → internal/patterns}//351/233/266/351/205/215/347/275/256/345/210/235/345/247/213/345/214/226.md" +0 -0
- /package/templates/{knowledge/patterns/core → internal/patterns}//351/252/214/350/257/201/345/221/275/344/273/244/347/224/237/346/210/220.md" +0 -0
- /package/templates/{knowledge → internal}/rules/OOD/344/270/216SOLID/350/256/276/350/256/241/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge → internal}/rules//344/272/247/347/211/251/345/245/221/347/272/246/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge → internal}/rules//344/273/243/347/240/201/346/263/250/351/207/212/344/270/216/346/227/245/345/277/227/345/245/221/347/272/246/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge → internal}/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" +0 -0
- /package/templates/{knowledge → internal}/rules//345/220/216/347/253/257/345/256/236/347/216/260/345/267/245/347/250/213/345/245/221/347/272/246/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge → internal}/rules//345/221/275/344/273/244/346/211/247/350/241/214/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge → internal}/rules//345/267/245/344/275/234/346/265/201/345/245/221/347/272/246/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge → internal}/rules//345/267/245/344/275/234/346/265/201/345/257/274/350/210/252/345/245/221/347/272/246/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge → internal}/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" +0 -0
- /package/templates/{knowledge → internal}/rules//345/267/245/345/205/267/350/260/203/347/224/250/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge → internal}/rules//346/204/217/345/233/276/350/267/257/347/224/261/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge → internal}/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" +0 -0
- /package/templates/{knowledge → internal}/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" +0 -0
- /package/templates/{knowledge → internal}/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" +0 -0
- /package/templates/{knowledge → internal}/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" +0 -0
- /package/templates/{knowledge → internal}/rules//346/227/245/345/277/227/346/262/273/347/220/206/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge → internal}/rules//346/234/272/345/210/266/350/207/252/346/262/273/347/220/206/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge → internal}/rules//346/236/266/346/236/204/345/206/263/347/255/226/347/240/224/350/256/250/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge → internal}/rules//346/240/207/345/207/206/350/265/204/344/272/247/350/246/206/347/233/226/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge → internal}/rules//346/240/270/345/277/203/344/275/223/351/252/214/345/216/237/345/210/231.md" +0 -0
- /package/templates/{knowledge → internal}/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" +0 -0
- /package/templates/{knowledge → internal}/rules//346/250/241/346/235/277/350/265/204/344/272/247/345/217/257/350/247/201/346/200/247/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge → internal}/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" +0 -0
- /package/templates/{knowledge → internal}/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" +0 -0
- /package/templates/{knowledge → internal}/rules//347/237/245/350/257/206/346/262/273/347/220/206/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge → internal}/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" +0 -0
- /package/templates/{knowledge → internal}/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" +0 -0
- /package/templates/{knowledge → internal}/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" +0 -0
- /package/templates/{knowledge → internal}/rules//347/273/206/350/212/202/347/272/252/345/276/213/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge → internal}/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" +0 -0
- /package/templates/{knowledge → internal}/rules//350/256/241/345/210/222/345/211/215/347/275/256/351/227/250/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge → internal}/rules//350/256/276/350/256/241/344/272/247/347/211/251/345/214/205/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge → internal}/rules//350/257/201/346/215/256/351/251/261/345/212/250/344/270/216/345/217/215/345/271/273/350/247/211/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge → internal}/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" +0 -0
- /package/templates/{knowledge → internal}/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" +0 -0
- /package/templates/{knowledge → internal}/rules//351/200/232/347/224/250/345/206/263/347/255/226/347/240/224/350/256/250/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge → internal}/rules//351/205/215/347/275/256/344/274/230/345/205/210/347/272/247/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge → internal}/rules//351/205/215/347/275/256/350/220/275/347/233/230/350/276/271/347/225/214/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge → internal}/rules//351/230/262/345/255/244/345/262/233/345/256/236/347/216/260/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge → internal}/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" +0 -0
- /package/templates/{knowledge → internal}/rules//351/252/214/346/224/266/346/250/241/346/235/277/350/276/223/345/207/272/345/245/221/347/272/246/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge → internal}/rules//351/252/214/350/257/201/345/245/221/347/272/246/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge/procedures → procedures}/OOD/350/256/276/350/256/241/345/267/245/344/275/234/346/265/201.md" +0 -0
- /package/templates/{knowledge/procedures → procedures}/Schema/345/217/230/346/233/264/346/265/201/346/260/264/347/272/277.md" +0 -0
- /package/templates/{knowledge/procedures → 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" +0 -0
- /package/templates/{knowledge/procedures → procedures}//344/273/243/347/240/201/351/227/250/347/246/201/346/265/201/347/250/213.md" +0 -0
- /package/templates/{knowledge/procedures → procedures}//344/273/273/345/212/241/346/213/206/350/247/243/346/265/201/347/250/213.md" +0 -0
- /package/templates/{knowledge/procedures → procedures}//345/205/250/347/224/237/345/221/275/345/221/250/346/234/237/345/267/245/344/275/234/346/265/201/345/257/274/350/210/252.md" +0 -0
- /package/templates/{knowledge/procedures → procedures}//345/212/237/350/203/275/345/274/200/345/217/221/346/265/201/347/250/213.md" +0 -0
- /package/templates/{knowledge/procedures → procedures}//345/220/216/347/253/257/346/216/245/345/217/243/345/256/236/347/216/260/345/267/245/344/275/234/346/265/201.md" +0 -0
- /package/templates/{knowledge/procedures → procedures}//345/221/275/344/273/244/346/211/247/350/241/214/346/265/201/347/250/213.md" +0 -0
- /package/templates/{knowledge/procedures → procedures}//345/256/211/345/205/250/345/212/240/345/233/272/346/265/201/346/260/264/347/272/277.md" +0 -0
- /package/templates/{knowledge/procedures → procedures}//345/267/245/345/205/267/350/260/203/347/224/250/346/265/201/347/250/213.md" +0 -0
- /package/templates/{knowledge/procedures → procedures}//346/200/247/350/203/275/346/265/201/346/260/264/347/272/277.md" +0 -0
- /package/templates/{knowledge/procedures → procedures}//346/204/217/345/233/276/350/267/257/347/224/261/346/265/201/347/250/213.md" +0 -0
- /package/templates/{knowledge/procedures → procedures}//346/216/245/345/217/243/351/233/206/346/210/220/346/265/201/346/260/264/347/272/277.md" +0 -0
- /package/templates/{knowledge/procedures → procedures}//346/225/260/346/215/256/345/272/223/350/277/201/347/247/273/346/265/201/347/250/213.md" +0 -0
- /package/templates/{knowledge/procedures → 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" +0 -0
- /package/templates/{knowledge/procedures → procedures}//346/236/266/346/236/204/345/206/263/347/255/226/347/240/224/350/256/250/345/267/245/344/275/234/346/265/201.md" +0 -0
- /package/templates/{knowledge/procedures → procedures}//346/246/202/345/277/265/351/252/214/350/257/201/346/265/201/346/260/264/347/272/277.md" +0 -0
- /package/templates/{knowledge/procedures → 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" +0 -0
- /package/templates/{knowledge/procedures → 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" +0 -0
- /package/templates/{knowledge/procedures → 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" +0 -0
- /package/templates/{knowledge/procedures → procedures}//347/237/245/350/257/206/347/273/264/346/212/244/346/265/201/346/260/264/347/272/277.md" +0 -0
- /package/templates/{knowledge/procedures → procedures}//347/274/226/347/240/201/345/211/215/346/276/204/346/270/205/346/265/201/347/250/213.md" +0 -0
- /package/templates/{knowledge/procedures → procedures}//350/207/252/344/270/273/351/200/211/345/236/213/346/265/201/347/250/213.md" +0 -0
- /package/templates/{knowledge/procedures → procedures}//350/256/276/350/256/241/344/272/247/347/211/251/347/224/237/346/210/220/344/270/216/345/244/215/351/252/214/345/267/245/344/275/234/346/265/201.md" +0 -0
- /package/templates/{knowledge/procedures → procedures}//350/257/246/347/273/206/350/256/276/350/256/241/346/265/201/347/250/213.md" +0 -0
- /package/templates/{knowledge/procedures → procedures}//350/277/201/347/247/273/346/265/201/346/260/264/347/272/277.md" +0 -0
- /package/templates/{knowledge/procedures → procedures}//351/203/250/347/275/262/345/217/221/345/270/203/346/265/201/347/250/213.md" +0 -0
- /package/templates/{knowledge/procedures → procedures}//351/207/215/346/236/204/346/265/201/346/260/264/347/272/277.md" +0 -0
- /package/templates/{knowledge/procedures → procedures}//351/233/206/346/210/220/351/252/214/350/257/201/346/265/201/347/250/213.md" +0 -0
- /package/templates/{knowledge/procedures → procedures}//351/234/200/346/261/202/346/276/204/346/270/205/346/265/201/347/250/213.md" +0 -0
- /package/templates/{knowledge/product_profiles → profiles}/b2b-internal.yaml +0 -0
- /package/templates/{knowledge/product_profiles → profiles}/b2c.yaml +0 -0
- /package/templates/{knowledge/product_profiles → profiles}/saas.yaml +0 -0
- /package/templates/{knowledge/review_rules → rules/shared}/SOLID/344/273/243/347/240/201/345/256/241/346/237/245/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge/review_rules → rules/shared}//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" +0 -0
- /package/templates/{knowledge/review → rules/shared}//344/273/243/347/240/201/345/217/257/347/273/264/346/212/244/346/200/247/344/270/216/345/217/257/350/247/202/346/265/213/346/200/247/345/256/241/346/237/245.md" +0 -0
- /package/templates/{knowledge/review_rules → rules/shared}//345/220/216/347/253/257/345/256/236/347/216/260/345/267/245/347/250/213/345/256/241/346/237/245/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge/review_rules → rules/shared}//345/256/211/345/205/250/345/256/241/346/237/245/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge/review_rules → rules/shared}//345/271/266/345/217/221/345/256/241/346/237/245/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge/review_rules → rules/shared}//346/200/247/350/203/275/345/256/241/346/237/245/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge/review_rules → rules/shared}//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" +0 -0
- /package/templates/{knowledge/review_rules → rules/shared}//346/236/266/346/236/204/345/256/241/346/237/245/350/247/204/345/210/231.md" +0 -0
- /package/templates/{knowledge/review_rules → rules/shared}//350/264/250/351/207/217/345/256/241/346/237/245/350/247/204/345/210/231.md" +0 -0
|
@@ -0,0 +1,736 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 门禁检查模块 — Phase 15: 发布问题架构决策与设计产物真实消费。
|
|
3
|
+
*/
|
|
4
|
+
import fs from "node:fs";
|
|
5
|
+
import os from "node:os";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import { safeReadCached } from "./helpers.js";
|
|
8
|
+
import { sourceContainsPattern, sourceContainsCall, sourceContainsIdentifier, sourceContainsZodSchema, sourceContainsPropertyAccess, } from "../source_code_matcher.js";
|
|
9
|
+
export async function check(ctx, hardFail, info) {
|
|
10
|
+
const rootDir = ctx.rootDir;
|
|
11
|
+
const _info = info ?? (() => { });
|
|
12
|
+
const toolsText = safeReadCached(path.join(rootDir, "src", "adapters", "claude_code", "tools.ts"), ctx.readCache) ?? "";
|
|
13
|
+
const cliText = safeReadCached(path.join(rootDir, "src", "bin", "soloforge.ts"), ctx.readCache) ?? "";
|
|
14
|
+
const workflowText = (safeReadCached(path.join(rootDir, "src", "adapters", "shared", "workflow_template.ts"), ctx.readCache) ?? "")
|
|
15
|
+
+ (safeReadCached(path.join(rootDir, "src", "engine", "workflow_rule_generator.ts"), ctx.readCache) ?? "");
|
|
16
|
+
// ══ 前置检查: 发布文档一致性 ══
|
|
17
|
+
const gateDocText = safeReadCached(path.join(rootDir, "docs", "正式发布门槛.md"), ctx.readCache) ?? "";
|
|
18
|
+
// 发布问题场景矩阵: 结构化场景注册表验证测试文件存在 + 执行证据
|
|
19
|
+
{
|
|
20
|
+
const { validateReleaseIssueScenarios, executeReleaseIssueScenarios } = await import("../release_issue_scenario_registry.js");
|
|
21
|
+
const scenarioResult = validateReleaseIssueScenarios(rootDir);
|
|
22
|
+
_info(` 发布问题场景: ${scenarioResult.scenario_count} 条`);
|
|
23
|
+
if (scenarioResult.missing_runners.length > 0) {
|
|
24
|
+
hardFail("RELEASE_ISSUE_SCENARIO_NO_RUNNER", `发布问题场景缺少 runner: ${scenarioResult.missing_runners.join("; ")}`, ["src/engine/release_issue_scenario_registry.ts"], "release-issues", "所有场景必须有真实生产入口 runner", "为缺失场景添加 runner");
|
|
25
|
+
}
|
|
26
|
+
if (scenarioResult.missing_tests.length > 0) {
|
|
27
|
+
hardFail("RELEASE_ISSUE_SCENARIO_TESTS_MISSING", `发布问题场景引用的测试文件缺失: ${scenarioResult.missing_tests.join("; ")}`, scenarioResult.missing_tests.map(m => m.split(": ")[1] ?? "unknown"), "release-issues", "场景测试文件必须存在", "创建缺失的测试文件");
|
|
28
|
+
}
|
|
29
|
+
// 运行所有场景收集执行证据(全部必须有 runner)
|
|
30
|
+
const execResults = await executeReleaseIssueScenarios();
|
|
31
|
+
const failed = execResults.filter(r => r.status === "fail");
|
|
32
|
+
_info(` 发布问题场景执行: ${execResults.length} 条已执行,${failed.length} 条失败`);
|
|
33
|
+
if (failed.length > 0) {
|
|
34
|
+
hardFail("RELEASE_ISSUE_SCENARIO_EXECUTION_FAILED", `发布问题场景执行失败: ${failed.map(f => `${f.scenario_id}: ${f.error ?? "unknown"}`).join("; ")}`, ["src/engine/release_issue_scenario_registry.ts"], "release-issues", "所有场景执行必须通过", "修复失败场景的 runner 逻辑");
|
|
35
|
+
}
|
|
36
|
+
// R10: 所有场景必须有 production_trace 且 tool_entrypoint 引用真实工具
|
|
37
|
+
const noTrace = execResults.filter(r => !r.production_trace);
|
|
38
|
+
if (noTrace.length > 0) {
|
|
39
|
+
hardFail("RELEASE_ISSUE_SCENARIO_NO_PRODUCTION_TRACE", `场景缺少 production_trace: ${noTrace.map(r => r.scenario_id).join("; ")}`, ["src/engine/release_issue_scenario_registry.ts"], "release-issues", "所有场景必须有 production_trace 记录真实入口", "为缺失场景添加 production_trace");
|
|
40
|
+
}
|
|
41
|
+
// R10.1: 每个场景(非 engine_contract 声明)的 tool_entrypoint 必须包含真实工具名
|
|
42
|
+
const allRealToolNames = ["sf_classify", "sf_expand", "sf_verify", "sf_deliver", "sf_learn", "sf_accept", "sf_record_verification_execution", "sf_scaffold", "sf_classify", "soloforge next", "checkArchitectureDecisionWorkshopGate", "planNextAction"];
|
|
43
|
+
const fakeTraceScenarios = execResults.filter(r => r.production_trace &&
|
|
44
|
+
!allRealToolNames.some(t => r.production_trace.tool_entrypoint.includes(t)) &&
|
|
45
|
+
!r.production_trace.gates_consumed?.includes("engine_contract"));
|
|
46
|
+
if (fakeTraceScenarios.length > 0) {
|
|
47
|
+
hardFail("RELEASE_ISSUE_SCENARIO_NO_PRODUCTION_TRACE", `场景 production_trace 不引用真实工具入口: ${fakeTraceScenarios.map(r => `${r.scenario_id}(entrypoint=${r.production_trace.tool_entrypoint})`).join("; ")}`, ["src/engine/release_issue_scenario_registry.ts"], "release-issues", "所有场景的 production_trace.tool_entrypoint 必须引用真实工具(sf_classify/sf_expand/adapter gate 等)", "用 createToolHarness 重写 runner");
|
|
48
|
+
}
|
|
49
|
+
// R12: production_trace 的 diagnostic_codes 必须非空(来自工具返回值或函数调用结果)
|
|
50
|
+
const noDiagCodes = execResults.filter(r => r.production_trace && (!r.production_trace.diagnostic_codes || r.production_trace.diagnostic_codes.length === 0));
|
|
51
|
+
if (noDiagCodes.length > 0) {
|
|
52
|
+
hardFail("RELEASE_ISSUE_SCENARIO_NO_PRODUCTION_TRACE", `场景 production_trace 缺少 diagnostic_codes: ${noDiagCodes.map(r => r.scenario_id).join("; ")}`, ["src/engine/release_issue_scenario_registry.ts"], "release-issues", "所有 production_trace 必须包含来自工具/函数返回值的 diagnostic_codes", "为场景添加真实 diagnostic_codes");
|
|
53
|
+
}
|
|
54
|
+
// R14: architecture-workshop 非 low-risk 场景必须真正触发 workshop(不得假绿)
|
|
55
|
+
{
|
|
56
|
+
const archNonLowRisk = execResults.filter(r => r.scenario_id.startsWith("release-scenario-architecture-workshop-") &&
|
|
57
|
+
!r.scenario_id.includes("low-risk-skip"));
|
|
58
|
+
const fakeGreenPatterns = ["workshop=false", "domains=0", "no workshop", "blocked by earlier gate"];
|
|
59
|
+
const fakeGreens = archNonLowRisk.filter(r => r.status === "pass" && fakeGreenPatterns.some(p => r.evidence?.includes(p)));
|
|
60
|
+
if (fakeGreens.length > 0) {
|
|
61
|
+
hardFail("RELEASE_ISSUE_SCENARIO_NO_PRODUCTION_TRACE", `architecture-workshop 场景假绿: ${fakeGreens.map(r => `${r.scenario_id}(evidence=${r.evidence?.slice(0, 120)})`).join("; ")}`, ["src/engine/release_issue_scenario_registry.ts"], "release-issues", "非 low-risk 架构研讨场景必须真正触发 architecture_decision_workshop,不得把证据门阻断当作 pass", "确保场景提供足够证据通过 evidence grounding gate,使 workshop gate 能实际触发");
|
|
62
|
+
}
|
|
63
|
+
// 非 low-risk 场景必须同时有 sf_classify 和 sf_expand 入口
|
|
64
|
+
const missingEntrypoint = archNonLowRisk.filter(r => r.production_trace &&
|
|
65
|
+
(!r.production_trace.tool_entrypoint.includes("sf_classify") || !r.production_trace.tool_entrypoint.includes("sf_expand")));
|
|
66
|
+
if (missingEntrypoint.length > 0) {
|
|
67
|
+
hardFail("RELEASE_ISSUE_SCENARIO_NO_PRODUCTION_TRACE", `architecture-workshop 场景缺少 sf_classify 或 sf_expand 入口: ${missingEntrypoint.map(r => `${r.scenario_id}(entrypoint=${r.production_trace.tool_entrypoint})`).join("; ")}`, ["src/engine/release_issue_scenario_registry.ts"], "release-issues", "architecture-workshop 非 low-risk 场景必须同时通过 sf_classify 和 sf_expand 真实 MCP 工具执行", "使用 createToolHarness + callTool('sf_classify') + callTool('sf_expand') 重写 runner");
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// R15: production_trace.diagnostic_codes 不得包含运行时异常
|
|
71
|
+
{
|
|
72
|
+
const runtimeErrorPattern = /Cannot read|TypeError|ReferenceError|^undefined$|uncaught exception|\.error\b/i;
|
|
73
|
+
const runtimeDiagCodes = execResults.filter(r => r.production_trace?.diagnostic_codes?.some(c => runtimeErrorPattern.test(c)));
|
|
74
|
+
if (runtimeDiagCodes.length > 0) {
|
|
75
|
+
hardFail("RELEASE_ISSUE_SCENARIO_DIAGNOSTIC_SWALLOWED_ERROR", `场景 production_trace.diagnostic_codes 包含运行时异常(不是业务/门禁诊断码): ${runtimeDiagCodes.map(r => `${r.scenario_id}(codes=${r.production_trace.diagnostic_codes.filter(c => runtimeErrorPattern.test(c)).join("; ")})`).join("; ")}`, ["src/engine/release_issue_scenario_registry.ts"], "release-issues", "diagnostic_codes 必须来自真实业务/门禁诊断,不得把异常信息当作有效诊断码", "定位异常根因并修复,或确保场景提供完整输入使工具不抛异常");
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// R10: 每个 problem 必须至少有一个场景通过真实 MCP 工具入口执行
|
|
79
|
+
const realToolNames = ["sf_classify", "sf_expand", "sf_verify", "sf_deliver", "sf_learn", "sf_accept", "sf_record_verification_execution", "sf_scaffold"];
|
|
80
|
+
// 用 scenario_id 前缀识别 problem 归属
|
|
81
|
+
const problemPrefixes = {
|
|
82
|
+
"problem-61": ["release-scenario-architecture-workshop-", "release-scenario-decision-workshop-"],
|
|
83
|
+
"problem-62": ["release-scenario-design-pack-"],
|
|
84
|
+
"problem-63": ["release-scenario-template-contract-"],
|
|
85
|
+
"problem-64": ["release-scenario-template-visibility-"],
|
|
86
|
+
"problem-68": ["release-scenario-code-observability-"],
|
|
87
|
+
};
|
|
88
|
+
for (const [problem, prefixes] of Object.entries(problemPrefixes)) {
|
|
89
|
+
const problemScenarios = execResults.filter(r => prefixes.some(p => r.scenario_id.startsWith(p)));
|
|
90
|
+
const withRealTools = problemScenarios.filter(r => r.production_trace && realToolNames.some(t => r.production_trace.tool_entrypoint.includes(t)));
|
|
91
|
+
if (withRealTools.length === 0 && problemScenarios.length > 0) {
|
|
92
|
+
hardFail("RELEASE_ISSUE_SCENARIO_NO_PRODUCTION_TRACE", `${problem} 无场景通过真实 MCP 工具入口执行`, ["src/engine/release_issue_scenario_registry.ts"], "release-issues", `R10 ${problem} 必须有通过 sf_classify/sf_expand 等真实 MCP 工具执行的场景`, "用 createToolHarness + callTool 重写 runner");
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// R13: problem-61 必须证明 awaiting_confirmation 阻断 + 确认放行双向
|
|
96
|
+
{
|
|
97
|
+
const p61 = execResults.filter(r => r.scenario_id.startsWith("release-scenario-decision-workshop-"));
|
|
98
|
+
// 阻断证据: evidence 包含 "awaiting" 或 diagnostic_codes 包含决策研讨阻断码
|
|
99
|
+
const hasAwaiting = p61.some(r => r.evidence?.includes("awaiting") ||
|
|
100
|
+
r.production_trace?.diagnostic_codes?.some(c => c.includes("决策研讨") || c.includes("awaiting_confirmation")));
|
|
101
|
+
// 放行证据: 至少一个 decision_workshop 场景通过两次 sf_expand(tool_entrypoint 含两个 sf_expand)
|
|
102
|
+
const hasConfirmedPass = p61.some(r => r.status === "pass" && r.production_trace?.tool_entrypoint &&
|
|
103
|
+
(r.production_trace.tool_entrypoint.match(/sf_expand/g) ?? []).length >= 2);
|
|
104
|
+
if (!hasAwaiting || !hasConfirmedPass) {
|
|
105
|
+
hardFail("RELEASE_ISSUE_SCENARIO_NO_PRODUCTION_TRACE", `problem-61 缺少 awaiting_confirmation 阻断+放行双向证据 (awaiting=${hasAwaiting}, confirmed=${hasConfirmedPass})`, ["src/engine/release_issue_scenario_registry.ts"], "release-issues", "problem-61 必须有场景证明 decision_workshop 阻断后确认放行", "确保 data-migration/security-policy 等场景含 awaiting 阻断和确认放行双向证据");
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// problem-63 必须在同一正式产物任务上证明阻断、清零、接受与交付,不能由描述文字自证。
|
|
109
|
+
{
|
|
110
|
+
const p63 = execResults.filter(r => r.scenario_id.startsWith("release-scenario-template-contract-"));
|
|
111
|
+
const lifecycleProof = p63.find(r => r.scenario_id === "release-scenario-template-contract-repair-directive")?.behavioral_proof;
|
|
112
|
+
const sameTask = lifecycleProof?.task_id
|
|
113
|
+
&& lifecycleProof.blocked_task_id === lifecycleProof.task_id
|
|
114
|
+
&& lifecycleProof.delivered_task_id === lifecycleProof.task_id;
|
|
115
|
+
const completed = lifecycleProof?.contract_blocked === true
|
|
116
|
+
&& lifecycleProof?.repair_directive_cleared === true
|
|
117
|
+
&& lifecycleProof?.artifact_status === "accepted"
|
|
118
|
+
&& !!lifecycleProof?.acceptance_confirmation_ref
|
|
119
|
+
&& lifecycleProof?.delivery_succeeded === true;
|
|
120
|
+
if (!sameTask || !completed) {
|
|
121
|
+
hardFail("RELEASE_ISSUE_SCENARIO_NO_PRODUCTION_TRACE", `problem-63 缺少同任务正式产物生命周期证据 (same_task=${!!sameTask}, completed=${completed})`, ["src/engine/release_issue_scenario_registry.ts"], "release-issues", "problem-63 必须从同一 task 的 artifact_output 证明阻断、重验、显式接受和成功交付", "修复 repair-directive 场景的 behavioral_proof 与真实工具链");
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// R10: index_only 泄漏行为门禁 — 通过真实 sf_expand 验证 index_only 不进入 prompt
|
|
126
|
+
{
|
|
127
|
+
const { createToolHarness } = await import("../release_tool_harness.js");
|
|
128
|
+
const { clearInjectionContractCache } = await import("../knowledge_injection_boundary.js");
|
|
129
|
+
clearInjectionContractCache();
|
|
130
|
+
try {
|
|
131
|
+
const harness = await createToolHarness({ copyKnowledge: true });
|
|
132
|
+
try {
|
|
133
|
+
const all = harness.knowledgeIndex.getAllEntries();
|
|
134
|
+
// 找到 index_only 条目
|
|
135
|
+
const { buildTemplateAssetContracts } = await import("../template_asset_contract_registry.js");
|
|
136
|
+
const contracts = buildTemplateAssetContracts(rootDir);
|
|
137
|
+
const indexOnlyIds = new Set(contracts.filter(c => c.runtime_visibility === "index_only").map(c => c.asset_id));
|
|
138
|
+
// R12: 前置条件缺失 = hardFail,不得静默跳过
|
|
139
|
+
if (all.project.length === 0) {
|
|
140
|
+
hardFail("RELEASE_ISSUE_INDEX_ONLY_PROMPT_LEAK", "copyKnowledge 后无项目资产被索引,前置条件不满足", ["src/engine/knowledge_injection_boundary.ts"], "release-issues", "index_only 行为检查必须有同步+索引的资产", "检查 copyKnowledgeToProject 和 KIM build");
|
|
141
|
+
}
|
|
142
|
+
if (indexOnlyIds.size === 0) {
|
|
143
|
+
hardFail("RELEASE_ISSUE_INDEX_ONLY_PROMPT_LEAK", "模板合同中无 index_only 资产,前置条件不满足", ["src/engine/template_asset_contract_registry.ts"], "release-issues", "index_only 行为检查必须存在 index_only 合同", "检查 buildTemplateAssetContracts 是否注册了 index_only 资产");
|
|
144
|
+
}
|
|
145
|
+
const clsRaw = await harness.callTool("sf_classify", { intent: "添加用户管理功能" });
|
|
146
|
+
const cls = harness.parseResult(clsRaw);
|
|
147
|
+
if (!cls.task_id) {
|
|
148
|
+
hardFail("RELEASE_ISSUE_INDEX_ONLY_PROMPT_LEAK", "sf_classify 未返回 task_id,前置条件不满足", ["src/engine/classifier.ts"], "release-issues", "index_only 行为检查必须 sf_classify 返回有效 task_id", "检查分类器是否正常返回");
|
|
149
|
+
}
|
|
150
|
+
const expRaw = await harness.callTool("sf_expand", { task_id: cls.task_id });
|
|
151
|
+
const exp = harness.parseResult(expRaw);
|
|
152
|
+
// index_only 资产不得进入 matched_knowledge
|
|
153
|
+
const leaked = (exp.matched_knowledge ?? []).filter((k) => indexOnlyIds.has(k.id));
|
|
154
|
+
if (leaked.length > 0) {
|
|
155
|
+
hardFail("RELEASE_ISSUE_INDEX_ONLY_PROMPT_LEAK", `index_only 资产泄漏到 expand 结果: ${leaked.map((k) => k.id).join(", ")}`, ["src/engine/knowledge_injection_boundary.ts"], "release-issues", "index_only 资产不得进入 matched_knowledge 或 prompt", "修复注入边界逻辑");
|
|
156
|
+
}
|
|
157
|
+
// prompt 中也不得包含 index_only 资产内容
|
|
158
|
+
const promptStr = exp.prompt ?? "";
|
|
159
|
+
const leakedInPrompt = all.project.filter((e) => {
|
|
160
|
+
const contract = contracts.find(c => c.asset_id === e.id || c.path.endsWith(e.name + ".md"));
|
|
161
|
+
return contract?.runtime_visibility === "index_only" && e.body && promptStr.includes(e.body.slice(0, 50));
|
|
162
|
+
});
|
|
163
|
+
if (leakedInPrompt.length > 0) {
|
|
164
|
+
hardFail("RELEASE_ISSUE_INDEX_ONLY_PROMPT_LEAK", `index_only 资产内容泄漏到 prompt: ${leakedInPrompt.map((e) => e.id).join(", ")}`, ["src/engine/knowledge_injection_boundary.ts"], "release-issues", "index_only 资产内容不得出现在 prompt 中", "修复注入边界逻辑");
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
finally {
|
|
168
|
+
harness.cleanup();
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
// R11: fail-closed — 缺少前置条件或异常 = hard_fail
|
|
173
|
+
hardFail("RELEASE_ISSUE_INDEX_ONLY_PROMPT_LEAK", `index_only 行为检查失败: ${err.message}`, ["src/engine/knowledge_injection_boundary.ts"], "release-issues", "index_only 行为检查不得跳过", "修复 index_only 检查前置条件");
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// R10: 权威来源 fail-closed 主动负向测试 — 已注册但文件缺失必须被阻断
|
|
177
|
+
{
|
|
178
|
+
const { getConsumptionTraces, clearConsumptionTraces } = await import("../consumption_trace_store.js");
|
|
179
|
+
// 先检查已有 traces
|
|
180
|
+
const traces = getConsumptionTraces();
|
|
181
|
+
const authorityLeaks = traces.filter((t) => t.matched_reason?.includes("权威来源文件缺失") && t.contract_decision === "allowed");
|
|
182
|
+
if (authorityLeaks.length > 0) {
|
|
183
|
+
hardFail("RELEASE_ISSUE_AUTHORITIVE_FAIL_OPEN", `权威来源缺失的资产被 allowed: ${authorityLeaks.map((t) => t.asset_id).join(", ")}`, ["src/knowledge/index_manager.ts"], "release-issues", "已注册资产权威来源缺失时必须 fail-closed", "检查 filterByContractGate 逻辑");
|
|
184
|
+
}
|
|
185
|
+
// 主动负向测试: 创建临时项目,manifest 指向不存在的权威文件
|
|
186
|
+
try {
|
|
187
|
+
const { copyKnowledgeToProject } = await import("../template_init_sync.js");
|
|
188
|
+
const { KnowledgeIndexManager } = await import("../../knowledge/index_manager.js");
|
|
189
|
+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "soloforge-r10-auth-"));
|
|
190
|
+
try {
|
|
191
|
+
await copyKnowledgeToProject(rootDir, tmpDir);
|
|
192
|
+
const manifestPath = path.join(tmpDir, ".soloforge", "sync-manifest.json");
|
|
193
|
+
const manifest = JSON.parse(fs.readFileSync(manifestPath, "utf-8"));
|
|
194
|
+
const domainKey = Object.keys(manifest.entries).find(k => k.startsWith("domain/"));
|
|
195
|
+
// R12: 找不到 domain 条目 = hardFail,不得静默通过
|
|
196
|
+
if (!domainKey) {
|
|
197
|
+
hardFail("RELEASE_ISSUE_AUTHORITIVE_FAIL_OPEN", "sync-manifest 中无 domain/ 条目可做篡改测试,前置条件不满足", ["src/engine/template_init_sync.ts"], "release-issues", "权威 fail-closed 测试必须找到可篡改的 domain 合同", "检查 copyKnowledgeToProject 是否同步了 domain 资产");
|
|
198
|
+
}
|
|
199
|
+
manifest.entries[domainKey].source_contract_path = "templates/domain/不存在的权威文件.md";
|
|
200
|
+
fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2), "utf-8");
|
|
201
|
+
clearConsumptionTraces();
|
|
202
|
+
const kim = new KnowledgeIndexManager({
|
|
203
|
+
tech_stack: { backend: { lang: "java", framework: "spring-boot" }, frontend: { lang: "typescript", framework: "react" } },
|
|
204
|
+
_projectPath: tmpDir,
|
|
205
|
+
}, { watch: false });
|
|
206
|
+
await kim.build();
|
|
207
|
+
const domainEntries = kim.getAllEntries().project.filter((e) => e.file_path?.replace(/\\/g, "/").includes(domainKey));
|
|
208
|
+
await kim.close();
|
|
209
|
+
// 权威来源缺失 → 不得被索引
|
|
210
|
+
if (domainEntries.length > 0) {
|
|
211
|
+
hardFail("RELEASE_ISSUE_AUTHORITIVE_FAIL_OPEN", `权威缺失的资产被索引: ${domainKey}`, ["src/knowledge/index_manager.ts"], "release-issues", "已注册资产权威来源缺失时必须 fail-closed", "检查 filterByContractGate 逻辑");
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
finally {
|
|
215
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
catch (err) {
|
|
219
|
+
// R11: fail-closed — 找不到篡改目标或执行异常 = hard_fail
|
|
220
|
+
hardFail("RELEASE_ISSUE_AUTHORITIVE_FAIL_OPEN", `权威 fail-closed 主动测试失败: ${err.message}`, ["src/knowledge/index_manager.ts"], "release-issues", "权威来源缺失测试不得跳过", "检查 filterByContractGate 和模板合同配置");
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// 工作流硬规则正文单真源检查
|
|
224
|
+
{
|
|
225
|
+
const { WORKFLOW_TEMPLATE_HARD_RULES } = await import("../asset_manifest.js");
|
|
226
|
+
const { generateWorkflowRules } = await import("../../adapters/shared/workflow_template.js");
|
|
227
|
+
const emptyRules = WORKFLOW_TEMPLATE_HARD_RULES.filter(r => r.enforcement_status === "enforced" && (!r.user_instruction || r.user_instruction.trim() === ""));
|
|
228
|
+
if (emptyRules.length > 0) {
|
|
229
|
+
hardFail("WORKFLOW_RULE_EMPTY_INSTRUCTION", `enforced 规则 user_instruction 为空: ${emptyRules.map(r => r.rule_id).join(", ")}`, ["src/engine/asset_manifest.ts"], "release-issues", "enforced 规则必须有非空 user_instruction", "为空规则补充用户可见指令文本");
|
|
230
|
+
}
|
|
231
|
+
const output = generateWorkflowRules({});
|
|
232
|
+
for (const rule of WORKFLOW_TEMPLATE_HARD_RULES) {
|
|
233
|
+
if (rule.user_instruction) {
|
|
234
|
+
const lines = rule.user_instruction.split("\n").filter(l => l.trim());
|
|
235
|
+
for (const line of lines) {
|
|
236
|
+
if (!output.includes(line)) {
|
|
237
|
+
hardFail("WORKFLOW_RULE_TEXT_MISSING_IN_OUTPUT", `规则 ${rule.rule_id} 正文未出现在生成输出: ${line}`, ["src/engine/asset_manifest.ts", "src/adapters/shared/workflow_template.ts"], "release-issues", "每条规则正文必须出现在 generateWorkflowRules 输出", "检查 WORKFLOW_STEPS 中是否遗漏该规则");
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
if (!output.includes(`id=${rule.rule_id}`)) {
|
|
242
|
+
hardFail("WORKFLOW_RULE_MARKER_MISSING", `规则 ${rule.rule_id} marker 未出现在生成输出`, ["src/adapters/shared/workflow_template.ts"], "release-issues", "每条规则 marker 必须出现在 generateWorkflowRules 输出", "将规则添加到 WORKFLOW_STEPS");
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
if (/发布问题.*100%|100%.*发布问题/.test(gateDocText)) {
|
|
247
|
+
hardFail("RELEASE_ISSUE_DOC_PREMATURE_100", "发布门槛文档提前声称发布问题 100% 完成", ["docs/正式发布门槛.md"], "release-issues", "文档不得在返修未完成前声称 100%", "完成所有返修后更新文档");
|
|
248
|
+
}
|
|
249
|
+
// ══ 问题六十一: 通用决策研讨机制 ══
|
|
250
|
+
// TaskContext 必须有强类型通用决策研讨字段
|
|
251
|
+
const typesText = safeReadCached(path.join(rootDir, "src", "types", "task.ts"), ctx.readCache) ?? "";
|
|
252
|
+
if (!sourceContainsPattern(typesText, "decision_workshop?: import")) {
|
|
253
|
+
hardFail("RELEASE_ISSUE_TASKCONTEXT_WEAK_TYPE", "TaskContext 缺少强类型 decision_workshop 字段", ["src/types/task.ts"], "problem-61", "使用 (ctx as any).decision_workshop 是弱类型", "在 TaskContext 添加 decision_workshop 强类型字段");
|
|
254
|
+
}
|
|
255
|
+
// tools.ts 不得使用 (ctx as any).decision_workshop
|
|
256
|
+
if (sourceContainsPropertyAccess(toolsText, "ctx", "decision_workshop") && toolsText.includes("(ctx as any)")) {
|
|
257
|
+
hardFail("RELEASE_ISSUE_TOOLS_ANY_CAST", "tools.ts 仍使用 (ctx as any).decision_workshop 弱类型", ["src/adapters/claude_code/tools.ts"], "problem-61", "必须使用 TaskContext 强类型字段", "将 (ctx as any).decision_workshop 改为 ctx.decision_workshop");
|
|
258
|
+
}
|
|
259
|
+
// ExpandSchema 必须支持 decision_workshop 输入
|
|
260
|
+
if (!sourceContainsIdentifier(toolsText, "decision_workshop") || (!sourceContainsZodSchema(toolsText, "decision_workshop", "z.record(z.unknown())") && !sourceContainsZodSchema(toolsText, "decision_workshop", "z.unknown()"))) {
|
|
261
|
+
hardFail("RELEASE_ISSUE_EXPAND_NO_WORKSHOP_INPUT", "ExpandSchema 不支持通用 decision_workshop 输入", ["src/adapters/claude_code/tools.ts"], "problem-61", "用户无法回传确认后的决策合同", "在 ExpandSchema 添加 decision_workshop 输入参数");
|
|
262
|
+
}
|
|
263
|
+
if (!sourceContainsIdentifier(toolsText, "parseContractObject") || !sourceContainsIdentifier(toolsText, "JSON.parse")) {
|
|
264
|
+
hardFail("RELEASE_ISSUE_EXPAND_WORKSHOP_JSON_STRING_UNSUPPORTED", "sf_expand 未兼容 MCP 客户端以 JSON 字符串回传 decision_workshop", ["src/adapters/claude_code/tools.ts"], "problem-61", "真实用户项目中 decision_workshop 被序列化为字符串后触发 undefined.includes 服务端错误", "在 sf_expand 入口解析 JSON 字符串契约,解析失败返回结构化错误");
|
|
265
|
+
}
|
|
266
|
+
const dwTextForShape = safeReadCached(path.join(rootDir, "src", "engine", "decision_workshop.ts"), ctx.readCache) ?? "";
|
|
267
|
+
if (!sourceContainsIdentifier(toolsText, "normalizeDecisionWorkshopContract") || !sourceContainsPattern(dwTextForShape, "MCP 客户端回传的领域字典已规范化")) {
|
|
268
|
+
hardFail("RELEASE_ISSUE_EXPAND_WORKSHOP_NATURAL_SHAPE_UNSUPPORTED", "sf_expand 未兼容 AI 回传的决策域字典结构", ["src/adapters/claude_code/tools.ts", "src/engine/decision_workshop.ts"], "problem-61", "真实 AI 会回传 { delivery_validation: {...} } 形状,若不规范化会卡在 expanding 或结构无效", "在 decision_workshop.ts 提供 normalizeDecisionWorkshopContract,并在 sf_expand 入口使用");
|
|
269
|
+
}
|
|
270
|
+
const s4RecoveryFields = [
|
|
271
|
+
"technology_decision_contract",
|
|
272
|
+
"technology_decision_record",
|
|
273
|
+
"detail_discipline_contract",
|
|
274
|
+
"provided_details",
|
|
275
|
+
"first_principles_frame",
|
|
276
|
+
"brainstorm_session",
|
|
277
|
+
];
|
|
278
|
+
const missingS4SchemaFields = s4RecoveryFields.filter((field) => !sourceContainsZodSchema(toolsText, field, "z.record(z.unknown())") && !sourceContainsZodSchema(toolsText, field, "z.unknown()"));
|
|
279
|
+
const missingS4ContextFields = s4RecoveryFields.filter((field) => !sourceContainsPattern(typesText, `${field}?:`));
|
|
280
|
+
const missingS4SaveFields = s4RecoveryFields.filter((field) => !sourceContainsPattern(toolsText, `(ctx as Record<string, unknown>)[field]`) && !sourceContainsPattern(toolsText, `(ctx as unknown as Record<string, unknown>)[field]`) && !sourceContainsPattern(toolsText, `ctx.${field} = parsed.value`));
|
|
281
|
+
const staleS4AnyFields = s4RecoveryFields.filter((field) => sourceContainsPattern(toolsText, `(ctx as any).${field}`) || sourceContainsPattern(toolsText, `(params.ctx as any).${field}`));
|
|
282
|
+
if (missingS4SchemaFields.length > 0 || missingS4ContextFields.length > 0 || missingS4SaveFields.length > 0 || staleS4AnyFields.length > 0) {
|
|
283
|
+
hardFail("RELEASE_ISSUE_S4_RECOVERY_INPUT_MISSING", "S4 强门禁缺少可执行 sf_expand 恢复入口", ["src/adapters/claude_code/tools.ts", "src/types/task.ts"], "problem-16/26/27/42", `缺 schema=${missingS4SchemaFields.join(",")}; 缺 TaskContext=${missingS4ContextFields.join(",")}; 缺保存=${missingS4SaveFields.join(",")}; 弱类型=${staleS4AnyFields.join(",")}`, "所有返回\u201C请提供 X 后重新 sf_expand\u201D的强门禁,都必须在 ExpandSchema 接受 X、写入 TaskContext,并通过强类型主链路消费");
|
|
284
|
+
}
|
|
285
|
+
// 架构决策研讨子包必须接入 sf_expand
|
|
286
|
+
if (!sourceContainsIdentifier(toolsText, "checkArchitectureDecisionWorkshopGate") ||
|
|
287
|
+
!sourceContainsPattern(toolsText, "projectContext: detectedArchitectureContext")) {
|
|
288
|
+
hardFail("RELEASE_ISSUE_MAINLINE_MISSING", "问题六十一架构研讨子包未接入 sf_expand", ["src/adapters/claude_code/tools.ts"], "problem-61", "仅有合同或模板不能证明主链路消费", "在 sf_expand 真实路由调用架构研讨门");
|
|
289
|
+
}
|
|
290
|
+
// 通用决策研讨必须接入 sf_expand(可组合决策包)
|
|
291
|
+
if (!sourceContainsIdentifier(toolsText, "lazyDecisionWorkshop") || !sourceContainsIdentifier(toolsText, "matchDecisionPacks") || !sourceContainsIdentifier(toolsText, "nonArchPacks")) {
|
|
292
|
+
hardFail("RELEASE_ISSUE_DECISION_WORKSHOP_MISSING", "问题六十一通用决策研讨未接入 sf_expand 可组合决策包", ["src/adapters/claude_code/tools.ts"], "problem-61", "非架构高影响任务也必须门禁,且必须支持组合多个决策包", "在 sf_expand 接入 matchDecisionPacks 门禁");
|
|
293
|
+
}
|
|
294
|
+
// DecisionPackRegistry 必须有 business_process 和 delivery_validation 独立包
|
|
295
|
+
{
|
|
296
|
+
const dwText = safeReadCached(path.join(rootDir, "src", "engine", "decision_workshop.ts"), ctx.readCache) ?? "";
|
|
297
|
+
if (!dwText.includes("business_process") || !dwText.includes("delivery_validation")) {
|
|
298
|
+
hardFail("RELEASE_ISSUE_DECISION_PACK_MISSING", "问题六十一 DecisionPackRegistry 缺少 business_process 或 delivery_validation 独立包", ["src/engine/decision_workshop.ts"], "problem-61", "业务流程和交付验证必须可独立触发", "在 DECISION_PACKS 添加 business_process 和 delivery_validation");
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
try {
|
|
302
|
+
const dw = await import(path.join(rootDir, "dist", "engine", "decision_workshop.js"));
|
|
303
|
+
// must-fail: 未确认的技术选型必须阻断
|
|
304
|
+
const techContract = dw.createDecisionWorkshop("gate-test", "technology_selection");
|
|
305
|
+
const techGate = dw.evaluateDecisionWorkshop(techContract);
|
|
306
|
+
if (techGate.allowed) {
|
|
307
|
+
hardFail("RELEASE_ISSUE_DECISION_FALSE_PASS", "问题六十一未确认技术选型草稿错误放行", ["src/engine/decision_workshop.ts"], "problem-61", "技术选型未确认应阻断", "修复 evaluateDecisionWorkshop");
|
|
308
|
+
}
|
|
309
|
+
// must-fail: 低风险任务不需要研讨
|
|
310
|
+
const lowRisk = dw.requiresDecisionWorkshop({ intent: "修复按钮颜色" });
|
|
311
|
+
if (lowRisk.required) {
|
|
312
|
+
hardFail("RELEASE_ISSUE_DECISION_LOW_RISK_BLOCKED", "问题六十一低风险任务错误触发决策研讨", ["src/engine/decision_workshop.ts"], "problem-61", "低风险任务不应触发研讨", "修复 requiresDecisionWorkshop 触发条件");
|
|
313
|
+
}
|
|
314
|
+
// must-pass: 确认的技术选型放行
|
|
315
|
+
const confirmed = dw.createDecisionWorkshop("gate-test-2", "technology_selection");
|
|
316
|
+
confirmed.extended_domains.technology_selection.status = "confirmed";
|
|
317
|
+
confirmed.extended_domains.technology_selection.user_confirmation_ref = "user-ok";
|
|
318
|
+
if (!dw.evaluateDecisionWorkshop(confirmed).allowed) {
|
|
319
|
+
hardFail("RELEASE_ISSUE_DECISION_CONFIRMED_BLOCKED", "问题六十一已确认决策仍被阻断", ["src/engine/decision_workshop.ts"], "problem-61", "已确认决策应放行", "修复 evaluateDecisionWorkshop 确认检查");
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
catch (error) {
|
|
323
|
+
hardFail("RELEASE_ISSUE_DECISION_LOAD_FAILED", `无法执行问题六十一行为复验: ${error?.message ?? error}`, ["src/engine/decision_workshop.ts"], "problem-61", "模块不可执行", "修复构建或导出");
|
|
324
|
+
}
|
|
325
|
+
// ══ 问题六十二: 标准资产覆盖机制 ══
|
|
326
|
+
if (!sourceContainsCall(toolsText, "verifyDesignArtifactPack") ||
|
|
327
|
+
!sourceContainsPattern(toolsText, "ctx.design_artifact_pack.status !== \"implementation_ready\"") ||
|
|
328
|
+
!sourceContainsCall(toolsText, "checkDesignArtifactWriteGate")) {
|
|
329
|
+
hardFail("RELEASE_ISSUE_MAINLINE_MISSING", "问题六十二设计产物包子机制未接入真实消费路径", ["src/adapters/claude_code/tools.ts"], "problem-62", "仅有文档校验函数不能阻断用户编码/交付", "在验证、写入与交付路径消费设计产物包状态");
|
|
330
|
+
}
|
|
331
|
+
if (!sourceContainsCall(toolsText, "auditDesignImplementationTraceability") ||
|
|
332
|
+
!sourceContainsIdentifier(toolsText, "verifyChangedFilesAgainstDesignTraceability") ||
|
|
333
|
+
!sourceContainsIdentifier(toolsText, "TOOL_DIAGNOSTIC_CODES.traceabilityVerifyFailed")) {
|
|
334
|
+
hardFail("RELEASE_ISSUE_TRACEABILITY_MAINLINE_MISSING", "问题七十三追踪契约未接入 sf_expand/sf_verify 主链路", ["src/adapters/claude_code/tools.ts", "src/engine/traceability.ts"], "problem-73", "只审计设计产物不能保证编码来自需求、原型、架构、详细设计和切片", "在 sf_expand 编码前门和 sf_verify changed_files 门接入追踪契约");
|
|
335
|
+
}
|
|
336
|
+
const traceabilityText = safeReadCached(path.join(rootDir, "src", "engine", "traceability.ts"), ctx.readCache) ?? "";
|
|
337
|
+
const nextPlannerText = safeReadCached(path.join(rootDir, "src", "engine", "next_action_planner.ts"), ctx.readCache) ?? "";
|
|
338
|
+
if (!sourceContainsIdentifier(traceabilityText, "DESIGN_IMPLEMENTATION_TRACEABILITY_TEMPLATE_PATH") ||
|
|
339
|
+
!sourceContainsIdentifier(traceabilityText, "recovery_command") ||
|
|
340
|
+
!sourceContainsIdentifier(traceabilityText, "recovery_zh") ||
|
|
341
|
+
!sourceContainsIdentifier(nextPlannerText, "DESIGN_IMPLEMENTATION_TRACEABILITY_TEMPLATE_PATH") ||
|
|
342
|
+
!sourceContainsPattern(cliText, "finding.template_path") ||
|
|
343
|
+
!sourceContainsPattern(cliText, "finding.recovery_command")) {
|
|
344
|
+
hardFail("RELEASE_ISSUE_TRACEABILITY_RECOVERY_PATH_MISSING", "问题七十三追踪矩阵强门禁缺少模板/引导/审计恢复路径", ["src/engine/traceability.ts", "src/engine/next_action_planner.ts", "src/bin/soloforge.ts"], "problem-73", "强门禁只阻断不给模板和恢复命令会导致用户无法闭环", "为追踪矩阵 finding、soloforge next 和 audit-design-artifacts 输出模板路径与恢复命令");
|
|
345
|
+
}
|
|
346
|
+
const designPackText = safeReadCached(path.join(rootDir, "src", "engine", "design_artifact_pack.ts"), ctx.readCache) ?? "";
|
|
347
|
+
if (!designPackText.includes("traceability_matrix") ||
|
|
348
|
+
!designPackText.includes("auditDesignImplementationTraceability")) {
|
|
349
|
+
hardFail("RELEASE_ISSUE_TRACEABILITY_DESIGN_AUDIT_MISSING", "问题七十三未并入设计产物包审计", ["src/engine/design_artifact_pack.ts"], "problem-73", "追踪矩阵不进入 audit-design-artifacts 会导致用户设计阶段无法发现缺口", "把追踪矩阵作为设计产物包权威资产审计");
|
|
350
|
+
}
|
|
351
|
+
const lifecycleContractText = safeReadCached(path.join(rootDir, "src", "engine", "design_lifecycle_contract.ts"), ctx.readCache) ?? "";
|
|
352
|
+
const lifecycleKnowledgeText = safeReadCached(path.join(rootDir, "src", "engine", "lifecycle_knowledge_contract.ts"), ctx.readCache) ?? "";
|
|
353
|
+
if (!lifecycleContractText.includes("detail_design") ||
|
|
354
|
+
!lifecycleContractText.includes("docs/architecture/02-数据库设计文档.md") ||
|
|
355
|
+
!lifecycleContractText.includes("docs/architecture/03-API接口规格文档.md") ||
|
|
356
|
+
!lifecycleContractText.includes("optional_implementation_detail_document") ||
|
|
357
|
+
!lifecycleContractText.includes("docs/architecture/04-开发切片计划.md") ||
|
|
358
|
+
!lifecycleContractText.includes("DESIGN_LIFECYCLE_LEGACY_SLICE_PLAN_PATHS") ||
|
|
359
|
+
!lifecycleContractText.includes("slice_planning") ||
|
|
360
|
+
!designPackText.includes("getDesignLifecycleArtifactPaths")) {
|
|
361
|
+
hardFail("RELEASE_ISSUE_DESIGN_LIFECYCLE_CONTRACT_MISSING", "设计、实现、测试、验收生命周期 I/O 合同缺失或未被设计产物包消费", ["src/engine/design_lifecycle_contract.ts", "src/engine/design_artifact_pack.ts"], "problem-62/problem-73", "没有中心合同会导致后续门禁凭空新增输入输出,详细设计又被误判成单文件", "建立中心生命周期合同,并让设计产物包、追踪审计和 hook 消费同一合同");
|
|
362
|
+
}
|
|
363
|
+
if (!lifecycleKnowledgeText.includes("evaluateLifecycleKnowledgeDecision") ||
|
|
364
|
+
!lifecycleKnowledgeText.includes("selectProjectKnowledgeForTaskWithReasons") ||
|
|
365
|
+
!lifecycleKnowledgeText.includes("auditDesignImplementationTraceability") ||
|
|
366
|
+
!lifecycleKnowledgeText.includes("assessControlledGenerationChain")) {
|
|
367
|
+
hardFail("RELEASE_ISSUE_UNIFIED_LIFECYCLE_KNOWLEDGE_CONTRACT_MISSING", "生命周期、项目知识选择和证据消费仍未收口到统一决策合同", ["src/engine/lifecycle_knowledge_contract.ts"], "problem-62/problem-73/project-knowledge-control-plane", "三个并行机制会导致 next/expand/verify/deliver 各自新增局部口径", "建立并强制消费 evaluateLifecycleKnowledgeDecision");
|
|
368
|
+
}
|
|
369
|
+
const injectionBoundaryText = safeReadCached(path.join(rootDir, "src", "engine", "knowledge_injection_boundary.ts"), ctx.readCache) ?? "";
|
|
370
|
+
if (injectionBoundaryText.includes("buildTemplateAssetContracts(process.cwd())")) {
|
|
371
|
+
hardFail("RELEASE_ISSUE_KNOWLEDGE_CONTRACT_CWD_DRIFT", "知识注入边界仍用 process.cwd() 读取模板合同", ["src/engine/knowledge_injection_boundary.ts"], "project-knowledge-consumption", "用户项目、全局安装和测试目录会取错合同根目录", "改为从模块根或显式合同根读取模板合同");
|
|
372
|
+
}
|
|
373
|
+
if (!cliText.includes("cmdAuditDesignArtifacts") ||
|
|
374
|
+
!cliText.includes("cmdUpgradeDesignArtifacts") ||
|
|
375
|
+
!cliText.includes("currentTask?.design_artifact_pack")) {
|
|
376
|
+
hardFail("RELEASE_ISSUE_USER_CLI_MISSING", "问题六十二缺少用户 CLI 审计/升级或 Claude Code 写入 hook 阻断路径", ["src/bin/soloforge.ts"], "problem-62", "MCP 内部调用不能覆盖用户现有文档升级与直接 Edit/Write 路径", "接入 audit/upgrade CLI 与 check-write 设计产物门");
|
|
377
|
+
}
|
|
378
|
+
// 标准资产覆盖机制必须使用真实注册表审计
|
|
379
|
+
try {
|
|
380
|
+
const cov = await import(path.join(rootDir, "dist", "engine", "standard_asset_coverage.js"));
|
|
381
|
+
const car = await import(path.join(rootDir, "dist", "engine", "consumable_asset_registry.js"));
|
|
382
|
+
const manifest = await import(path.join(rootDir, "dist", "engine", "asset_manifest.js"));
|
|
383
|
+
// 从真实注册表构建消费证据
|
|
384
|
+
const registeredAssets = car.listBuiltinConsumableAssets();
|
|
385
|
+
const consumablePaths = new Set(registeredAssets.map((a) => a.path));
|
|
386
|
+
const ownerMap = new Map(registeredAssets.map((a) => [a.path, a.owner_mechanism_id ?? ""]));
|
|
387
|
+
const manifestEntries = manifest.ASSET_MANIFEST;
|
|
388
|
+
const consumerMap = new Map(manifestEntries.map((e) => [e.path, []]));
|
|
389
|
+
const visibilityMap = new Map(manifestEntries.map((e) => [e.path, e.consumption_mode ?? "unknown"]));
|
|
390
|
+
const report = cov.auditStandardAssetCoverage(rootDir, consumablePaths, ownerMap, consumerMap, visibilityMap);
|
|
391
|
+
// 必须能审计并返回结构化报告
|
|
392
|
+
if (typeof report.total_assets !== "number" || typeof report.covered_assets !== "number") {
|
|
393
|
+
hardFail("RELEASE_ISSUE_COVERAGE_REPORT_INVALID", "问题六十二覆盖审计报告结构不完整", ["src/engine/standard_asset_coverage.ts"], "problem-62", "审计报告缺少必须字段", "修复 auditStandardAssetCoverage 返回结构");
|
|
394
|
+
}
|
|
395
|
+
// 不得传空 Set/空 Map 通过覆盖检查 — 必须使用真实数据
|
|
396
|
+
if (report.total_assets > 0 && report.covered_assets === report.total_assets && consumablePaths.size === 0) {
|
|
397
|
+
hardFail("RELEASE_ISSUE_COVERAGE_EMPTY_REGISTRY_PASS", "问题六十二空注册表不应全部覆盖", ["src/engine/standard_asset_coverage.ts"], "problem-62", "空注册表时所有资产必须 uncovered", "修复覆盖检查使用真实注册表");
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
catch (error) {
|
|
401
|
+
hardFail("RELEASE_ISSUE_COVERAGE_LOAD_FAILED", `无法执行问题六十二覆盖审计行为复验: ${error?.message ?? error}`, ["src/engine/standard_asset_coverage.ts"], "problem-62", "模块不可执行", "修复构建或导出");
|
|
402
|
+
}
|
|
403
|
+
try {
|
|
404
|
+
const workshop = await import(path.join(rootDir, "dist", "engine", "architecture_decision_workshop.js"));
|
|
405
|
+
const designPack = await import(path.join(rootDir, "dist", "engine", "design_artifact_pack.js"));
|
|
406
|
+
const lifecycle = await import(path.join(rootDir, "dist", "engine", "design_lifecycle_contract.js"));
|
|
407
|
+
const lifecycleFindings = lifecycle.validateDesignLifecycleContract();
|
|
408
|
+
if (lifecycleFindings.length > 0) {
|
|
409
|
+
hardFail("RELEASE_ISSUE_DESIGN_LIFECYCLE_CONTRACT_INVALID", `设计生命周期合同不满足不变量: ${lifecycleFindings.map((finding) => finding.code).join(",")}`, ["src/engine/design_lifecycle_contract.ts"], "problem-62/problem-73", "生命周期合同必须明确设计、实现、测试、验收节点的输入输出和门禁", "修复 validateDesignLifecycleContract 报告的不变量缺口");
|
|
410
|
+
}
|
|
411
|
+
const detailStage = lifecycle.getDesignLifecycleStageContract("detail_design");
|
|
412
|
+
const detailRequiredOutputs = detailStage.outputs.filter((artifact) => artifact.required).map((artifact) => artifact.path);
|
|
413
|
+
if (!detailRequiredOutputs.includes("docs/architecture/02-数据库设计文档.md") ||
|
|
414
|
+
!detailRequiredOutputs.includes("docs/architecture/03-API接口规格文档.md") ||
|
|
415
|
+
detailRequiredOutputs.includes("docs/architecture/04-详细设计文档.md")) {
|
|
416
|
+
hardFail("RELEASE_ISSUE_DETAIL_DESIGN_TOPOLOGY_INVALID", "详细设计阶段输出拓扑错误", ["src/engine/design_lifecycle_contract.ts"], "problem-62/problem-73", "详细设计必需载体是数据库设计和 API 规格,04-详细设计文档只能是可选兼容", "修复 detail_design 生命周期合同");
|
|
417
|
+
}
|
|
418
|
+
const lifecyclePaths = lifecycle.getDesignLifecycleArtifactPaths();
|
|
419
|
+
if (lifecyclePaths.slice_plan !== "docs/architecture/04-开发切片计划.md") {
|
|
420
|
+
hardFail("RELEASE_ISSUE_SLICE_PLAN_CANONICAL_PATH_INVALID", "开发切片计划仍绑定到固定阶段文件", ["src/engine/design_lifecycle_contract.ts"], "problem-62/problem-73", "切片计划是全项目调度权威资产,不能命名成第一阶段", "将 canonical slice_plan 改为 docs/architecture/04-开发切片计划.md,旧第一阶段文件仅作为 alias");
|
|
421
|
+
}
|
|
422
|
+
const packPaths = designPack.defaultDesignArtifactPaths();
|
|
423
|
+
if (JSON.stringify(lifecyclePaths) !== JSON.stringify(packPaths)) {
|
|
424
|
+
hardFail("RELEASE_ISSUE_DESIGN_PACK_PATH_DRIFT", "设计产物包路径与生命周期合同漂移", ["src/engine/design_lifecycle_contract.ts", "src/engine/design_artifact_pack.ts"], "problem-62/problem-73", "设计产物包不得独立硬编码另一套输入输出路径", "让 defaultDesignArtifactPaths 从 getDesignLifecycleArtifactPaths 派生");
|
|
425
|
+
}
|
|
426
|
+
const draft = workshop.createArchitectureDecisionWorkshop("release-issue", "new_system");
|
|
427
|
+
if (workshop.evaluateArchitectureDecisionWorkshop(draft).allowed) {
|
|
428
|
+
hardFail("RELEASE_ISSUE_BEHAVIOR_FALSE_PASS", "问题六十一未确认六域的草稿错误放行", ["src/engine/architecture_decision_workshop.ts"], "problem-61", "必须有负向行为证据", "修复研讨生成门");
|
|
429
|
+
}
|
|
430
|
+
const missingPackResult = designPack.verifyDesignArtifactPack(rootDir, designPack.createDesignArtifactPack("release-issue"));
|
|
431
|
+
if (missingPackResult.passed) {
|
|
432
|
+
hardFail("RELEASE_ISSUE_BEHAVIOR_FALSE_PASS", "问题六十二缺少用户项目设计产物时错误放行", ["src/engine/design_artifact_pack.ts"], "problem-62", "必须读取真实资产并阻断缺失", "修复设计产物复验门");
|
|
433
|
+
}
|
|
434
|
+
const traceability = await import(path.join(rootDir, "dist", "engine", "traceability.js"));
|
|
435
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), "sf-trace-gate-"));
|
|
436
|
+
const write = (relativePath, content) => {
|
|
437
|
+
const target = path.join(tmp, relativePath);
|
|
438
|
+
fs.mkdirSync(path.dirname(target), { recursive: true });
|
|
439
|
+
fs.writeFileSync(target, content);
|
|
440
|
+
};
|
|
441
|
+
write("docs/architecture/01-架构设计文档.md", "# 架构\n来源: REQ-001, PROTO-001\nARCH-001");
|
|
442
|
+
const missingTrace = traceability.auditDesignImplementationTraceability(tmp);
|
|
443
|
+
if (missingTrace.passed || !missingTrace.findings.some((f) => f.code === "TRACEABILITY_MATRIX_MISSING")) {
|
|
444
|
+
hardFail("RELEASE_ISSUE_TRACEABILITY_MATRIX_FALSE_PASS", "问题七十三缺少追踪矩阵时错误放行", ["src/engine/traceability.ts", "src/engine/design_artifact_pack.ts"], "problem-73", "设计产物存在但无追踪矩阵必须阻断", "修复 auditDesignImplementationTraceability");
|
|
445
|
+
}
|
|
446
|
+
write("docs/traceability/01-需求原型设计实现追踪矩阵.md", [
|
|
447
|
+
"# 需求原型设计实现追踪矩阵",
|
|
448
|
+
"| 需求 | 原型 | 架构 | 详细设计 | 切片 | 验收 |",
|
|
449
|
+
"| --- | --- | --- | --- | --- | --- |",
|
|
450
|
+
"| REQ-001 | PROTO-001 | ARCH-001 | DD-T001, DD-A001 | PHASE-001, SLICE-001 | AC-001 |",
|
|
451
|
+
].join("\n"));
|
|
452
|
+
write("docs/architecture/02-数据库设计文档.md", "# 数据库设计\nARCH-001 -> DD-T001");
|
|
453
|
+
write("docs/architecture/03-API接口规格文档.md", "# API 设计\nARCH-001 -> DD-A001");
|
|
454
|
+
write("docs/architecture/04-开发切片计划.md", "# 开发切片计划\nPHASE-001\nSLICE-001\n来源 DD-T001, DD-A001\n验收 AC-001");
|
|
455
|
+
const bindingFail = traceability.verifyChangedFilesAgainstDesignTraceability(tmp, ["src/main/java/demo/BedService.java"], {
|
|
456
|
+
task_id: "trace-gate",
|
|
457
|
+
created_at: new Date().toISOString(),
|
|
458
|
+
intent: "实现资源管理",
|
|
459
|
+
product_profile: "default",
|
|
460
|
+
status: "executing",
|
|
461
|
+
});
|
|
462
|
+
if (bindingFail.passed || !bindingFail.findings.some((f) => f.code === "TRACEABILITY_CODE_BINDING_MISSING")) {
|
|
463
|
+
hardFail("RELEASE_ISSUE_TRACEABILITY_CODE_BINDING_FALSE_PASS", "问题七十三编码缺少 PHASE/SLICE/DD/AC 绑定时错误放行", ["src/engine/traceability.ts", "src/adapters/claude_code/tools.ts"], "problem-73", "实现代码必须能追溯到详细设计、切片和验收", "修复 sf_expand/sf_verify 追踪绑定门");
|
|
464
|
+
}
|
|
465
|
+
const bindingPass = traceability.verifyChangedFilesAgainstDesignTraceability(tmp, ["src/main/java/demo/BedService.java"], {
|
|
466
|
+
task_id: "trace-gate-ok",
|
|
467
|
+
created_at: new Date().toISOString(),
|
|
468
|
+
intent: "实现资源管理 PHASE-001 SLICE-001 DD-T001 DD-A001 AC-001",
|
|
469
|
+
product_profile: "default",
|
|
470
|
+
status: "executing",
|
|
471
|
+
});
|
|
472
|
+
if (!bindingPass.passed) {
|
|
473
|
+
hardFail("RELEASE_ISSUE_TRACEABILITY_CODE_BINDING_FALSE_BLOCK", "问题七十三合法 PHASE/SLICE/DD/AC 绑定被错误阻断", ["src/engine/traceability.ts"], "problem-73", "合法追踪绑定应允许编码验证继续", "修复 traceability binding 校验");
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
catch (error) {
|
|
477
|
+
hardFail("RELEASE_ISSUE_MODULE_LOAD_FAILED", `无法执行 发布问题行为复验: ${error?.message ?? error}`, ["src/engine/architecture_decision_workshop.ts", "src/engine/design_artifact_pack.ts", "src/engine/traceability.ts"], "发布问题", "模块不可执行", "修复构建或导出");
|
|
478
|
+
}
|
|
479
|
+
if (!workflowText.includes("wf-architecture-workshop-first") || !workflowText.includes("wf-design-artifact-pack")) {
|
|
480
|
+
hardFail("RELEASE_ISSUE_USER_INJECTION_MISSING", "用户项目工作流模板未注入 发布问题硬协议", ["src/adapters/shared/workflow_template.ts"], "problem-61/problem-62", "运行时有门但用户不可预期会造成体验断裂", "向 workflow template 注入硬规则");
|
|
481
|
+
}
|
|
482
|
+
// workflow_template @sf-hard-rule 机制 ID 必须能解析到权威机制注册条目且资产文件存在
|
|
483
|
+
try {
|
|
484
|
+
const { validateWorkflowRuleSources } = await import("../../adapters/shared/workflow_template.js");
|
|
485
|
+
const wfValidation = validateWorkflowRuleSources(rootDir);
|
|
486
|
+
if (!wfValidation.valid) {
|
|
487
|
+
if (wfValidation.missing_mechanisms.length > 0) {
|
|
488
|
+
hardFail("RELEASE_ISSUE_WF_RULE_MISSING_MECHANISM", `工作流模板引用了未注册的机制: ${wfValidation.missing_mechanisms.join(", ")}`, ["src/adapters/shared/workflow_template.ts"], "发布问题", "硬编码规则与权威机制注册表漂移", "在 dual_layer_mechanism_registry 中注册缺失机制或修正 workflow_template 引用");
|
|
489
|
+
}
|
|
490
|
+
if (wfValidation.missing_assets.length > 0) {
|
|
491
|
+
hardFail("RELEASE_ISSUE_WF_RULE_MISSING_ASSET", `工作流模板规则的权威资产文件缺失: ${wfValidation.missing_assets.join(", ")}`, ["src/adapters/shared/workflow_template.ts"], "发布问题", "权威规则资产文件不存在", "恢复缺失的模板文件或修正注册表路径");
|
|
492
|
+
}
|
|
493
|
+
if (wfValidation.checksum_mismatch) {
|
|
494
|
+
hardFail("RELEASE_ISSUE_WF_RULE_CONTENT_DRIFT", `工作流模板权威规则内容校验和不匹配: 嵌入=${wfValidation.embedded_checksum}, 实际=${wfValidation.computed_checksum}`, ["src/adapters/shared/workflow_template.ts"], "发布问题", "权威规则资产内容已变化但工作流模板未同步", "运行 updateEmbeddedChecksum 或重新生成工作流模板");
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
catch (error) {
|
|
499
|
+
hardFail("RELEASE_ISSUE_WF_RULE_VALIDATION_FAILED", `工作流规则来源校验失败: ${error?.message ?? error}`, ["src/adapters/shared/workflow_template.ts"], "发布问题", "校验函数不可执行", "修复 validateWorkflowRuleSources 导出");
|
|
500
|
+
}
|
|
501
|
+
// ══ 问题六十三: 标准资产契约 ══
|
|
502
|
+
const sacText = safeReadCached(path.join(rootDir, "src", "engine", "standard_asset_contract.ts"), ctx.readCache) ?? "";
|
|
503
|
+
if (!sourceContainsIdentifier(sacText, "matchTemplateContract") || !sourceContainsIdentifier(sacText, "verifyOutputAgainstContract") || !sourceContainsIdentifier(sacText, "createRepairReverifyDirective")) {
|
|
504
|
+
hardFail("RELEASE_ISSUE_CONTRACT_MISSING", "问题六十三缺少模板契约匹配、产物验证或修复重验函数", ["src/engine/standard_asset_contract.ts"], "problem-63", "缺少核心函数不能实现契约验证", "实现 matchTemplateContract / verifyOutputAgainstContract / createRepairReverifyDirective");
|
|
505
|
+
}
|
|
506
|
+
// sf_verify 必须按文件逐一匹配契约(不得使用 changed_files[0] 的契约校验全部文件)
|
|
507
|
+
if (!sourceContainsIdentifier(toolsText, "lazyStandardAssetContract") || !sourceContainsIdentifier(toolsText, "TOOL_DIAGNOSTIC_CODES.contractDraft") || !sourceContainsIdentifier(toolsText, "repair_reverify_directive")) {
|
|
508
|
+
hardFail("RELEASE_ISSUE_CONTRACT_MAINLINE_MISSING", "问题六十三未接入 sf_verify 模板契约验证和 sf_deliver 修复重验阻断", ["src/adapters/claude_code/tools.ts"], "problem-63", "仅有契约定义不能阻断交付", "在 sf_verify 消费模板契约验证、sf_deliver 消费修复重验阻断");
|
|
509
|
+
}
|
|
510
|
+
// 必须检查 per-file 匹配(不得 changed_files[0] 统一匹配)
|
|
511
|
+
if (sourceContainsPattern(toolsText, "file_path: args.changed_files?.[0]") && !sourceContainsIdentifier(toolsText, "file_path: changedFile")) {
|
|
512
|
+
hardFail("RELEASE_ISSUE_CONTRACT_SINGLE_FILE_MATCH", "问题六十三 sf_verify 仍使用 changed_files[0] 单一匹配", ["src/adapters/claude_code/tools.ts"], "problem-63", "一个契约不能校验所有文件", "改为按文件逐一匹配 matchTemplateContract");
|
|
513
|
+
}
|
|
514
|
+
// 草稿必须阻断(不得 continue 跳过)
|
|
515
|
+
if (!sourceContainsIdentifier(toolsText, "SF-CONTRACT-DRAFT")) {
|
|
516
|
+
hardFail("RELEASE_ISSUE_CONTRACT_DRAFT_SKIP", "问题六十三草稿文件未阻断下游消费", ["src/adapters/claude_code/tools.ts"], "problem-63", "草稿不得静默跳过", "草稿必须写入 blocked 状态并阻断");
|
|
517
|
+
}
|
|
518
|
+
try {
|
|
519
|
+
const sac = await import(path.join(rootDir, "dist", "engine", "standard_asset_contract.js"));
|
|
520
|
+
if (sac.matchTemplateContract({ file_path: "docs/architecture/01-架构设计文档.md" }) === null) {
|
|
521
|
+
hardFail("RELEASE_ISSUE_CONTRACT_MATCH_FAILURE", "问题六十三模板匹配失败:架构设计文档路径应匹配模板契约", ["src/engine/standard_asset_contract.ts"], "problem-63", "精确路径应匹配 P0 模板", "修复 matchTemplateContract 路径匹配逻辑");
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
catch (error) {
|
|
525
|
+
hardFail("RELEASE_ISSUE_CONTRACT_LOAD_FAILED", `无法执行问题六十三行为复验: ${error?.message ?? error}`, ["src/engine/standard_asset_contract.ts"], "problem-63", "模块不可执行", "修复构建或导出");
|
|
526
|
+
}
|
|
527
|
+
// ══ 问题六十四: 模板资产可见性 ══
|
|
528
|
+
const visText = safeReadCached(path.join(rootDir, "src", "engine", "template_asset_visibility.ts"), ctx.readCache) ?? "";
|
|
529
|
+
if (!visText.includes("isInherentlyInternal") || !visText.includes("inferVisibilityFromPath") || !visText.includes("filterSyncAssets")) {
|
|
530
|
+
hardFail("RELEASE_ISSUE_VISIBILITY_MISSING", "问题六十四缺少内部资产识别、可见性推断或同步过滤函数", ["src/engine/template_asset_visibility.ts"], "problem-64", "缺少核心函数不能实现可见性门禁", "实现 isInherentlyInternal / inferVisibilityFromPath / filterSyncAssets");
|
|
531
|
+
}
|
|
532
|
+
const syncText = safeReadCached(path.join(rootDir, "src", "engine", "template_init_sync.ts"), ctx.readCache) ?? "";
|
|
533
|
+
if (!cliText.includes("getContractDecision") && !syncText.includes("getContractDecision")) {
|
|
534
|
+
hardFail("RELEASE_ISSUE_VISIBILITY_SYNC_MISSING", "问题六十四 copyKnowledgeTemplates 未接入可见性门禁", ["src/engine/template_init_sync.ts"], "problem-64", "init/sync 不加门禁会泄漏内部资产到用户项目", "在 template_init_sync 中消费可见性门禁");
|
|
535
|
+
}
|
|
536
|
+
// copyKnowledgeTemplates 不得使用 subDirs 硬编码列表
|
|
537
|
+
if (cliText.includes("const subDirs = [")) {
|
|
538
|
+
hardFail("RELEASE_ISSUE_VISIBILITY_SUBDIRS_HARDCODE", "问题六十四 copyKnowledgeTemplates 仍使用 subDirs 硬编码列表", ["src/bin/soloforge.ts"], "problem-64", "硬编码 subDirs 无法覆盖新增目录", "改为递归发现并统一走可见性门禁");
|
|
539
|
+
}
|
|
540
|
+
// scaffolder 不得使用 process.cwd() 作为内置路径 fallback
|
|
541
|
+
const scaffolderText = safeReadCached(path.join(rootDir, "src", "engine", "scaffolder.ts"), ctx.readCache) ?? "";
|
|
542
|
+
if (scaffolderText.includes("process.cwd()")) {
|
|
543
|
+
hardFail("RELEASE_ISSUE_SCAFFOLDER_CWD_FALLBACK", "问题六十四 scaffolder 仍使用 process.cwd() 作为内置路径", ["src/engine/scaffolder.ts"], "problem-64", "process.cwd() 在 npm 安装场景解析错误", "改为 import.meta.dirname 解析包内路径");
|
|
544
|
+
}
|
|
545
|
+
try {
|
|
546
|
+
const vis = await import(path.join(rootDir, "dist", "engine", "template_asset_visibility.js"));
|
|
547
|
+
// 内部资产必须被识别
|
|
548
|
+
if (!vis.isInherentlyInternal("templates/internal/rules/演进回归门控规则.md")) {
|
|
549
|
+
hardFail("RELEASE_ISSUE_VISIBILITY_INTERNAL_MISS", "问题六十四内部资产识别失败:演进回归门控规则应被识别为内部资产", ["src/engine/template_asset_visibility.ts"], "problem-64", "denylist 不生效", "修复 isInherentlyInternal 逻辑");
|
|
550
|
+
}
|
|
551
|
+
// 用户可见资产不应被识别为内部
|
|
552
|
+
if (vis.isInherentlyInternal("templates/artifacts/shared/架构设计模版.md")) {
|
|
553
|
+
hardFail("RELEASE_ISSUE_VISIBILITY_USER_MISS", "问题六十四用户项目资产误判为内部资产", ["src/engine/template_asset_visibility.ts"], "problem-64", "用户可见资产不应被过滤", "修复 isInherentlyInternal 逻辑");
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
catch (error) {
|
|
557
|
+
hardFail("RELEASE_ISSUE_VISIBILITY_LOAD_FAILED", `无法执行问题六十四行为复验: ${error?.message ?? error}`, ["src/engine/template_asset_visibility.ts"], "problem-64", "模块不可执行", "修复构建或导出");
|
|
558
|
+
}
|
|
559
|
+
// ══ 发布问题返修新增门禁 ══
|
|
560
|
+
// 问题六十一: sf_expand 不得使用不存在的 args.intent
|
|
561
|
+
{
|
|
562
|
+
const expandFnMatch = toolsText.match(/\/\/ 问题六十一[\s\S]*?matchDecisionPacks\(\{[^}]*\}\)/);
|
|
563
|
+
if (expandFnMatch && expandFnMatch[0].includes("args.intent")) {
|
|
564
|
+
hardFail("RELEASE_ISSUE_DECISION_ARGS_INTENT", "问题六十一 sf_expand 使用不存在的 args.intent 调用 matchDecisionPacks", ["src/adapters/claude_code/tools.ts"], "problem-61", "ExpandSchema 无 intent 字段,args.intent 永远 undefined", "改用 ctx.intent / ctx.classification / ctx.route_decision");
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
// 问题六十二: standard_asset_coverage 不得以注册存在替代复验路径
|
|
568
|
+
{
|
|
569
|
+
const sacCovText = safeReadCached(path.join(rootDir, "src", "engine", "standard_asset_coverage.ts"), ctx.readCache) ?? "";
|
|
570
|
+
if (sacCovText.includes("hasRevalidation = isRegistered") || sacCovText.includes("has_revalidation_path: isRegistered")) {
|
|
571
|
+
hardFail("RELEASE_ISSUE_COVERAGE_FAKE_REVALIDATION", "问题六十二 hasRevalidation=isRegistered 将注册等同于复验路径", ["src/engine/standard_asset_coverage.ts"], "problem-62", "注册存在不等于有复验入口", "必须从真实消费链路验证复验路径");
|
|
572
|
+
}
|
|
573
|
+
// 覆盖审计不得从 ASSET_MANIFEST 创建空 consumerMap
|
|
574
|
+
if (cliText.includes("ASSET_MANIFEST") && cliText.includes("[] as string[]") && cliText.includes("consumerMap")) {
|
|
575
|
+
hardFail("RELEASE_ISSUE_COVERAGE_EMPTY_CONSUMER", "问题六十二 audit-template-visibility 从 ASSET_MANIFEST 创建空 consumerMap", ["src/bin/soloforge.ts"], "problem-62", "空 consumerMap 导致所有资产 missing_consumer=0 假通过", "从权威合同获取真实消费者");
|
|
576
|
+
}
|
|
577
|
+
// 覆盖报告中有 uncovered/missing_consumer 时必须 hard_fail
|
|
578
|
+
// 消费者证据从逐资产运行时观察结果获取,不从合同声明字段复制
|
|
579
|
+
try {
|
|
580
|
+
const cov = await import(path.join(rootDir, "dist", "engine", "standard_asset_coverage.js"));
|
|
581
|
+
const car = await import(path.join(rootDir, "dist", "engine", "consumable_asset_registry.js"));
|
|
582
|
+
const contractReg = await import(path.join(rootDir, "dist", "engine", "template_asset_contract_registry.js"));
|
|
583
|
+
const obsMod = await import(path.join(rootDir, "dist", "engine", "observed_consumption.js"));
|
|
584
|
+
const registeredAssets = car.listBuiltinConsumableAssets();
|
|
585
|
+
const contracts = contractReg.listTemplateAssetContracts();
|
|
586
|
+
const consumablePaths = new Set(registeredAssets.map((a) => a.path));
|
|
587
|
+
const ownerMap = new Map(contracts.map((c) => [c.path, c.owner_mechanism_id]));
|
|
588
|
+
// 运行真实 scenario 生成消费 trace,然后构建消费者映射
|
|
589
|
+
const obsReport = await obsMod.observeAllConsumption(rootDir);
|
|
590
|
+
const consumerMap = new Map();
|
|
591
|
+
for (const obs of obsReport.observations) {
|
|
592
|
+
const consumers = consumerMap.get(obs.asset_path) ?? [];
|
|
593
|
+
// entry_point 即为真实消费入口
|
|
594
|
+
if (obs.entry_point && !consumers.includes(obs.entry_point)) {
|
|
595
|
+
consumers.push(obs.entry_point);
|
|
596
|
+
}
|
|
597
|
+
consumerMap.set(obs.asset_path, consumers);
|
|
598
|
+
}
|
|
599
|
+
// 补充复验入口标识(与消费者证据不同维度,复验入口是审计/验证角色标识)
|
|
600
|
+
for (const c of contracts) {
|
|
601
|
+
const consumers = consumerMap.get(c.path) ?? [];
|
|
602
|
+
if (c.validation_entrypoint && !consumers.includes(c.validation_entrypoint)) {
|
|
603
|
+
consumers.push(c.validation_entrypoint);
|
|
604
|
+
}
|
|
605
|
+
consumerMap.set(c.path, consumers);
|
|
606
|
+
}
|
|
607
|
+
const visibilityMap = new Map(contracts.map((c) => [c.path, c.asset_visibility ?? "unknown"]));
|
|
608
|
+
const report = cov.auditStandardAssetCoverage(rootDir, consumablePaths, ownerMap, consumerMap, visibilityMap);
|
|
609
|
+
if (report.uncovered_assets > 0) {
|
|
610
|
+
hardFail("RELEASE_ISSUE_COVERAGE_UNCOVERED", `问题六十二覆盖审计发现 ${report.uncovered_assets} 个未覆盖资产`, ["src/engine/standard_asset_coverage.ts", "src/engine/template_asset_contract_registry.ts"], "problem-62", "未覆盖资产不得通过发布门禁", "为每个资产建立真实消费证据");
|
|
611
|
+
}
|
|
612
|
+
if (report.missing_consumer > 0) {
|
|
613
|
+
hardFail("RELEASE_ISSUE_COVERAGE_MISSING_CONSUMER", `问题六十二覆盖审计发现 ${report.missing_consumer} 个资产缺少主链路消费者`, ["src/engine/standard_asset_coverage.ts", "src/engine/template_asset_contract_registry.ts"], "problem-62", "无消费者证据不得通过发布门禁", "为每个资产建立真实主链路消费者");
|
|
614
|
+
}
|
|
615
|
+
if (report.missing_revalidation > 0) {
|
|
616
|
+
hardFail("RELEASE_ISSUE_COVERAGE_MISSING_REVALIDATION", `问题六十二覆盖审计发现 ${report.missing_revalidation} 个资产缺少复验入口`, ["src/engine/standard_asset_coverage.ts", "src/engine/template_asset_contract_registry.ts"], "problem-62", "无复验入口不得通过发布门禁", "为每个资产建立真实复验入口");
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
catch (error) {
|
|
620
|
+
// template_asset_contract_registry 尚不存在 — 这是预期失败
|
|
621
|
+
hardFail("RELEASE_ISSUE_CONTRACT_REGISTRY_MISSING", `问题六十三权威合同注册表不存在: ${error?.message ?? error}`, ["src/engine/template_asset_contract_registry.ts"], "problem-63", "214 资产必须有权威合同", "创建 template_asset_contract_registry.ts");
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
// 问题六十三: templates 总数 = 权威合同覆盖数
|
|
625
|
+
{
|
|
626
|
+
const contractRegText = safeReadCached(path.join(rootDir, "src", "engine", "template_asset_contract_registry.ts"), ctx.readCache) ?? "";
|
|
627
|
+
if (!contractRegText.includes("TemplateAssetContract") || !contractRegText.includes("listTemplateAssetContracts")) {
|
|
628
|
+
hardFail("RELEASE_ISSUE_CONTRACT_REGISTRY_MISSING", "问题六十三缺少权威合同注册表(TemplateAssetContract / listTemplateAssetContracts)", ["src/engine/template_asset_contract_registry.ts"], "problem-63", "214 资产必须有单一权威元数据体系", "创建 template_asset_contract_registry.ts");
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
// 问题六十四: 可见性不得使用 denylist 猜测
|
|
632
|
+
{
|
|
633
|
+
const visText2 = safeReadCached(path.join(rootDir, "src", "engine", "template_asset_visibility.ts"), ctx.readCache) ?? "";
|
|
634
|
+
if (visText2.includes("INTERNAL_ASSET_PATTERNS")) {
|
|
635
|
+
hardFail("RELEASE_ISSUE_VISIBILITY_DENYLIST", "问题六十四 template_asset_visibility.ts 仍使用 INTERNAL_ASSET_PATTERNS denylist", ["src/engine/template_asset_visibility.ts"], "problem-64", "denylist 猜测不是权威分类", "改用权威合同注册表的 asset_visibility 字段");
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
// 问题六十四: 必须存在并执行真实技术栈受限资产,禁止以跳过或内存假资产代替。
|
|
639
|
+
{
|
|
640
|
+
const { buildTemplateAssetContracts } = await import("../template_asset_contract_registry.js");
|
|
641
|
+
const restrictedScaffolds = buildTemplateAssetContracts(rootDir).filter((contract) => contract.consume_category === "scaffold_only" && contract.applicable_tech_stack.length > 0);
|
|
642
|
+
if (restrictedScaffolds.length === 0) {
|
|
643
|
+
hardFail("RELEASE_ISSUE_TECH_STACK_ASSET_MISSING", "问题六十四不存在真实 applicable_tech_stack 脚手架资产", ["src/engine/explicit_asset_registry.ts"], "problem-64", "没有真实受限资产不能证明技术栈隔离", "为内置脚手架声明权威 applicable_tech_stack 并走 sf_scaffold 验证");
|
|
644
|
+
}
|
|
645
|
+
const scenarioTestText = safeReadCached(path.join(rootDir, "tests", "engine", "release_issue_scenario_matrix.test.ts"), ctx.readCache) ?? "";
|
|
646
|
+
const failClosedTestText = safeReadCached(path.join(rootDir, "tests", "engine", "template_asset_contract_registry.test.ts"), ctx.readCache) ?? "";
|
|
647
|
+
if (/it\.skip\([\s\S]{0,80}技术栈|test-java-rule/.test(`${scenarioTestText}\n${failClosedTestText}`)) {
|
|
648
|
+
hardFail("RELEASE_ISSUE_TECH_STACK_FAKE_TEST", "问题六十四仍以跳过测试或内存假资产代替真实技术栈复验", ["tests/engine/release_issue_scenario_matrix.test.ts", "tests/engine/template_asset_contract_registry.test.ts"], "problem-64", "假资产/skip 不证明用户实际链路", "仅使用 explicit_asset_registry 已登记资产执行真实 scaffold 场景");
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
// sf_accept 必须为需要显式授权的验收入口,且处理器不得直接篡改产物状态。
|
|
652
|
+
{
|
|
653
|
+
const contractText = safeReadCached(path.join(rootDir, "src", "engine", "tool_invocation_contract_registry.ts"), ctx.readCache) ?? "";
|
|
654
|
+
const acceptStart = toolsText.indexOf('registerSafeTool(\n "sf_accept"');
|
|
655
|
+
const deliverStart = toolsText.indexOf('registerSafeTool(\n "sf_deliver"', acceptStart + 1);
|
|
656
|
+
const acceptBody = toolsText.substring(acceptStart, deliverStart > 0 ? deliverStart : toolsText.length);
|
|
657
|
+
const contractStrict = /tool_name:\s*"sf_accept"[\s\S]{0,120}category:\s*"strict_controlled"[\s\S]{0,120}requires_authorization:\s*true/.test(contractText);
|
|
658
|
+
const confirmsEvidence = acceptBody.includes("confirmation_ref") && acceptBody.includes("confirmed_by") && acceptBody.includes("updateArtifactStatus");
|
|
659
|
+
const directStatusWrite = /artifact_output\.status\s*=\s*"accepted"/.test(acceptBody);
|
|
660
|
+
if (!contractStrict || !confirmsEvidence || directStatusWrite) {
|
|
661
|
+
hardFail("RELEASE_ISSUE_ACCEPTANCE_SELF_ATTESTATION", "sf_accept 仍可缺少显式确认或绕过 artifact 生命周期", ["src/adapters/claude_code/tools.ts", "src/engine/tool_invocation_contract_registry.ts"], "problem-63", "自动生成的验收证据不得放行正式产物", "要求显式确认引用并只通过 updateArtifactStatus 接受产物");
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
// 问题五十九: 新增 CLI 命令不得使用 console.log
|
|
665
|
+
{
|
|
666
|
+
const auditFnStart = cliText.indexOf("async function cmdAuditTemplateVisibility");
|
|
667
|
+
const nextFnStart = cliText.indexOf("\nasync function ", auditFnStart + 1);
|
|
668
|
+
const fnBody = cliText.substring(auditFnStart, nextFnStart > 0 ? nextFnStart : cliText.length);
|
|
669
|
+
if (fnBody.includes("console.log")) {
|
|
670
|
+
hardFail("RELEASE_ISSUE_LOGGER_VIOLATION", "问题五十九 cmdAuditTemplateVisibility 使用 console.log 违反日志治理", ["src/bin/soloforge.ts"], "problem-59", "新增代码必须使用统一 logger", "替换 console.log 为 userInfo/userJson");
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
// 问题六十二/六十三: 逐资产运行时消费证据 — 不得接受"consumer file exists"或"export name exists"作为真实消费证明
|
|
674
|
+
{
|
|
675
|
+
const { observeAllConsumption } = await import("../observed_consumption.js");
|
|
676
|
+
const report = await observeAllConsumption(rootDir);
|
|
677
|
+
if (report.fail > 0) {
|
|
678
|
+
hardFail("RELEASE_ISSUE_CONSUMPTION_EVIDENCE_FAIL", `问题六十二逐资产消费证据验证失败(${report.fail} failures): ${report.failures.join("; ")}`, ["src/engine/observed_consumption.ts", "src/engine/template_asset_contract_registry.ts"], "problem-62", "逐资产运行时消费证据不完整", "检查 observeAllConsumption 中每个资产的观察结果");
|
|
679
|
+
}
|
|
680
|
+
if (report.total < 215) {
|
|
681
|
+
hardFail("RELEASE_ISSUE_CONSUMPTION_EVIDENCE_INCOMPLETE", `问题六十二消费证据仅覆盖 ${report.total} 个资产,预期至少 215`, ["src/engine/observed_consumption.ts"], "problem-62", "消费证据覆盖不全", "确保所有注册资产都有消费观察记录");
|
|
682
|
+
}
|
|
683
|
+
// trace 必须来自真实入口(init/sync_templates),不得仅来自 contract_gate 兜底
|
|
684
|
+
const traceCounts = report.trace_counts;
|
|
685
|
+
if ((traceCounts.init ?? 0) === 0 && (traceCounts.sync_templates ?? 0) === 0) {
|
|
686
|
+
hardFail("RELEASE_ISSUE_CONSUMPTION_EVIDENCE_NO_REAL_TRACE", "问题六十二消费证据无真实入口 trace(init/sync_templates 均为 0)", ["src/engine/observed_consumption.ts"], "problem-62", "必须运行真实入口 scenario 产生 trace", "检查 observeAllConsumption 中的 scenario runner");
|
|
687
|
+
}
|
|
688
|
+
// 硬检查: mainline trace 的 declared_consumer 必须与合同 mainline_consumer 精确匹配
|
|
689
|
+
for (const obs of report.observations) {
|
|
690
|
+
if (obs.consume_category === "mainline" && obs.validation_result === "fail" && obs.failure_reason?.includes("无精确消费 trace")) {
|
|
691
|
+
hardFail("RELEASE_ISSUE_MAINLINE_TRACE_MISMATCH", `mainline 资产消费 trace 不匹配: ${obs.failure_reason}`, ["src/engine/observed_consumption.ts", obs.asset_path], "problem-62", "mainline trace declared_consumer 必须与合同 mainline_consumer 精确对应", "确保生产函数记录 declared_consumer");
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
// 负向测试: scaffold_only 资产必须有 scaffold trace,删除 scaffold scenario 后必须 fail
|
|
696
|
+
{
|
|
697
|
+
const { buildTemplateAssetContracts } = await import("../template_asset_contract_registry.js");
|
|
698
|
+
const { getConsumptionTraces, clearConsumptionTraces, recordConsumptionTrace } = await import("../consumption_trace_store.js");
|
|
699
|
+
clearConsumptionTraces();
|
|
700
|
+
// 只运行 init+sync(不运行 scaffold),scaffold_only 资产应无合法 trace
|
|
701
|
+
const { copyKnowledgeToProject, copyPatternsToGlobal } = await import("../template_init_sync.js");
|
|
702
|
+
const tmpNegDir = fs.mkdtempSync(path.join(os.tmpdir(), "soloforge-neg-"));
|
|
703
|
+
try {
|
|
704
|
+
await copyKnowledgeToProject(rootDir, tmpNegDir);
|
|
705
|
+
const globalDir = path.join(tmpNegDir, ".soloforge", "patterns");
|
|
706
|
+
await copyPatternsToGlobal(rootDir, globalDir);
|
|
707
|
+
}
|
|
708
|
+
finally {
|
|
709
|
+
fs.rmSync(tmpNegDir, { recursive: true, force: true });
|
|
710
|
+
}
|
|
711
|
+
// 收集 scaffold_only 合同,验证它们都没有 scaffold trace
|
|
712
|
+
const contracts = buildTemplateAssetContracts(rootDir);
|
|
713
|
+
const scaffoldContracts = contracts.filter(c => c.consume_category === "scaffold_only");
|
|
714
|
+
const traces = getConsumptionTraces();
|
|
715
|
+
const scaffoldTracedPaths = new Set(traces.filter(t => t.consumer === "scaffold").map(t => t.asset_path));
|
|
716
|
+
const scaffoldWithTrace = scaffoldContracts.filter(c => scaffoldTracedPaths.has(c.path));
|
|
717
|
+
if (scaffoldWithTrace.length > 0) {
|
|
718
|
+
hardFail("RELEASE_ISSUE_NEGATIVE_SCAFFOLD_LEAK", `负向测试失败: 未运行 scaffold scenario 但 ${scaffoldWithTrace.length} 个 scaffold_only 资产有 scaffold trace`, ["src/engine/observed_consumption.ts"], "problem-62", "scaffold trace 不应从其他 scenario 泄露", "检查 scaffold scenario 是否独立");
|
|
719
|
+
}
|
|
720
|
+
clearConsumptionTraces();
|
|
721
|
+
}
|
|
722
|
+
// 问题六十四: copyKnowledgeTemplates 必须对无合同资产 fail-closed
|
|
723
|
+
{
|
|
724
|
+
const copyFnSource = syncText || cliText;
|
|
725
|
+
const copyFnStart = copyFnSource.indexOf("async function copyKnowledge") !== -1
|
|
726
|
+
? copyFnSource.indexOf("async function copyKnowledge")
|
|
727
|
+
: copyFnSource.indexOf("export async function copyKnowledgeToProject");
|
|
728
|
+
const copyFnEnd = copyFnSource.indexOf("\nasync function ", copyFnStart + 1);
|
|
729
|
+
const copyFnBody = copyFnSource.substring(copyFnStart, copyFnEnd > 0 ? copyFnEnd : copyFnSource.length);
|
|
730
|
+
// 必须有 "skipped_no_contract" 或 "unregistered" — 证明无合同时会跳过
|
|
731
|
+
if (!copyFnBody.includes("skipped_no_contract") && !copyFnBody.includes("unregistered")) {
|
|
732
|
+
hardFail("RELEASE_ISSUE_COPY_NO_CONTRACT_FAIL_OPEN", "问题六十四 copyKnowledgeTemplates 未对无合同资产 fail-closed", ["src/engine/template_init_sync.ts"], "problem-64", "无合同资产不应被复制", "添加 skipped_no_contract 计数并在无合同时 continue");
|
|
733
|
+
}
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
//# sourceMappingURL=checkReleaseIssueDesignPath.js.map
|