soloforge 1.4.16 → 2.0.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/CHANGELOG.md +279 -0
- package/README.md +162 -50
- package/dist/adapters/claude_code/claude_md.d.ts +2 -1
- package/dist/adapters/claude_code/claude_md.d.ts.map +1 -1
- package/dist/adapters/claude_code/claude_md.js +6 -6
- package/dist/adapters/claude_code/claude_md.js.map +1 -1
- package/dist/adapters/claude_code/hooks.d.ts.map +1 -1
- package/dist/adapters/claude_code/hooks.js +2 -2
- package/dist/adapters/claude_code/hooks.js.map +1 -1
- package/dist/adapters/claude_code/tools.d.ts +9 -327
- package/dist/adapters/claude_code/tools.d.ts.map +1 -1
- package/dist/adapters/claude_code/tools.js +7 -4202
- package/dist/adapters/claude_code/tools.js.map +1 -1
- package/dist/adapters/codex/codex_config.d.ts.map +1 -1
- package/dist/adapters/codex/codex_config.js +2 -2
- package/dist/adapters/codex/codex_config.js.map +1 -1
- package/dist/adapters/codex/codex_rules.d.ts +2 -1
- package/dist/adapters/codex/codex_rules.d.ts.map +1 -1
- package/dist/adapters/codex/codex_rules.js +25 -25
- package/dist/adapters/codex/codex_rules.js.map +1 -1
- package/dist/adapters/shared/hook_command.d.ts +20 -0
- package/dist/adapters/shared/hook_command.d.ts.map +1 -0
- package/dist/adapters/shared/hook_command.js +80 -0
- package/dist/adapters/shared/hook_command.js.map +1 -0
- 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 +17 -80
- package/dist/adapters/shared/workflow_template.js.map +1 -1
- package/dist/adapters/trae/trae_config.d.ts +17 -1
- package/dist/adapters/trae/trae_config.d.ts.map +1 -1
- package/dist/adapters/trae/trae_config.js +3 -3
- package/dist/adapters/trae/trae_config.js.map +1 -1
- package/dist/adapters/trae/trae_rules.d.ts +2 -1
- package/dist/adapters/trae/trae_rules.d.ts.map +1 -1
- package/dist/adapters/trae/trae_rules.js +25 -11
- package/dist/adapters/trae/trae_rules.js.map +1 -1
- package/dist/bin/args.d.ts +13 -0
- package/dist/bin/args.d.ts.map +1 -0
- package/dist/bin/args.js +52 -0
- package/dist/bin/args.js.map +1 -0
- package/dist/bin/commands/analyze.d.ts +7 -0
- package/dist/bin/commands/analyze.d.ts.map +1 -0
- package/dist/bin/commands/analyze.js +52 -0
- package/dist/bin/commands/analyze.js.map +1 -0
- package/dist/bin/commands/audit.d.ts +11 -0
- package/dist/bin/commands/audit.d.ts.map +1 -0
- package/dist/bin/commands/audit.js +468 -0
- package/dist/bin/commands/audit.js.map +1 -0
- package/dist/bin/commands/check_bash.d.ts +15 -0
- package/dist/bin/commands/check_bash.d.ts.map +1 -0
- package/dist/bin/commands/check_bash.js +264 -0
- package/dist/bin/commands/check_bash.js.map +1 -0
- package/dist/bin/commands/check_write.d.ts +41 -0
- package/dist/bin/commands/check_write.d.ts.map +1 -0
- package/dist/bin/commands/check_write.js +437 -0
- package/dist/bin/commands/check_write.js.map +1 -0
- package/dist/bin/commands/hooks.d.ts +8 -0
- package/dist/bin/commands/hooks.d.ts.map +1 -0
- package/dist/bin/commands/hooks.js +83 -0
- package/dist/bin/commands/hooks.js.map +1 -0
- package/dist/bin/commands/init.d.ts +38 -0
- package/dist/bin/commands/init.d.ts.map +1 -0
- package/dist/bin/commands/init.js +406 -0
- package/dist/bin/commands/init.js.map +1 -0
- package/dist/bin/commands/modify.d.ts +7 -0
- package/dist/bin/commands/modify.d.ts.map +1 -0
- package/dist/bin/commands/modify.js +74 -0
- package/dist/bin/commands/modify.js.map +1 -0
- package/dist/bin/commands/reasoning.d.ts +14 -0
- package/dist/bin/commands/reasoning.d.ts.map +1 -0
- package/dist/bin/commands/reasoning.js +158 -0
- package/dist/bin/commands/reasoning.js.map +1 -0
- package/dist/bin/commands/review.d.ts +7 -0
- package/dist/bin/commands/review.d.ts.map +1 -0
- package/dist/bin/commands/review.js +79 -0
- package/dist/bin/commands/review.js.map +1 -0
- package/dist/bin/commands/status.d.ts +12 -0
- package/dist/bin/commands/status.d.ts.map +1 -0
- package/dist/bin/commands/status.js +614 -0
- package/dist/bin/commands/status.js.map +1 -0
- package/dist/bin/commands/sync.d.ts +11 -0
- package/dist/bin/commands/sync.d.ts.map +1 -0
- package/dist/bin/commands/sync.js +517 -0
- package/dist/bin/commands/sync.js.map +1 -0
- package/dist/bin/commands/validate.d.ts +10 -0
- package/dist/bin/commands/validate.d.ts.map +1 -0
- package/dist/bin/commands/validate.js +504 -0
- package/dist/bin/commands/validate.js.map +1 -0
- package/dist/bin/config_commands.d.ts +21 -20
- package/dist/bin/config_commands.d.ts.map +1 -1
- package/dist/bin/config_commands.js +214 -227
- package/dist/bin/config_commands.js.map +1 -1
- package/dist/bin/soloforge.d.ts +1 -1
- package/dist/bin/soloforge.d.ts.map +1 -1
- package/dist/bin/soloforge.js +100 -2833
- package/dist/bin/soloforge.js.map +1 -1
- package/dist/engine/adapter_prompt_contract.d.ts +2 -2
- package/dist/engine/adapter_prompt_contract.d.ts.map +1 -1
- package/dist/engine/adapter_prompt_contract.js +1 -1
- package/dist/engine/adapter_prompt_contract.js.map +1 -1
- package/dist/engine/audit/audit_pool.d.ts.map +1 -0
- package/dist/engine/audit/audit_pool.js +121 -0
- package/dist/engine/audit/audit_pool.js.map +1 -0
- package/dist/engine/audit/audit_sampler.d.ts +22 -0
- package/dist/engine/audit/audit_sampler.d.ts.map +1 -0
- package/dist/engine/audit/audit_sampler.js +29 -0
- package/dist/engine/audit/audit_sampler.js.map +1 -0
- package/dist/engine/audit/code_reviewer.d.ts +73 -0
- package/dist/engine/audit/code_reviewer.d.ts.map +1 -0
- package/dist/engine/audit/code_reviewer.js +632 -0
- package/dist/engine/audit/code_reviewer.js.map +1 -0
- package/dist/engine/audit/confidence_scorer.d.ts +48 -0
- package/dist/engine/audit/confidence_scorer.d.ts.map +1 -0
- package/dist/engine/audit/confidence_scorer.js +64 -0
- package/dist/engine/audit/confidence_scorer.js.map +1 -0
- package/dist/engine/audit/core_engineering_principles.d.ts +155 -0
- package/dist/engine/audit/core_engineering_principles.d.ts.map +1 -0
- package/dist/engine/audit/core_engineering_principles.js +414 -0
- package/dist/engine/audit/core_engineering_principles.js.map +1 -0
- package/dist/engine/audit/core_experience_principle.d.ts +194 -0
- package/dist/engine/audit/core_experience_principle.d.ts.map +1 -0
- package/dist/engine/audit/core_experience_principle.js +349 -0
- package/dist/engine/audit/core_experience_principle.js.map +1 -0
- package/dist/engine/audit/debt_reporter.d.ts +12 -0
- package/dist/engine/audit/debt_reporter.d.ts.map +1 -0
- package/dist/engine/audit/debt_reporter.js +94 -0
- package/dist/engine/audit/debt_reporter.js.map +1 -0
- package/dist/engine/audit/debt_tracker.d.ts +72 -0
- package/dist/engine/audit/debt_tracker.d.ts.map +1 -0
- package/dist/engine/audit/debt_tracker.js +231 -0
- package/dist/engine/audit/debt_tracker.js.map +1 -0
- package/dist/engine/audit/debugger.d.ts +15 -0
- package/dist/engine/audit/debugger.d.ts.map +1 -0
- package/dist/engine/audit/debugger.js +415 -0
- package/dist/engine/audit/debugger.js.map +1 -0
- package/dist/engine/audit/degradation.d.ts.map +1 -0
- package/dist/engine/audit/degradation.js.map +1 -0
- package/dist/engine/audit/delivery.d.ts +49 -0
- package/dist/engine/audit/delivery.d.ts.map +1 -0
- package/dist/engine/audit/delivery.js +405 -0
- package/dist/engine/audit/delivery.js.map +1 -0
- package/dist/engine/audit/delivery_readiness.d.ts +72 -0
- package/dist/engine/audit/delivery_readiness.d.ts.map +1 -0
- package/dist/engine/audit/delivery_readiness.js +200 -0
- package/dist/engine/audit/delivery_readiness.js.map +1 -0
- package/dist/engine/audit/developer_sovereignty.d.ts +24 -0
- package/dist/engine/audit/developer_sovereignty.d.ts.map +1 -0
- package/dist/engine/audit/developer_sovereignty.js +137 -0
- package/dist/engine/audit/developer_sovereignty.js.map +1 -0
- package/dist/engine/audit/diagnostic_registry.d.ts.map +1 -0
- package/dist/engine/audit/diagnostic_registry.js +288 -0
- package/dist/engine/audit/diagnostic_registry.js.map +1 -0
- package/dist/engine/audit/evolver.d.ts +78 -0
- package/dist/engine/audit/evolver.d.ts.map +1 -0
- package/dist/engine/audit/evolver.js +402 -0
- package/dist/engine/audit/evolver.js.map +1 -0
- package/dist/engine/audit/failure_classifier.d.ts +39 -0
- package/dist/engine/audit/failure_classifier.d.ts.map +1 -0
- package/dist/engine/audit/failure_classifier.js +175 -0
- package/dist/engine/audit/failure_classifier.js.map +1 -0
- package/dist/engine/audit/failure_report.d.ts.map +1 -0
- package/dist/engine/audit/failure_report.js.map +1 -0
- package/dist/engine/audit/governance_report.d.ts +101 -0
- package/dist/engine/audit/governance_report.d.ts.map +1 -0
- package/dist/engine/audit/governance_report.js +185 -0
- package/dist/engine/audit/governance_report.js.map +1 -0
- package/dist/engine/audit/java_quality_guard.d.ts.map +1 -0
- package/dist/engine/audit/java_quality_guard.js +228 -0
- package/dist/engine/audit/java_quality_guard.js.map +1 -0
- package/dist/engine/audit/main_path_integration_contract/constants.d.ts +27 -0
- package/dist/engine/audit/main_path_integration_contract/constants.d.ts.map +1 -0
- package/dist/engine/audit/main_path_integration_contract/constants.js +71 -0
- package/dist/engine/audit/main_path_integration_contract/constants.js.map +1 -0
- package/dist/engine/audit/main_path_integration_contract/factories.d.ts +35 -0
- package/dist/engine/audit/main_path_integration_contract/factories.d.ts.map +1 -0
- package/dist/engine/audit/main_path_integration_contract/factories.js +62 -0
- package/dist/engine/audit/main_path_integration_contract/factories.js.map +1 -0
- package/dist/engine/audit/main_path_integration_contract/gates.d.ts +25 -0
- package/dist/engine/audit/main_path_integration_contract/gates.d.ts.map +1 -0
- package/dist/engine/audit/main_path_integration_contract/gates.js +307 -0
- package/dist/engine/audit/main_path_integration_contract/gates.js.map +1 -0
- package/dist/engine/audit/main_path_integration_contract/index.d.ts +17 -0
- package/dist/engine/audit/main_path_integration_contract/index.d.ts.map +1 -0
- package/dist/engine/audit/main_path_integration_contract/index.js +21 -0
- package/dist/engine/audit/main_path_integration_contract/index.js.map +1 -0
- package/dist/engine/audit/main_path_integration_contract/queries.d.ts +46 -0
- package/dist/engine/audit/main_path_integration_contract/queries.d.ts.map +1 -0
- package/dist/engine/audit/main_path_integration_contract/queries.js +91 -0
- package/dist/engine/audit/main_path_integration_contract/queries.js.map +1 -0
- package/dist/engine/audit/main_path_integration_contract/scanning.d.ts +13 -0
- package/dist/engine/audit/main_path_integration_contract/scanning.d.ts.map +1 -0
- package/dist/engine/audit/main_path_integration_contract/scanning.js +476 -0
- package/dist/engine/audit/main_path_integration_contract/scanning.js.map +1 -0
- package/dist/engine/audit/main_path_integration_contract/scanning_infra.d.ts +35 -0
- package/dist/engine/audit/main_path_integration_contract/scanning_infra.d.ts.map +1 -0
- package/dist/engine/audit/main_path_integration_contract/scanning_infra.js +343 -0
- package/dist/engine/audit/main_path_integration_contract/scanning_infra.js.map +1 -0
- package/dist/engine/audit/main_path_integration_contract/types.d.ts +87 -0
- package/dist/engine/audit/main_path_integration_contract/types.d.ts.map +1 -0
- package/dist/engine/audit/main_path_integration_contract/types.js +5 -0
- package/dist/engine/audit/main_path_integration_contract/types.js.map +1 -0
- package/dist/engine/audit/main_path_integration_contract.d.ts +13 -0
- package/dist/engine/audit/main_path_integration_contract.d.ts.map +1 -0
- package/dist/engine/audit/main_path_integration_contract.js +17 -0
- package/dist/engine/audit/main_path_integration_contract.js.map +1 -0
- package/dist/engine/audit/mutation_audit.d.ts +39 -0
- package/dist/engine/audit/mutation_audit.d.ts.map +1 -0
- package/dist/engine/audit/mutation_audit.js +153 -0
- package/dist/engine/audit/mutation_audit.js.map +1 -0
- package/dist/engine/audit/observability.d.ts +68 -0
- package/dist/engine/audit/observability.d.ts.map +1 -0
- package/dist/engine/audit/observability.js +437 -0
- package/dist/engine/audit/observability.js.map +1 -0
- package/dist/engine/audit/privacy_grants.d.ts +108 -0
- package/dist/engine/audit/privacy_grants.d.ts.map +1 -0
- package/dist/engine/audit/privacy_grants.js +171 -0
- package/dist/engine/audit/privacy_grants.js.map +1 -0
- package/dist/engine/audit/privacy_patterns.d.ts +24 -0
- package/dist/engine/audit/privacy_patterns.d.ts.map +1 -0
- package/dist/engine/audit/privacy_patterns.js +143 -0
- package/dist/engine/audit/privacy_patterns.js.map +1 -0
- package/dist/engine/audit/privacy_scanning.d.ts +153 -0
- package/dist/engine/audit/privacy_scanning.d.ts.map +1 -0
- package/dist/engine/audit/privacy_scanning.js +567 -0
- package/dist/engine/audit/privacy_scanning.js.map +1 -0
- package/dist/engine/audit/privacy_secret_contract.d.ts +12 -0
- package/dist/engine/audit/privacy_secret_contract.d.ts.map +1 -0
- package/dist/engine/audit/privacy_secret_contract.js +14 -0
- package/dist/engine/audit/privacy_secret_contract.js.map +1 -0
- package/dist/engine/audit/privacy_types.d.ts +48 -0
- package/dist/engine/audit/privacy_types.d.ts.map +1 -0
- package/dist/engine/audit/privacy_types.js +14 -0
- package/dist/engine/audit/privacy_types.js.map +1 -0
- package/dist/engine/audit/risk_sampler.d.ts +45 -0
- package/dist/engine/audit/risk_sampler.d.ts.map +1 -0
- package/dist/engine/audit/risk_sampler.js +81 -0
- package/dist/engine/audit/risk_sampler.js.map +1 -0
- package/dist/engine/audit/runtime_safety.d.ts.map +1 -0
- package/dist/engine/audit/runtime_safety.js +200 -0
- package/dist/engine/audit/runtime_safety.js.map +1 -0
- package/dist/engine/audit/semantic_evidence.d.ts +33 -0
- package/dist/engine/audit/semantic_evidence.d.ts.map +1 -0
- package/dist/engine/audit/semantic_evidence.js +93 -0
- package/dist/engine/audit/semantic_evidence.js.map +1 -0
- package/dist/engine/audit/test_generator.d.ts +10 -0
- package/dist/engine/audit/test_generator.d.ts.map +1 -0
- package/dist/engine/audit/test_generator.js +268 -0
- package/dist/engine/audit/test_generator.js.map +1 -0
- package/dist/engine/audit/test_quality.d.ts +39 -0
- package/dist/engine/audit/test_quality.d.ts.map +1 -0
- package/dist/engine/audit/test_quality.js +642 -0
- package/dist/engine/audit/test_quality.js.map +1 -0
- package/dist/engine/audit/test_strategy.d.ts.map +1 -0
- package/dist/engine/audit/test_strategy.js.map +1 -0
- package/dist/engine/change_coordinator.d.ts +2 -2
- package/dist/engine/change_coordinator.d.ts.map +1 -1
- package/dist/engine/change_coordinator.js +33 -33
- package/dist/engine/change_coordinator.js.map +1 -1
- package/dist/engine/cognitive_anchor.d.ts.map +1 -1
- package/dist/engine/cognitive_anchor.js +7 -8
- package/dist/engine/cognitive_anchor.js.map +1 -1
- package/dist/engine/config/config_write_boundary.d.ts.map +1 -0
- package/dist/engine/config/config_write_boundary.js +85 -0
- package/dist/engine/config/config_write_boundary.js.map +1 -0
- package/dist/engine/config/conflicts.d.ts +39 -0
- package/dist/engine/config/conflicts.d.ts.map +1 -0
- package/dist/engine/config/conflicts.js +79 -0
- package/dist/engine/config/conflicts.js.map +1 -0
- package/dist/engine/config/detector/blueprint.d.ts +25 -0
- package/dist/engine/config/detector/blueprint.d.ts.map +1 -0
- package/dist/engine/config/detector/blueprint.js +47 -0
- package/dist/engine/config/detector/blueprint.js.map +1 -0
- package/dist/engine/config/detector/fingerprint.d.ts +67 -0
- package/dist/engine/config/detector/fingerprint.d.ts.map +1 -0
- package/dist/engine/config/detector/fingerprint.js +160 -0
- package/dist/engine/config/detector/fingerprint.js.map +1 -0
- package/dist/engine/config/detector/framework_map.d.ts +89 -0
- package/dist/engine/config/detector/framework_map.d.ts.map +1 -0
- package/dist/engine/config/detector/framework_map.js +406 -0
- package/dist/engine/config/detector/framework_map.js.map +1 -0
- package/dist/engine/config/detector/index.d.ts +12 -0
- package/dist/engine/config/detector/index.d.ts.map +1 -0
- package/dist/engine/config/detector/index.js +12 -0
- package/dist/engine/config/detector/index.js.map +1 -0
- package/dist/engine/config/detector/verify.d.ts +32 -0
- package/dist/engine/config/detector/verify.d.ts.map +1 -0
- package/dist/engine/config/detector/verify.js +107 -0
- package/dist/engine/config/detector/verify.js.map +1 -0
- package/dist/engine/config/intent.d.ts +26 -0
- package/dist/engine/config/intent.d.ts.map +1 -0
- package/dist/engine/config/intent.js +81 -0
- package/dist/engine/config/intent.js.map +1 -0
- package/dist/engine/config/intent_schema.d.ts +873 -0
- package/dist/engine/config/intent_schema.d.ts.map +1 -0
- package/dist/engine/config/intent_schema.js +98 -0
- package/dist/engine/config/intent_schema.js.map +1 -0
- package/dist/engine/config/regression_matrix.d.ts.map +1 -0
- package/dist/engine/config/regression_matrix.js +389 -0
- package/dist/engine/config/regression_matrix.js.map +1 -0
- package/dist/engine/config/resolver.d.ts +136 -0
- package/dist/engine/config/resolver.d.ts.map +1 -0
- package/dist/engine/config/resolver.js +251 -0
- package/dist/engine/config/resolver.js.map +1 -0
- package/dist/engine/context_engine/bootstrap.d.ts +12 -0
- package/dist/engine/context_engine/bootstrap.d.ts.map +1 -0
- package/dist/engine/context_engine/bootstrap.js +28 -0
- package/dist/engine/context_engine/bootstrap.js.map +1 -0
- package/dist/engine/context_engine/companion_injector.d.ts +49 -0
- package/dist/engine/context_engine/companion_injector.d.ts.map +1 -0
- package/dist/engine/context_engine/companion_injector.js +157 -0
- package/dist/engine/context_engine/companion_injector.js.map +1 -0
- package/dist/engine/context_engine/context_resolver.d.ts +46 -0
- package/dist/engine/context_engine/context_resolver.d.ts.map +1 -0
- package/dist/engine/context_engine/context_resolver.js +139 -0
- package/dist/engine/context_engine/context_resolver.js.map +1 -0
- package/dist/engine/context_engine/index.d.ts +25 -0
- package/dist/engine/context_engine/index.d.ts.map +1 -0
- package/dist/engine/context_engine/index.js +25 -0
- package/dist/engine/context_engine/index.js.map +1 -0
- package/dist/engine/context_engine/view_registry.d.ts +45 -0
- package/dist/engine/context_engine/view_registry.d.ts.map +1 -0
- package/dist/engine/context_engine/view_registry.js +36 -0
- package/dist/engine/context_engine/view_registry.js.map +1 -0
- package/dist/engine/context_engine/views/change_impact.d.ts +34 -0
- package/dist/engine/context_engine/views/change_impact.d.ts.map +1 -0
- package/dist/engine/context_engine/views/change_impact.js +288 -0
- package/dist/engine/context_engine/views/change_impact.js.map +1 -0
- package/dist/engine/context_engine/views/coverage_gap.d.ts +45 -0
- package/dist/engine/context_engine/views/coverage_gap.d.ts.map +1 -0
- package/dist/engine/context_engine/views/coverage_gap.js +238 -0
- package/dist/engine/context_engine/views/coverage_gap.js.map +1 -0
- package/dist/engine/context_engine/views/dependency_graph.d.ts +45 -0
- package/dist/engine/context_engine/views/dependency_graph.d.ts.map +1 -0
- package/dist/engine/context_engine/views/dependency_graph.js +358 -0
- package/dist/engine/context_engine/views/dependency_graph.js.map +1 -0
- package/dist/engine/context_engine/views/file_impact.d.ts +46 -0
- package/dist/engine/context_engine/views/file_impact.d.ts.map +1 -0
- package/dist/engine/context_engine/views/file_impact.js +181 -0
- package/dist/engine/context_engine/views/file_impact.js.map +1 -0
- package/dist/engine/context_engine/views/knowledge_ref.d.ts +37 -0
- package/dist/engine/context_engine/views/knowledge_ref.d.ts.map +1 -0
- package/dist/engine/context_engine/views/knowledge_ref.js +264 -0
- package/dist/engine/context_engine/views/knowledge_ref.js.map +1 -0
- package/dist/engine/context_engine/views/reference_trace.d.ts +49 -0
- package/dist/engine/context_engine/views/reference_trace.d.ts.map +1 -0
- package/dist/engine/context_engine/views/reference_trace.js +227 -0
- package/dist/engine/context_engine/views/reference_trace.js.map +1 -0
- package/dist/engine/contracts/architecture_decision_workshop.d.ts +63 -0
- package/dist/engine/contracts/architecture_decision_workshop.d.ts.map +1 -0
- package/dist/engine/contracts/architecture_decision_workshop.js +122 -0
- package/dist/engine/contracts/architecture_decision_workshop.js.map +1 -0
- package/dist/engine/contracts/architecture_design_contract.d.ts.map +1 -0
- package/dist/engine/contracts/architecture_design_contract.js.map +1 -0
- package/dist/engine/contracts/artifact_contract_registry.d.ts +138 -0
- package/dist/engine/contracts/artifact_contract_registry.d.ts.map +1 -0
- package/dist/engine/contracts/artifact_contract_registry.js +420 -0
- package/dist/engine/contracts/artifact_contract_registry.js.map +1 -0
- package/dist/engine/contracts/artifact_process_rules.d.ts +46 -0
- package/dist/engine/contracts/artifact_process_rules.d.ts.map +1 -0
- package/dist/engine/contracts/artifact_process_rules.js +396 -0
- package/dist/engine/contracts/artifact_process_rules.js.map +1 -0
- package/dist/engine/contracts/artifact_schema_registry.d.ts +139 -0
- package/dist/engine/contracts/artifact_schema_registry.d.ts.map +1 -0
- package/dist/engine/contracts/artifact_schema_registry.js +803 -0
- package/dist/engine/contracts/artifact_schema_registry.js.map +1 -0
- package/dist/engine/contracts/backend_implementation_contract.d.ts.map +1 -0
- package/dist/engine/contracts/backend_implementation_contract.js +164 -0
- package/dist/engine/contracts/backend_implementation_contract.js.map +1 -0
- package/dist/engine/contracts/behavior_coverage_verifier.d.ts +35 -0
- package/dist/engine/contracts/behavior_coverage_verifier.d.ts.map +1 -0
- package/dist/engine/contracts/behavior_coverage_verifier.js +220 -0
- package/dist/engine/contracts/behavior_coverage_verifier.js.map +1 -0
- package/dist/engine/contracts/brainstorm_contract.d.ts +48 -0
- package/dist/engine/contracts/brainstorm_contract.d.ts.map +1 -0
- package/dist/engine/contracts/brainstorm_contract.js +146 -0
- package/dist/engine/contracts/brainstorm_contract.js.map +1 -0
- package/dist/engine/contracts/capability_action_advisor.d.ts.map +1 -0
- package/dist/engine/contracts/capability_action_advisor.js +158 -0
- package/dist/engine/contracts/capability_action_advisor.js.map +1 -0
- package/dist/engine/contracts/capability_registry.d.ts.map +1 -0
- package/dist/engine/contracts/capability_registry.js +778 -0
- package/dist/engine/contracts/capability_registry.js.map +1 -0
- package/dist/engine/contracts/capability_state_store.d.ts +115 -0
- package/dist/engine/contracts/capability_state_store.d.ts.map +1 -0
- package/dist/engine/contracts/capability_state_store.js +182 -0
- package/dist/engine/contracts/capability_state_store.js.map +1 -0
- package/dist/engine/contracts/code_maintainability_observability_contract.d.ts.map +1 -0
- package/dist/engine/contracts/code_maintainability_observability_contract.js +711 -0
- package/dist/engine/contracts/code_maintainability_observability_contract.js.map +1 -0
- package/dist/engine/contracts/coding_readiness_gate.d.ts +46 -0
- package/dist/engine/contracts/coding_readiness_gate.d.ts.map +1 -0
- package/dist/engine/contracts/coding_readiness_gate.js +175 -0
- package/dist/engine/contracts/coding_readiness_gate.js.map +1 -0
- package/dist/engine/contracts/command_execution_contract.d.ts +216 -0
- package/dist/engine/contracts/command_execution_contract.d.ts.map +1 -0
- package/dist/engine/contracts/command_execution_contract.js +562 -0
- package/dist/engine/contracts/command_execution_contract.js.map +1 -0
- package/dist/engine/contracts/contract_guard.d.ts +37 -0
- package/dist/engine/contracts/contract_guard.d.ts.map +1 -0
- package/dist/engine/contracts/contract_guard.js +598 -0
- package/dist/engine/contracts/contract_guard.js.map +1 -0
- package/dist/engine/contracts/contract_registry/builtin_contracts_core.d.ts +10 -0
- package/dist/engine/contracts/contract_registry/builtin_contracts_core.d.ts.map +1 -0
- package/dist/engine/contracts/contract_registry/builtin_contracts_core.js +300 -0
- package/dist/engine/contracts/contract_registry/builtin_contracts_core.js.map +1 -0
- package/dist/engine/contracts/contract_registry/builtin_contracts_core_2.d.ts +10 -0
- package/dist/engine/contracts/contract_registry/builtin_contracts_core_2.d.ts.map +1 -0
- package/dist/engine/contracts/contract_registry/builtin_contracts_core_2.js +298 -0
- package/dist/engine/contracts/contract_registry/builtin_contracts_core_2.js.map +1 -0
- package/dist/engine/contracts/contract_registry/builtin_contracts_extended.d.ts +13 -0
- package/dist/engine/contracts/contract_registry/builtin_contracts_extended.d.ts.map +1 -0
- package/dist/engine/contracts/contract_registry/builtin_contracts_extended.js +494 -0
- package/dist/engine/contracts/contract_registry/builtin_contracts_extended.js.map +1 -0
- package/dist/engine/contracts/contract_registry/index.d.ts +8 -0
- package/dist/engine/contracts/contract_registry/index.d.ts.map +1 -0
- package/dist/engine/contracts/contract_registry/index.js +7 -0
- package/dist/engine/contracts/contract_registry/index.js.map +1 -0
- package/dist/engine/contracts/contract_registry/registry.d.ts +61 -0
- package/dist/engine/contracts/contract_registry/registry.d.ts.map +1 -0
- package/dist/engine/contracts/contract_registry/registry.js +191 -0
- package/dist/engine/contracts/contract_registry/registry.js.map +1 -0
- package/dist/engine/contracts/contract_registry/registry_internal.d.ts +12 -0
- package/dist/engine/contracts/contract_registry/registry_internal.d.ts.map +1 -0
- package/dist/engine/contracts/contract_registry/registry_internal.js +47 -0
- package/dist/engine/contracts/contract_registry/registry_internal.js.map +1 -0
- package/dist/engine/contracts/contract_registry/types.d.ts +47 -0
- package/dist/engine/contracts/contract_registry/types.d.ts.map +1 -0
- package/dist/engine/contracts/contract_registry/types.js +5 -0
- package/dist/engine/contracts/contract_registry/types.js.map +1 -0
- package/dist/engine/contracts/contract_registry/validation.d.ts +18 -0
- package/dist/engine/contracts/contract_registry/validation.d.ts.map +1 -0
- package/dist/engine/contracts/contract_registry/validation.js +339 -0
- package/dist/engine/contracts/contract_registry/validation.js.map +1 -0
- package/dist/engine/contracts/contract_registry.d.ts +9 -0
- package/dist/engine/contracts/contract_registry.d.ts.map +1 -0
- package/dist/engine/contracts/contract_registry.js +8 -0
- package/dist/engine/contracts/contract_registry.js.map +1 -0
- package/dist/engine/contracts/contract_state_store.d.ts +69 -0
- package/dist/engine/contracts/contract_state_store.d.ts.map +1 -0
- package/dist/engine/contracts/contract_state_store.js +170 -0
- package/dist/engine/contracts/contract_state_store.js.map +1 -0
- package/dist/engine/contracts/control_plane_contract.d.ts.map +1 -0
- package/dist/engine/contracts/control_plane_contract.js +266 -0
- package/dist/engine/contracts/control_plane_contract.js.map +1 -0
- package/dist/engine/contracts/decision_contract.d.ts +38 -0
- package/dist/engine/contracts/decision_contract.d.ts.map +1 -0
- package/dist/engine/contracts/decision_contract.js +57 -0
- package/dist/engine/contracts/decision_contract.js.map +1 -0
- package/dist/engine/contracts/decision_workshop.d.ts +166 -0
- package/dist/engine/contracts/decision_workshop.d.ts.map +1 -0
- package/dist/engine/contracts/decision_workshop.js.map +1 -0
- package/dist/engine/contracts/design_artifact_pack.d.ts +13 -0
- package/dist/engine/contracts/design_artifact_pack.d.ts.map +1 -0
- package/dist/engine/contracts/design_artifact_pack.js.map +1 -0
- package/dist/engine/contracts/design_lifecycle_contract.d.ts +60 -0
- package/dist/engine/contracts/design_lifecycle_contract.d.ts.map +1 -0
- package/dist/engine/contracts/design_lifecycle_contract.js +505 -0
- package/dist/engine/contracts/design_lifecycle_contract.js.map +1 -0
- package/dist/engine/contracts/detail_discipline.d.ts.map +1 -0
- package/dist/engine/contracts/detail_discipline.js.map +1 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/index.d.ts +9 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/index.d.ts.map +1 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/index.js +8 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/index.js.map +1 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_audit.d.ts +7 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_audit.d.ts.map +1 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_audit.js +414 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_audit.js.map +1 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_audit_tail.d.ts +7 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_audit_tail.d.ts.map +1 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_audit_tail.js +81 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_audit_tail.js.map +1 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_core.d.ts +7 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_core.d.ts.map +1 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_core.js +448 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_core.js.map +1 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_extension.d.ts +7 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_extension.d.ts.map +1 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_extension.js +445 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_extension.js.map +1 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_governance.d.ts +7 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_governance.d.ts.map +1 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_governance.js +274 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_governance.js.map +1 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_infra.d.ts +7 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_infra.d.ts.map +1 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_infra.js +247 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_infra.js.map +1 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_platform.d.ts +7 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_platform.d.ts.map +1 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_platform.js +470 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_platform.js.map +1 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_release.d.ts +7 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_release.d.ts.map +1 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_release.js +320 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/mechanisms_release.js.map +1 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/shared.d.ts +8 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/shared.d.ts.map +1 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/shared.js +60 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/shared.js.map +1 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/validation.d.ts +68 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/validation.d.ts.map +1 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/validation.js +354 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry/validation.js.map +1 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry.d.ts +9 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry.d.ts.map +1 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry.js +8 -0
- package/dist/engine/contracts/dual_layer_mechanism_registry.js.map +1 -0
- package/dist/engine/contracts/enforcement_guard.d.ts +110 -0
- package/dist/engine/contracts/enforcement_guard.d.ts.map +1 -0
- package/dist/engine/contracts/enforcement_guard.js +473 -0
- package/dist/engine/contracts/enforcement_guard.js.map +1 -0
- package/dist/engine/contracts/error_path_verifier.d.ts +36 -0
- package/dist/engine/contracts/error_path_verifier.d.ts.map +1 -0
- package/dist/engine/contracts/error_path_verifier.js +131 -0
- package/dist/engine/contracts/error_path_verifier.js.map +1 -0
- package/dist/engine/contracts/escape_report.d.ts.map +1 -0
- package/dist/engine/contracts/escape_report.js +137 -0
- package/dist/engine/contracts/escape_report.js.map +1 -0
- package/dist/engine/contracts/evidence_grounding_contract.d.ts +135 -0
- package/dist/engine/contracts/evidence_grounding_contract.d.ts.map +1 -0
- package/dist/engine/contracts/evidence_grounding_contract.js +404 -0
- package/dist/engine/contracts/evidence_grounding_contract.js.map +1 -0
- package/dist/engine/contracts/evolution_regression_gate.d.ts +44 -0
- package/dist/engine/contracts/evolution_regression_gate.d.ts.map +1 -0
- package/dist/engine/contracts/evolution_regression_gate.js +161 -0
- package/dist/engine/contracts/evolution_regression_gate.js.map +1 -0
- package/dist/engine/contracts/existing_system_analysis.d.ts.map +1 -0
- package/dist/engine/contracts/existing_system_analysis.js.map +1 -0
- package/dist/engine/contracts/existing_system_analyzer.d.ts +153 -0
- package/dist/engine/contracts/existing_system_analyzer.d.ts.map +1 -0
- package/dist/engine/contracts/existing_system_analyzer.js +615 -0
- package/dist/engine/contracts/existing_system_analyzer.js.map +1 -0
- package/dist/engine/contracts/extension_contract.d.ts +50 -0
- package/dist/engine/contracts/extension_contract.d.ts.map +1 -0
- package/dist/engine/contracts/extension_contract.js +158 -0
- package/dist/engine/contracts/extension_contract.js.map +1 -0
- package/dist/engine/contracts/extension_platform_contracts.d.ts +716 -0
- package/dist/engine/contracts/extension_platform_contracts.d.ts.map +1 -0
- package/dist/engine/contracts/extension_platform_contracts.js +41 -0
- package/dist/engine/contracts/extension_platform_contracts.js.map +1 -0
- package/dist/engine/contracts/extension_scenario_definitions.d.ts +10 -0
- package/dist/engine/contracts/extension_scenario_definitions.d.ts.map +1 -0
- package/dist/engine/contracts/extension_scenario_definitions.js +112 -0
- package/dist/engine/contracts/extension_scenario_definitions.js.map +1 -0
- package/dist/engine/contracts/extension_scenario_registry.d.ts +24 -0
- package/dist/engine/contracts/extension_scenario_registry.d.ts.map +1 -0
- package/dist/engine/contracts/extension_scenario_registry.js +711 -0
- package/dist/engine/contracts/extension_scenario_registry.js.map +1 -0
- package/dist/engine/contracts/first_principles.d.ts +84 -0
- package/dist/engine/contracts/first_principles.d.ts.map +1 -0
- package/dist/engine/contracts/first_principles.js +197 -0
- package/dist/engine/contracts/first_principles.js.map +1 -0
- package/dist/engine/contracts/instruction_contract.d.ts +81 -0
- package/dist/engine/contracts/instruction_contract.d.ts.map +1 -0
- package/dist/engine/contracts/instruction_contract.js +178 -0
- package/dist/engine/contracts/instruction_contract.js.map +1 -0
- package/dist/engine/contracts/lazy_pattern_detector.d.ts +43 -0
- package/dist/engine/contracts/lazy_pattern_detector.d.ts.map +1 -0
- package/dist/engine/contracts/lazy_pattern_detector.js +164 -0
- package/dist/engine/contracts/lazy_pattern_detector.js.map +1 -0
- package/dist/engine/contracts/lifecycle_knowledge_contract.d.ts +59 -0
- package/dist/engine/contracts/lifecycle_knowledge_contract.d.ts.map +1 -0
- package/dist/engine/contracts/lifecycle_knowledge_contract.js +203 -0
- package/dist/engine/contracts/lifecycle_knowledge_contract.js.map +1 -0
- package/dist/engine/contracts/local_docker_acceptance.d.ts +94 -0
- package/dist/engine/contracts/local_docker_acceptance.d.ts.map +1 -0
- package/dist/engine/contracts/local_docker_acceptance.js +312 -0
- package/dist/engine/contracts/local_docker_acceptance.js.map +1 -0
- package/dist/engine/contracts/mechanism_contract_registry/contracts-audit.d.ts +13 -0
- package/dist/engine/contracts/mechanism_contract_registry/contracts-audit.d.ts.map +1 -0
- package/dist/engine/contracts/mechanism_contract_registry/contracts-audit.js +422 -0
- package/dist/engine/contracts/mechanism_contract_registry/contracts-audit.js.map +1 -0
- package/dist/engine/contracts/mechanism_contract_registry/contracts-governance.d.ts +14 -0
- package/dist/engine/contracts/mechanism_contract_registry/contracts-governance.d.ts.map +1 -0
- package/dist/engine/contracts/mechanism_contract_registry/contracts-governance.js +444 -0
- package/dist/engine/contracts/mechanism_contract_registry/contracts-governance.js.map +1 -0
- package/dist/engine/contracts/mechanism_contract_registry/contracts-pipeline.d.ts +11 -0
- package/dist/engine/contracts/mechanism_contract_registry/contracts-pipeline.d.ts.map +1 -0
- package/dist/engine/contracts/mechanism_contract_registry/contracts-pipeline.js +246 -0
- package/dist/engine/contracts/mechanism_contract_registry/contracts-pipeline.js.map +1 -0
- package/dist/engine/contracts/mechanism_contract_registry/contracts-platform.d.ts +15 -0
- package/dist/engine/contracts/mechanism_contract_registry/contracts-platform.d.ts.map +1 -0
- package/dist/engine/contracts/mechanism_contract_registry/contracts-platform.js +378 -0
- package/dist/engine/contracts/mechanism_contract_registry/contracts-platform.js.map +1 -0
- package/dist/engine/contracts/mechanism_contract_registry/index.d.ts +19 -0
- package/dist/engine/contracts/mechanism_contract_registry/index.d.ts.map +1 -0
- package/dist/engine/contracts/mechanism_contract_registry/index.js +21 -0
- package/dist/engine/contracts/mechanism_contract_registry/index.js.map +1 -0
- package/dist/engine/contracts/mechanism_contract_registry/types.d.ts +33 -0
- package/dist/engine/contracts/mechanism_contract_registry/types.d.ts.map +1 -0
- package/dist/engine/contracts/mechanism_contract_registry/types.js +5 -0
- package/dist/engine/contracts/mechanism_contract_registry/types.js.map +1 -0
- package/dist/engine/contracts/mechanism_contract_registry/validation.d.ts +28 -0
- package/dist/engine/contracts/mechanism_contract_registry/validation.d.ts.map +1 -0
- package/dist/engine/contracts/mechanism_contract_registry/validation.js +124 -0
- package/dist/engine/contracts/mechanism_contract_registry/validation.js.map +1 -0
- package/dist/engine/contracts/mechanism_contract_registry.d.ts +8 -0
- package/dist/engine/contracts/mechanism_contract_registry.d.ts.map +1 -0
- package/dist/engine/contracts/mechanism_contract_registry.js +7 -0
- package/dist/engine/contracts/mechanism_contract_registry.js.map +1 -0
- package/dist/engine/contracts/mechanism_health_check.d.ts +25 -0
- package/dist/engine/contracts/mechanism_health_check.d.ts.map +1 -0
- package/dist/engine/contracts/mechanism_health_check.js +143 -0
- package/dist/engine/contracts/mechanism_health_check.js.map +1 -0
- package/dist/engine/contracts/metric_governance.d.ts.map +1 -0
- package/dist/engine/contracts/metric_governance.js.map +1 -0
- package/dist/engine/contracts/omission_scanner.d.ts +83 -0
- package/dist/engine/contracts/omission_scanner.d.ts.map +1 -0
- package/dist/engine/contracts/omission_scanner.js +191 -0
- package/dist/engine/contracts/omission_scanner.js.map +1 -0
- package/dist/engine/contracts/ood_solid_contract.d.ts.map +1 -0
- package/dist/engine/contracts/ood_solid_contract.js +115 -0
- package/dist/engine/contracts/ood_solid_contract.js.map +1 -0
- package/dist/engine/contracts/platform_context.d.ts +46 -0
- package/dist/engine/contracts/platform_context.d.ts.map +1 -0
- package/dist/engine/contracts/platform_context.js +171 -0
- package/dist/engine/contracts/platform_context.js.map +1 -0
- package/dist/engine/contracts/project_knowledge_contract.d.ts +133 -0
- package/dist/engine/contracts/project_knowledge_contract.d.ts.map +1 -0
- package/dist/engine/contracts/project_knowledge_contract.js +559 -0
- package/dist/engine/contracts/project_knowledge_contract.js.map +1 -0
- package/dist/engine/contracts/slice_fix_loop.d.ts +86 -0
- package/dist/engine/contracts/slice_fix_loop.d.ts.map +1 -0
- package/dist/engine/contracts/slice_fix_loop.js +98 -0
- package/dist/engine/contracts/slice_fix_loop.js.map +1 -0
- package/dist/engine/contracts/state_machine_contracts.d.ts +17 -0
- package/dist/engine/contracts/state_machine_contracts.d.ts.map +1 -0
- package/dist/engine/contracts/state_machine_contracts.js +97 -0
- package/dist/engine/contracts/state_machine_contracts.js.map +1 -0
- package/dist/engine/contracts/technology_decision.d.ts +58 -0
- package/dist/engine/contracts/technology_decision.d.ts.map +1 -0
- package/dist/engine/contracts/technology_decision.js +175 -0
- package/dist/engine/contracts/technology_decision.js.map +1 -0
- package/dist/engine/contracts/template_schema_loader.d.ts +79 -0
- package/dist/engine/contracts/template_schema_loader.d.ts.map +1 -0
- package/dist/engine/contracts/template_schema_loader.js +301 -0
- package/dist/engine/contracts/template_schema_loader.js.map +1 -0
- package/dist/engine/contracts/tool_invocation_contract_registry.d.ts +76 -0
- package/dist/engine/contracts/tool_invocation_contract_registry.d.ts.map +1 -0
- package/dist/engine/contracts/tool_invocation_contract_registry.js +782 -0
- package/dist/engine/contracts/tool_invocation_contract_registry.js.map +1 -0
- package/dist/engine/contracts/traceability.d.ts +49 -0
- package/dist/engine/contracts/traceability.d.ts.map +1 -0
- package/dist/engine/contracts/traceability.js +470 -0
- package/dist/engine/contracts/traceability.js.map +1 -0
- package/dist/engine/contracts/user_feedback_contract.d.ts +162 -0
- package/dist/engine/contracts/user_feedback_contract.d.ts.map +1 -0
- package/dist/engine/contracts/user_feedback_contract.js +415 -0
- package/dist/engine/contracts/user_feedback_contract.js.map +1 -0
- package/dist/engine/contracts/user_promise.d.ts +67 -0
- package/dist/engine/contracts/user_promise.d.ts.map +1 -0
- package/dist/engine/contracts/user_promise.js +436 -0
- package/dist/engine/contracts/user_promise.js.map +1 -0
- package/dist/engine/contracts/verification_contract.d.ts.map +1 -0
- package/dist/engine/contracts/verification_contract.js.map +1 -0
- package/dist/engine/contracts/workflow_template_pack.d.ts +71 -0
- package/dist/engine/contracts/workflow_template_pack.d.ts.map +1 -0
- package/dist/engine/contracts/workflow_template_pack.js +246 -0
- package/dist/engine/contracts/workflow_template_pack.js.map +1 -0
- package/dist/engine/convention_detector.js +1 -1
- package/dist/engine/convention_detector.js.map +1 -1
- package/dist/engine/core/config_defaults.d.ts +11 -0
- package/dist/engine/core/config_defaults.d.ts.map +1 -0
- package/dist/engine/core/config_defaults.js +11 -0
- package/dist/engine/core/config_defaults.js.map +1 -0
- package/dist/engine/core/debug_log.d.ts +5 -0
- package/dist/engine/core/debug_log.d.ts.map +1 -0
- package/dist/engine/core/debug_log.js +5 -0
- package/dist/engine/core/debug_log.js.map +1 -0
- package/dist/engine/core/denied_paths.d.ts +25 -0
- package/dist/engine/core/denied_paths.d.ts.map +1 -0
- package/dist/engine/core/denied_paths.js +57 -0
- package/dist/engine/core/denied_paths.js.map +1 -0
- package/dist/engine/core/env.d.ts +12 -0
- package/dist/engine/core/env.d.ts.map +1 -0
- package/dist/engine/core/env.js +12 -0
- package/dist/engine/core/env.js.map +1 -0
- package/dist/engine/core/errors.d.ts +21 -0
- package/dist/engine/core/errors.d.ts.map +1 -0
- package/dist/engine/core/errors.js +35 -0
- package/dist/engine/core/errors.js.map +1 -0
- package/dist/engine/core/exit_codes.d.ts +14 -0
- package/dist/engine/core/exit_codes.d.ts.map +1 -0
- package/dist/engine/core/exit_codes.js +14 -0
- package/dist/engine/core/exit_codes.js.map +1 -0
- package/dist/engine/core/fail_closed.d.ts +39 -0
- package/dist/engine/core/fail_closed.d.ts.map +1 -0
- package/dist/engine/core/fail_closed.js +38 -0
- package/dist/engine/core/fail_closed.js.map +1 -0
- package/dist/engine/core/helpers.d.ts +24 -0
- package/dist/engine/core/helpers.d.ts.map +1 -0
- package/dist/engine/core/helpers.js +44 -0
- package/dist/engine/core/helpers.js.map +1 -0
- package/dist/engine/core/index.d.ts +17 -0
- package/dist/engine/core/index.d.ts.map +1 -0
- package/dist/engine/core/index.js +24 -0
- package/dist/engine/core/index.js.map +1 -0
- package/dist/engine/core/io_controller.d.ts +88 -0
- package/dist/engine/core/io_controller.d.ts.map +1 -0
- package/dist/engine/core/io_controller.js +219 -0
- package/dist/engine/core/io_controller.js.map +1 -0
- package/dist/engine/core/knowledge_config_loader.d.ts +28 -0
- package/dist/engine/core/knowledge_config_loader.d.ts.map +1 -0
- package/dist/engine/core/knowledge_config_loader.js +102 -0
- package/dist/engine/core/knowledge_config_loader.js.map +1 -0
- package/dist/engine/core/llm_gateway.d.ts +184 -0
- package/dist/engine/core/llm_gateway.d.ts.map +1 -0
- package/dist/engine/core/llm_gateway.js +374 -0
- package/dist/engine/core/llm_gateway.js.map +1 -0
- package/dist/engine/core/log_governance.d.ts.map +1 -0
- package/dist/engine/core/log_governance.js +71 -0
- package/dist/engine/core/log_governance.js.map +1 -0
- package/dist/engine/core/logger.d.ts.map +1 -0
- package/dist/engine/core/logger.js +118 -0
- package/dist/engine/core/logger.js.map +1 -0
- package/dist/engine/core/path_scope_utils.d.ts +21 -0
- package/dist/engine/core/path_scope_utils.d.ts.map +1 -0
- package/dist/engine/core/path_scope_utils.js +126 -0
- package/dist/engine/core/path_scope_utils.js.map +1 -0
- package/dist/engine/core/paths.d.ts +90 -0
- package/dist/engine/core/paths.d.ts.map +1 -0
- package/dist/engine/core/paths.js +109 -0
- package/dist/engine/core/paths.js.map +1 -0
- package/dist/engine/core/write_file_atomic.d.ts +25 -0
- package/dist/engine/core/write_file_atomic.d.ts.map +1 -0
- package/dist/engine/core/write_file_atomic.js +63 -0
- package/dist/engine/core/write_file_atomic.js.map +1 -0
- package/dist/engine/dependency_scanner.d.ts +1 -1
- package/dist/engine/dependency_scanner.d.ts.map +1 -1
- package/dist/engine/dependency_scanner.js +16 -18
- package/dist/engine/dependency_scanner.js.map +1 -1
- package/dist/engine/exploration.d.ts +1 -1
- package/dist/engine/exploration.d.ts.map +1 -1
- package/dist/engine/exploration.js +11 -10
- package/dist/engine/exploration.js.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/feasibility_checker.js +2 -2
- package/dist/engine/feasibility_checker.js.map +1 -1
- 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 +3 -3
- package/dist/engine/impact_analyzer.js.map +1 -1
- package/dist/engine/knowledge/chinese_semantic_priority.d.ts.map +1 -0
- package/dist/engine/knowledge/chinese_semantic_priority.js.map +1 -0
- package/dist/engine/knowledge/documentation_governance.d.ts.map +1 -0
- package/dist/engine/knowledge/documentation_governance.js.map +1 -0
- package/dist/engine/knowledge/drift_classifier.d.ts +26 -0
- package/dist/engine/knowledge/drift_classifier.d.ts.map +1 -0
- package/dist/engine/knowledge/drift_classifier.js +82 -0
- package/dist/engine/knowledge/drift_classifier.js.map +1 -0
- package/dist/engine/knowledge/knowledge_acceptance_registry.d.ts.map +1 -0
- package/dist/engine/knowledge/knowledge_acceptance_registry.js +261 -0
- package/dist/engine/knowledge/knowledge_acceptance_registry.js.map +1 -0
- package/dist/engine/knowledge/knowledge_asset_audit.d.ts.map +1 -0
- package/dist/engine/knowledge/knowledge_asset_audit.js +231 -0
- package/dist/engine/knowledge/knowledge_asset_audit.js.map +1 -0
- package/dist/engine/knowledge/knowledge_asset_consumer.d.ts +157 -0
- package/dist/engine/knowledge/knowledge_asset_consumer.d.ts.map +1 -0
- package/dist/engine/knowledge/knowledge_asset_consumer.js +288 -0
- package/dist/engine/knowledge/knowledge_asset_consumer.js.map +1 -0
- package/dist/engine/knowledge/knowledge_asset_generation_gate.d.ts.map +1 -0
- package/dist/engine/knowledge/knowledge_asset_generation_gate.js.map +1 -0
- package/dist/engine/knowledge/knowledge_asset_migration.d.ts.map +1 -0
- package/dist/engine/knowledge/knowledge_asset_migration.js +204 -0
- package/dist/engine/knowledge/knowledge_asset_migration.js.map +1 -0
- package/dist/engine/knowledge/knowledge_asset_schema.d.ts +102 -0
- package/dist/engine/knowledge/knowledge_asset_schema.d.ts.map +1 -0
- package/dist/engine/knowledge/knowledge_asset_schema.js +427 -0
- package/dist/engine/knowledge/knowledge_asset_schema.js.map +1 -0
- package/dist/engine/knowledge/knowledge_config_loader.d.ts.map +1 -0
- package/dist/engine/knowledge/knowledge_config_loader.js +144 -0
- package/dist/engine/knowledge/knowledge_config_loader.js.map +1 -0
- package/dist/engine/knowledge/knowledge_consumption_snapshot.d.ts +91 -0
- package/dist/engine/knowledge/knowledge_consumption_snapshot.d.ts.map +1 -0
- package/dist/engine/knowledge/knowledge_consumption_snapshot.js +113 -0
- package/dist/engine/knowledge/knowledge_consumption_snapshot.js.map +1 -0
- package/dist/engine/knowledge/knowledge_evolution.d.ts +66 -0
- package/dist/engine/knowledge/knowledge_evolution.d.ts.map +1 -0
- package/dist/engine/knowledge/knowledge_evolution.js +200 -0
- package/dist/engine/knowledge/knowledge_evolution.js.map +1 -0
- package/dist/engine/knowledge/knowledge_governance_gate.d.ts +41 -0
- package/dist/engine/knowledge/knowledge_governance_gate.d.ts.map +1 -0
- package/dist/engine/knowledge/knowledge_governance_gate.js +123 -0
- package/dist/engine/knowledge/knowledge_governance_gate.js.map +1 -0
- package/dist/engine/knowledge/knowledge_health.d.ts +44 -0
- package/dist/engine/knowledge/knowledge_health.d.ts.map +1 -0
- package/dist/engine/knowledge/knowledge_health.js +305 -0
- package/dist/engine/knowledge/knowledge_health.js.map +1 -0
- package/dist/engine/knowledge/knowledge_injection_boundary.d.ts +108 -0
- package/dist/engine/knowledge/knowledge_injection_boundary.d.ts.map +1 -0
- package/dist/engine/knowledge/knowledge_injection_boundary.js +760 -0
- package/dist/engine/knowledge/knowledge_injection_boundary.js.map +1 -0
- package/dist/engine/knowledge/knowledge_lifecycle.d.ts +97 -0
- package/dist/engine/knowledge/knowledge_lifecycle.d.ts.map +1 -0
- package/dist/engine/knowledge/knowledge_lifecycle.js +299 -0
- package/dist/engine/knowledge/knowledge_lifecycle.js.map +1 -0
- package/dist/engine/knowledge/knowledge_manager.d.ts +3 -0
- package/dist/engine/knowledge/knowledge_manager.d.ts.map +1 -0
- package/dist/engine/knowledge/knowledge_manager.js +5 -0
- package/dist/engine/knowledge/knowledge_manager.js.map +1 -0
- package/dist/engine/knowledge/knowledge_scenario_registry.d.ts +21 -0
- package/dist/engine/knowledge/knowledge_scenario_registry.d.ts.map +1 -0
- package/dist/engine/knowledge/knowledge_scenario_registry.js +329 -0
- package/dist/engine/knowledge/knowledge_scenario_registry.js.map +1 -0
- package/dist/engine/knowledge/knowledge_sovereignty.d.ts.map +1 -0
- package/dist/engine/knowledge/knowledge_sovereignty.js +196 -0
- package/dist/engine/knowledge/knowledge_sovereignty.js.map +1 -0
- package/dist/engine/knowledge/knowledge_template_contracts.d.ts +243 -0
- package/dist/engine/knowledge/knowledge_template_contracts.d.ts.map +1 -0
- package/dist/engine/knowledge/knowledge_template_contracts.js.map +1 -0
- package/dist/engine/knowledge/knowledge_writer.d.ts +108 -0
- package/dist/engine/knowledge/knowledge_writer.d.ts.map +1 -0
- package/dist/engine/knowledge/knowledge_writer.js +637 -0
- package/dist/engine/knowledge/knowledge_writer.js.map +1 -0
- package/dist/engine/knowledge/language_policy.d.ts +78 -0
- package/dist/engine/knowledge/language_policy.d.ts.map +1 -0
- package/dist/engine/knowledge/language_policy.js +139 -0
- package/dist/engine/knowledge/language_policy.js.map +1 -0
- package/dist/engine/knowledge/language_policy_contract.d.ts.map +1 -0
- package/dist/engine/knowledge/language_policy_contract.js.map +1 -0
- package/dist/engine/knowledge/release_compatibility.d.ts.map +1 -0
- package/dist/engine/knowledge/release_compatibility.js.map +1 -0
- package/dist/engine/migration_guard.d.ts +1 -1
- package/dist/engine/migration_guard.d.ts.map +1 -1
- package/dist/engine/migration_guard.js +5 -5
- package/dist/engine/migration_guard.js.map +1 -1
- package/dist/engine/onboarding.d.ts +3 -3
- package/dist/engine/onboarding.d.ts.map +1 -1
- package/dist/engine/onboarding.js +8 -5
- package/dist/engine/onboarding.js.map +1 -1
- package/dist/engine/pipeline/artifact_aliases.d.ts +19 -0
- package/dist/engine/pipeline/artifact_aliases.d.ts.map +1 -0
- package/dist/engine/pipeline/artifact_aliases.js +39 -0
- package/dist/engine/pipeline/artifact_aliases.js.map +1 -0
- package/dist/engine/pipeline/conflict_gate.d.ts.map +1 -0
- package/dist/engine/pipeline/conflict_gate.js +92 -0
- package/dist/engine/pipeline/conflict_gate.js.map +1 -0
- package/dist/engine/pipeline/diff_ownership.d.ts.map +1 -0
- package/dist/engine/pipeline/diff_ownership.js +159 -0
- package/dist/engine/pipeline/diff_ownership.js.map +1 -0
- package/dist/engine/pipeline/diff_ownership_store.d.ts.map +1 -0
- package/dist/engine/pipeline/diff_ownership_store.js +293 -0
- package/dist/engine/pipeline/diff_ownership_store.js.map +1 -0
- package/dist/engine/pipeline/input_material_contract_registry.d.ts +185 -0
- package/dist/engine/pipeline/input_material_contract_registry.d.ts.map +1 -0
- package/dist/engine/pipeline/input_material_contract_registry.js +565 -0
- package/dist/engine/pipeline/input_material_contract_registry.js.map +1 -0
- package/dist/engine/pipeline/input_material_extractor.d.ts +47 -0
- package/dist/engine/pipeline/input_material_extractor.d.ts.map +1 -0
- package/dist/engine/pipeline/input_material_extractor.js +156 -0
- package/dist/engine/pipeline/input_material_extractor.js.map +1 -0
- package/dist/engine/pipeline/intent_expander/helpers.d.ts +44 -0
- package/dist/engine/pipeline/intent_expander/helpers.d.ts.map +1 -0
- package/dist/engine/pipeline/intent_expander/helpers.js +158 -0
- package/dist/engine/pipeline/intent_expander/helpers.js.map +1 -0
- package/dist/engine/pipeline/intent_expander/index.d.ts +12 -0
- package/dist/engine/pipeline/intent_expander/index.d.ts.map +1 -0
- package/dist/engine/pipeline/intent_expander/index.js +14 -0
- package/dist/engine/pipeline/intent_expander/index.js.map +1 -0
- package/dist/engine/pipeline/intent_expander/knowledge.d.ts +16 -0
- package/dist/engine/pipeline/intent_expander/knowledge.d.ts.map +1 -0
- package/dist/engine/pipeline/intent_expander/knowledge.js +154 -0
- package/dist/engine/pipeline/intent_expander/knowledge.js.map +1 -0
- package/dist/engine/pipeline/intent_expander/knowledge_resolution.d.ts +47 -0
- package/dist/engine/pipeline/intent_expander/knowledge_resolution.d.ts.map +1 -0
- package/dist/engine/pipeline/intent_expander/knowledge_resolution.js +301 -0
- package/dist/engine/pipeline/intent_expander/knowledge_resolution.js.map +1 -0
- package/dist/engine/pipeline/intent_expander/privacy_gates.d.ts +33 -0
- package/dist/engine/pipeline/intent_expander/privacy_gates.d.ts.map +1 -0
- package/dist/engine/pipeline/intent_expander/privacy_gates.js +66 -0
- package/dist/engine/pipeline/intent_expander/privacy_gates.js.map +1 -0
- package/dist/engine/pipeline/intent_expander/scope_acceptance.d.ts +80 -0
- package/dist/engine/pipeline/intent_expander/scope_acceptance.d.ts.map +1 -0
- package/dist/engine/pipeline/intent_expander/scope_acceptance.js +219 -0
- package/dist/engine/pipeline/intent_expander/scope_acceptance.js.map +1 -0
- package/dist/engine/pipeline/intent_expander/templates.d.ts +28 -0
- package/dist/engine/pipeline/intent_expander/templates.d.ts.map +1 -0
- package/dist/engine/pipeline/intent_expander/templates.js +662 -0
- package/dist/engine/pipeline/intent_expander/templates.js.map +1 -0
- package/dist/engine/pipeline/intent_expander/types.d.ts +101 -0
- package/dist/engine/pipeline/intent_expander/types.d.ts.map +1 -0
- package/dist/engine/pipeline/intent_expander/types.js +8 -0
- package/dist/engine/pipeline/intent_expander/types.js.map +1 -0
- package/dist/engine/pipeline/intent_expander/uncertainty_circuit.d.ts +33 -0
- package/dist/engine/pipeline/intent_expander/uncertainty_circuit.d.ts.map +1 -0
- package/dist/engine/pipeline/intent_expander/uncertainty_circuit.js +187 -0
- package/dist/engine/pipeline/intent_expander/uncertainty_circuit.js.map +1 -0
- package/dist/engine/pipeline/intent_expander.d.ts +12 -0
- package/dist/engine/pipeline/intent_expander.d.ts.map +1 -0
- package/dist/engine/pipeline/intent_expander.js +14 -0
- package/dist/engine/pipeline/intent_expander.js.map +1 -0
- package/dist/engine/pipeline/job_manager.d.ts +111 -0
- package/dist/engine/pipeline/job_manager.d.ts.map +1 -0
- package/dist/engine/pipeline/job_manager.js +284 -0
- package/dist/engine/pipeline/job_manager.js.map +1 -0
- package/dist/engine/pipeline/plan_proposal_gate.d.ts.map +1 -0
- package/dist/engine/pipeline/plan_proposal_gate.js +340 -0
- package/dist/engine/pipeline/plan_proposal_gate.js.map +1 -0
- package/dist/engine/pipeline/prompt_template_resolver.d.ts +13 -0
- package/dist/engine/pipeline/prompt_template_resolver.d.ts.map +1 -0
- package/dist/engine/pipeline/prompt_template_resolver.js +25 -0
- package/dist/engine/pipeline/prompt_template_resolver.js.map +1 -0
- package/dist/engine/pipeline/rollback_router.d.ts +35 -0
- package/dist/engine/pipeline/rollback_router.d.ts.map +1 -0
- package/dist/engine/pipeline/rollback_router.js +57 -0
- package/dist/engine/pipeline/rollback_router.js.map +1 -0
- package/dist/engine/pipeline/scope_controller.d.ts +17 -0
- package/dist/engine/pipeline/scope_controller.d.ts.map +1 -0
- package/dist/engine/pipeline/scope_controller.js +224 -0
- package/dist/engine/pipeline/scope_controller.js.map +1 -0
- package/dist/engine/pipeline/scope_lease.d.ts +92 -0
- package/dist/engine/pipeline/scope_lease.d.ts.map +1 -0
- package/dist/engine/pipeline/scope_lease.js +178 -0
- package/dist/engine/pipeline/scope_lease.js.map +1 -0
- package/dist/engine/pipeline/scope_resolver.d.ts +18 -0
- package/dist/engine/pipeline/scope_resolver.d.ts.map +1 -0
- package/dist/engine/pipeline/scope_resolver.js +533 -0
- package/dist/engine/pipeline/scope_resolver.js.map +1 -0
- package/dist/engine/pipeline/slice_executor.d.ts +83 -0
- package/dist/engine/pipeline/slice_executor.d.ts.map +1 -0
- package/dist/engine/pipeline/slice_executor.js +103 -0
- package/dist/engine/pipeline/slice_executor.js.map +1 -0
- package/dist/engine/pipeline/stale_current_task_detector.d.ts +30 -0
- package/dist/engine/pipeline/stale_current_task_detector.d.ts.map +1 -0
- package/dist/engine/pipeline/stale_current_task_detector.js +171 -0
- package/dist/engine/pipeline/stale_current_task_detector.js.map +1 -0
- package/dist/engine/pipeline/state_machine/audit_logger.d.ts +42 -0
- package/dist/engine/pipeline/state_machine/audit_logger.d.ts.map +1 -0
- package/dist/engine/pipeline/state_machine/audit_logger.js +71 -0
- package/dist/engine/pipeline/state_machine/audit_logger.js.map +1 -0
- package/dist/engine/pipeline/state_machine/capability_safety_valve.d.ts +51 -0
- package/dist/engine/pipeline/state_machine/capability_safety_valve.d.ts.map +1 -0
- package/dist/engine/pipeline/state_machine/capability_safety_valve.js +131 -0
- package/dist/engine/pipeline/state_machine/capability_safety_valve.js.map +1 -0
- package/dist/engine/pipeline/state_machine/certainty_gate.d.ts +92 -0
- package/dist/engine/pipeline/state_machine/certainty_gate.d.ts.map +1 -0
- package/dist/engine/pipeline/state_machine/certainty_gate.js +391 -0
- package/dist/engine/pipeline/state_machine/certainty_gate.js.map +1 -0
- package/dist/engine/pipeline/state_machine/command_state_verifier.d.ts +50 -0
- package/dist/engine/pipeline/state_machine/command_state_verifier.d.ts.map +1 -0
- package/dist/engine/pipeline/state_machine/command_state_verifier.js +160 -0
- package/dist/engine/pipeline/state_machine/command_state_verifier.js.map +1 -0
- package/dist/engine/pipeline/state_machine/hook_classifier.d.ts +71 -0
- package/dist/engine/pipeline/state_machine/hook_classifier.d.ts.map +1 -0
- package/dist/engine/pipeline/state_machine/hook_classifier.js +146 -0
- package/dist/engine/pipeline/state_machine/hook_classifier.js.map +1 -0
- package/dist/engine/pipeline/state_machine/human_uncertainty_detector.d.ts +33 -0
- package/dist/engine/pipeline/state_machine/human_uncertainty_detector.d.ts.map +1 -0
- package/dist/engine/pipeline/state_machine/human_uncertainty_detector.js +72 -0
- package/dist/engine/pipeline/state_machine/human_uncertainty_detector.js.map +1 -0
- package/dist/engine/pipeline/state_machine/knowledge_stage_query.d.ts +21 -0
- package/dist/engine/pipeline/state_machine/knowledge_stage_query.d.ts.map +1 -0
- package/dist/engine/pipeline/state_machine/knowledge_stage_query.js +33 -0
- package/dist/engine/pipeline/state_machine/knowledge_stage_query.js.map +1 -0
- package/dist/engine/pipeline/state_machine/pipeline_state_machine.d.ts +158 -0
- package/dist/engine/pipeline/state_machine/pipeline_state_machine.d.ts.map +1 -0
- package/dist/engine/pipeline/state_machine/pipeline_state_machine.js +1197 -0
- package/dist/engine/pipeline/state_machine/pipeline_state_machine.js.map +1 -0
- package/dist/engine/pipeline/state_machine/risk_pattern_scanner.d.ts +34 -0
- package/dist/engine/pipeline/state_machine/risk_pattern_scanner.d.ts.map +1 -0
- package/dist/engine/pipeline/state_machine/risk_pattern_scanner.js +152 -0
- package/dist/engine/pipeline/state_machine/risk_pattern_scanner.js.map +1 -0
- package/dist/engine/pipeline/state_machine/route_usage_stats.d.ts +28 -0
- package/dist/engine/pipeline/state_machine/route_usage_stats.d.ts.map +1 -0
- package/dist/engine/pipeline/state_machine/route_usage_stats.js +76 -0
- package/dist/engine/pipeline/state_machine/route_usage_stats.js.map +1 -0
- package/dist/engine/pipeline/state_machine/sf_command_parser.d.ts +22 -0
- package/dist/engine/pipeline/state_machine/sf_command_parser.d.ts.map +1 -0
- package/dist/engine/pipeline/state_machine/sf_command_parser.js +171 -0
- package/dist/engine/pipeline/state_machine/sf_command_parser.js.map +1 -0
- package/dist/engine/pipeline/state_machine/stage_command_registry.d.ts +38 -0
- package/dist/engine/pipeline/state_machine/stage_command_registry.d.ts.map +1 -0
- package/dist/engine/pipeline/state_machine/stage_command_registry.js +218 -0
- package/dist/engine/pipeline/state_machine/stage_command_registry.js.map +1 -0
- package/dist/engine/pipeline/state_machine/stage_executor.d.ts +37 -0
- package/dist/engine/pipeline/state_machine/stage_executor.d.ts.map +1 -0
- package/dist/engine/pipeline/state_machine/stage_executor.js +67 -0
- package/dist/engine/pipeline/state_machine/stage_executor.js.map +1 -0
- package/dist/engine/pipeline/state_machine/state_migrator.d.ts +21 -0
- package/dist/engine/pipeline/state_machine/state_migrator.d.ts.map +1 -0
- package/dist/engine/pipeline/state_machine/state_migrator.js +130 -0
- package/dist/engine/pipeline/state_machine/state_migrator.js.map +1 -0
- package/dist/engine/pipeline/state_machine/state_self_diagnostic.d.ts +48 -0
- package/dist/engine/pipeline/state_machine/state_self_diagnostic.d.ts.map +1 -0
- package/dist/engine/pipeline/state_machine/state_self_diagnostic.js +566 -0
- package/dist/engine/pipeline/state_machine/state_self_diagnostic.js.map +1 -0
- package/dist/engine/pipeline/state_machine/static_route_table.d.ts +36 -0
- package/dist/engine/pipeline/state_machine/static_route_table.d.ts.map +1 -0
- package/dist/engine/pipeline/state_machine/static_route_table.js +112 -0
- package/dist/engine/pipeline/state_machine/static_route_table.js.map +1 -0
- package/dist/engine/pipeline/state_machine/strong_confirmation.d.ts +45 -0
- package/dist/engine/pipeline/state_machine/strong_confirmation.d.ts.map +1 -0
- package/dist/engine/pipeline/state_machine/strong_confirmation.js +57 -0
- package/dist/engine/pipeline/state_machine/strong_confirmation.js.map +1 -0
- package/dist/engine/pipeline/state_machine/uncertainty_bridge.d.ts +55 -0
- package/dist/engine/pipeline/state_machine/uncertainty_bridge.d.ts.map +1 -0
- package/dist/engine/pipeline/state_machine/uncertainty_bridge.js +48 -0
- package/dist/engine/pipeline/state_machine/uncertainty_bridge.js.map +1 -0
- package/dist/engine/pipeline/task_context/cleanup.d.ts +13 -0
- package/dist/engine/pipeline/task_context/cleanup.d.ts.map +1 -0
- package/dist/engine/pipeline/task_context/cleanup.js +68 -0
- package/dist/engine/pipeline/task_context/cleanup.js.map +1 -0
- package/dist/engine/pipeline/task_context/constants.d.ts +9 -0
- package/dist/engine/pipeline/task_context/constants.d.ts.map +1 -0
- package/dist/engine/pipeline/task_context/constants.js +20 -0
- package/dist/engine/pipeline/task_context/constants.js.map +1 -0
- package/dist/engine/pipeline/task_context/expansion_privacy.d.ts +18 -0
- package/dist/engine/pipeline/task_context/expansion_privacy.d.ts.map +1 -0
- package/dist/engine/pipeline/task_context/expansion_privacy.js +82 -0
- package/dist/engine/pipeline/task_context/expansion_privacy.js.map +1 -0
- package/dist/engine/pipeline/task_context/index.d.ts +19 -0
- package/dist/engine/pipeline/task_context/index.d.ts.map +1 -0
- package/dist/engine/pipeline/task_context/index.js +19 -0
- package/dist/engine/pipeline/task_context/index.js.map +1 -0
- package/dist/engine/pipeline/task_context/manager.d.ts +200 -0
- package/dist/engine/pipeline/task_context/manager.d.ts.map +1 -0
- package/dist/engine/pipeline/task_context/manager.js +758 -0
- package/dist/engine/pipeline/task_context/manager.js.map +1 -0
- package/dist/engine/pipeline/task_context/manager_setters.d.ts +65 -0
- package/dist/engine/pipeline/task_context/manager_setters.d.ts.map +1 -0
- package/dist/engine/pipeline/task_context/manager_setters.js +288 -0
- package/dist/engine/pipeline/task_context/manager_setters.js.map +1 -0
- package/dist/engine/pipeline/task_context/phase_directive.d.ts +10 -0
- package/dist/engine/pipeline/task_context/phase_directive.d.ts.map +1 -0
- package/dist/engine/pipeline/task_context/phase_directive.js +75 -0
- package/dist/engine/pipeline/task_context/phase_directive.js.map +1 -0
- package/dist/engine/pipeline/task_context/status_transitions.d.ts +17 -0
- package/dist/engine/pipeline/task_context/status_transitions.d.ts.map +1 -0
- package/dist/engine/pipeline/task_context/status_transitions.js +76 -0
- package/dist/engine/pipeline/task_context/status_transitions.js.map +1 -0
- package/dist/engine/pipeline/task_context.d.ts +15 -0
- package/dist/engine/pipeline/task_context.d.ts.map +1 -0
- package/dist/engine/pipeline/task_context.js +15 -0
- package/dist/engine/pipeline/task_context.js.map +1 -0
- package/dist/engine/pipeline/task_planner.d.ts +30 -0
- package/dist/engine/pipeline/task_planner.d.ts.map +1 -0
- package/dist/engine/pipeline/task_planner.js +334 -0
- package/dist/engine/pipeline/task_planner.js.map +1 -0
- package/dist/engine/pipeline/task_stage_detector.d.ts +27 -0
- package/dist/engine/pipeline/task_stage_detector.d.ts.map +1 -0
- package/dist/engine/pipeline/task_stage_detector.js +191 -0
- package/dist/engine/pipeline/task_stage_detector.js.map +1 -0
- package/dist/engine/pipeline/workspace_lease.d.ts +78 -0
- package/dist/engine/pipeline/workspace_lease.d.ts.map +1 -0
- package/dist/engine/pipeline/workspace_lease.js +180 -0
- package/dist/engine/pipeline/workspace_lease.js.map +1 -0
- package/dist/engine/pipeline/workspace_resumer.d.ts.map +1 -0
- package/dist/engine/pipeline/workspace_resumer.js +210 -0
- package/dist/engine/pipeline/workspace_resumer.js.map +1 -0
- package/dist/engine/release/foundation_scenario_registry.d.ts +44 -0
- package/dist/engine/release/foundation_scenario_registry.d.ts.map +1 -0
- package/dist/engine/release/foundation_scenario_registry.js +281 -0
- package/dist/engine/release/foundation_scenario_registry.js.map +1 -0
- package/dist/engine/release/foundation_scenario_runners.d.ts +54 -0
- package/dist/engine/release/foundation_scenario_runners.d.ts.map +1 -0
- package/dist/engine/release/foundation_scenario_runners.js +151 -0
- package/dist/engine/release/foundation_scenario_runners.js.map +1 -0
- package/dist/engine/release/gate_checks/checkControlPlaneTrust.d.ts +9 -0
- package/dist/engine/release/gate_checks/checkControlPlaneTrust.d.ts.map +1 -0
- package/dist/engine/release/gate_checks/checkControlPlaneTrust.js +121 -0
- package/dist/engine/release/gate_checks/checkControlPlaneTrust.js.map +1 -0
- package/dist/engine/release/gate_checks/checkCriticalProblemConsumption.d.ts +6 -0
- package/dist/engine/release/gate_checks/checkCriticalProblemConsumption.d.ts.map +1 -0
- package/dist/engine/release/gate_checks/checkCriticalProblemConsumption.js +498 -0
- package/dist/engine/release/gate_checks/checkCriticalProblemConsumption.js.map +1 -0
- package/dist/engine/release/gate_checks/checkDependencyAudit.d.ts +6 -0
- package/dist/engine/release/gate_checks/checkDependencyAudit.d.ts.map +1 -0
- package/dist/engine/release/gate_checks/checkDependencyAudit.js +45 -0
- package/dist/engine/release/gate_checks/checkDependencyAudit.js.map +1 -0
- package/dist/engine/release/gate_checks/checkDistFreshness.d.ts +6 -0
- package/dist/engine/release/gate_checks/checkDistFreshness.d.ts.map +1 -0
- package/dist/engine/release/gate_checks/checkDistFreshness.js +59 -0
- package/dist/engine/release/gate_checks/checkDistFreshness.js.map +1 -0
- package/dist/engine/release/gate_checks/checkKnowledgeAssetSchemaP0.d.ts +6 -0
- package/dist/engine/release/gate_checks/checkKnowledgeAssetSchemaP0.d.ts.map +1 -0
- package/dist/engine/release/gate_checks/checkKnowledgeAssetSchemaP0.js +30 -0
- package/dist/engine/release/gate_checks/checkKnowledgeAssetSchemaP0.js.map +1 -0
- package/dist/engine/release/gate_checks/checkMainlineConsumption.d.ts +6 -0
- package/dist/engine/release/gate_checks/checkMainlineConsumption.d.ts.map +1 -0
- package/dist/engine/release/gate_checks/checkMainlineConsumption.js +356 -0
- package/dist/engine/release/gate_checks/checkMainlineConsumption.js.map +1 -0
- package/dist/engine/release/gate_checks/checkNpmPack.d.ts +10 -0
- package/dist/engine/release/gate_checks/checkNpmPack.d.ts.map +1 -0
- package/dist/engine/release/gate_checks/checkNpmPack.js +69 -0
- package/dist/engine/release/gate_checks/checkNpmPack.js.map +1 -0
- package/dist/engine/release/gate_checks/checkTemplateKnowledgeHygiene.d.ts +10 -0
- package/dist/engine/release/gate_checks/checkTemplateKnowledgeHygiene.d.ts.map +1 -0
- package/dist/engine/release/gate_checks/checkTemplateKnowledgeHygiene.js +267 -0
- package/dist/engine/release/gate_checks/checkTemplateKnowledgeHygiene.js.map +1 -0
- package/dist/engine/release/gate_checks/checkWorkflowNavigation.d.ts +6 -0
- package/dist/engine/release/gate_checks/checkWorkflowNavigation.d.ts.map +1 -0
- package/dist/engine/release/gate_checks/checkWorkflowNavigation.js +189 -0
- package/dist/engine/release/gate_checks/checkWorkflowNavigation.js.map +1 -0
- package/dist/engine/release/gate_checks/helpers.d.ts +28 -0
- package/dist/engine/release/gate_checks/helpers.d.ts.map +1 -0
- package/dist/engine/release/gate_checks/helpers.js +92 -0
- package/dist/engine/release/gate_checks/helpers.js.map +1 -0
- package/dist/engine/release/gate_checks/types.d.ts +38 -0
- package/dist/engine/release/gate_checks/types.d.ts.map +1 -0
- package/dist/engine/release/gate_checks/types.js +5 -0
- package/dist/engine/release/gate_checks/types.js.map +1 -0
- package/dist/engine/release/index.d.ts +6 -0
- package/dist/engine/release/index.d.ts.map +1 -0
- package/dist/engine/release/index.js +6 -0
- package/dist/engine/release/index.js.map +1 -0
- package/dist/engine/release/release_gate_scenario_registry.d.ts.map +1 -0
- package/dist/engine/release/release_gate_scenario_registry.js +717 -0
- package/dist/engine/release/release_gate_scenario_registry.js.map +1 -0
- package/dist/engine/release/release_issue_scenario_registry/fixtures.d.ts +8 -0
- package/dist/engine/release/release_issue_scenario_registry/fixtures.d.ts.map +1 -0
- package/dist/engine/release/release_issue_scenario_registry/fixtures.js +54 -0
- package/dist/engine/release/release_issue_scenario_registry/fixtures.js.map +1 -0
- package/dist/engine/release/release_issue_scenario_registry/index.d.ts +8 -0
- package/dist/engine/release/release_issue_scenario_registry/index.d.ts.map +1 -0
- package/dist/engine/release/release_issue_scenario_registry/index.js +7 -0
- package/dist/engine/release/release_issue_scenario_registry/index.js.map +1 -0
- package/dist/engine/release/release_issue_scenario_registry/registry.d.ts +26 -0
- package/dist/engine/release/release_issue_scenario_registry/registry.d.ts.map +1 -0
- package/dist/engine/release/release_issue_scenario_registry/registry.js +83 -0
- package/dist/engine/release/release_issue_scenario_registry/registry.js.map +1 -0
- package/dist/engine/release/release_issue_scenario_registry/scenarios_architecture_workshop.d.ts +6 -0
- package/dist/engine/release/release_issue_scenario_registry/scenarios_architecture_workshop.d.ts.map +1 -0
- package/dist/engine/release/release_issue_scenario_registry/scenarios_architecture_workshop.js +284 -0
- package/dist/engine/release/release_issue_scenario_registry/scenarios_architecture_workshop.js.map +1 -0
- package/dist/engine/release/release_issue_scenario_registry/scenarios_code_observability.d.ts +6 -0
- package/dist/engine/release/release_issue_scenario_registry/scenarios_code_observability.d.ts.map +1 -0
- package/dist/engine/release/release_issue_scenario_registry/scenarios_code_observability.js +214 -0
- package/dist/engine/release/release_issue_scenario_registry/scenarios_code_observability.js.map +1 -0
- package/dist/engine/release/release_issue_scenario_registry/scenarios_decision_workshop.d.ts +6 -0
- package/dist/engine/release/release_issue_scenario_registry/scenarios_decision_workshop.d.ts.map +1 -0
- package/dist/engine/release/release_issue_scenario_registry/scenarios_decision_workshop.js +356 -0
- package/dist/engine/release/release_issue_scenario_registry/scenarios_decision_workshop.js.map +1 -0
- package/dist/engine/release/release_issue_scenario_registry/scenarios_design_pack.d.ts +6 -0
- package/dist/engine/release/release_issue_scenario_registry/scenarios_design_pack.d.ts.map +1 -0
- package/dist/engine/release/release_issue_scenario_registry/scenarios_design_pack.js +232 -0
- package/dist/engine/release/release_issue_scenario_registry/scenarios_design_pack.js.map +1 -0
- package/dist/engine/release/release_issue_scenario_registry/scenarios_template_contract.d.ts +6 -0
- package/dist/engine/release/release_issue_scenario_registry/scenarios_template_contract.d.ts.map +1 -0
- package/dist/engine/release/release_issue_scenario_registry/scenarios_template_contract.js +358 -0
- package/dist/engine/release/release_issue_scenario_registry/scenarios_template_contract.js.map +1 -0
- package/dist/engine/release/release_issue_scenario_registry/scenarios_template_visibility.d.ts +6 -0
- package/dist/engine/release/release_issue_scenario_registry/scenarios_template_visibility.d.ts.map +1 -0
- package/dist/engine/release/release_issue_scenario_registry/scenarios_template_visibility.js +292 -0
- package/dist/engine/release/release_issue_scenario_registry/scenarios_template_visibility.js.map +1 -0
- package/dist/engine/release/release_issue_scenario_registry/scenarios_workflow_navigation.d.ts +12 -0
- package/dist/engine/release/release_issue_scenario_registry/scenarios_workflow_navigation.d.ts.map +1 -0
- package/dist/engine/release/release_issue_scenario_registry/scenarios_workflow_navigation.js +147 -0
- package/dist/engine/release/release_issue_scenario_registry/scenarios_workflow_navigation.js.map +1 -0
- package/dist/engine/release/release_issue_scenario_registry/types.d.ts +37 -0
- package/dist/engine/release/release_issue_scenario_registry/types.d.ts.map +1 -0
- package/dist/engine/release/release_issue_scenario_registry/types.js +5 -0
- package/dist/engine/release/release_issue_scenario_registry/types.js.map +1 -0
- package/dist/engine/release/release_issue_scenario_registry/workshop_helpers.d.ts +35 -0
- package/dist/engine/release/release_issue_scenario_registry/workshop_helpers.d.ts.map +1 -0
- package/dist/engine/release/release_issue_scenario_registry/workshop_helpers.js +78 -0
- package/dist/engine/release/release_issue_scenario_registry/workshop_helpers.js.map +1 -0
- package/dist/engine/release/release_issue_scenario_registry.d.ts +9 -0
- package/dist/engine/release/release_issue_scenario_registry.d.ts.map +1 -0
- package/dist/engine/release/release_issue_scenario_registry.js +8 -0
- package/dist/engine/release/release_issue_scenario_registry.js.map +1 -0
- package/dist/engine/release/release_readiness_gate.d.ts +26 -0
- package/dist/engine/release/release_readiness_gate.d.ts.map +1 -0
- package/dist/engine/release/release_readiness_gate.js +209 -0
- package/dist/engine/release/release_readiness_gate.js.map +1 -0
- package/dist/engine/release/release_tool_harness.d.ts +84 -0
- package/dist/engine/release/release_tool_harness.d.ts.map +1 -0
- package/dist/engine/release/release_tool_harness.js +169 -0
- package/dist/engine/release/release_tool_harness.js.map +1 -0
- package/dist/engine/release/types.d.ts +81 -0
- package/dist/engine/release/types.d.ts.map +1 -0
- package/dist/engine/release/types.js +7 -0
- package/dist/engine/release/types.js.map +1 -0
- package/dist/engine/release/verifier.d.ts +45 -0
- package/dist/engine/release/verifier.d.ts.map +1 -0
- package/dist/engine/release/verifier.js +629 -0
- package/dist/engine/release/verifier.js.map +1 -0
- package/dist/engine/retention_policy.js +1 -1
- package/dist/engine/retention_policy.js.map +1 -1
- package/dist/engine/source_code_matcher.js +1 -1
- package/dist/engine/source_code_matcher.js.map +1 -1
- package/dist/engine/state_fact_classifier.d.ts +3 -3
- package/dist/engine/state_fact_classifier.js +4 -4
- package/dist/engine/state_fact_classifier.js.map +1 -1
- package/dist/engine/team_awareness.d.ts +2 -2
- package/dist/engine/team_awareness.d.ts.map +1 -1
- package/dist/engine/team_awareness.js +1 -1
- package/dist/engine/team_awareness.js.map +1 -1
- package/dist/engine/templates/asset_manifest.d.ts +67 -0
- package/dist/engine/templates/asset_manifest.d.ts.map +1 -0
- package/dist/engine/templates/asset_manifest.js +316 -0
- package/dist/engine/templates/asset_manifest.js.map +1 -0
- package/dist/engine/templates/consumable_asset_registry/builtin_assets_core.d.ts +8 -0
- package/dist/engine/templates/consumable_asset_registry/builtin_assets_core.d.ts.map +1 -0
- package/dist/engine/templates/consumable_asset_registry/builtin_assets_core.js +326 -0
- package/dist/engine/templates/consumable_asset_registry/builtin_assets_core.js.map +1 -0
- package/dist/engine/templates/consumable_asset_registry/builtin_assets_dual_layer_core.d.ts +7 -0
- package/dist/engine/templates/consumable_asset_registry/builtin_assets_dual_layer_core.d.ts.map +1 -0
- package/dist/engine/templates/consumable_asset_registry/builtin_assets_dual_layer_core.js +310 -0
- package/dist/engine/templates/consumable_asset_registry/builtin_assets_dual_layer_core.js.map +1 -0
- package/dist/engine/templates/consumable_asset_registry/builtin_assets_dual_layer_ext.d.ts +7 -0
- package/dist/engine/templates/consumable_asset_registry/builtin_assets_dual_layer_ext.d.ts.map +1 -0
- package/dist/engine/templates/consumable_asset_registry/builtin_assets_dual_layer_ext.js +255 -0
- package/dist/engine/templates/consumable_asset_registry/builtin_assets_dual_layer_ext.js.map +1 -0
- package/dist/engine/templates/consumable_asset_registry/builtin_assets_dual_layer_ext2.d.ts +8 -0
- package/dist/engine/templates/consumable_asset_registry/builtin_assets_dual_layer_ext2.d.ts.map +1 -0
- package/dist/engine/templates/consumable_asset_registry/builtin_assets_dual_layer_ext2.js +281 -0
- package/dist/engine/templates/consumable_asset_registry/builtin_assets_dual_layer_ext2.js.map +1 -0
- package/dist/engine/templates/consumable_asset_registry/builtin_assets_pipeline.d.ts +7 -0
- package/dist/engine/templates/consumable_asset_registry/builtin_assets_pipeline.d.ts.map +1 -0
- package/dist/engine/templates/consumable_asset_registry/builtin_assets_pipeline.js +60 -0
- package/dist/engine/templates/consumable_asset_registry/builtin_assets_pipeline.js.map +1 -0
- package/dist/engine/templates/consumable_asset_registry/index.d.ts +9 -0
- package/dist/engine/templates/consumable_asset_registry/index.d.ts.map +1 -0
- package/dist/engine/templates/consumable_asset_registry/index.js +9 -0
- package/dist/engine/templates/consumable_asset_registry/index.js.map +1 -0
- package/dist/engine/templates/consumable_asset_registry/registry.d.ts +33 -0
- package/dist/engine/templates/consumable_asset_registry/registry.d.ts.map +1 -0
- package/dist/engine/templates/consumable_asset_registry/registry.js +55 -0
- package/dist/engine/templates/consumable_asset_registry/registry.js.map +1 -0
- package/dist/engine/templates/consumable_asset_registry/types.d.ts +55 -0
- package/dist/engine/templates/consumable_asset_registry/types.d.ts.map +1 -0
- package/dist/engine/templates/consumable_asset_registry/types.js +246 -0
- package/dist/engine/templates/consumable_asset_registry/types.js.map +1 -0
- package/dist/engine/templates/consumable_asset_registry.d.ts +11 -0
- package/dist/engine/templates/consumable_asset_registry.d.ts.map +1 -0
- package/dist/engine/templates/consumable_asset_registry.js +10 -0
- package/dist/engine/templates/consumable_asset_registry.js.map +1 -0
- package/dist/engine/templates/consumption_trace_store.d.ts +93 -0
- package/dist/engine/templates/consumption_trace_store.d.ts.map +1 -0
- package/dist/engine/templates/consumption_trace_store.js +128 -0
- package/dist/engine/templates/consumption_trace_store.js.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/adapters.d.ts +3 -0
- package/dist/engine/templates/explicit_asset_registry/adapters.d.ts.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/adapters.js +67 -0
- package/dist/engine/templates/explicit_asset_registry/adapters.js.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/artifacts_existing_system.d.ts +3 -0
- package/dist/engine/templates/explicit_asset_registry/artifacts_existing_system.d.ts.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/artifacts_existing_system.js +163 -0
- package/dist/engine/templates/explicit_asset_registry/artifacts_existing_system.js.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/artifacts_shared_part1.d.ts +3 -0
- package/dist/engine/templates/explicit_asset_registry/artifacts_shared_part1.d.ts.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/artifacts_shared_part1.js +403 -0
- package/dist/engine/templates/explicit_asset_registry/artifacts_shared_part1.js.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/artifacts_shared_part2.d.ts +3 -0
- package/dist/engine/templates/explicit_asset_registry/artifacts_shared_part2.d.ts.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/artifacts_shared_part2.js +83 -0
- package/dist/engine/templates/explicit_asset_registry/artifacts_shared_part2.js.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/checklists.d.ts +3 -0
- package/dist/engine/templates/explicit_asset_registry/checklists.d.ts.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/checklists.js +115 -0
- package/dist/engine/templates/explicit_asset_registry/checklists.js.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/contributing.d.ts +3 -0
- package/dist/engine/templates/explicit_asset_registry/contributing.d.ts.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/contributing.js +19 -0
- package/dist/engine/templates/explicit_asset_registry/contributing.js.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/domain.d.ts +3 -0
- package/dist/engine/templates/explicit_asset_registry/domain.d.ts.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/domain.js +147 -0
- package/dist/engine/templates/explicit_asset_registry/domain.js.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/gates.d.ts +3 -0
- package/dist/engine/templates/explicit_asset_registry/gates.d.ts.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/gates.js +374 -0
- package/dist/engine/templates/explicit_asset_registry/gates.js.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/index.d.ts +4 -0
- package/dist/engine/templates/explicit_asset_registry/index.d.ts.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/index.js +58 -0
- package/dist/engine/templates/explicit_asset_registry/index.js.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/internal_patterns.d.ts +3 -0
- package/dist/engine/templates/explicit_asset_registry/internal_patterns.d.ts.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/internal_patterns.js +435 -0
- package/dist/engine/templates/explicit_asset_registry/internal_patterns.js.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/internal_rules_part1.d.ts +3 -0
- package/dist/engine/templates/explicit_asset_registry/internal_rules_part1.d.ts.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/internal_rules_part1.js +419 -0
- package/dist/engine/templates/explicit_asset_registry/internal_rules_part1.js.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/internal_rules_part2.d.ts +3 -0
- package/dist/engine/templates/explicit_asset_registry/internal_rules_part2.d.ts.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/internal_rules_part2.js +323 -0
- package/dist/engine/templates/explicit_asset_registry/internal_rules_part2.js.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/patterns_part1.d.ts +3 -0
- package/dist/engine/templates/explicit_asset_registry/patterns_part1.d.ts.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/patterns_part1.js +403 -0
- package/dist/engine/templates/explicit_asset_registry/patterns_part1.js.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/patterns_part2.d.ts +3 -0
- package/dist/engine/templates/explicit_asset_registry/patterns_part2.d.ts.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/patterns_part2.js +403 -0
- package/dist/engine/templates/explicit_asset_registry/patterns_part2.js.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/patterns_part3.d.ts +3 -0
- package/dist/engine/templates/explicit_asset_registry/patterns_part3.d.ts.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/patterns_part3.js +35 -0
- package/dist/engine/templates/explicit_asset_registry/patterns_part3.js.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/procedures_part1.d.ts +3 -0
- package/dist/engine/templates/explicit_asset_registry/procedures_part1.d.ts.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/procedures_part1.js +435 -0
- package/dist/engine/templates/explicit_asset_registry/procedures_part1.js.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/procedures_part2.d.ts +3 -0
- package/dist/engine/templates/explicit_asset_registry/procedures_part2.d.ts.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/procedures_part2.js +230 -0
- package/dist/engine/templates/explicit_asset_registry/procedures_part2.js.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/profiles.d.ts +3 -0
- package/dist/engine/templates/explicit_asset_registry/profiles.d.ts.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/profiles.js +51 -0
- package/dist/engine/templates/explicit_asset_registry/profiles.js.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/rules_pipeline.d.ts +3 -0
- package/dist/engine/templates/explicit_asset_registry/rules_pipeline.d.ts.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/rules_pipeline.js +163 -0
- package/dist/engine/templates/explicit_asset_registry/rules_pipeline.js.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/rules_shared.d.ts +3 -0
- package/dist/engine/templates/explicit_asset_registry/rules_shared.d.ts.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/rules_shared.js +622 -0
- package/dist/engine/templates/explicit_asset_registry/rules_shared.js.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/scaffolds.d.ts +3 -0
- package/dist/engine/templates/explicit_asset_registry/scaffolds.d.ts.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/scaffolds.js +378 -0
- package/dist/engine/templates/explicit_asset_registry/scaffolds.js.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/types.d.ts +29 -0
- package/dist/engine/templates/explicit_asset_registry/types.d.ts.map +1 -0
- package/dist/engine/templates/explicit_asset_registry/types.js +7 -0
- package/dist/engine/templates/explicit_asset_registry/types.js.map +1 -0
- package/dist/engine/templates/explicit_asset_registry.d.ts +9 -0
- package/dist/engine/templates/explicit_asset_registry.d.ts.map +1 -0
- package/dist/engine/templates/explicit_asset_registry.js +9 -0
- package/dist/engine/templates/explicit_asset_registry.js.map +1 -0
- package/dist/engine/templates/observed_consumption.d.ts +54 -0
- package/dist/engine/templates/observed_consumption.d.ts.map +1 -0
- package/dist/engine/templates/observed_consumption.js +364 -0
- package/dist/engine/templates/observed_consumption.js.map +1 -0
- package/dist/engine/templates/scaffolder.d.ts +19 -0
- package/dist/engine/templates/scaffolder.d.ts.map +1 -0
- package/dist/engine/templates/scaffolder.js +412 -0
- package/dist/engine/templates/scaffolder.js.map +1 -0
- package/dist/engine/templates/standard_asset_contract.d.ts +105 -0
- package/dist/engine/templates/standard_asset_contract.d.ts.map +1 -0
- package/dist/engine/templates/standard_asset_contract.js +540 -0
- package/dist/engine/templates/standard_asset_contract.js.map +1 -0
- package/dist/engine/templates/standard_asset_coverage.d.ts.map +1 -0
- package/dist/engine/templates/standard_asset_coverage.js +220 -0
- package/dist/engine/templates/standard_asset_coverage.js.map +1 -0
- package/dist/engine/templates/template_asset_contract_registry.d.ts +162 -0
- package/dist/engine/templates/template_asset_contract_registry.d.ts.map +1 -0
- package/dist/engine/templates/template_asset_contract_registry.js +662 -0
- package/dist/engine/templates/template_asset_contract_registry.js.map +1 -0
- package/dist/engine/templates/template_asset_visibility.d.ts +109 -0
- package/dist/engine/templates/template_asset_visibility.d.ts.map +1 -0
- package/dist/engine/templates/template_asset_visibility.js +304 -0
- package/dist/engine/templates/template_asset_visibility.js.map +1 -0
- package/dist/engine/templates/template_init_sync.d.ts +103 -0
- package/dist/engine/templates/template_init_sync.d.ts.map +1 -0
- package/dist/engine/templates/template_init_sync.js +447 -0
- package/dist/engine/templates/template_init_sync.js.map +1 -0
- package/dist/engine/templates/template_manifest_io.d.ts +57 -0
- package/dist/engine/templates/template_manifest_io.d.ts.map +1 -0
- package/dist/engine/templates/template_manifest_io.js +189 -0
- package/dist/engine/templates/template_manifest_io.js.map +1 -0
- package/dist/engine/templates/template_mechanism_auditor.d.ts +95 -0
- package/dist/engine/templates/template_mechanism_auditor.d.ts.map +1 -0
- package/dist/engine/templates/template_mechanism_auditor.js +627 -0
- package/dist/engine/templates/template_mechanism_auditor.js.map +1 -0
- package/dist/engine/templates/template_sync.d.ts +98 -0
- package/dist/engine/templates/template_sync.d.ts.map +1 -0
- package/dist/engine/templates/template_sync.js.map +1 -0
- package/dist/engine/templates/workflow_rule_generator.d.ts +22 -0
- package/dist/engine/templates/workflow_rule_generator.d.ts.map +1 -0
- package/dist/engine/templates/workflow_rule_generator.js +81 -0
- package/dist/engine/templates/workflow_rule_generator.js.map +1 -0
- package/dist/engine/workflow/index.d.ts +10 -0
- package/dist/engine/workflow/index.d.ts.map +1 -0
- package/dist/engine/workflow/index.js +12 -0
- package/dist/engine/workflow/index.js.map +1 -0
- package/dist/engine/workflow/next_action_planner.d.ts +32 -0
- package/dist/engine/workflow/next_action_planner.d.ts.map +1 -0
- package/dist/engine/workflow/next_action_planner.js +868 -0
- package/dist/engine/workflow/next_action_planner.js.map +1 -0
- package/dist/engine/workflow/project_stage_detector.d.ts.map +1 -0
- package/dist/engine/workflow/project_stage_detector.js +253 -0
- package/dist/engine/workflow/project_stage_detector.js.map +1 -0
- package/dist/engine/workflow/workflow_contract_registry.d.ts +126 -0
- package/dist/engine/workflow/workflow_contract_registry.d.ts.map +1 -0
- package/dist/engine/workflow/workflow_contract_registry.js +271 -0
- package/dist/engine/workflow/workflow_contract_registry.js.map +1 -0
- package/dist/engine/workflow/workflow_navigation_contract.d.ts +178 -0
- package/dist/engine/workflow/workflow_navigation_contract.d.ts.map +1 -0
- package/dist/engine/workflow/workflow_navigation_contract.js +30 -0
- package/dist/engine/workflow/workflow_navigation_contract.js.map +1 -0
- package/dist/git/git_deps.d.ts +72 -0
- package/dist/git/git_deps.d.ts.map +1 -0
- package/dist/git/git_deps.js +9 -0
- package/dist/git/git_deps.js.map +1 -0
- package/dist/git/operations.d.ts +1 -0
- package/dist/git/operations.d.ts.map +1 -1
- package/dist/git/operations.js +3 -1
- package/dist/git/operations.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +61 -20
- package/dist/index.js.map +1 -1
- package/dist/knowledge/conflict_detector.d.ts +15 -1
- package/dist/knowledge/conflict_detector.d.ts.map +1 -1
- package/dist/knowledge/conflict_detector.js +83 -4
- 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/health_checker.js +19 -8
- package/dist/knowledge/health_checker.js.map +1 -1
- package/dist/knowledge/index_manager.d.ts +26 -2
- package/dist/knowledge/index_manager.d.ts.map +1 -1
- package/dist/knowledge/index_manager.js +361 -113
- package/dist/knowledge/index_manager.js.map +1 -1
- package/dist/knowledge/loader.d.ts +9 -5
- package/dist/knowledge/loader.d.ts.map +1 -1
- package/dist/knowledge/loader.js +211 -45
- package/dist/knowledge/loader.js.map +1 -1
- package/dist/knowledge/writer.d.ts +11 -1
- package/dist/knowledge/writer.d.ts.map +1 -1
- package/dist/knowledge/writer.js +44 -3
- package/dist/knowledge/writer.js.map +1 -1
- package/dist/server/index.d.ts +26 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +55 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/lifecycle.d.ts +25 -0
- package/dist/server/lifecycle.d.ts.map +1 -0
- package/dist/server/lifecycle.js +66 -0
- package/dist/server/lifecycle.js.map +1 -0
- package/dist/server/tools/cep_assessment.d.ts +172 -0
- package/dist/server/tools/cep_assessment.d.ts.map +1 -0
- package/dist/server/tools/cep_assessment.js +397 -0
- package/dist/server/tools/cep_assessment.js.map +1 -0
- package/dist/server/tools/gate_checks.d.ts +123 -0
- package/dist/server/tools/gate_checks.d.ts.map +1 -0
- package/dist/server/tools/gate_checks.js +267 -0
- package/dist/server/tools/gate_checks.js.map +1 -0
- package/dist/server/tools/index.d.ts +12 -0
- package/dist/server/tools/index.d.ts.map +1 -0
- package/dist/server/tools/index.js +62 -0
- package/dist/server/tools/index.js.map +1 -0
- package/dist/server/tools/lazy_loaders.d.ts +66 -0
- package/dist/server/tools/lazy_loaders.d.ts.map +1 -0
- package/dist/server/tools/lazy_loaders.js +78 -0
- package/dist/server/tools/lazy_loaders.js.map +1 -0
- package/dist/server/tools/middleware.d.ts +52 -0
- package/dist/server/tools/middleware.d.ts.map +1 -0
- package/dist/server/tools/middleware.js +648 -0
- package/dist/server/tools/middleware.js.map +1 -0
- package/dist/server/tools/schemas.d.ts +220 -0
- package/dist/server/tools/schemas.d.ts.map +1 -0
- package/dist/server/tools/schemas.js +162 -0
- package/dist/server/tools/schemas.js.map +1 -0
- package/dist/server/tools/tool_groups/admin.d.ts +3 -0
- package/dist/server/tools/tool_groups/admin.d.ts.map +1 -0
- package/dist/server/tools/tool_groups/admin.js +162 -0
- package/dist/server/tools/tool_groups/admin.js.map +1 -0
- package/dist/server/tools/tool_groups/auxiliary.d.ts +3 -0
- package/dist/server/tools/tool_groups/auxiliary.d.ts.map +1 -0
- package/dist/server/tools/tool_groups/auxiliary.js +144 -0
- package/dist/server/tools/tool_groups/auxiliary.js.map +1 -0
- package/dist/server/tools/tool_groups/knowledge.d.ts +3 -0
- package/dist/server/tools/tool_groups/knowledge.d.ts.map +1 -0
- package/dist/server/tools/tool_groups/knowledge.js +71 -0
- package/dist/server/tools/tool_groups/knowledge.js.map +1 -0
- package/dist/server/tools/tool_groups/product_operations.d.ts +9 -0
- package/dist/server/tools/tool_groups/product_operations.d.ts.map +1 -0
- package/dist/server/tools/tool_groups/product_operations.js +143 -0
- package/dist/server/tools/tool_groups/product_operations.js.map +1 -0
- package/dist/server/tools/tool_groups/scaffold_accept_deliver.d.ts +3 -0
- package/dist/server/tools/tool_groups/scaffold_accept_deliver.d.ts.map +1 -0
- package/dist/server/tools/tool_groups/scaffold_accept_deliver.js +37 -0
- package/dist/server/tools/tool_groups/scaffold_accept_deliver.js.map +1 -0
- package/dist/server/tools/tool_groups/state_machine.d.ts +13 -0
- package/dist/server/tools/tool_groups/state_machine.d.ts.map +1 -0
- package/dist/server/tools/tool_groups/state_machine.js +606 -0
- package/dist/server/tools/tool_groups/state_machine.js.map +1 -0
- package/dist/server/tools/tool_names.d.ts +59 -0
- package/dist/server/tools/tool_names.d.ts.map +1 -0
- package/dist/server/tools/tool_names.js +67 -0
- package/dist/server/tools/tool_names.js.map +1 -0
- package/dist/server/tools/types.d.ts +14 -0
- package/dist/server/tools/types.d.ts.map +1 -0
- package/dist/server/tools/types.js +2 -0
- package/dist/server/tools/types.js.map +1 -0
- package/dist/server/tools/utils.d.ts +17 -0
- package/dist/server/tools/utils.d.ts.map +1 -0
- package/dist/server/tools/utils.js +65 -0
- package/dist/server/tools/utils.js.map +1 -0
- package/dist/types/analysis.d.ts +358 -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 +13 -0
- package/dist/types/base.d.ts.map +1 -0
- package/dist/types/base.js +3 -0
- package/dist/types/base.js.map +1 -0
- package/dist/types/config.d.ts +130 -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 +304 -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 +14 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +14 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/knowledge.d.ts +116 -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 +538 -0
- package/dist/types/pipeline.d.ts.map +1 -0
- package/dist/types/pipeline.js +6 -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/state_machine.d.ts +353 -0
- package/dist/types/state_machine.d.ts.map +1 -0
- package/dist/types/state_machine.js +47 -0
- package/dist/types/state_machine.js.map +1 -0
- package/dist/types/task.d.ts +314 -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 +29 -16
- 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 +45 -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 +52 -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 +47 -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 +49 -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 +45 -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 +53 -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 +47 -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 +34 -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 +75 -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 +42 -0
- package/templates/artifacts/shared/ADR/346/250/241/347/211/210.md +54 -0
- package/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 +105 -0
- package/templates/artifacts/shared/Bug/345/210/206/346/236/220/346/250/241/347/211/210.md +60 -0
- package/templates/artifacts/shared/OOD/350/256/276/350/256/241/346/221/230/350/246/201/346/250/241/347/211/210.md +51 -0
- package/templates/artifacts/shared/POC/347/273/223/350/256/272/346/250/241/347/211/210.md +54 -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 +71 -0
- package/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/347/211/210.md +68 -0
- package/templates/artifacts/shared//345/210/207/347/211/207/350/256/241/345/210/222/346/250/241/347/211/210.md +150 -0
- package/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 +41 -0
- package/templates/artifacts/shared//345/216/237/345/236/213/350/257/264/346/230/216/346/250/241/347/211/210.md +203 -0
- package/templates/artifacts/shared//345/220/216/347/253/257API/351/252/214/346/224/266/346/270/205/345/215/225.md +40 -0
- package/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 +44 -0
- package/templates/artifacts/shared//345/256/211/345/205/250/345/256/241/350/256/241/346/250/241/347/211/210.md +49 -0
- package/templates/artifacts/shared//345/256/241/346/237/245/346/221/230/350/246/201.md +58 -0
- package/templates/artifacts/shared//346/200/247/350/203/275/345/210/206/346/236/220/346/250/241/347/211/210.md +60 -0
- package/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 +34 -0
- package/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 +101 -0
- package/templates/artifacts/shared//346/225/205/351/232/234/345/244/215/347/233/230/346/250/241/347/211/210.md +68 -0
- package/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 +79 -0
- package/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 +38 -0
- package/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 +164 -0
- package/templates/artifacts/shared//346/236/266/346/236/204/350/256/276/350/256/241/346/250/241/347/211/210.md +177 -0
- package/templates/artifacts/shared//346/265/213/350/257/225/350/256/241/345/210/222/346/250/241/347/211/210.md +71 -0
- package/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 +42 -0
- package/templates/artifacts/shared//350/257/246/347/273/206/350/256/276/350/256/241/346/250/241/347/211/210.md +115 -0
- package/templates/artifacts/shared//350/277/201/347/247/273/350/257/204/344/274/260/346/250/241/347/211/210.md +68 -0
- package/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 +177 -0
- package/templates/artifacts/shared//351/207/215/346/236/204/346/226/271/346/241/210/346/250/241/347/211/210.md +62 -0
- package/templates/artifacts/shared//351/234/200/346/261/202/345/210/206/346/236/220/346/250/241/347/211/210.md +126 -0
- package/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 +91 -0
- package/templates/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 +35 -0
- package/templates/checklists//344/274/232/350/257/235/346/201/242/345/244/215.md +42 -0
- package/templates/checklists//345/267/245/344/275/234/346/265/201/351/252/214/346/224/266/346/270/205/345/215/225.md +36 -0
- package/templates/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 +62 -0
- package/templates/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 +36 -0
- package/templates/checklists//351/232/220/347/247/201/345/256/241/346/237/245/346/270/205/345/215/225.md +34 -0
- package/templates/checklists//351/252/214/350/257/201/351/252/214/346/224/266/346/270/205/345/215/225.md +35 -0
- package/templates/domain//345/244/232/347/247/237/346/210/267.md +47 -0
- package/templates/domain//345/256/241/350/256/241/346/227/245/345/277/227.md +45 -0
- package/templates/domain//345/257/274/345/205/245/345/257/274/345/207/272/350/247/204/345/210/231.md +50 -0
- package/templates/domain//345/267/245/344/275/234/346/265/201/345/274/225/346/223/216.md +49 -0
- package/templates/domain//346/212/245/350/241/250/347/273/237/350/256/241.md +49 -0
- package/templates/domain//346/224/257/344/273/230/350/247/204/345/210/231.md +50 -0
- package/templates/domain//346/225/260/346/215/256/346/235/203/351/231/220.md +46 -0
- package/templates/domain//351/200/232/347/224/250/346/234/272/346/242/260/346/235/241/346/254/276.md +46 -0
- package/templates/domain//351/200/232/347/237/245/350/247/204/345/210/231.md +49 -0
- package/templates/gates/existing-system/gate-/346/236/266/346/236/204/350/256/276/350/256/241.yaml +26 -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 +61 -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 +52 -0
- package/templates/gates/existing-system/gate-/350/257/225/350/277/220/350/241/214.yaml +39 -0
- package/templates/gates/existing-system/gate-/350/257/246/347/273/206/350/256/276/350/256/241.yaml +33 -0
- package/templates/gates/shared/gate-/344/272/244/344/273/230.yaml +32 -0
- package/templates/gates/shared/gate-/344/273/243/347/240/201/345/256/241/346/237/245.yaml +53 -0
- package/templates/gates/shared/gate-/344/273/273/345/212/241/350/247/204/345/210/222.yaml +144 -0
- package/templates/gates/shared/gate-/344/274/232/350/257/235/345/220/257/345/212/250.yaml +14 -0
- package/templates/gates/shared/gate-/345/206/263/347/255/226/347/240/224/350/256/250.yaml +14 -0
- package/templates/gates/shared/gate-/345/210/207/347/211/207/345/256/241/346/237/245.yaml +50 -0
- package/templates/gates/shared/gate-/345/210/207/347/211/207/346/211/247/350/241/214.yaml +51 -0
- package/templates/gates/shared/gate-/345/217/221/345/270/203/345/220/216/350/247/202/345/257/237.yaml +46 -0
- package/templates/gates/shared/gate-/345/256/211/345/205/250/345/256/241/350/256/241.yaml +77 -0
- package/templates/gates/shared/gate-/346/234/254/345/234/260/351/252/214/346/224/266.yaml +14 -0
- package/templates/gates/shared/gate-/346/236/266/346/236/204/350/256/276/350/256/241.yaml +145 -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 +40 -0
- package/templates/gates/shared/gate-/347/274/226/347/240/201/345/207/206/345/244/207.yaml +50 -0
- package/templates/gates/shared/gate-/347/274/226/347/240/201/345/256/236/347/216/260.yaml +52 -0
- package/templates/gates/shared/gate-/347/274/226/347/240/201/351/252/214/350/257/201.yaml +47 -0
- package/templates/gates/shared/gate-/350/201/224/350/260/203/351/252/214/350/257/201.yaml +53 -0
- package/templates/gates/shared/gate-/350/257/246/347/273/206/350/256/276/350/256/241.yaml +123 -0
- package/templates/gates/shared/gate-/351/234/200/346/261/202/345/210/206/346/236/220.yaml +164 -0
- package/templates/internal/patterns/Diff/345/275/222/345/261/236/350/277/275/350/270/252.md +53 -0
- package/templates/internal/patterns/Hook/345/261/202/344/272/247/347/211/251/347/273/223/346/236/204/346/240/241/351/252/214.md +55 -0
- package/templates/internal/patterns/Java/350/264/250/351/207/217/351/227/250/347/246/201.md +52 -0
- package/templates/internal/patterns/LLM/351/242/204/347/256/227/347/275/221/345/205/263.md +52 -0
- package/templates/internal/patterns//344/272/247/347/211/251Schema/346/263/250/345/206/214/344/270/255/345/277/203.md +55 -0
- package/templates/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 +53 -0
- package/templates/internal/patterns//344/273/273/345/212/241/347/256/241/347/220/206/345/231/250.md +53 -0
- package/templates/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 +52 -0
- package/templates/internal/patterns//344/275/234/347/224/250/345/237/237/347/247/237/347/272/246.md +53 -0
- package/templates/internal/patterns//345/206/262/347/252/201/351/227/250/347/246/201.md +53 -0
- package/templates/internal/patterns//345/206/263/347/255/226/347/275/221/345/205/263.md +59 -0
- package/templates/internal/patterns//345/210/206/345/234/272/346/231/257/350/277/207/347/250/213/350/247/204/345/210/231.md +55 -0
- package/templates/internal/patterns//345/217/230/345/274/202/345/256/241/350/256/241.md +56 -0
- package/templates/internal/patterns//345/233/236/345/275/222/347/237/251/351/230/265.md +52 -0
- package/templates/internal/patterns//345/267/245/344/275/234/345/214/272/344/272/222/346/226/245/351/224/201.md +50 -0
- package/templates/internal/patterns//345/267/245/344/275/234/345/214/272/345/224/244/351/206/222.md +52 -0
- package/templates/internal/patterns//345/271/266/345/217/221/351/224/201.md +55 -0
- package/templates/internal/patterns//345/274/200/345/217/221/350/200/205/345/256/252/346/263/225.md +65 -0
- package/templates/internal/patterns//346/225/217/346/204/237/344/277/241/346/201/257/346/211/253/346/217/217.md +51 -0
- package/templates/internal/patterns//346/250/241/347/211/210Frontmatter/350/247/243/346/236/220.md +55 -0
- package/templates/internal/patterns//346/262/273/347/220/206/350/277/220/350/241/214/346/227/266/345/276/252/347/216/257.md +54 -0
- package/templates/internal/patterns//346/265/201/345/274/217/345/277/203/350/267/263.md +62 -0
- package/templates/internal/patterns//347/237/245/350/257/206/344/270/273/346/235/203.md +64 -0
- package/templates/internal/patterns//350/257/255/344/271/211/350/257/201/346/215/256.md +53 -0
- package/templates/internal/patterns//350/277/220/350/241/214/345/256/211/345/205/250/345/214/205.md +56 -0
- package/templates/internal/patterns//351/252/214/350/257/201/345/221/275/344/273/244/347/224/237/346/210/220.md +53 -0
- package/templates/internal/rules/OOD/344/270/216SOLID/350/256/276/350/256/241/350/247/204/345/210/231.md +47 -0
- package/templates/internal/rules//344/272/247/347/211/251/345/245/221/347/272/246/350/247/204/345/210/231.md +48 -0
- package/templates/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 +122 -0
- package/templates/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 +56 -0
- package/templates/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 +40 -0
- package/templates/internal/rules//345/221/275/344/273/244/346/211/247/350/241/214/350/247/204/345/210/231.md +52 -0
- package/templates/internal/rules//345/221/275/344/273/244/350/267/257/347/224/261/350/247/204/345/210/231.md +30 -0
- package/templates/internal/rules//345/267/245/344/275/234/346/265/201/345/245/221/347/272/246/350/247/204/345/210/231.md +47 -0
- package/templates/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 +131 -0
- package/templates/internal/rules//345/267/245/344/275/234/346/265/201/346/250/241/347/211/210/345/214/205/350/247/204/345/210/231.md +40 -0
- package/templates/internal/rules//345/267/245/345/205/267/350/260/203/347/224/250/350/247/204/345/210/231.md +52 -0
- package/templates/internal/rules//346/204/217/345/233/276/350/267/257/347/224/261/350/247/204/345/210/231.md +55 -0
- package/templates/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 +51 -0
- package/templates/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 +40 -0
- package/templates/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 +54 -0
- package/templates/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 +75 -0
- package/templates/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 +69 -0
- package/templates/internal/rules//346/227/245/345/277/227/346/262/273/347/220/206/350/247/204/345/210/231.md +36 -0
- package/templates/internal/rules//346/234/272/345/210/266/350/207/252/346/262/273/347/220/206/350/247/204/345/210/231.md +35 -0
- package/templates/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 +44 -0
- package/templates/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 +59 -0
- package/templates/internal/rules//346/240/270/345/277/203/344/275/223/351/252/214/345/216/237/345/210/231.md +38 -0
- package/templates/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 +151 -0
- package/templates/internal/rules//346/250/241/347/211/210Frontmatter/350/247/204/350/214/203.md +301 -0
- package/templates/internal/rules//346/250/241/347/211/210/350/265/204/344/272/247/345/217/257/350/247/201/346/200/247/350/247/204/345/210/231.md +57 -0
- package/templates/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 +53 -0
- package/templates/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 +63 -0
- package/templates/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 +99 -0
- package/templates/internal/rules//347/237/245/350/257/206/346/262/273/347/220/206/350/247/204/345/210/231.md +36 -0
- package/templates/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 +52 -0
- package/templates/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 +45 -0
- package/templates/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 +63 -0
- package/templates/internal/rules//347/273/206/350/212/202/347/272/252/345/276/213/350/247/204/345/210/231.md +57 -0
- package/templates/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 +56 -0
- package/templates/internal/rules//350/256/241/345/210/222/345/211/215/347/275/256/351/227/250/350/247/204/345/210/231.md +41 -0
- package/templates/internal/rules//350/256/276/350/256/241/344/272/247/347/211/251/345/214/205/350/247/204/345/210/231.md +66 -0
- package/templates/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 +63 -0
- package/templates/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 +40 -0
- package/templates/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 +54 -0
- package/templates/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 +59 -0
- package/templates/internal/rules//351/205/215/347/275/256/344/274/230/345/205/210/347/272/247/350/247/204/345/210/231.md +68 -0
- package/templates/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 +37 -0
- package/templates/internal/rules//351/230/262/345/255/244/345/262/233/345/256/236/347/216/260/350/247/204/345/210/231.md +51 -0
- package/templates/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 +58 -0
- package/templates/internal/rules//351/252/214/346/224/266/346/250/241/347/211/210/350/276/223/345/207/272/345/245/221/347/272/246/350/247/204/345/210/231.md +80 -0
- package/templates/internal/rules//351/252/214/350/257/201/345/245/221/347/272/246/350/247/204/345/210/231.md +52 -0
- package/templates/patterns/API/350/256/276/350/256/241/350/247/204/350/214/203.md +5 -20
- package/templates/patterns/Docker/351/203/250/347/275/262/350/247/204/350/214/203.md +5 -18
- package/templates/patterns/Git/346/223/215/344/275/234/350/247/204/350/214/203.md +5 -22
- package/templates/patterns/N/345/212/2401/346/237/245/350/257/242/350/247/204/350/214/203.md +5 -21
- package/templates/patterns/React/345/210/227/350/241/250/350/241/250/346/240/274/350/247/204/350/214/203.md +6 -21
- package/templates/patterns/React/346/216/245/345/217/243/351/233/206/346/210/220/350/247/204/350/214/203.md +5 -21
- package/templates/patterns/React/347/212/266/346/200/201/347/256/241/347/220/206/350/247/204/350/214/203.md +5 -21
- package/templates/patterns/React/347/273/204/344/273/266/350/247/204/350/214/203.md +5 -20
- package/templates/patterns/React/350/241/250/345/215/225/350/247/204/350/214/203.md +5 -20
- package/templates/patterns/React/350/267/257/347/224/261/350/247/204/350/214/203.md +5 -21
- package/templates/patterns/SOLID/350/256/276/350/256/241/350/247/204/350/214/203.md +4 -13
- package/templates/patterns/Schema/345/205/274/345/256/271/350/247/204/350/214/203.md +5 -20
- package/templates/patterns/Vue/347/212/266/346/200/201/347/256/241/347/220/206/350/247/204/350/214/203.md +5 -19
- package/templates/patterns/Vue/347/273/204/344/273/266/350/247/204/350/214/203.md +5 -23
- package/templates/patterns/Vue/350/267/257/347/224/261/350/247/204/350/214/203.md +5 -18
- package/templates/patterns//344/272/213/344/273/266/351/251/261/345/212/250/350/247/204/350/214/203.md +5 -22
- package/templates/patterns//344/272/213/345/212/241/346/250/241/345/274/217/350/247/204/350/214/203.md +5 -21
- package/templates/patterns//344/274/230/351/233/205/345/201/234/346/234/272/350/247/204/350/214/203.md +5 -21
- package/templates/patterns//345/205/250/346/240/210/346/265/201/347/250/213/344/277/256/345/244/215.md +5 -19
- package/templates/patterns//345/210/206/351/241/265/346/237/245/350/257/242/350/247/204/350/214/203.md +5 -24
- package/templates/patterns//345/211/215/347/253/257/346/200/247/350/203/275/350/247/204/350/214/203.md +5 -22
- package/templates/patterns//345/220/216/347/253/257/345/256/236/347/216/260/345/267/245/347/250/213/350/247/204/350/214/203.md +4 -13
- package/templates/patterns//345/221/275/345/220/215/350/247/204/350/214/203.md +5 -19
- package/templates/patterns//345/233/275/351/231/205/345/214/226/350/247/204/350/214/203.md +6 -22
- package/templates/patterns//345/242/236/345/210/240/346/224/271/346/237/245/350/247/204/350/214/203.md +5 -21
- package/templates/patterns//345/244/226/351/203/250/344/276/235/350/265/226/350/247/204/350/214/203.md +5 -21
- package/templates/patterns//345/245/221/347/272/246/345/205/274/345/256/271/350/247/204/350/214/203.md +5 -18
- package/templates/patterns//345/256/232/346/227/266/344/273/273/345/212/241/350/247/204/350/214/203.md +5 -22
- package/templates/patterns//345/256/236/346/227/266/346/216/250/351/200/201/350/247/204/350/214/203.md +5 -20
- package/templates/patterns//345/267/245/347/250/213/347/272/252/345/276/213.md +5 -19
- package/templates/patterns//345/271/266/345/217/221/346/216/247/345/210/266/350/247/204/350/214/203.md +5 -24
- package/templates/patterns//345/274/202/346/255/245/345/257/274/345/207/272/350/247/204/350/214/203.md +5 -21
- package/templates/patterns//346/216/245/345/217/243/345/245/221/347/272/246/350/247/204/350/214/203.md +5 -19
- package/templates/patterns//346/220/234/347/264/242/346/250/241/345/274/217/350/247/204/350/214/203.md +5 -22
- package/templates/patterns//346/225/260/346/215/256/351/232/220/347/247/201/350/247/204/350/214/203.md +6 -24
- package/templates/patterns//346/226/207/344/273/266/344/270/212/344/274/240/350/247/204/350/214/203.md +5 -20
- package/templates/patterns//346/227/240/351/232/234/347/242/215/350/247/204/350/214/203.md +5 -20
- package/templates/patterns//346/227/245/345/277/227/350/247/204/350/214/203.md +5 -21
- package/templates/patterns//346/235/203/351/231/220/350/256/244/350/257/201/350/247/204/350/214/203.md +5 -24
- package/templates/patterns//346/236/266/346/236/204/347/272/242/347/272/277.md +5 -18
- package/templates/patterns//346/265/213/350/257/225/350/264/250/351/207/217/350/247/204/350/214/203.md +5 -19
- package/templates/patterns//347/206/224/346/226/255/351/231/215/347/272/247/350/247/204/350/214/203.md +5 -22
- package/templates/patterns//347/212/266/346/200/201/346/265/201/350/275/254/350/247/204/350/214/203.md +5 -19
- package/templates/patterns//347/272/246/346/235/237/345/256/236/347/216/260/350/247/204/350/214/203.md +5 -21
- package/templates/patterns//347/274/223/345/255/230/347/255/226/347/225/245/350/247/204/350/214/203.md +5 -21
- package/templates/patterns//347/274/226/347/240/201/350/264/250/351/207/217/350/247/204/350/214/203.md +5 -19
- package/templates/patterns//347/274/272/351/231/267/347/256/241/347/220/206/350/247/204/350/214/203.md +6 -19
- package/templates/patterns//350/260/203/350/257/225/346/226/271/346/263/225/350/256/272.md +5 -19
- package/templates/patterns//350/276/223/345/205/245/346/240/241/351/252/214/350/247/204/350/214/203.md +5 -21
- package/templates/patterns//351/224/231/350/257/257/345/244/204/347/220/206/350/247/204/350/214/203.md +5 -21
- package/templates/patterns//351/224/231/350/257/257/350/276/271/347/225/214/350/247/204/350/214/203.md +5 -23
- package/templates/patterns//351/242/206/345/237/237/351/251/261/345/212/250/350/256/276/350/256/241/350/247/204/350/214/203.md +5 -20
- package/templates/procedures/OOD/350/256/276/350/256/241/345/267/245/344/275/234/346/265/201.md +71 -0
- package/templates/procedures/Schema/345/217/230/346/233/264/346/265/201/346/260/264/347/272/277.md +46 -0
- package/templates/procedures//344/270/215/347/241/256/345/256/232/346/227/266/345/244/264/350/204/221/351/243/216/346/232/264/346/265/201/347/250/213.md +92 -0
- package/templates/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 +52 -0
- package/templates/procedures//344/273/243/347/240/201/351/227/250/347/246/201/346/265/201/347/250/213.md +51 -0
- package/templates/procedures//344/273/273/345/212/241/346/213/206/350/247/243/346/265/201/347/250/213.md +56 -0
- package/templates/procedures//344/273/273/345/212/241/350/247/204/345/210/222/345/267/245/344/275/234/346/265/201.md +83 -0
- package/templates/procedures//344/274/232/350/257/235/346/201/242/345/244/215/346/265/201/347/250/213.md +74 -0
- package/templates/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 +114 -0
- package/templates/procedures//345/212/237/350/203/275/345/274/200/345/217/221/346/265/201/347/250/213.md +59 -0
- package/templates/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 +40 -0
- package/templates/procedures//345/221/275/344/273/244/346/211/247/350/241/214/346/265/201/347/250/213.md +45 -0
- package/templates/procedures//345/221/275/344/273/244/350/267/257/347/224/261/346/265/201/347/250/213.md +32 -0
- package/templates/procedures//345/256/211/345/205/250/345/212/240/345/233/272/346/265/201/346/260/264/347/272/277.md +62 -0
- package/templates/procedures//345/267/245/345/205/267/350/260/203/347/224/250/346/265/201/347/250/213.md +41 -0
- package/templates/procedures//346/200/247/350/203/275/346/265/201/346/260/264/347/272/277.md +46 -0
- package/templates/procedures//346/204/217/345/233/276/350/267/257/347/224/261/346/265/201/347/250/213.md +42 -0
- package/templates/procedures//346/216/245/345/217/243/351/233/206/346/210/220/346/265/201/346/260/264/347/272/277.md +71 -0
- package/templates/procedures//346/225/260/346/215/256/345/272/223/350/277/201/347/247/273/346/265/201/347/250/213.md +56 -0
- package/templates/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 +90 -0
- package/templates/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 +50 -0
- package/templates/procedures//346/236/266/346/236/204/350/256/276/350/256/241/345/267/245/344/275/234/346/265/201.md +115 -0
- package/templates/procedures//346/246/202/345/277/265/351/252/214/350/257/201/346/265/201/346/260/264/347/272/277.md +45 -0
- package/templates/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 +96 -0
- package/templates/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 +56 -0
- package/templates/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 +116 -0
- package/templates/procedures//347/237/245/350/257/206/347/273/264/346/212/244/346/265/201/346/260/264/347/272/277.md +58 -0
- package/templates/procedures//347/264/247/346/200/245/344/277/256/345/244/215/346/265/201/346/260/264/347/272/277.md +64 -0
- package/templates/procedures//347/274/226/347/240/201/345/211/215/346/276/204/346/270/205/346/265/201/347/250/213.md +83 -0
- package/templates/procedures//347/274/226/347/240/201/351/230/266/346/256/265/346/211/247/350/241/214/345/267/245/344/275/234/346/265/201.md +101 -0
- package/templates/procedures//350/207/252/344/270/273/351/200/211/345/236/213/346/265/201/347/250/213.md +53 -0
- package/templates/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 +62 -0
- package/templates/procedures//350/256/276/350/256/241/345/256/241/350/256/241/346/265/201/347/250/213.md +180 -0
- package/templates/procedures//350/257/246/347/273/206/350/256/276/350/256/241/346/265/201/347/250/213.md +135 -0
- package/templates/procedures//350/260/203/350/257/225/346/216/222/346/237/245/346/265/201/347/250/213.md +90 -0
- package/templates/procedures//350/277/201/347/247/273/346/265/201/346/260/264/347/272/277.md +46 -0
- package/templates/procedures//351/203/250/347/275/262/345/217/221/345/270/203/346/265/201/347/250/213.md +95 -0
- package/templates/procedures//351/207/215/346/236/204/346/265/201/346/260/264/347/272/277.md +46 -0
- package/templates/procedures//351/233/206/346/210/220/351/252/214/350/257/201/346/265/201/347/250/213.md +60 -0
- package/templates/procedures//351/234/200/346/261/202/346/276/204/346/270/205/346/265/201/347/250/213.md +63 -0
- package/templates/procedures//351/252/214/346/224/266/346/265/213/350/257/225/350/247/204/345/210/222.md +63 -0
- 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 +77 -0
- package/templates/rules/existing-system//350/200/201/347/263/273/347/273/237/345/210/207/347/211/207/350/247/204/345/210/222/350/247/204/345/210/231.md +35 -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 +73 -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 +65 -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 +81 -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 +121 -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 +58 -0
- package/templates/rules/shared/SOLID/344/273/243/347/240/201/345/256/241/346/237/245/350/247/204/345/210/231.md +67 -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 +96 -0
- package/templates/rules/shared//344/270/212/346/270/270/344/272/244/345/217/211/351/252/214/350/257/201/350/247/204/345/210/231.md +56 -0
- package/templates/rules/shared//344/270/212/346/270/270/350/256/276/350/256/241/344/272/244/345/217/211/351/252/214/350/257/201/345/256/241/346/237/245/350/247/204/345/210/231.md +67 -0
- package/templates/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 +106 -0
- package/templates/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 +66 -0
- package/templates/rules/shared//345/206/263/347/255/226/345/256/214/346/225/264/346/200/247/345/256/241/346/237/245/350/247/204/345/210/231.md +63 -0
- package/templates/rules/shared//345/210/207/347/211/207/346/211/247/350/241/214/347/272/252/345/276/213/350/247/204/345/210/231.md +96 -0
- package/templates/rules/shared//345/210/207/347/211/207/350/247/204/345/210/222/350/247/204/345/210/231.md +64 -0
- package/templates/rules/shared//345/216/237/345/236/213/346/272/220/347/240/201/346/217/220/345/217/226/350/247/204/345/210/231.md +67 -0
- package/templates/rules/shared//345/216/237/345/236/213/350/257/264/346/230/216/345/256/241/346/237/245/350/247/204/345/210/231.md +73 -0
- package/templates/rules/shared//345/217/221/345/270/203/345/220/216/345/256/241/346/237/245/350/247/204/345/210/231.md +65 -0
- package/templates/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 +63 -0
- package/templates/rules/shared//345/256/211/345/205/250/345/256/241/346/237/245/350/247/204/345/210/231.md +132 -0
- package/templates/rules/shared//345/271/266/345/217/221/345/256/241/346/237/245/350/247/204/345/210/231.md +112 -0
- package/templates/rules/shared//346/200/247/350/203/275/345/256/241/346/237/245/350/247/204/345/210/231.md +100 -0
- package/templates/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 +112 -0
- package/templates/rules/shared//346/236/266/346/236/204/345/256/241/346/237/245/350/247/204/345/210/231.md +99 -0
- package/templates/rules/shared//346/236/266/346/236/204/350/256/276/350/256/241/345/256/241/346/237/245/350/247/204/345/210/231.md +102 -0
- package/templates/rules/shared//346/236/266/346/236/204/350/256/276/350/256/241/350/247/204/345/210/231.md +64 -0
- package/templates/rules/shared//347/213/254/347/253/213/345/256/241/346/237/245/350/247/204/345/210/231.md +33 -0
- package/templates/rules/shared//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 +171 -0
- package/templates/rules/shared//347/274/226/347/240/201/345/260/261/347/273/252/345/256/241/346/237/245/350/247/204/345/210/231.md +52 -0
- package/templates/rules/shared//350/201/224/350/260/203/351/252/214/350/257/201/346/270/205/345/215/225.md +76 -0
- package/templates/rules/shared//350/246/206/347/233/226/347/216/207/346/240/207/345/207/206.md +27 -0
- package/templates/rules/shared//350/257/246/347/273/206/350/256/276/350/256/241/345/256/241/346/237/245/350/247/204/345/210/231.md +82 -0
- package/templates/rules/shared//350/264/250/351/207/217/345/256/241/346/237/245/350/247/204/345/210/231.md +102 -0
- package/templates/rules/shared//350/277/275/350/270/252/347/237/251/351/230/265ID/350/247/204/345/210/231.md +48 -0
- package/templates/rules/shared//350/277/275/350/270/252/347/237/251/351/230/265/345/256/241/346/237/245/350/247/204/345/210/231.md +51 -0
- package/templates/rules/shared//351/234/200/346/261/202/350/264/250/351/207/217/345/256/241/346/237/245/350/247/204/345/210/231.md +80 -0
- package/templates/rules/shared//351/252/214/346/224/266/346/240/207/345/207/206/345/256/241/346/237/245/350/247/204/345/210/231.md +56 -0
- package/templates/scaffolds/react/ErrorBoundary.tsx.hbs +49 -0
- package/templates/scaffolds/react/Layout.tsx.hbs +20 -0
- package/templates/scaffolds/spring-boot/ControllerTest.java.hbs +36 -0
- package/templates/scaffolds/spring-boot/Mapper.xml.hbs +29 -0
- package/templates//346/250/241/347/211/210/350/264/241/347/214/256/346/214/207/345/215/227.md +147 -0
- package/dist/adapters/claude_code/pre_prompt_contract.d.ts +0 -64
- package/dist/adapters/claude_code/pre_prompt_contract.d.ts.map +0 -1
- package/dist/adapters/claude_code/pre_prompt_contract.js +0 -116
- package/dist/adapters/claude_code/pre_prompt_contract.js.map +0 -1
- package/dist/adapters/claude_code/server.d.ts +0 -26
- package/dist/adapters/claude_code/server.d.ts.map +0 -1
- package/dist/adapters/claude_code/server.js +0 -59
- package/dist/adapters/claude_code/server.js.map +0 -1
- package/dist/engine/architecture_decision_workshop.d.ts +0 -58
- package/dist/engine/architecture_decision_workshop.d.ts.map +0 -1
- package/dist/engine/architecture_decision_workshop.js +0 -118
- package/dist/engine/architecture_decision_workshop.js.map +0 -1
- package/dist/engine/architecture_design_contract.d.ts.map +0 -1
- package/dist/engine/architecture_design_contract.js.map +0 -1
- package/dist/engine/artifact_contract_registry.d.ts +0 -138
- package/dist/engine/artifact_contract_registry.d.ts.map +0 -1
- package/dist/engine/artifact_contract_registry.js +0 -420
- package/dist/engine/artifact_contract_registry.js.map +0 -1
- package/dist/engine/asset_manifest.d.ts +0 -67
- package/dist/engine/asset_manifest.d.ts.map +0 -1
- package/dist/engine/asset_manifest.js +0 -301
- package/dist/engine/asset_manifest.js.map +0 -1
- package/dist/engine/audit_pool.d.ts.map +0 -1
- package/dist/engine/audit_pool.js +0 -120
- package/dist/engine/audit_pool.js.map +0 -1
- package/dist/engine/audit_sampler.d.ts +0 -20
- package/dist/engine/audit_sampler.d.ts.map +0 -1
- package/dist/engine/audit_sampler.js +0 -29
- package/dist/engine/audit_sampler.js.map +0 -1
- package/dist/engine/audit_verifier.d.ts +0 -52
- package/dist/engine/audit_verifier.d.ts.map +0 -1
- package/dist/engine/audit_verifier.js +0 -101
- package/dist/engine/audit_verifier.js.map +0 -1
- package/dist/engine/backend_implementation_contract.d.ts.map +0 -1
- package/dist/engine/backend_implementation_contract.js +0 -164
- package/dist/engine/backend_implementation_contract.js.map +0 -1
- package/dist/engine/brainstorm_contract.d.ts +0 -48
- package/dist/engine/brainstorm_contract.d.ts.map +0 -1
- package/dist/engine/brainstorm_contract.js +0 -146
- package/dist/engine/brainstorm_contract.js.map +0 -1
- package/dist/engine/capability_action_advisor.d.ts.map +0 -1
- package/dist/engine/capability_action_advisor.js +0 -158
- package/dist/engine/capability_action_advisor.js.map +0 -1
- package/dist/engine/capability_registry.d.ts.map +0 -1
- package/dist/engine/capability_registry.js +0 -731
- package/dist/engine/capability_registry.js.map +0 -1
- package/dist/engine/capability_state_store.d.ts +0 -113
- package/dist/engine/capability_state_store.d.ts.map +0 -1
- package/dist/engine/capability_state_store.js +0 -172
- package/dist/engine/capability_state_store.js.map +0 -1
- package/dist/engine/chinese_semantic_priority.d.ts.map +0 -1
- package/dist/engine/chinese_semantic_priority.js.map +0 -1
- package/dist/engine/classifier.d.ts +0 -24
- package/dist/engine/classifier.d.ts.map +0 -1
- package/dist/engine/classifier.js +0 -209
- package/dist/engine/classifier.js.map +0 -1
- package/dist/engine/code_maintainability_observability_contract.d.ts.map +0 -1
- package/dist/engine/code_maintainability_observability_contract.js +0 -711
- package/dist/engine/code_maintainability_observability_contract.js.map +0 -1
- package/dist/engine/code_reviewer.d.ts +0 -71
- package/dist/engine/code_reviewer.d.ts.map +0 -1
- package/dist/engine/code_reviewer.js +0 -643
- package/dist/engine/code_reviewer.js.map +0 -1
- package/dist/engine/coding_readiness_gate.d.ts +0 -46
- package/dist/engine/coding_readiness_gate.d.ts.map +0 -1
- package/dist/engine/coding_readiness_gate.js +0 -175
- package/dist/engine/coding_readiness_gate.js.map +0 -1
- package/dist/engine/command_execution_contract.d.ts +0 -226
- package/dist/engine/command_execution_contract.d.ts.map +0 -1
- package/dist/engine/command_execution_contract.js +0 -572
- package/dist/engine/command_execution_contract.js.map +0 -1
- package/dist/engine/confidence_scorer.d.ts +0 -32
- package/dist/engine/confidence_scorer.d.ts.map +0 -1
- package/dist/engine/confidence_scorer.js +0 -45
- package/dist/engine/confidence_scorer.js.map +0 -1
- package/dist/engine/config_auto_repair.d.ts +0 -29
- package/dist/engine/config_auto_repair.d.ts.map +0 -1
- package/dist/engine/config_auto_repair.js +0 -254
- package/dist/engine/config_auto_repair.js.map +0 -1
- package/dist/engine/config_precedence_contract.d.ts +0 -269
- package/dist/engine/config_precedence_contract.d.ts.map +0 -1
- package/dist/engine/config_precedence_contract.js +0 -949
- package/dist/engine/config_precedence_contract.js.map +0 -1
- package/dist/engine/config_write_boundary.d.ts.map +0 -1
- package/dist/engine/config_write_boundary.js +0 -69
- package/dist/engine/config_write_boundary.js.map +0 -1
- package/dist/engine/conflict_gate.d.ts.map +0 -1
- package/dist/engine/conflict_gate.js +0 -92
- package/dist/engine/conflict_gate.js.map +0 -1
- package/dist/engine/consumable_asset_registry.d.ts +0 -50
- package/dist/engine/consumable_asset_registry.d.ts.map +0 -1
- package/dist/engine/consumable_asset_registry.js +0 -1336
- package/dist/engine/consumable_asset_registry.js.map +0 -1
- package/dist/engine/consumption_trace_store.d.ts +0 -58
- package/dist/engine/consumption_trace_store.d.ts.map +0 -1
- package/dist/engine/consumption_trace_store.js +0 -91
- package/dist/engine/consumption_trace_store.js.map +0 -1
- package/dist/engine/contract_guard.d.ts +0 -37
- package/dist/engine/contract_guard.d.ts.map +0 -1
- package/dist/engine/contract_guard.js +0 -589
- package/dist/engine/contract_guard.js.map +0 -1
- package/dist/engine/contract_registry.d.ts +0 -113
- package/dist/engine/contract_registry.d.ts.map +0 -1
- package/dist/engine/contract_registry.js +0 -1632
- package/dist/engine/contract_registry.js.map +0 -1
- package/dist/engine/contract_state_store.d.ts +0 -67
- package/dist/engine/contract_state_store.d.ts.map +0 -1
- package/dist/engine/contract_state_store.js +0 -167
- package/dist/engine/contract_state_store.js.map +0 -1
- package/dist/engine/control_plane_contract.d.ts.map +0 -1
- package/dist/engine/control_plane_contract.js +0 -247
- package/dist/engine/control_plane_contract.js.map +0 -1
- package/dist/engine/core_engineering_principles.d.ts +0 -155
- package/dist/engine/core_engineering_principles.d.ts.map +0 -1
- package/dist/engine/core_engineering_principles.js +0 -417
- package/dist/engine/core_engineering_principles.js.map +0 -1
- package/dist/engine/core_experience_principle.d.ts +0 -194
- package/dist/engine/core_experience_principle.d.ts.map +0 -1
- package/dist/engine/core_experience_principle.js +0 -349
- package/dist/engine/core_experience_principle.js.map +0 -1
- package/dist/engine/debt_reporter.d.ts +0 -9
- package/dist/engine/debt_reporter.d.ts.map +0 -1
- package/dist/engine/debt_reporter.js +0 -94
- package/dist/engine/debt_reporter.js.map +0 -1
- package/dist/engine/debt_tracker.d.ts +0 -72
- package/dist/engine/debt_tracker.d.ts.map +0 -1
- package/dist/engine/debt_tracker.js +0 -224
- package/dist/engine/debt_tracker.js.map +0 -1
- package/dist/engine/debug_log.d.ts +0 -5
- package/dist/engine/debug_log.d.ts.map +0 -1
- package/dist/engine/debug_log.js +0 -5
- package/dist/engine/debug_log.js.map +0 -1
- package/dist/engine/debugger.d.ts +0 -12
- package/dist/engine/debugger.d.ts.map +0 -1
- package/dist/engine/debugger.js +0 -415
- package/dist/engine/debugger.js.map +0 -1
- package/dist/engine/decision_contract.d.ts +0 -38
- package/dist/engine/decision_contract.d.ts.map +0 -1
- package/dist/engine/decision_contract.js +0 -57
- package/dist/engine/decision_contract.js.map +0 -1
- package/dist/engine/decision_workshop.d.ts +0 -168
- package/dist/engine/decision_workshop.d.ts.map +0 -1
- package/dist/engine/decision_workshop.js.map +0 -1
- package/dist/engine/degradation.d.ts.map +0 -1
- package/dist/engine/degradation.js.map +0 -1
- package/dist/engine/delivery.d.ts +0 -49
- package/dist/engine/delivery.d.ts.map +0 -1
- package/dist/engine/delivery.js +0 -373
- package/dist/engine/delivery.js.map +0 -1
- package/dist/engine/delivery_readiness.d.ts +0 -70
- package/dist/engine/delivery_readiness.d.ts.map +0 -1
- package/dist/engine/delivery_readiness.js +0 -198
- package/dist/engine/delivery_readiness.js.map +0 -1
- 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/design_artifact_pack.d.ts +0 -50
- package/dist/engine/design_artifact_pack.d.ts.map +0 -1
- package/dist/engine/design_artifact_pack.js.map +0 -1
- package/dist/engine/design_lifecycle_contract.d.ts +0 -60
- package/dist/engine/design_lifecycle_contract.d.ts.map +0 -1
- package/dist/engine/design_lifecycle_contract.js +0 -499
- package/dist/engine/design_lifecycle_contract.js.map +0 -1
- package/dist/engine/detail_discipline.d.ts.map +0 -1
- package/dist/engine/detail_discipline.js.map +0 -1
- package/dist/engine/developer_sovereignty.d.ts +0 -62
- package/dist/engine/developer_sovereignty.d.ts.map +0 -1
- package/dist/engine/developer_sovereignty.js +0 -141
- package/dist/engine/developer_sovereignty.js.map +0 -1
- package/dist/engine/diagnostic_registry.d.ts.map +0 -1
- package/dist/engine/diagnostic_registry.js +0 -268
- package/dist/engine/diagnostic_registry.js.map +0 -1
- package/dist/engine/diff_ownership.d.ts.map +0 -1
- package/dist/engine/diff_ownership.js +0 -152
- package/dist/engine/diff_ownership.js.map +0 -1
- package/dist/engine/diff_ownership_store.d.ts.map +0 -1
- package/dist/engine/diff_ownership_store.js +0 -291
- package/dist/engine/diff_ownership_store.js.map +0 -1
- package/dist/engine/documentation_governance.d.ts.map +0 -1
- package/dist/engine/documentation_governance.js.map +0 -1
- package/dist/engine/dual_layer_mechanism_registry.d.ts +0 -68
- package/dist/engine/dual_layer_mechanism_registry.d.ts.map +0 -1
- package/dist/engine/dual_layer_mechanism_registry.js +0 -2408
- package/dist/engine/dual_layer_mechanism_registry.js.map +0 -1
- package/dist/engine/enforcement_guard.d.ts +0 -84
- package/dist/engine/enforcement_guard.d.ts.map +0 -1
- package/dist/engine/enforcement_guard.js +0 -320
- package/dist/engine/enforcement_guard.js.map +0 -1
- package/dist/engine/escape_report.d.ts.map +0 -1
- package/dist/engine/escape_report.js +0 -136
- package/dist/engine/escape_report.js.map +0 -1
- package/dist/engine/evidence_grounding_contract.d.ts +0 -137
- package/dist/engine/evidence_grounding_contract.d.ts.map +0 -1
- package/dist/engine/evidence_grounding_contract.js +0 -410
- package/dist/engine/evidence_grounding_contract.js.map +0 -1
- package/dist/engine/evolution_regression_gate.d.ts +0 -42
- package/dist/engine/evolution_regression_gate.d.ts.map +0 -1
- package/dist/engine/evolution_regression_gate.js +0 -159
- package/dist/engine/evolution_regression_gate.js.map +0 -1
- package/dist/engine/evolver.d.ts +0 -78
- package/dist/engine/evolver.d.ts.map +0 -1
- package/dist/engine/evolver.js +0 -377
- package/dist/engine/evolver.js.map +0 -1
- package/dist/engine/existing_system_analysis.d.ts.map +0 -1
- package/dist/engine/existing_system_analysis.js.map +0 -1
- package/dist/engine/expand_pipeline.d.ts +0 -121
- package/dist/engine/expand_pipeline.d.ts.map +0 -1
- package/dist/engine/expand_pipeline.js +0 -141
- package/dist/engine/expand_pipeline.js.map +0 -1
- package/dist/engine/explicit_asset_registry.d.ts +0 -30
- package/dist/engine/explicit_asset_registry.d.ts.map +0 -1
- package/dist/engine/explicit_asset_registry.js +0 -3862
- package/dist/engine/explicit_asset_registry.js.map +0 -1
- package/dist/engine/extension_contract.d.ts +0 -50
- package/dist/engine/extension_contract.d.ts.map +0 -1
- package/dist/engine/extension_contract.js +0 -158
- package/dist/engine/extension_contract.js.map +0 -1
- package/dist/engine/extension_platform_contracts.d.ts +0 -718
- package/dist/engine/extension_platform_contracts.d.ts.map +0 -1
- package/dist/engine/extension_platform_contracts.js +0 -42
- package/dist/engine/extension_platform_contracts.js.map +0 -1
- package/dist/engine/extension_scenario_registry.d.ts +0 -30
- package/dist/engine/extension_scenario_registry.d.ts.map +0 -1
- package/dist/engine/extension_scenario_registry.js +0 -976
- package/dist/engine/extension_scenario_registry.js.map +0 -1
- package/dist/engine/failure_classifier.d.ts +0 -39
- package/dist/engine/failure_classifier.d.ts.map +0 -1
- package/dist/engine/failure_classifier.js +0 -175
- package/dist/engine/failure_classifier.js.map +0 -1
- package/dist/engine/failure_report.d.ts.map +0 -1
- package/dist/engine/failure_report.js.map +0 -1
- package/dist/engine/first_principles.d.ts +0 -37
- package/dist/engine/first_principles.d.ts.map +0 -1
- package/dist/engine/first_principles.js +0 -141
- package/dist/engine/first_principles.js.map +0 -1
- package/dist/engine/foundation_scenario_registry.d.ts +0 -76
- package/dist/engine/foundation_scenario_registry.d.ts.map +0 -1
- package/dist/engine/foundation_scenario_registry.js +0 -457
- package/dist/engine/foundation_scenario_registry.js.map +0 -1
- package/dist/engine/foundation_scenario_runners.d.ts +0 -54
- package/dist/engine/foundation_scenario_runners.d.ts.map +0 -1
- package/dist/engine/foundation_scenario_runners.js +0 -602
- package/dist/engine/foundation_scenario_runners.js.map +0 -1
- package/dist/engine/git_deps.d.ts +0 -69
- package/dist/engine/git_deps.d.ts.map +0 -1
- package/dist/engine/git_deps.js +0 -9
- package/dist/engine/git_deps.js.map +0 -1
- package/dist/engine/governance_report.d.ts +0 -100
- package/dist/engine/governance_report.d.ts.map +0 -1
- package/dist/engine/governance_report.js +0 -184
- package/dist/engine/governance_report.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/input_material_contract_registry.d.ts +0 -185
- package/dist/engine/input_material_contract_registry.d.ts.map +0 -1
- package/dist/engine/input_material_contract_registry.js +0 -564
- package/dist/engine/input_material_contract_registry.js.map +0 -1
- package/dist/engine/input_material_extractor.d.ts +0 -47
- package/dist/engine/input_material_extractor.d.ts.map +0 -1
- package/dist/engine/input_material_extractor.js +0 -155
- package/dist/engine/input_material_extractor.js.map +0 -1
- package/dist/engine/instruction_contract.d.ts +0 -75
- package/dist/engine/instruction_contract.d.ts.map +0 -1
- package/dist/engine/instruction_contract.js +0 -185
- package/dist/engine/instruction_contract.js.map +0 -1
- package/dist/engine/intent_expander.d.ts +0 -59
- package/dist/engine/intent_expander.d.ts.map +0 -1
- package/dist/engine/intent_expander.js +0 -2150
- package/dist/engine/intent_expander.js.map +0 -1
- package/dist/engine/intent_route_scorer.d.ts +0 -45
- package/dist/engine/intent_route_scorer.d.ts.map +0 -1
- package/dist/engine/intent_route_scorer.js +0 -341
- package/dist/engine/intent_route_scorer.js.map +0 -1
- package/dist/engine/intent_router.d.ts +0 -128
- package/dist/engine/intent_router.d.ts.map +0 -1
- package/dist/engine/intent_router.js +0 -628
- package/dist/engine/intent_router.js.map +0 -1
- package/dist/engine/intent_signal_extractor.d.ts +0 -73
- package/dist/engine/intent_signal_extractor.d.ts.map +0 -1
- package/dist/engine/intent_signal_extractor.js +0 -296
- package/dist/engine/intent_signal_extractor.js.map +0 -1
- package/dist/engine/io_controller.d.ts +0 -87
- package/dist/engine/io_controller.d.ts.map +0 -1
- package/dist/engine/io_controller.js +0 -203
- package/dist/engine/io_controller.js.map +0 -1
- package/dist/engine/java_quality_guard.d.ts.map +0 -1
- package/dist/engine/java_quality_guard.js +0 -228
- package/dist/engine/java_quality_guard.js.map +0 -1
- package/dist/engine/job_manager.d.ts +0 -111
- package/dist/engine/job_manager.d.ts.map +0 -1
- package/dist/engine/job_manager.js +0 -270
- package/dist/engine/job_manager.js.map +0 -1
- package/dist/engine/knowledge_acceptance_registry.d.ts.map +0 -1
- package/dist/engine/knowledge_acceptance_registry.js +0 -271
- package/dist/engine/knowledge_acceptance_registry.js.map +0 -1
- package/dist/engine/knowledge_asset_audit.d.ts.map +0 -1
- package/dist/engine/knowledge_asset_audit.js +0 -230
- package/dist/engine/knowledge_asset_audit.js.map +0 -1
- package/dist/engine/knowledge_asset_consumer.d.ts +0 -150
- package/dist/engine/knowledge_asset_consumer.d.ts.map +0 -1
- package/dist/engine/knowledge_asset_consumer.js +0 -287
- package/dist/engine/knowledge_asset_consumer.js.map +0 -1
- package/dist/engine/knowledge_asset_generation_gate.d.ts.map +0 -1
- package/dist/engine/knowledge_asset_generation_gate.js.map +0 -1
- package/dist/engine/knowledge_asset_migration.d.ts.map +0 -1
- package/dist/engine/knowledge_asset_migration.js +0 -204
- package/dist/engine/knowledge_asset_migration.js.map +0 -1
- package/dist/engine/knowledge_asset_schema.d.ts +0 -97
- package/dist/engine/knowledge_asset_schema.d.ts.map +0 -1
- package/dist/engine/knowledge_asset_schema.js +0 -413
- package/dist/engine/knowledge_asset_schema.js.map +0 -1
- package/dist/engine/knowledge_config_loader.d.ts.map +0 -1
- package/dist/engine/knowledge_config_loader.js +0 -113
- package/dist/engine/knowledge_config_loader.js.map +0 -1
- package/dist/engine/knowledge_consumption_snapshot.d.ts +0 -91
- package/dist/engine/knowledge_consumption_snapshot.d.ts.map +0 -1
- package/dist/engine/knowledge_consumption_snapshot.js +0 -113
- package/dist/engine/knowledge_consumption_snapshot.js.map +0 -1
- package/dist/engine/knowledge_evolution.d.ts +0 -82
- package/dist/engine/knowledge_evolution.d.ts.map +0 -1
- package/dist/engine/knowledge_evolution.js +0 -272
- package/dist/engine/knowledge_evolution.js.map +0 -1
- package/dist/engine/knowledge_governance_gate.d.ts +0 -38
- package/dist/engine/knowledge_governance_gate.d.ts.map +0 -1
- package/dist/engine/knowledge_governance_gate.js +0 -123
- package/dist/engine/knowledge_governance_gate.js.map +0 -1
- package/dist/engine/knowledge_injection_boundary.d.ts +0 -59
- package/dist/engine/knowledge_injection_boundary.d.ts.map +0 -1
- package/dist/engine/knowledge_injection_boundary.js +0 -617
- package/dist/engine/knowledge_injection_boundary.js.map +0 -1
- package/dist/engine/knowledge_lifecycle.d.ts +0 -83
- package/dist/engine/knowledge_lifecycle.d.ts.map +0 -1
- package/dist/engine/knowledge_lifecycle.js +0 -247
- package/dist/engine/knowledge_lifecycle.js.map +0 -1
- package/dist/engine/knowledge_manager.d.ts +0 -149
- package/dist/engine/knowledge_manager.d.ts.map +0 -1
- package/dist/engine/knowledge_manager.js +0 -934
- package/dist/engine/knowledge_manager.js.map +0 -1
- package/dist/engine/knowledge_scenario_registry.d.ts +0 -21
- package/dist/engine/knowledge_scenario_registry.d.ts.map +0 -1
- package/dist/engine/knowledge_scenario_registry.js +0 -337
- package/dist/engine/knowledge_scenario_registry.js.map +0 -1
- package/dist/engine/knowledge_sovereignty.d.ts.map +0 -1
- package/dist/engine/knowledge_sovereignty.js +0 -196
- package/dist/engine/knowledge_sovereignty.js.map +0 -1
- package/dist/engine/knowledge_template_contracts.d.ts +0 -244
- package/dist/engine/knowledge_template_contracts.d.ts.map +0 -1
- package/dist/engine/knowledge_template_contracts.js.map +0 -1
- package/dist/engine/language_policy.d.ts +0 -78
- package/dist/engine/language_policy.d.ts.map +0 -1
- package/dist/engine/language_policy.js +0 -139
- package/dist/engine/language_policy.js.map +0 -1
- package/dist/engine/language_policy_contract.d.ts.map +0 -1
- package/dist/engine/language_policy_contract.js.map +0 -1
- package/dist/engine/lifecycle_knowledge_contract.d.ts +0 -59
- package/dist/engine/lifecycle_knowledge_contract.d.ts.map +0 -1
- package/dist/engine/lifecycle_knowledge_contract.js +0 -203
- package/dist/engine/lifecycle_knowledge_contract.js.map +0 -1
- package/dist/engine/llm_gateway.d.ts +0 -167
- package/dist/engine/llm_gateway.d.ts.map +0 -1
- package/dist/engine/llm_gateway.js +0 -292
- package/dist/engine/llm_gateway.js.map +0 -1
- package/dist/engine/local_docker_acceptance.d.ts +0 -94
- package/dist/engine/local_docker_acceptance.d.ts.map +0 -1
- package/dist/engine/local_docker_acceptance.js +0 -312
- package/dist/engine/local_docker_acceptance.js.map +0 -1
- package/dist/engine/log_governance.d.ts.map +0 -1
- package/dist/engine/log_governance.js +0 -76
- package/dist/engine/log_governance.js.map +0 -1
- package/dist/engine/logger.d.ts.map +0 -1
- package/dist/engine/logger.js +0 -115
- package/dist/engine/logger.js.map +0 -1
- package/dist/engine/main_path_integration_contract.d.ts +0 -383
- package/dist/engine/main_path_integration_contract.d.ts.map +0 -1
- package/dist/engine/main_path_integration_contract.js +0 -1582
- package/dist/engine/main_path_integration_contract.js.map +0 -1
- package/dist/engine/mechanism_contract_registry.d.ts +0 -59
- package/dist/engine/mechanism_contract_registry.d.ts.map +0 -1
- package/dist/engine/mechanism_contract_registry.js +0 -1224
- package/dist/engine/mechanism_contract_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/mechanism_health_check.d.ts +0 -23
- package/dist/engine/mechanism_health_check.d.ts.map +0 -1
- package/dist/engine/mechanism_health_check.js +0 -140
- package/dist/engine/mechanism_health_check.js.map +0 -1
- package/dist/engine/metric_governance.d.ts.map +0 -1
- package/dist/engine/metric_governance.js.map +0 -1
- package/dist/engine/mutation_audit.d.ts +0 -53
- package/dist/engine/mutation_audit.d.ts.map +0 -1
- package/dist/engine/mutation_audit.js +0 -136
- package/dist/engine/mutation_audit.js.map +0 -1
- package/dist/engine/next_action_planner.d.ts +0 -32
- package/dist/engine/next_action_planner.d.ts.map +0 -1
- package/dist/engine/next_action_planner.js +0 -827
- package/dist/engine/next_action_planner.js.map +0 -1
- package/dist/engine/observability.d.ts +0 -68
- package/dist/engine/observability.d.ts.map +0 -1
- package/dist/engine/observability.js +0 -435
- package/dist/engine/observability.js.map +0 -1
- package/dist/engine/observed_consumption.d.ts +0 -54
- package/dist/engine/observed_consumption.d.ts.map +0 -1
- package/dist/engine/observed_consumption.js +0 -378
- package/dist/engine/observed_consumption.js.map +0 -1
- package/dist/engine/ood_solid_contract.d.ts.map +0 -1
- package/dist/engine/ood_solid_contract.js +0 -115
- package/dist/engine/ood_solid_contract.js.map +0 -1
- package/dist/engine/path_scope_utils.d.ts +0 -21
- package/dist/engine/path_scope_utils.d.ts.map +0 -1
- package/dist/engine/path_scope_utils.js +0 -126
- package/dist/engine/path_scope_utils.js.map +0 -1
- package/dist/engine/plan_proposal_gate.d.ts.map +0 -1
- package/dist/engine/plan_proposal_gate.js +0 -341
- package/dist/engine/plan_proposal_gate.js.map +0 -1
- package/dist/engine/platform_context.d.ts +0 -44
- package/dist/engine/platform_context.d.ts.map +0 -1
- package/dist/engine/platform_context.js +0 -169
- package/dist/engine/platform_context.js.map +0 -1
- package/dist/engine/policy_drift_detector.d.ts +0 -72
- package/dist/engine/policy_drift_detector.d.ts.map +0 -1
- package/dist/engine/policy_drift_detector.js +0 -277
- package/dist/engine/policy_drift_detector.js.map +0 -1
- package/dist/engine/privacy_secret_contract.d.ts +0 -320
- package/dist/engine/privacy_secret_contract.d.ts.map +0 -1
- package/dist/engine/privacy_secret_contract.js +0 -875
- package/dist/engine/privacy_secret_contract.js.map +0 -1
- package/dist/engine/project_knowledge_contract.d.ts +0 -132
- package/dist/engine/project_knowledge_contract.d.ts.map +0 -1
- package/dist/engine/project_knowledge_contract.js +0 -554
- package/dist/engine/project_knowledge_contract.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/project_stage_detector.d.ts.map +0 -1
- package/dist/engine/project_stage_detector.js +0 -185
- package/dist/engine/project_stage_detector.js.map +0 -1
- package/dist/engine/regression_matrix.d.ts.map +0 -1
- package/dist/engine/regression_matrix.js +0 -410
- package/dist/engine/regression_matrix.js.map +0 -1
- package/dist/engine/release_compatibility.d.ts.map +0 -1
- package/dist/engine/release_compatibility.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/engine/release_gate_scenario_registry.d.ts.map +0 -1
- package/dist/engine/release_gate_scenario_registry.js +0 -717
- package/dist/engine/release_gate_scenario_registry.js.map +0 -1
- package/dist/engine/release_issue_scenario_registry.d.ts +0 -64
- package/dist/engine/release_issue_scenario_registry.d.ts.map +0 -1
- package/dist/engine/release_issue_scenario_registry.js +0 -1790
- package/dist/engine/release_issue_scenario_registry.js.map +0 -1
- package/dist/engine/release_readiness_gate.d.ts +0 -49
- package/dist/engine/release_readiness_gate.d.ts.map +0 -1
- package/dist/engine/release_readiness_gate.js +0 -3382
- package/dist/engine/release_readiness_gate.js.map +0 -1
- package/dist/engine/release_tool_harness.d.ts +0 -71
- package/dist/engine/release_tool_harness.d.ts.map +0 -1
- package/dist/engine/release_tool_harness.js +0 -161
- package/dist/engine/release_tool_harness.js.map +0 -1
- package/dist/engine/risk_sampler.d.ts +0 -43
- package/dist/engine/risk_sampler.d.ts.map +0 -1
- package/dist/engine/risk_sampler.js +0 -79
- package/dist/engine/risk_sampler.js.map +0 -1
- package/dist/engine/route_decision_contract_verifier.d.ts +0 -44
- package/dist/engine/route_decision_contract_verifier.d.ts.map +0 -1
- package/dist/engine/route_decision_contract_verifier.js +0 -154
- package/dist/engine/route_decision_contract_verifier.js.map +0 -1
- package/dist/engine/runtime_safety.d.ts.map +0 -1
- package/dist/engine/runtime_safety.js +0 -200
- package/dist/engine/runtime_safety.js.map +0 -1
- package/dist/engine/scaffolder.d.ts +0 -19
- package/dist/engine/scaffolder.d.ts.map +0 -1
- package/dist/engine/scaffolder.js +0 -411
- package/dist/engine/scaffolder.js.map +0 -1
- package/dist/engine/scope_controller.d.ts +0 -16
- package/dist/engine/scope_controller.d.ts.map +0 -1
- package/dist/engine/scope_controller.js +0 -195
- package/dist/engine/scope_controller.js.map +0 -1
- package/dist/engine/scope_lease.d.ts +0 -88
- package/dist/engine/scope_lease.d.ts.map +0 -1
- package/dist/engine/scope_lease.js +0 -166
- package/dist/engine/scope_lease.js.map +0 -1
- package/dist/engine/scope_resolver.d.ts +0 -11
- package/dist/engine/scope_resolver.d.ts.map +0 -1
- package/dist/engine/scope_resolver.js +0 -526
- package/dist/engine/scope_resolver.js.map +0 -1
- package/dist/engine/semantic_evidence.d.ts +0 -29
- package/dist/engine/semantic_evidence.d.ts.map +0 -1
- package/dist/engine/semantic_evidence.js +0 -91
- package/dist/engine/semantic_evidence.js.map +0 -1
- package/dist/engine/stale_current_task_detector.d.ts +0 -30
- package/dist/engine/stale_current_task_detector.d.ts.map +0 -1
- package/dist/engine/stale_current_task_detector.js +0 -168
- package/dist/engine/stale_current_task_detector.js.map +0 -1
- package/dist/engine/standard_asset_contract.d.ts +0 -75
- package/dist/engine/standard_asset_contract.d.ts.map +0 -1
- package/dist/engine/standard_asset_contract.js +0 -388
- package/dist/engine/standard_asset_contract.js.map +0 -1
- package/dist/engine/standard_asset_coverage.d.ts.map +0 -1
- package/dist/engine/standard_asset_coverage.js +0 -220
- package/dist/engine/standard_asset_coverage.js.map +0 -1
- package/dist/engine/state_update_bypass.d.ts +0 -19
- package/dist/engine/state_update_bypass.d.ts.map +0 -1
- package/dist/engine/state_update_bypass.js +0 -17
- package/dist/engine/state_update_bypass.js.map +0 -1
- package/dist/engine/task_context.d.ts +0 -249
- package/dist/engine/task_context.d.ts.map +0 -1
- package/dist/engine/task_context.js +0 -981
- package/dist/engine/task_context.js.map +0 -1
- package/dist/engine/task_planner.d.ts +0 -28
- package/dist/engine/task_planner.d.ts.map +0 -1
- package/dist/engine/task_planner.js +0 -325
- package/dist/engine/task_planner.js.map +0 -1
- package/dist/engine/task_stage_detector.d.ts +0 -19
- package/dist/engine/task_stage_detector.d.ts.map +0 -1
- package/dist/engine/task_stage_detector.js +0 -201
- package/dist/engine/task_stage_detector.js.map +0 -1
- package/dist/engine/technology_decision.d.ts +0 -40
- package/dist/engine/technology_decision.d.ts.map +0 -1
- package/dist/engine/technology_decision.js +0 -137
- package/dist/engine/technology_decision.js.map +0 -1
- package/dist/engine/template_asset_contract_registry.d.ts +0 -162
- package/dist/engine/template_asset_contract_registry.d.ts.map +0 -1
- package/dist/engine/template_asset_contract_registry.js +0 -599
- package/dist/engine/template_asset_contract_registry.js.map +0 -1
- package/dist/engine/template_asset_visibility.d.ts +0 -109
- package/dist/engine/template_asset_visibility.d.ts.map +0 -1
- package/dist/engine/template_asset_visibility.js +0 -321
- package/dist/engine/template_asset_visibility.js.map +0 -1
- package/dist/engine/template_init_sync.d.ts +0 -68
- package/dist/engine/template_init_sync.d.ts.map +0 -1
- package/dist/engine/template_init_sync.js +0 -218
- package/dist/engine/template_init_sync.js.map +0 -1
- package/dist/engine/template_manifest_io.d.ts +0 -57
- package/dist/engine/template_manifest_io.d.ts.map +0 -1
- package/dist/engine/template_manifest_io.js +0 -184
- package/dist/engine/template_manifest_io.js.map +0 -1
- package/dist/engine/template_mechanism_auditor.d.ts +0 -95
- package/dist/engine/template_mechanism_auditor.d.ts.map +0 -1
- package/dist/engine/template_mechanism_auditor.js +0 -626
- package/dist/engine/template_mechanism_auditor.js.map +0 -1
- package/dist/engine/template_sync.d.ts +0 -98
- package/dist/engine/template_sync.d.ts.map +0 -1
- package/dist/engine/template_sync.js.map +0 -1
- package/dist/engine/test_generator.d.ts +0 -10
- package/dist/engine/test_generator.d.ts.map +0 -1
- package/dist/engine/test_generator.js +0 -265
- package/dist/engine/test_generator.js.map +0 -1
- package/dist/engine/test_quality.d.ts +0 -36
- package/dist/engine/test_quality.d.ts.map +0 -1
- package/dist/engine/test_quality.js +0 -642
- package/dist/engine/test_quality.js.map +0 -1
- package/dist/engine/test_strategy.d.ts.map +0 -1
- package/dist/engine/test_strategy.js.map +0 -1
- package/dist/engine/tool_invocation_contract_registry.d.ts +0 -136
- package/dist/engine/tool_invocation_contract_registry.d.ts.map +0 -1
- package/dist/engine/tool_invocation_contract_registry.js +0 -762
- package/dist/engine/tool_invocation_contract_registry.js.map +0 -1
- package/dist/engine/traceability.d.ts +0 -48
- package/dist/engine/traceability.d.ts.map +0 -1
- package/dist/engine/traceability.js +0 -470
- package/dist/engine/traceability.js.map +0 -1
- package/dist/engine/user_feedback_contract.d.ts +0 -162
- package/dist/engine/user_feedback_contract.d.ts.map +0 -1
- package/dist/engine/user_feedback_contract.js +0 -418
- package/dist/engine/user_feedback_contract.js.map +0 -1
- package/dist/engine/user_promise.d.ts +0 -67
- package/dist/engine/user_promise.d.ts.map +0 -1
- package/dist/engine/user_promise.js +0 -436
- package/dist/engine/user_promise.js.map +0 -1
- package/dist/engine/verification_contract.d.ts.map +0 -1
- package/dist/engine/verification_contract.js.map +0 -1
- package/dist/engine/verifier.d.ts +0 -45
- package/dist/engine/verifier.d.ts.map +0 -1
- package/dist/engine/verifier.js +0 -629
- package/dist/engine/verifier.js.map +0 -1
- package/dist/engine/workflow_contract_registry.d.ts +0 -70
- package/dist/engine/workflow_contract_registry.d.ts.map +0 -1
- package/dist/engine/workflow_contract_registry.js +0 -643
- package/dist/engine/workflow_contract_registry.js.map +0 -1
- package/dist/engine/workflow_navigation_contract.d.ts +0 -157
- package/dist/engine/workflow_navigation_contract.d.ts.map +0 -1
- package/dist/engine/workflow_navigation_contract.js +0 -39
- package/dist/engine/workflow_navigation_contract.js.map +0 -1
- package/dist/engine/workflow_template_pack.d.ts +0 -71
- package/dist/engine/workflow_template_pack.d.ts.map +0 -1
- package/dist/engine/workflow_template_pack.js +0 -246
- package/dist/engine/workflow_template_pack.js.map +0 -1
- package/dist/engine/workspace_lease.d.ts +0 -69
- package/dist/engine/workspace_lease.d.ts.map +0 -1
- package/dist/engine/workspace_lease.js +0 -154
- package/dist/engine/workspace_lease.js.map +0 -1
- package/dist/engine/workspace_resumer.d.ts.map +0 -1
- package/dist/engine/workspace_resumer.js +0 -207
- package/dist/engine/workspace_resumer.js.map +0 -1
- package/dist/engine/zero_config_init.d.ts +0 -152
- package/dist/engine/zero_config_init.d.ts.map +0 -1
- package/dist/engine/zero_config_init.js +0 -810
- package/dist/engine/zero_config_init.js.map +0 -1
- package/dist/types.d.ts +0 -1737
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -3
- package/dist/types.js.map +0 -1
- package/templates/knowledge/acceptance_templates/API/346/216/245/345/217/243/350/247/204/346/240/274/346/226/207/346/241/243/346/250/241/347/211/210.md +0 -74
- package/templates/knowledge/acceptance_templates/Bug/345/210/206/346/236/220/346/250/241/347/211/210.md +0 -69
- package/templates/knowledge/acceptance_templates/OOD/350/256/276/350/256/241/346/221/230/350/246/201/346/250/241/347/211/210.md +0 -60
- package/templates/knowledge/acceptance_templates/POC/347/273/223/350/256/272/346/250/241/347/211/210.md +0 -63
- package/templates/knowledge/acceptance_templates//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 -78
- package/templates/knowledge/acceptance_templates//345/211/215/347/253/257/351/241/265/351/235/242/351/252/214/346/224/266/346/270/205/345/215/225.md +0 -54
- package/templates/knowledge/acceptance_templates//345/216/237/345/236/213/350/257/264/346/230/216/346/250/241/347/211/210.md +0 -236
- package/templates/knowledge/acceptance_templates//345/220/216/347/253/257API/351/252/214/346/224/266/346/270/205/345/215/225.md +0 -52
- package/templates/knowledge/acceptance_templates//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 -46
- package/templates/knowledge/acceptance_templates//345/256/211/345/205/250/345/256/241/350/256/241/346/250/241/347/211/210.md +0 -75
- package/templates/knowledge/acceptance_templates//346/200/247/350/203/275/345/210/206/346/236/220/346/250/241/347/211/210.md +0 -69
- package/templates/knowledge/acceptance_templates//346/212/200/346/234/257/351/200/211/345/236/213/351/252/214/346/224/266/346/270/205/345/215/225.md +0 -46
- package/templates/knowledge/acceptance_templates//346/216/245/345/217/243/345/257/271/346/216/245/346/226/271/346/241/210/346/250/241/347/211/210.md +0 -68
- 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/acceptance_templates//346/225/205/351/232/234/345/244/215/347/233/230/346/250/241/347/211/210.md +0 -78
- package/templates/knowledge/acceptance_templates//346/225/260/346/215/256/345/272/223/345/217/230/346/233/264/346/226/271/346/241/210/346/250/241/347/211/210.md +0 -68
- package/templates/knowledge/acceptance_templates//346/225/260/346/215/256/345/272/223/345/217/230/346/233/264/351/252/214/346/224/266/346/270/205/345/215/225.md +0 -52
- package/templates/knowledge/acceptance_templates//346/225/260/346/215/256/345/272/223/350/256/276/350/256/241/346/226/207/346/241/243/346/250/241/347/211/210.md +0 -59
- package/templates/knowledge/acceptance_templates//346/236/266/346/236/204/350/256/276/350/256/241/346/250/241/347/211/210.md +0 -86
- package/templates/knowledge/acceptance_templates//346/265/213/350/257/225/350/256/241/345/210/222/346/250/241/347/211/210.md +0 -63
- package/templates/knowledge/acceptance_templates//350/256/276/350/256/241/344/270/200/350/207/264/346/200/247/351/252/214/346/224/266/346/212/245/345/221/212/346/250/241/347/211/210.md +0 -47
- package/templates/knowledge/acceptance_templates//350/257/246/347/273/206/350/256/276/350/256/241/346/250/241/347/211/210.md +0 -63
- package/templates/knowledge/acceptance_templates//350/277/201/347/247/273/350/257/204/344/274/260/346/250/241/347/211/210.md +0 -66
- package/templates/knowledge/acceptance_templates//351/200/232/347/224/250/350/264/250/351/207/217/351/252/214/346/224/266/346/270/205/345/215/225.md +0 -57
- package/templates/knowledge/acceptance_templates//351/207/215/346/236/204/346/226/271/346/241/210/346/250/241/347/211/210.md +0 -71
- package/templates/knowledge/acceptance_templates//351/234/200/346/261/202/345/210/206/346/236/220/346/250/241/347/211/210.md +0 -68
- package/templates/knowledge/acceptance_templates//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 -103
- package/templates/knowledge/checklists//344/270/273/351/223/276/350/267/257/346/216/245/345/205/245/351/252/214/346/224/266/346/270/205/345/215/225.md +0 -45
- package/templates/knowledge/checklists//344/274/232/350/257/235/346/201/242/345/244/215.md +0 -59
- package/templates/knowledge/checklists//345/267/245/344/275/234/346/265/201/351/252/214/346/224/266/346/270/205/345/215/225.md +0 -47
- package/templates/knowledge/checklists//346/240/270/345/277/203/345/267/245/347/250/213/346/211/247/350/241/214/351/252/214/346/224/266/346/270/205/345/215/225.md +0 -72
- package/templates/knowledge/checklists//347/237/245/350/257/206/346/263/250/345/205/245/351/252/214/346/224/266/346/270/205/345/215/225.md +0 -47
- package/templates/knowledge/checklists//351/232/220/347/247/201/345/256/241/346/237/245/346/270/205/345/215/225.md +0 -44
- package/templates/knowledge/checklists//351/252/214/350/257/201/351/252/214/346/224/266/346/270/205/345/215/225.md +0 -45
- package/templates/knowledge/domain//345/244/232/347/247/237/346/210/267.md +0 -60
- package/templates/knowledge/domain//345/256/241/350/256/241/346/227/245/345/277/227.md +0 -57
- package/templates/knowledge/domain//345/257/274/345/205/245/345/257/274/345/207/272/350/247/204/345/210/231.md +0 -64
- package/templates/knowledge/domain//345/267/245/344/275/234/346/265/201/345/274/225/346/223/216.md +0 -66
- package/templates/knowledge/domain//346/212/245/350/241/250/347/273/237/350/256/241.md +0 -64
- package/templates/knowledge/domain//346/224/257/344/273/230/350/247/204/345/210/231.md +0 -66
- package/templates/knowledge/domain//346/225/260/346/215/256/346/235/203/351/231/220.md +0 -59
- package/templates/knowledge/domain//351/200/232/347/224/250/346/234/272/346/242/260/346/235/241/346/254/276.md +0 -61
- package/templates/knowledge/domain//351/200/232/347/237/245/350/247/204/345/210/231.md +0 -64
- package/templates/knowledge/patterns/core/Diff/345/275/222/345/261/236/350/277/275/350/270/252.md +0 -64
- package/templates/knowledge/patterns/core/Java/350/264/250/351/207/217/351/227/250/347/246/201.md +0 -64
- package/templates/knowledge/patterns/core/LLM/351/242/204/347/256/227/347/275/221/345/205/263.md +0 -63
- package/templates/knowledge/patterns/core//344/273/273/345/212/241/344/270/212/344/270/213/346/226/207/347/224/237/345/221/275/345/221/250/346/234/237.md +0 -64
- package/templates/knowledge/patterns/core//344/273/273/345/212/241/347/256/241/347/220/206/345/231/250.md +0 -65
- package/templates/knowledge/patterns/core//344/275/234/347/224/250/345/237/237/344/270/216/345/257/206/351/222/245/346/213/246/346/210/252.md +0 -63
- package/templates/knowledge/patterns/core//344/275/234/347/224/250/345/237/237/347/247/237/347/272/246.md +0 -65
- package/templates/knowledge/patterns/core//345/206/262/347/252/201/351/227/250/347/246/201.md +0 -64
- package/templates/knowledge/patterns/core//345/206/263/347/255/226/347/275/221/345/205/263.md +0 -72
- package/templates/knowledge/patterns/core//345/217/230/345/274/202/345/256/241/350/256/241.md +0 -68
- package/templates/knowledge/patterns/core//345/233/236/345/275/222/347/237/251/351/230/265.md +0 -63
- package/templates/knowledge/patterns/core//345/267/245/344/275/234/345/214/272/344/272/222/346/226/245/351/224/201.md +0 -61
- package/templates/knowledge/patterns/core//345/267/245/344/275/234/345/214/272/345/224/244/351/206/222.md +0 -63
- package/templates/knowledge/patterns/core//345/271/266/345/217/221/351/224/201.md +0 -68
- package/templates/knowledge/patterns/core//345/274/200/345/217/221/350/200/205/345/256/252/346/263/225.md +0 -78
- package/templates/knowledge/patterns/core//346/225/217/346/204/237/344/277/241/346/201/257/346/211/253/346/217/217.md +0 -62
- package/templates/knowledge/patterns/core//346/262/273/347/220/206/350/277/220/350/241/214/346/227/266/345/276/252/347/216/257.md +0 -66
- package/templates/knowledge/patterns/core//346/265/201/345/274/217/345/277/203/350/267/263.md +0 -74
- package/templates/knowledge/patterns/core//347/237/245/350/257/206/344/270/273/346/235/203.md +0 -76
- package/templates/knowledge/patterns/core//350/257/255/344/271/211/350/257/201/346/215/256.md +0 -64
- package/templates/knowledge/patterns/core//350/277/220/350/241/214/345/256/211/345/205/250/345/214/205.md +0 -68
- package/templates/knowledge/patterns/core//351/233/266/351/205/215/347/275/256/345/210/235/345/247/213/345/214/226.md +0 -64
- package/templates/knowledge/patterns/core//351/252/214/350/257/201/345/221/275/344/273/244/347/224/237/346/210/220.md +0 -63
- package/templates/knowledge/procedures/OOD/350/256/276/350/256/241/345/267/245/344/275/234/346/265/201.md +0 -50
- package/templates/knowledge/procedures/Schema/345/217/230/346/233/264/346/265/201/346/260/264/347/272/277.md +0 -54
- package/templates/knowledge/procedures//344/270/273/351/223/276/350/267/257/346/216/245/345/205/245/351/252/214/350/257/201/346/265/201/347/250/213.md +0 -56
- package/templates/knowledge/procedures//344/273/243/347/240/201/351/227/250/347/246/201/346/265/201/347/250/213.md +0 -60
- package/templates/knowledge/procedures//344/273/273/345/212/241/346/213/206/350/247/243/346/265/201/347/250/213.md +0 -58
- package/templates/knowledge/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 -126
- package/templates/knowledge/procedures//345/212/237/350/203/275/345/274/200/345/217/221/346/265/201/347/250/213.md +0 -67
- package/templates/knowledge/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 -50
- package/templates/knowledge/procedures//345/221/275/344/273/244/346/211/247/350/241/214/346/265/201/347/250/213.md +0 -53
- package/templates/knowledge/procedures//345/256/211/345/205/250/345/212/240/345/233/272/346/265/201/346/260/264/347/272/277.md +0 -70
- package/templates/knowledge/procedures//345/267/245/345/205/267/350/260/203/347/224/250/346/265/201/347/250/213.md +0 -49
- package/templates/knowledge/procedures//346/200/247/350/203/275/346/265/201/346/260/264/347/272/277.md +0 -54
- package/templates/knowledge/procedures//346/204/217/345/233/276/350/267/257/347/224/261/346/265/201/347/250/213.md +0 -49
- package/templates/knowledge/procedures//346/216/245/345/217/243/351/233/206/346/210/220/346/265/201/346/260/264/347/272/277.md +0 -73
- package/templates/knowledge/procedures//346/225/260/346/215/256/345/272/223/350/277/201/347/247/273/346/265/201/347/250/213.md +0 -64
- package/templates/knowledge/procedures//346/234/254/345/234/260/346/265/217/350/247/210/345/231/250/351/252/214/346/224/266/345/267/245/344/275/234/346/265/201.md +0 -99
- package/templates/knowledge/procedures//346/236/266/346/236/204/345/206/263/347/255/226/347/240/224/350/256/250/345/267/245/344/275/234/346/265/201.md +0 -51
- package/templates/knowledge/procedures//346/236/266/346/236/204/350/256/276/350/256/241/345/267/245/344/275/234/346/265/201.md +0 -104
- 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//346/246/202/345/277/265/351/252/214/350/257/201/346/265/201/346/260/264/347/272/277.md +0 -51
- package/templates/knowledge/procedures//346/265/213/350/257/225/344/274/230/345/205/210/347/274/226/347/240/201/345/267/245/344/275/234/346/265/201.md +0 -91
- package/templates/knowledge/procedures//346/272/220/347/240/201/345/216/237/345/236/213/344/272/244/344/273/230/346/265/201/347/250/213.md +0 -65
- package/templates/knowledge/procedures//347/216/260/346/234/211/347/263/273/347/273/237/345/267/256/350/267/235/345/210/206/346/236/220/345/267/245/344/275/234/346/265/201.md +0 -97
- package/templates/knowledge/procedures//347/237/245/350/257/206/347/273/264/346/212/244/346/265/201/346/260/264/347/272/277.md +0 -67
- package/templates/knowledge/procedures//347/264/247/346/200/245/344/277/256/345/244/215/346/265/201/346/260/264/347/272/277.md +0 -72
- 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/226/347/240/201/345/211/215/346/276/204/346/270/205/346/265/201/347/250/213.md +0 -86
- 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//350/207/252/344/270/273/351/200/211/345/236/213/346/265/201/347/250/213.md +0 -61
- package/templates/knowledge/procedures//350/256/276/350/256/241/344/272/247/347/211/251/347/224/237/346/210/220/344/270/216/345/244/215/351/252/214/345/267/245/344/275/234/346/265/201.md +0 -45
- package/templates/knowledge/procedures//350/257/246/347/273/206/350/256/276/350/256/241/346/265/201/347/250/213.md +0 -69
- package/templates/knowledge/procedures//350/260/203/350/257/225/346/216/222/346/237/245/346/265/201/347/250/213.md +0 -70
- package/templates/knowledge/procedures//350/277/201/347/247/273/346/265/201/346/260/264/347/272/277.md +0 -54
- package/templates/knowledge/procedures//351/203/250/347/275/262/345/217/221/345/270/203/346/265/201/347/250/213.md +0 -72
- package/templates/knowledge/procedures//351/207/215/346/236/204/346/265/201/346/260/264/347/272/277.md +0 -54
- package/templates/knowledge/procedures//351/233/206/346/210/220/351/252/214/350/257/201/346/265/201/347/250/213.md +0 -63
- package/templates/knowledge/procedures//351/234/200/346/261/202/346/276/204/346/270/205/346/265/201/347/250/213.md +0 -59
- package/templates/knowledge/procedures//351/252/214/346/224/266/346/265/213/350/257/225/350/247/204/345/210/222.md +0 -67
- 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/review//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 -81
- package/templates/knowledge/review_rules/SOLID/344/273/243/347/240/201/345/256/241/346/237/245/350/247/204/345/210/231.md +0 -40
- package/templates/knowledge/review_rules//344/272/244/344/273/230/345/256/214/345/244/207/346/200/247/345/256/241/346/237/245/350/247/204/345/210/231.md +0 -87
- package/templates/knowledge/review_rules//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 -38
- package/templates/knowledge/review_rules//345/256/211/345/205/250/345/256/241/346/237/245/350/247/204/345/210/231.md +0 -100
- package/templates/knowledge/review_rules//345/271/266/345/217/221/345/256/241/346/237/245/350/247/204/345/210/231.md +0 -87
- package/templates/knowledge/review_rules//346/200/247/350/203/275/345/256/241/346/237/245/350/247/204/345/210/231.md +0 -82
- package/templates/knowledge/review_rules//346/216/245/345/217/243/345/245/221/347/272/246/345/256/241/346/237/245/350/247/204/345/210/231.md +0 -87
- package/templates/knowledge/review_rules//346/236/266/346/236/204/345/256/241/346/237/245/350/247/204/345/210/231.md +0 -83
- package/templates/knowledge/review_rules//350/264/250/351/207/217/345/256/241/346/237/245/350/247/204/345/210/231.md +0 -101
- package/templates/knowledge/rules/OOD/344/270/216SOLID/350/256/276/350/256/241/350/247/204/345/210/231.md +0 -62
- package/templates/knowledge/rules//344/272/247/347/211/251/345/245/221/347/272/246/350/247/204/345/210/231.md +0 -57
- package/templates/knowledge/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 -150
- package/templates/knowledge/rules//344/273/273/345/212/241/344/270/212/344/270/213/346/226/207/347/224/237/345/221/275/345/221/250/346/234/237/350/247/204/345/210/231.md +0 -65
- package/templates/knowledge/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 -55
- package/templates/knowledge/rules//345/221/275/344/273/244/346/211/247/350/241/214/350/247/204/345/210/231.md +0 -61
- package/templates/knowledge/rules//345/267/245/344/275/234/346/265/201/345/245/221/347/272/246/350/247/204/345/210/231.md +0 -56
- package/templates/knowledge/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 -144
- package/templates/knowledge/rules//345/267/245/344/275/234/346/265/201/346/250/241/346/235/277/345/214/205/350/247/204/345/210/231.md +0 -48
- package/templates/knowledge/rules//345/267/245/345/205/267/350/260/203/347/224/250/350/247/204/345/210/231.md +0 -61
- package/templates/knowledge/rules//346/204/217/345/233/276/350/267/257/347/224/261/350/247/204/345/210/231.md +0 -62
- package/templates/knowledge/rules//346/211/247/350/241/214/345/256/210/345/215/253/350/257/204/344/274/260/350/247/204/345/210/231.md +0 -60
- package/templates/knowledge/rules//346/211/251/345/261/225/347/224/237/345/221/275/345/221/250/346/234/237/350/247/204/345/210/231.md +0 -48
- package/templates/knowledge/rules//346/212/200/346/234/257/345/206/263/347/255/226/344/270/273/346/235/203/350/247/204/345/210/231.md +0 -64
- 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/225/217/346/204/237/344/277/241/346/201/257/346/227/245/345/277/227/350/247/204/345/210/231.md +0 -69
- package/templates/knowledge/rules//346/226/275/345/267/245/346/214/207/344/273/244/345/245/221/347/272/246/350/247/204/345/210/231.md +0 -78
- package/templates/knowledge/rules//346/227/245/345/277/227/346/262/273/347/220/206/350/247/204/345/210/231.md +0 -49
- package/templates/knowledge/rules//346/234/272/345/210/266/350/207/252/346/262/273/347/220/206/350/247/204/345/210/231.md +0 -48
- package/templates/knowledge/rules//346/236/266/346/236/204/345/206/263/347/255/226/347/240/224/350/256/250/350/247/204/345/210/231.md +0 -49
- package/templates/knowledge/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 -72
- package/templates/knowledge/rules//346/240/270/345/277/203/344/275/223/351/252/214/345/216/237/345/210/231.md +0 -50
- package/templates/knowledge/rules//346/240/270/345/277/203/345/267/245/347/250/213/346/211/247/350/241/214/345/216/237/345/210/231.md +0 -160
- package/templates/knowledge/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 -71
- package/templates/knowledge/rules//346/263/250/345/206/214/350/241/250/345/237/272/347/241/200/350/256/276/346/226/275/350/247/204/345/210/231.md +0 -62
- 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/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 +0 -74
- package/templates/knowledge/rules//347/224/250/346/210/267/345/217/215/351/246/210/345/245/221/347/272/246/350/247/204/345/210/231.md +0 -118
- package/templates/knowledge/rules//347/237/245/350/257/206/346/262/273/347/220/206/350/247/204/345/210/231.md +0 -50
- package/templates/knowledge/rules//347/237/245/350/257/206/346/263/250/345/205/245/350/276/271/347/225/214/350/247/204/345/210/231.md +0 -61
- package/templates/knowledge/rules//347/237/245/350/257/206/350/265/204/344/272/247/346/262/273/347/220/206/350/247/204/345/210/231.md +0 -61
- package/templates/knowledge/rules//347/254/254/344/270/200/346/200/247/345/216/237/347/220/206/346/216/250/347/220/206/350/247/204/345/210/231.md +0 -73
- package/templates/knowledge/rules//347/273/206/350/212/202/347/272/252/345/276/213/350/247/204/345/210/231.md +0 -67
- package/templates/knowledge/rules//350/204/221/346/232/264/344/270/216/346/226/271/346/241/210/346/216/242/347/264/242/350/247/204/345/210/231.md +0 -66
- package/templates/knowledge/rules//350/256/241/345/210/222/345/211/215/347/275/256/351/227/250/350/247/204/345/210/231.md +0 -59
- package/templates/knowledge/rules//350/256/276/350/256/241/344/272/247/347/211/251/345/214/205/350/247/204/345/210/231.md +0 -71
- package/templates/knowledge/rules//350/257/201/346/215/256/351/251/261/345/212/250/344/270/216/345/217/215/345/271/273/350/247/211/350/247/204/345/210/231.md +0 -75
- package/templates/knowledge/rules//350/267/250/345/271/263/345/217/260/350/267/257/345/276/204/345/256/211/345/205/250/350/247/204/345/210/231.md +0 -48
- package/templates/knowledge/rules//350/276/223/345/205/245/346/235/220/346/226/231/345/245/221/347/272/246/350/247/204/345/210/231.md +0 -63
- package/templates/knowledge/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 -77
- package/templates/knowledge/rules//351/205/215/347/275/256/344/274/230/345/205/210/347/272/247/350/247/204/345/210/231.md +0 -57
- package/templates/knowledge/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 -47
- package/templates/knowledge/rules//351/230/262/345/255/244/345/262/233/345/256/236/347/216/260/350/247/204/345/210/231.md +0 -60
- package/templates/knowledge/rules//351/233/266/351/205/215/347/275/256/345/210/235/345/247/213/345/214/226/350/247/204/345/210/231.md +0 -64
- package/templates/knowledge/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 -96
- package/templates/knowledge/rules//351/252/214/350/257/201/345/245/221/347/272/246/350/247/204/345/210/231.md +0 -61
- package/templates/knowledge/templates//345/256/241/346/237/245/346/221/230/350/246/201.md +0 -65
- /package/dist/engine/{audit_pool.d.ts → audit/audit_pool.d.ts} +0 -0
- /package/dist/engine/{degradation.d.ts → audit/degradation.d.ts} +0 -0
- /package/dist/engine/{degradation.js → audit/degradation.js} +0 -0
- /package/dist/engine/{diagnostic_registry.d.ts → audit/diagnostic_registry.d.ts} +0 -0
- /package/dist/engine/{failure_report.d.ts → audit/failure_report.d.ts} +0 -0
- /package/dist/engine/{failure_report.js → audit/failure_report.js} +0 -0
- /package/dist/engine/{java_quality_guard.d.ts → audit/java_quality_guard.d.ts} +0 -0
- /package/dist/engine/{runtime_safety.d.ts → audit/runtime_safety.d.ts} +0 -0
- /package/dist/engine/{test_strategy.d.ts → audit/test_strategy.d.ts} +0 -0
- /package/dist/engine/{test_strategy.js → audit/test_strategy.js} +0 -0
- /package/dist/engine/{config_write_boundary.d.ts → config/config_write_boundary.d.ts} +0 -0
- /package/dist/engine/{regression_matrix.d.ts → config/regression_matrix.d.ts} +0 -0
- /package/dist/engine/{architecture_design_contract.d.ts → contracts/architecture_design_contract.d.ts} +0 -0
- /package/dist/engine/{architecture_design_contract.js → contracts/architecture_design_contract.js} +0 -0
- /package/dist/engine/{backend_implementation_contract.d.ts → contracts/backend_implementation_contract.d.ts} +0 -0
- /package/dist/engine/{capability_action_advisor.d.ts → contracts/capability_action_advisor.d.ts} +0 -0
- /package/dist/engine/{capability_registry.d.ts → contracts/capability_registry.d.ts} +0 -0
- /package/dist/engine/{code_maintainability_observability_contract.d.ts → contracts/code_maintainability_observability_contract.d.ts} +0 -0
- /package/dist/engine/{control_plane_contract.d.ts → contracts/control_plane_contract.d.ts} +0 -0
- /package/dist/engine/{decision_workshop.js → contracts/decision_workshop.js} +0 -0
- /package/dist/engine/{design_artifact_pack.js → contracts/design_artifact_pack.js} +0 -0
- /package/dist/engine/{detail_discipline.d.ts → contracts/detail_discipline.d.ts} +0 -0
- /package/dist/engine/{detail_discipline.js → contracts/detail_discipline.js} +0 -0
- /package/dist/engine/{escape_report.d.ts → contracts/escape_report.d.ts} +0 -0
- /package/dist/engine/{existing_system_analysis.d.ts → contracts/existing_system_analysis.d.ts} +0 -0
- /package/dist/engine/{existing_system_analysis.js → contracts/existing_system_analysis.js} +0 -0
- /package/dist/engine/{metric_governance.d.ts → contracts/metric_governance.d.ts} +0 -0
- /package/dist/engine/{metric_governance.js → contracts/metric_governance.js} +0 -0
- /package/dist/engine/{ood_solid_contract.d.ts → contracts/ood_solid_contract.d.ts} +0 -0
- /package/dist/engine/{verification_contract.d.ts → contracts/verification_contract.d.ts} +0 -0
- /package/dist/engine/{verification_contract.js → contracts/verification_contract.js} +0 -0
- /package/dist/engine/{log_governance.d.ts → core/log_governance.d.ts} +0 -0
- /package/dist/engine/{logger.d.ts → core/logger.d.ts} +0 -0
- /package/dist/engine/{chinese_semantic_priority.d.ts → knowledge/chinese_semantic_priority.d.ts} +0 -0
- /package/dist/engine/{chinese_semantic_priority.js → knowledge/chinese_semantic_priority.js} +0 -0
- /package/dist/engine/{documentation_governance.d.ts → knowledge/documentation_governance.d.ts} +0 -0
- /package/dist/engine/{documentation_governance.js → knowledge/documentation_governance.js} +0 -0
- /package/dist/engine/{knowledge_acceptance_registry.d.ts → knowledge/knowledge_acceptance_registry.d.ts} +0 -0
- /package/dist/engine/{knowledge_asset_audit.d.ts → knowledge/knowledge_asset_audit.d.ts} +0 -0
- /package/dist/engine/{knowledge_asset_generation_gate.d.ts → knowledge/knowledge_asset_generation_gate.d.ts} +0 -0
- /package/dist/engine/{knowledge_asset_generation_gate.js → knowledge/knowledge_asset_generation_gate.js} +0 -0
- /package/dist/engine/{knowledge_asset_migration.d.ts → knowledge/knowledge_asset_migration.d.ts} +0 -0
- /package/dist/engine/{knowledge_config_loader.d.ts → knowledge/knowledge_config_loader.d.ts} +0 -0
- /package/dist/engine/{knowledge_sovereignty.d.ts → knowledge/knowledge_sovereignty.d.ts} +0 -0
- /package/dist/engine/{knowledge_template_contracts.js → knowledge/knowledge_template_contracts.js} +0 -0
- /package/dist/engine/{language_policy_contract.d.ts → knowledge/language_policy_contract.d.ts} +0 -0
- /package/dist/engine/{language_policy_contract.js → knowledge/language_policy_contract.js} +0 -0
- /package/dist/engine/{release_compatibility.d.ts → knowledge/release_compatibility.d.ts} +0 -0
- /package/dist/engine/{release_compatibility.js → knowledge/release_compatibility.js} +0 -0
- /package/dist/engine/{conflict_gate.d.ts → pipeline/conflict_gate.d.ts} +0 -0
- /package/dist/engine/{diff_ownership.d.ts → pipeline/diff_ownership.d.ts} +0 -0
- /package/dist/engine/{diff_ownership_store.d.ts → pipeline/diff_ownership_store.d.ts} +0 -0
- /package/dist/engine/{plan_proposal_gate.d.ts → pipeline/plan_proposal_gate.d.ts} +0 -0
- /package/dist/engine/{workspace_resumer.d.ts → pipeline/workspace_resumer.d.ts} +0 -0
- /package/dist/engine/{release_gate_scenario_registry.d.ts → release/release_gate_scenario_registry.d.ts} +0 -0
- /package/dist/engine/{standard_asset_coverage.d.ts → templates/standard_asset_coverage.d.ts} +0 -0
- /package/dist/engine/{template_sync.js → templates/template_sync.js} +0 -0
- /package/dist/engine/{project_stage_detector.d.ts → workflow/project_stage_detector.d.ts} +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
|
@@ -1,3382 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 发布就绪门禁 — CLI 和 npm 共用的正式发布检查逻辑。
|
|
3
|
-
*
|
|
4
|
-
* 本模块是 validate-release 的唯一正式入口。
|
|
5
|
-
* 旧 validate-batch* gate 仅代表历史施工检查,不代表正式发布通过。
|
|
6
|
-
*
|
|
7
|
-
* 检查项:
|
|
8
|
-
* 0. dist 旧产物风险
|
|
9
|
-
* 1. Batch 施工痕迹泄漏
|
|
10
|
-
* 2. 双层模型语义归位
|
|
11
|
-
* 3. 主链路真实消费
|
|
12
|
-
* 4. 模板/adapter 更新空洞
|
|
13
|
-
* 5. 旧 gate 误导标记
|
|
14
|
-
* 6. 测试污染初筛
|
|
15
|
-
* 7. Batch 问题文档格式一致性
|
|
16
|
-
* 8. 关键问题消费验证
|
|
17
|
-
* 9. 机制身份一致性
|
|
18
|
-
* 10. P0/P1 知识资产 schema
|
|
19
|
-
* 11. engine console.log 检查
|
|
20
|
-
* 12. 中文注释检查
|
|
21
|
-
* 13. 第五批一致性校验
|
|
22
|
-
* 14. 依赖漏洞扫描
|
|
23
|
-
* 15. 发布问题架构决策与设计产物真实消费
|
|
24
|
-
* 18. 代码可维护性与可观测性契约行为验证
|
|
25
|
-
* 19. 历史问题长期机制化行为验证
|
|
26
|
-
* 20. 诊断码集中治理检查
|
|
27
|
-
* 21. 模板卫生与项目知识消费验证
|
|
28
|
-
* 22. MCP 控制面可信与受控生成链路验证
|
|
29
|
-
*/
|
|
30
|
-
import fs from "node:fs";
|
|
31
|
-
import os from "node:os";
|
|
32
|
-
import path from "node:path";
|
|
33
|
-
import { sourceContainsPattern, sourceContainsCall, sourceContainsIdentifier, sourceContainsZodSchema, sourceContainsPropertyAccess, sourceImportsModule, } from "./source_code_matcher.js";
|
|
34
|
-
// ── 辅助函数 ──
|
|
35
|
-
function safeRead(filePath) {
|
|
36
|
-
try {
|
|
37
|
-
return fs.readFileSync(filePath, "utf8");
|
|
38
|
-
}
|
|
39
|
-
catch {
|
|
40
|
-
return null;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
function safeReadLines(filePath) {
|
|
44
|
-
const content = safeRead(filePath);
|
|
45
|
-
return content ? content.split("\n") : [];
|
|
46
|
-
}
|
|
47
|
-
// ── 0. dist 旧产物风险 ──
|
|
48
|
-
function checkDistFreshness(rootDir, hardFail) {
|
|
49
|
-
const srcDir = path.join(rootDir, "src");
|
|
50
|
-
const distDir = path.join(rootDir, "dist");
|
|
51
|
-
if (!fs.existsSync(distDir)) {
|
|
52
|
-
hardFail("DIST_STALE", "dist/ 目录不存在,请先 npm run build", ["dist/"], "构建系统", "旧 gate 不检查 dist 是否存在", "构建");
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
let latestSrc = new Date(0);
|
|
56
|
-
function findLatestSrc(dir) {
|
|
57
|
-
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
58
|
-
for (const entry of entries) {
|
|
59
|
-
const full = path.join(dir, entry.name);
|
|
60
|
-
if (entry.isDirectory()) {
|
|
61
|
-
if (entry.name === "node_modules")
|
|
62
|
-
continue;
|
|
63
|
-
findLatestSrc(full);
|
|
64
|
-
}
|
|
65
|
-
else if (entry.isFile() && entry.name.endsWith(".ts")) {
|
|
66
|
-
const stat = fs.statSync(full);
|
|
67
|
-
if (stat.mtime > latestSrc)
|
|
68
|
-
latestSrc = stat.mtime;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
findLatestSrc(srcDir);
|
|
73
|
-
let oldestDist = new Date(Infinity);
|
|
74
|
-
let distFileCount = 0;
|
|
75
|
-
function findOldestDist(dir) {
|
|
76
|
-
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
77
|
-
for (const entry of entries) {
|
|
78
|
-
const full = path.join(dir, entry.name);
|
|
79
|
-
if (entry.isDirectory()) {
|
|
80
|
-
findOldestDist(full);
|
|
81
|
-
}
|
|
82
|
-
else if (entry.isFile() && entry.name.endsWith(".js")) {
|
|
83
|
-
distFileCount++;
|
|
84
|
-
const stat = fs.statSync(full);
|
|
85
|
-
if (stat.mtime < oldestDist)
|
|
86
|
-
oldestDist = stat.mtime;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
findOldestDist(distDir);
|
|
91
|
-
if (distFileCount === 0) {
|
|
92
|
-
hardFail("DIST_STALE", "dist/ 中无 .js 文件,请先 npm run build", ["dist/"], "构建系统", "旧 gate 不检查 dist 是否为空", "构建");
|
|
93
|
-
}
|
|
94
|
-
else if (oldestDist < latestSrc) {
|
|
95
|
-
hardFail("DIST_STALE", `dist/ 最旧文件 (${oldestDist.toISOString()}) 早于 src/ 最新文件 (${latestSrc.toISOString()}),存在过期风险`, ["dist/", "src/"], "构建系统", "旧 gate 不检查 dist 与 src 的时间一致性", "构建");
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
// ── 1. Batch 施工痕迹泄漏 ──
|
|
99
|
-
function checkBatchTraceLeakage(rootDir, hardFail, _info) {
|
|
100
|
-
const srcDir = path.join(rootDir, "src");
|
|
101
|
-
const batchRegex = /\b(batch[1-5]|batch_[1-5])\b/i;
|
|
102
|
-
// 白名单: 仅允许 @deprecated 标记和类型中的迁移兼容字段
|
|
103
|
-
const allowedPatterns = [/deprecated/i, /@deprecated/, /迁移兼容/];
|
|
104
|
-
const findings = [];
|
|
105
|
-
function scanDir(dir) {
|
|
106
|
-
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
107
|
-
for (const entry of entries) {
|
|
108
|
-
const full = path.join(dir, entry.name);
|
|
109
|
-
if (entry.isDirectory()) {
|
|
110
|
-
if (entry.name === "node_modules" || entry.name === "dist")
|
|
111
|
-
continue;
|
|
112
|
-
scanDir(full);
|
|
113
|
-
}
|
|
114
|
-
else if (entry.isFile() && entry.name.endsWith(".ts")) {
|
|
115
|
-
const lines = safeReadLines(full);
|
|
116
|
-
const rel = path.relative(rootDir, full);
|
|
117
|
-
for (let i = 0; i < lines.length; i++) {
|
|
118
|
-
const line = lines[i];
|
|
119
|
-
if (!batchRegex.test(line))
|
|
120
|
-
continue;
|
|
121
|
-
if (allowedPatterns.some(p => p.test(line)))
|
|
122
|
-
continue;
|
|
123
|
-
findings.push({ file: rel, line: i + 1, content: line.trim() });
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
scanDir(srcDir);
|
|
129
|
-
if (findings.length > 0) {
|
|
130
|
-
const criticalFindings = findings.filter(f => {
|
|
131
|
-
if (f.file.startsWith("src/engine/") && !f.content.startsWith("//") && !f.content.startsWith("*"))
|
|
132
|
-
return true;
|
|
133
|
-
return false;
|
|
134
|
-
});
|
|
135
|
-
for (const f of criticalFindings) {
|
|
136
|
-
hardFail("BATCH_TRACE_LEAK", `正式代码中发现 batch 施工痕迹: ${f.content}`, [f.file], `${f.file}:${f.line}`, "旧 validate-batch* gate 只检查文件是否存在和测试是否通过,不检查 batch 命名是否泄漏到正式 runtime", "清理");
|
|
137
|
-
}
|
|
138
|
-
const nonCritical = findings.filter(f => !criticalFindings.includes(f));
|
|
139
|
-
for (const f of nonCritical) {
|
|
140
|
-
_info(` [注意] batch 引用在: ${f.file}:${f.line} — ${f.content}`);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
// ── 2. 双层模型语义归位 ──
|
|
145
|
-
async function checkDualLayerSemantics(rootDir, hardFail, _info) {
|
|
146
|
-
const registryPath = path.join(rootDir, "dist", "engine", "dual_layer_mechanism_registry.js");
|
|
147
|
-
const consumablePath = path.join(rootDir, "dist", "engine", "consumable_asset_registry.js");
|
|
148
|
-
if (!fs.existsSync(registryPath)) {
|
|
149
|
-
hardFail("REGISTRY_NOT_BUILT", "dual_layer_mechanism_registry.js 未编译,请先 npm run build", ["dist/engine/dual_layer_mechanism_registry.js"], "构建系统", "旧 gate 只检查源文件存在,不检查是否可运行", "构建");
|
|
150
|
-
return;
|
|
151
|
-
}
|
|
152
|
-
let mechanisms = [];
|
|
153
|
-
let consumableAssets = [];
|
|
154
|
-
try {
|
|
155
|
-
const reg = await import(registryPath);
|
|
156
|
-
mechanisms = reg.listMechanismLayerMaps ? reg.listMechanismLayerMaps() : [];
|
|
157
|
-
}
|
|
158
|
-
catch (e) {
|
|
159
|
-
hardFail("REGISTRY_LOAD_FAIL", `无法加载 dual_layer_mechanism_registry: ${e.message}`, ["dist/engine/dual_layer_mechanism_registry.js"], "构建系统", "旧 gate 只检查源文件存在,不检查运行时可加载", "修复");
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
try {
|
|
163
|
-
const con = await import(consumablePath);
|
|
164
|
-
consumableAssets = con.listBuiltinConsumableAssets ? con.listBuiltinConsumableAssets() : [];
|
|
165
|
-
}
|
|
166
|
-
catch (e) {
|
|
167
|
-
_info(` [警告] 无法加载 consumable_asset_registry: ${e.message}`);
|
|
168
|
-
}
|
|
169
|
-
const enforced = mechanisms.filter((m) => m.status === "dual_layer_enforced");
|
|
170
|
-
for (const mech of enforced) {
|
|
171
|
-
const assets = mech.template_assets || [];
|
|
172
|
-
if (assets.length > 0 && assets.every((a) => a.consumption_mode === "supporting")) {
|
|
173
|
-
hardFail("ALL_SUPPORTING_ASSETS", `机制 ${mech.mechanism_id} 的所有模板资产都是 supporting 模式,无 required 资产: ${assets.map((a) => a.path).join(", ")}`, assets.map((a) => a.path), mech.mechanism_id, "旧 gate 用 template_assets.length > 0 判断模板层通过,不区分 required/supporting", "修复语义归位");
|
|
174
|
-
continue;
|
|
175
|
-
}
|
|
176
|
-
for (const asset of assets) {
|
|
177
|
-
const inConsumable = consumableAssets.find((ca) => ca.path === asset.path && ca.owner_mechanism_id === mech.mechanism_id);
|
|
178
|
-
if (!inConsumable) {
|
|
179
|
-
const assetBasename = path.basename(asset.path, ".md");
|
|
180
|
-
const mechanismIdShort = mech.mechanism_id.replace("mc-", "");
|
|
181
|
-
const nameCorresponds = assetBasename.includes(mechanismIdShort) || assetBasename.includes(mech.mechanism_name);
|
|
182
|
-
if (!nameCorresponds && asset.consumption_mode === "supporting") {
|
|
183
|
-
hardFail("TEMPLATE_SEMANTIC_MISALIGN", `机制 ${mech.mechanism_id} 的模板 ${asset.path} 在 consumable_asset_registry 中未声明 owner_mechanism_id 为该机制,且文件名不对应机制名称`, [asset.path, "src/engine/consumable_asset_registry.ts"], mech.mechanism_id, "旧 gate 用 template_assets.length > 0 判断模板层通过,不检查资产是否语义归属该机制", "修复语义归位");
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
const firstPrinciples = enforced.find((m) => m.mechanism_id === "mc-first-principles");
|
|
189
|
-
if (firstPrinciples) {
|
|
190
|
-
const assets = firstPrinciples.template_assets || [];
|
|
191
|
-
if (assets.length === 1 && assets[0].path.includes("架构设计工作流") && assets[0].consumption_mode === "supporting") {
|
|
192
|
-
hardFail("FIRST_PRINCIPLES_MISALIGNED", "mc-first-principles 只挂了 架构设计工作流.md(supporting),无自有模板资产。第一性原理检查应有独立的推理框架模板或规则", ["templates/knowledge/procedures/架构设计工作流.md", "src/engine/dual_layer_mechanism_registry.ts"], "mc-first-principles", "旧 gate 用 template_assets.length > 0 判断通过,不检查资产内容是否匹配机制语义", "修复语义归位");
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
for (const sm of [{ id: "mc-brainstorm-contract", name: "脑暴与方案探索" }, { id: "mc-detail-discipline", name: "细节纪律" }, { id: "mc-decision-sovereignty", name: "技术决策主权" }]) {
|
|
196
|
-
const mech = enforced.find((m) => m.mechanism_id === sm.id);
|
|
197
|
-
if (!mech)
|
|
198
|
-
continue;
|
|
199
|
-
const assets = mech.template_assets || [];
|
|
200
|
-
if (assets.every((a) => a.path.includes("架构设计工作流") || a.path.includes("测试优先编码工作流")) && assets.every((a) => a.consumption_mode === "supporting")) {
|
|
201
|
-
hardFail("SHARED_SUPPORTING_ONLY", `${sm.id}(${sm.name}) 只挂了共享的 supporting 模板(架构设计工作流/测试优先编码工作流),无自有 required 模板资产`, assets.map((a) => a.path), sm.id, "旧 gate 用 template_assets.length > 0 判断通过,不检查模板是否专属", "修复语义归位");
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
// 检查 required template asset 是否在 ASSET_MANIFEST 中注册
|
|
205
|
-
try {
|
|
206
|
-
const manifestPath = path.join(rootDir, "dist/engine/asset_manifest.js");
|
|
207
|
-
const manifestMod = await import(manifestPath);
|
|
208
|
-
const manifestEntries = manifestMod.ASSET_MANIFEST || [];
|
|
209
|
-
for (const mech of enforced) {
|
|
210
|
-
const assets = mech.template_assets || [];
|
|
211
|
-
for (const asset of assets) {
|
|
212
|
-
if (asset.consumption_mode !== "required")
|
|
213
|
-
continue;
|
|
214
|
-
const inManifest = manifestEntries.some((me) => me.path === asset.path && me.owner_mechanism_id === mech.mechanism_id && me.consumption_mode === "required");
|
|
215
|
-
if (!inManifest) {
|
|
216
|
-
hardFail("ASSET_MANIFEST_GAP", `机制 ${mech.mechanism_id} 的 required 模板 ${asset.path} 未在 ASSET_MANIFEST 中注册`, [asset.path, "src/engine/asset_manifest.ts"], mech.mechanism_id, "旧 gate 不检查 required 模板是否同步进入 ASSET_MANIFEST", "修复语义归位");
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
catch (e) {
|
|
222
|
-
_info(` [警告] 无法加载 asset_manifest 进行 required 模板检查: ${e.message}`);
|
|
223
|
-
}
|
|
224
|
-
_info(` 共检查 ${enforced.length} 个 dual_layer_enforced 机制`);
|
|
225
|
-
}
|
|
226
|
-
// ── 3. 主链路真实消费 ──
|
|
227
|
-
/** 已知的消费者入口→文件映射 */
|
|
228
|
-
const CONSUMER_ENTRY_FILES = {
|
|
229
|
-
"CLI validate": ["src/bin/soloforge.ts"],
|
|
230
|
-
"CLI sync-templates": ["src/bin/soloforge.ts"],
|
|
231
|
-
"CLI sync-adapters": ["src/bin/soloforge.ts"],
|
|
232
|
-
"CLI migrate": ["src/bin/soloforge.ts"],
|
|
233
|
-
"CLI validate-knowledge": ["src/engine/knowledge_scenario_registry.ts"],
|
|
234
|
-
"sf_verify": ["src/engine/verifier.ts"],
|
|
235
|
-
"sf_deliver": ["src/adapters/claude_code/tools.ts", "src/engine/delivery_readiness.ts"],
|
|
236
|
-
"sf_expand": ["src/adapters/claude_code/tools.ts", "src/engine/intent_expander.ts"],
|
|
237
|
-
"问题管理流程": [],
|
|
238
|
-
};
|
|
239
|
-
/** 模块名→文件路径映射 (用于模块间调用链如 "knowledge_evolution.validateCandidateTrust") */
|
|
240
|
-
const MODULE_FILE_MAP = {
|
|
241
|
-
"knowledge_lifecycle": "src/engine/knowledge_lifecycle.ts",
|
|
242
|
-
"knowledge_evolution": "src/engine/knowledge_evolution.ts",
|
|
243
|
-
"chinese_semantic_priority": "src/engine/chinese_semantic_priority.ts",
|
|
244
|
-
"language_policy": "src/engine/language_policy.ts",
|
|
245
|
-
"documentation_governance": "src/engine/documentation_governance.ts",
|
|
246
|
-
"template_sync": "src/engine/template_sync.ts",
|
|
247
|
-
"user_promise": "src/engine/user_promise.ts",
|
|
248
|
-
"adapter_prompt_contract": "src/engine/adapter_prompt_contract.ts",
|
|
249
|
-
"release_compatibility": "src/engine/release_compatibility.ts",
|
|
250
|
-
"extension_contract": "src/engine/extension_contract.ts",
|
|
251
|
-
"platform_context": "src/engine/platform_context.ts",
|
|
252
|
-
"metric_governance": "src/engine/metric_governance.ts",
|
|
253
|
-
"technology_decision": "src/engine/technology_decision.ts",
|
|
254
|
-
"brainstorm_contract": "src/engine/brainstorm_contract.ts",
|
|
255
|
-
"detail_discipline": "src/engine/detail_discipline.ts",
|
|
256
|
-
"first_principles": "src/engine/first_principles.ts",
|
|
257
|
-
"architecture_design_contract": "src/engine/architecture_design_contract.ts",
|
|
258
|
-
"existing_system_analysis": "src/engine/existing_system_analysis.ts",
|
|
259
|
-
"coding_readiness_gate": "src/engine/coding_readiness_gate.ts",
|
|
260
|
-
"local_docker_acceptance": "src/engine/local_docker_acceptance.ts",
|
|
261
|
-
"workflow_template_pack": "src/engine/workflow_template_pack.ts",
|
|
262
|
-
"evolution_regression_gate": "src/engine/evolution_regression_gate.ts",
|
|
263
|
-
"delivery_readiness": "src/engine/delivery_readiness.ts",
|
|
264
|
-
"knowledge_scenario_registry": "src/engine/knowledge_scenario_registry.ts",
|
|
265
|
-
"intent_expander": "src/engine/intent_expander.ts",
|
|
266
|
-
};
|
|
267
|
-
/** 从调用链文本中解析出所有消费者文件 */
|
|
268
|
-
function resolveConsumerFiles(chainText) {
|
|
269
|
-
const files = new Set();
|
|
270
|
-
const segments = chainText.split("→").map(s => s.trim()).filter(Boolean);
|
|
271
|
-
for (const seg of segments) {
|
|
272
|
-
// 检查是否匹配已知入口 (如 "CLI validate →" 或 "sf_verify →")
|
|
273
|
-
for (const [entry, paths] of Object.entries(CONSUMER_ENTRY_FILES)) {
|
|
274
|
-
if (seg.includes(entry) || seg.startsWith(entry)) {
|
|
275
|
-
for (const p of paths)
|
|
276
|
-
files.add(p);
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
// 检查是否匹配 cmdXxx 命令 (如 "cmdValidate")
|
|
280
|
-
const cmdMatch = seg.match(/cmd([A-Z]\w+)/);
|
|
281
|
-
if (cmdMatch) {
|
|
282
|
-
// cmd* 函数通常在 src/bin/soloforge.ts
|
|
283
|
-
files.add("src/bin/soloforge.ts");
|
|
284
|
-
}
|
|
285
|
-
// 检查是否匹配 generateVerifyCommands
|
|
286
|
-
if (seg.includes("generateVerifyCommands")) {
|
|
287
|
-
files.add("src/engine/verifier.ts");
|
|
288
|
-
}
|
|
289
|
-
// 检查是否匹配 evaluateDeliveryReadiness
|
|
290
|
-
if (seg.includes("evaluateDeliveryReadiness")) {
|
|
291
|
-
files.add("src/engine/delivery_readiness.ts");
|
|
292
|
-
files.add("src/adapters/claude_code/tools.ts");
|
|
293
|
-
}
|
|
294
|
-
// 检查是否匹配 cmdSyncTemplates/cmdSyncAdapters/cmdMigrate
|
|
295
|
-
if (seg.includes("cmdSyncTemplates") || seg.includes("cmdSyncAdapters") || seg.includes("cmdMigrate") || seg.includes("cmdValidate")) {
|
|
296
|
-
files.add("src/bin/soloforge.ts");
|
|
297
|
-
}
|
|
298
|
-
// 检查模块.function 模式 (如 "knowledge_evolution.validateCandidateTrust")
|
|
299
|
-
for (const [modName, modPath] of Object.entries(MODULE_FILE_MAP)) {
|
|
300
|
-
if (seg.includes(`${modName}.`) || seg.includes(modName)) {
|
|
301
|
-
files.add(modPath);
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
// 检查 buildTemplateManifestFromSource
|
|
305
|
-
if (seg.includes("buildTemplateManifestFromSource")) {
|
|
306
|
-
files.add("src/bin/soloforge.ts");
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
return [...files];
|
|
310
|
-
}
|
|
311
|
-
/** 从字符串数组格式的字段中提取文件路径列表 */
|
|
312
|
-
function extractStringArray(rawValue) {
|
|
313
|
-
// 处理 ["a", "b"] 格式
|
|
314
|
-
const items = rawValue.match(/["']([^"']+)["']/g) || [];
|
|
315
|
-
return items.map(s => s.replace(/["']/g, ""));
|
|
316
|
-
}
|
|
317
|
-
/** 从注册表文件内容中提取所有验收条目的结构化数据 */
|
|
318
|
-
function parseAcceptanceEntries(content) {
|
|
319
|
-
const entries = [];
|
|
320
|
-
const lines = content.split("\n");
|
|
321
|
-
let currentEntry = null;
|
|
322
|
-
for (let i = 0; i < lines.length; i++) {
|
|
323
|
-
const line = lines[i];
|
|
324
|
-
// 检测新条目开始 (issue_id 出现)
|
|
325
|
-
const issueMatch = line.match(/issue_id:\s*["']([^"']+)["']/);
|
|
326
|
-
if (issueMatch) {
|
|
327
|
-
if (currentEntry)
|
|
328
|
-
entries.push(currentEntry);
|
|
329
|
-
currentEntry = {
|
|
330
|
-
issue_id: issueMatch[1],
|
|
331
|
-
owner_files: [],
|
|
332
|
-
required_entrypoints: [],
|
|
333
|
-
mainline_consumption_check: "",
|
|
334
|
-
entryStartLine: i,
|
|
335
|
-
};
|
|
336
|
-
continue;
|
|
337
|
-
}
|
|
338
|
-
if (!currentEntry)
|
|
339
|
-
continue;
|
|
340
|
-
// 提取 owner_files
|
|
341
|
-
if (line.includes("owner_files:") && !line.includes("//")) {
|
|
342
|
-
// 可能是单行或多行
|
|
343
|
-
let raw = line;
|
|
344
|
-
if (!raw.includes("]")) {
|
|
345
|
-
let j = i + 1;
|
|
346
|
-
while (j < lines.length && !raw.includes("]")) {
|
|
347
|
-
raw += lines[j];
|
|
348
|
-
j++;
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
currentEntry.owner_files = extractStringArray(raw.replace(/^.*owner_files:\s*/, ""));
|
|
352
|
-
}
|
|
353
|
-
// 提取 required_entrypoints
|
|
354
|
-
if (line.includes("required_entrypoints:") && !line.includes("//")) {
|
|
355
|
-
let raw = line;
|
|
356
|
-
if (!raw.includes("]")) {
|
|
357
|
-
let j = i + 1;
|
|
358
|
-
while (j < lines.length && !raw.includes("]")) {
|
|
359
|
-
raw += lines[j];
|
|
360
|
-
j++;
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
currentEntry.required_entrypoints = extractStringArray(raw.replace(/^.*required_entrypoints:\s*/, ""));
|
|
364
|
-
}
|
|
365
|
-
// 提取 mainline_consumption_check
|
|
366
|
-
if (line.includes("mainline_consumption_check:") && !line.includes("//")) {
|
|
367
|
-
let raw = line;
|
|
368
|
-
if (!raw.includes("]")) {
|
|
369
|
-
let j = i + 1;
|
|
370
|
-
while (j < lines.length && !raw.includes("]")) {
|
|
371
|
-
raw += lines[j];
|
|
372
|
-
j++;
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
currentEntry.mainline_consumption_check = raw.replace(/^.*mainline_consumption_check:\s*/, "");
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
if (currentEntry)
|
|
379
|
-
entries.push(currentEntry);
|
|
380
|
-
return entries;
|
|
381
|
-
}
|
|
382
|
-
function checkMainlineConsumption(rootDir, hardFail, _info) {
|
|
383
|
-
const registryFiles = [
|
|
384
|
-
{ filePath: "tests/engine/extension_acceptance_registry.ts", label: "Extension 验收" },
|
|
385
|
-
{ filePath: "src/engine/knowledge_acceptance_registry.ts", label: "知识验收" },
|
|
386
|
-
];
|
|
387
|
-
for (const reg of registryFiles) {
|
|
388
|
-
const content = safeRead(path.join(rootDir, reg.filePath));
|
|
389
|
-
if (!content) {
|
|
390
|
-
_info(` [跳过] ${reg.filePath} 不存在`);
|
|
391
|
-
continue;
|
|
392
|
-
}
|
|
393
|
-
const entries = parseAcceptanceEntries(content);
|
|
394
|
-
for (const entry of entries) {
|
|
395
|
-
// ── 检查 1: owner_files 必须在磁盘上存在 ──
|
|
396
|
-
for (const ownerFile of entry.owner_files) {
|
|
397
|
-
const fullPath = path.join(rootDir, ownerFile);
|
|
398
|
-
if (!fs.existsSync(fullPath)) {
|
|
399
|
-
hardFail("MAINLINE_OWNER_FILE_MISSING", `${reg.label}: ${entry.issue_id} 的 owner_file "${ownerFile}" 不存在`, [reg.filePath, ownerFile], entry.issue_id, "旧 gate 不校验 owner_files 是否真实存在", "创建缺失文件或修正 owner_files");
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
// ── 检查 2: required_entrypoints 必须在 owner_files 中真实 export ──
|
|
403
|
-
for (const ep of entry.required_entrypoints) {
|
|
404
|
-
let found = false;
|
|
405
|
-
for (const ownerFile of entry.owner_files) {
|
|
406
|
-
const srcContent = safeRead(path.join(rootDir, ownerFile));
|
|
407
|
-
if (!srcContent)
|
|
408
|
-
continue;
|
|
409
|
-
// 检查 export function 或 export const 或 export async function
|
|
410
|
-
const exportPattern = new RegExp(`export\\s+(async\\s+)?function\\s+${ep}\\b|export\\s+const\\s+${ep}\\b`);
|
|
411
|
-
if (exportPattern.test(srcContent)) {
|
|
412
|
-
found = true;
|
|
413
|
-
break;
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
if (!found) {
|
|
417
|
-
hardFail("MAINLINE_ENTRYPOINT_NOT_EXPORTED", `${reg.label}: ${entry.issue_id} 的 required_entrypoint "${ep}" 未在 owner_files 中找到 export`, [reg.filePath, ...entry.owner_files], entry.issue_id, "旧 gate 不校验 required_entrypoints 是否真实导出", "添加缺失的 export 或修正 required_entrypoints");
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
// ── 检查 3: 调用链格式 — pending_integration 或至少 2 级 (→ 分隔) ──
|
|
421
|
-
const chainText = entry.mainline_consumption_check.match(/\[([^\]]+)\]/)?.[1] || "";
|
|
422
|
-
const isPendingIntegration = chainText.includes("pending_integration");
|
|
423
|
-
const chainSegments = chainText.split("→").map(s => s.trim()).filter(Boolean);
|
|
424
|
-
if (isPendingIntegration) {
|
|
425
|
-
// 诚实标记: 入口已 export 但无生产消费者 — hard_fail 提醒集成未完成
|
|
426
|
-
hardFail("MAINLINE_PENDING_INTEGRATION", `${reg.label}: ${entry.issue_id} 标记为 pending_integration: ${chainText.replace("pending_integration: ", "")}`, [reg.filePath], entry.issue_id, "入口函数已实现但无真实生产消费路径", "补充消费者源码调用");
|
|
427
|
-
continue;
|
|
428
|
-
}
|
|
429
|
-
if (chainSegments.length < 2) {
|
|
430
|
-
hardFail("MAINLINE_CHAIN_TOO_SHORT", `${reg.label}: ${entry.issue_id} 的 mainline_consumption_check 调用链不足 2 级: "${chainText}"`, [reg.filePath], entry.issue_id, "调用链必须包含入口→调用→效果至少 2 级", "补充调用链");
|
|
431
|
-
continue;
|
|
432
|
-
}
|
|
433
|
-
// ── 检查 4: 调用链中声称的消费者必须真实 import/call required_entrypoints ──
|
|
434
|
-
const consumerFiles = resolveConsumerFiles(chainText);
|
|
435
|
-
if (consumerFiles.length === 0) {
|
|
436
|
-
// 调用链中的入口无法映射到任何消费者文件
|
|
437
|
-
hardFail("MAINLINE_CONSUMER_NOT_FOUND", `${reg.label}: ${entry.issue_id} 的调用链入口无法映射到已知消费者文件: "${chainSegments[0]}"`, [reg.filePath], entry.issue_id, "调用链声称的入口没有对应的消费者文件", "补充消费源码或修正调用链描述");
|
|
438
|
-
continue;
|
|
439
|
-
}
|
|
440
|
-
// 对每个 required_entrypoint,验证至少有一条真实消费路径
|
|
441
|
-
// 路径 A: 消费者文件直接 import + call 该 entrypoint
|
|
442
|
-
// 路径 B: entrypoint 在 owner_file 内部被同一模块的另一个已消费函数调用 (传递消费)
|
|
443
|
-
// 条件: 消费者 import 了 owner_file 的某个函数 + entrypoint 在 owner_file 内被调用
|
|
444
|
-
for (const ep of entry.required_entrypoints) {
|
|
445
|
-
let consumedByRealCode = false;
|
|
446
|
-
// 路径 A: 直接消费
|
|
447
|
-
for (const consumerFile of consumerFiles) {
|
|
448
|
-
const consumerContent = safeRead(path.join(rootDir, consumerFile));
|
|
449
|
-
if (!consumerContent)
|
|
450
|
-
continue;
|
|
451
|
-
const staticImportPattern = new RegExp(`import\\s+\\{[^}]*\\b${ep}\\b[^}]*\\}\\s+from`);
|
|
452
|
-
const dynamicImportPattern = new RegExp(`\\{[^}]*\\b${ep}\\b[^}]*\\}\\s*=\\s*await\\s+import\\(`);
|
|
453
|
-
const hasLazyModuleImport = entry.owner_files.some((ownerFile) => {
|
|
454
|
-
const moduleName = path.basename(ownerFile, ".ts");
|
|
455
|
-
return sourceImportsModule(consumerContent, `../../engine/${moduleName}.js`)
|
|
456
|
-
|| sourceImportsModule(consumerContent, `../engine/${moduleName}.js`)
|
|
457
|
-
|| sourceImportsModule(consumerContent, `./${moduleName}.js`);
|
|
458
|
-
});
|
|
459
|
-
const hasImport = staticImportPattern.test(consumerContent)
|
|
460
|
-
|| dynamicImportPattern.test(consumerContent)
|
|
461
|
-
|| hasLazyModuleImport;
|
|
462
|
-
if (!hasImport)
|
|
463
|
-
continue;
|
|
464
|
-
const importLinePattern = new RegExp(`import\\s+\\{[^}]*\\b${ep}\\b|\\{[^}]*\\b${ep}\\b[^}]*\\}\\s*=\\s*await\\s+import`);
|
|
465
|
-
const callLines = consumerContent.split("\n").filter(l => !importLinePattern.test(l) && l.includes(ep));
|
|
466
|
-
if (callLines.length > 0) {
|
|
467
|
-
consumedByRealCode = true;
|
|
468
|
-
break;
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
// 路径 B: 传递消费 — entrypoint 在 owner_file 内部被另一个函数调用
|
|
472
|
-
// 且消费者 import 了 owner_file 中的某个函数
|
|
473
|
-
if (!consumedByRealCode) {
|
|
474
|
-
for (const ownerFile of entry.owner_files) {
|
|
475
|
-
const ownerContent = safeRead(path.join(rootDir, ownerFile));
|
|
476
|
-
if (!ownerContent)
|
|
477
|
-
continue;
|
|
478
|
-
// 检查 entrypoint 在 owner_file 内部被非 export 行调用
|
|
479
|
-
const ownerLines = ownerContent.split("\n");
|
|
480
|
-
const exportLinePattern = new RegExp(`export\\s+(async\\s+)?function\\s+${ep}\\b|export\\s+const\\s+${ep}\\b`);
|
|
481
|
-
const internalCalls = ownerLines.filter(l => !exportLinePattern.test(l) && l.includes(ep));
|
|
482
|
-
if (internalCalls.length === 0)
|
|
483
|
-
continue; // entrypoint 在 owner_file 内部未被调用
|
|
484
|
-
// entrypoint 在 owner_file 内部被调用 — 检查消费者是否 import 了 owner_file 的任何函数
|
|
485
|
-
for (const consumerFile of consumerFiles) {
|
|
486
|
-
const consumerContent = safeRead(path.join(rootDir, consumerFile));
|
|
487
|
-
if (!consumerContent)
|
|
488
|
-
continue;
|
|
489
|
-
// 检查消费者是否从 owner_file import 了任何东西
|
|
490
|
-
const ownerBasename = ownerFile.replace(/^src\/engine\//, "").replace(/\.ts$/, ".js");
|
|
491
|
-
const ownerImportPattern = new RegExp(`from\\s+["']\\./${ownerBasename.replace(".js", "")}\\.js["']|from\\s+["']\\.\\./engine/${ownerBasename.replace(".js", "")}\\.js["']`);
|
|
492
|
-
// 对于 CLI: from "../engine/xxx.js"
|
|
493
|
-
const cliImportPattern = new RegExp(`\\bimport\\s*\\([^)]*${ownerBasename.replace(/\.js$/, "")}`);
|
|
494
|
-
if (ownerImportPattern.test(consumerContent) || cliImportPattern.test(consumerContent)) {
|
|
495
|
-
consumedByRealCode = true;
|
|
496
|
-
break;
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
if (consumedByRealCode)
|
|
500
|
-
break;
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
if (!consumedByRealCode) {
|
|
504
|
-
hardFail("MAINLINE_ENTRYPOINT_NOT_CONSUMED", `${reg.label}: ${entry.issue_id} 的 required_entrypoint "${ep}" 无真实消费路径 (直接或传递)`, [reg.filePath, ...consumerFiles, ...entry.owner_files], entry.issue_id, "旧 gate 不校验消费者是否真实调用入口函数", "补充消费者源码调用或修正 required_entrypoints");
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
// ── 检查 5: owner_files 源码中必须包含调用链提到的函数名 ──
|
|
508
|
-
let funcInSource = false;
|
|
509
|
-
for (const ownerFile of entry.owner_files) {
|
|
510
|
-
const srcContent = safeRead(path.join(rootDir, ownerFile));
|
|
511
|
-
if (!srcContent)
|
|
512
|
-
continue;
|
|
513
|
-
for (const seg of chainSegments) {
|
|
514
|
-
const funcName = seg.match(/([a-z][a-zA-Z_]{4,})/)?.[1];
|
|
515
|
-
if (funcName && sourceContainsIdentifier(srcContent, funcName)) {
|
|
516
|
-
funcInSource = true;
|
|
517
|
-
break;
|
|
518
|
-
}
|
|
519
|
-
}
|
|
520
|
-
if (funcInSource)
|
|
521
|
-
break;
|
|
522
|
-
}
|
|
523
|
-
if (!funcInSource) {
|
|
524
|
-
hardFail("MAINLINE_CHAIN_FUNC_NOT_IN_OWNER", `${reg.label}: ${entry.issue_id} 的调用链函数名未在 owner_files 源码中找到`, [reg.filePath, ...entry.owner_files], entry.issue_id, "旧 gate 对调用链与 owner_files 交叉引用失败时仅发 _info", "修正调用链或 owner_files");
|
|
525
|
-
}
|
|
526
|
-
}
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
// ── 4. 模板/adapter 更新空洞 ──
|
|
530
|
-
function checkTemplateAdapterGaps(rootDir, hardFail) {
|
|
531
|
-
const registryFiles = [
|
|
532
|
-
{ filePath: "tests/engine/extension_acceptance_registry.ts", label: "Extension 验收" },
|
|
533
|
-
{ filePath: "src/engine/knowledge_acceptance_registry.ts", label: "知识验收" },
|
|
534
|
-
];
|
|
535
|
-
for (const reg of registryFiles) {
|
|
536
|
-
const content = safeRead(path.join(rootDir, reg.filePath));
|
|
537
|
-
if (!content)
|
|
538
|
-
continue;
|
|
539
|
-
const lines = content.split("\n");
|
|
540
|
-
for (let i = 0; i < lines.length; i++) {
|
|
541
|
-
const line = lines[i];
|
|
542
|
-
if (!line.includes("required_template_or_adapter_updates:"))
|
|
543
|
-
continue;
|
|
544
|
-
if (line.includes("[]") || line.includes("[ ]")) {
|
|
545
|
-
const contextBefore = lines.slice(Math.max(0, i - 20), i);
|
|
546
|
-
const issueMatch = contextBefore.find(l => l.includes("issue_id:"));
|
|
547
|
-
const issueId = issueMatch ? (issueMatch.match(/issue_id:\s*["']([^"']+)["']/)?.[1] ?? "未知") : "未知";
|
|
548
|
-
const contextAfter = lines.slice(i, Math.min(lines.length, i + 10));
|
|
549
|
-
const notApplicable = contextAfter.some(l => l.includes("not_applicable") || l.includes("N/A") || l.includes("不适用"));
|
|
550
|
-
if (!notApplicable) {
|
|
551
|
-
hardFail("TEMPLATE_ADAPTER_GAP", `${reg.label}: ${issueId} 的 required_template_or_adapter_updates 为空,无 not_applicable 说明`, [reg.filePath], issueId, "旧 gate 不检查空数组是否有合理说明", "清理");
|
|
552
|
-
}
|
|
553
|
-
}
|
|
554
|
-
}
|
|
555
|
-
}
|
|
556
|
-
}
|
|
557
|
-
// ── 5. 旧 gate 误导 ──
|
|
558
|
-
function checkOldGateMisdirection(rootDir, hardFail, _info) {
|
|
559
|
-
const gateFiles = ["scripts/validate_batch1_gate.mjs", "scripts/validate_batch2_gate.mjs", "scripts/validate_batch3_gate.mjs", "scripts/validate_batch4_gate.mjs", "scripts/validate_batch5_gate.mjs"];
|
|
560
|
-
// 检查 package.json 中对应脚本是否先输出历史警告
|
|
561
|
-
const pkgPath = path.join(rootDir, "package.json");
|
|
562
|
-
const pkgContent = safeRead(pkgPath);
|
|
563
|
-
const noticeModule = "validate_batch_historical_notice.mjs";
|
|
564
|
-
let pkgNoticeOk = true;
|
|
565
|
-
if (pkgContent) {
|
|
566
|
-
for (let i = 1; i <= 5; i++) {
|
|
567
|
-
const scriptKey = `"validate-batch${i}"`;
|
|
568
|
-
const scriptLine = pkgContent.split("\n").find(l => l.includes(scriptKey));
|
|
569
|
-
if (!scriptLine || !scriptLine.includes(noticeModule)) {
|
|
570
|
-
hardFail("HISTORICAL_GATE_NOT_RELEASE_PROOF", `package.json 中 ${scriptKey} 未在测试前输出历史 gate 警告(缺少 ${noticeModule})`, ["package.json"], `validate-batch${i}`, "旧 gate 可能让用户误以为是正式发布门禁", "添加历史声明");
|
|
571
|
-
pkgNoticeOk = false;
|
|
572
|
-
}
|
|
573
|
-
}
|
|
574
|
-
}
|
|
575
|
-
// 检查每个旧 gate 脚本是否已降级为历史施工 gate
|
|
576
|
-
for (const gf of gateFiles) {
|
|
577
|
-
const content = safeRead(path.join(rootDir, gf));
|
|
578
|
-
if (!content)
|
|
579
|
-
continue;
|
|
580
|
-
const batchNum = gf.match(/batch(\d)/)?.[1] ?? "?";
|
|
581
|
-
const issues = [];
|
|
582
|
-
// 1. 顶部注释不得自称 Release Gate
|
|
583
|
-
if (/Release Gate/.test(content) && !/历史施工 gate/.test(content)) {
|
|
584
|
-
issues.push("仍自称 Release Gate,未改为历史施工 gate");
|
|
585
|
-
}
|
|
586
|
-
// 2. 必须导入 printHistoricalNotice
|
|
587
|
-
if (!sourceContainsIdentifier(content, "printHistoricalNotice")) {
|
|
588
|
-
issues.push("缺少 printHistoricalNotice 调用");
|
|
589
|
-
}
|
|
590
|
-
// 3. 必须包含 historical_only: true(JSON 输出场景)
|
|
591
|
-
if (!sourceContainsIdentifier(content, "historical_only") && !sourceContainsIdentifier(content, "getHistoricalJsonFields")) {
|
|
592
|
-
issues.push("JSON 输出缺少 historical_only: true / getHistoricalJsonFields()");
|
|
593
|
-
}
|
|
594
|
-
// 4. 底部消息不得称 Release Gate(应为历史施工 Gate)
|
|
595
|
-
if (/Release Gate/.test(content)) {
|
|
596
|
-
issues.push("底部消息仍称 Release Gate");
|
|
597
|
-
}
|
|
598
|
-
if (issues.length > 0) {
|
|
599
|
-
hardFail("HISTORICAL_GATE_NOT_RELEASE_PROOF", `旧 gate ${gf} 未完成历史降级: ${issues.join("; ")}`, [gf], `validate-batch${batchNum}`, "旧 gate 误导性的通过结论被标记为不可作为发布依据", "完成历史降级");
|
|
600
|
-
}
|
|
601
|
-
}
|
|
602
|
-
_info(` 已检查 ${gateFiles.length} 个旧 gate 和 package.json 历史声明`);
|
|
603
|
-
}
|
|
604
|
-
// ── 6. 测试污染初筛 ──
|
|
605
|
-
function checkTestPollution(rootDir, hardFail, _info) {
|
|
606
|
-
const categories = { product_test: [], useful_contract_test: [], batch_construction_test: [], suspicious_test_pollution: [] };
|
|
607
|
-
const usefulContractExemptions = new Set([
|
|
608
|
-
"tests/engine/implementation_roadmap_registry.test.ts",
|
|
609
|
-
]);
|
|
610
|
-
const testDir = path.join(rootDir, "tests");
|
|
611
|
-
function scanTestDir(dir) {
|
|
612
|
-
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
613
|
-
for (const entry of entries) {
|
|
614
|
-
const full = path.join(dir, entry.name);
|
|
615
|
-
if (entry.isDirectory()) {
|
|
616
|
-
scanTestDir(full);
|
|
617
|
-
}
|
|
618
|
-
else if (entry.isFile() && (entry.name.endsWith(".test.ts") || entry.name.endsWith(".test.js"))) {
|
|
619
|
-
const content = safeRead(full);
|
|
620
|
-
if (!content)
|
|
621
|
-
continue;
|
|
622
|
-
const rel = path.relative(rootDir, full);
|
|
623
|
-
const isScenarioMatrix = rel.includes("scenario_matrix");
|
|
624
|
-
const isBatchGateRelated = /batch\d/.test(content) && !rel.includes("scripts/");
|
|
625
|
-
const checksImplementedVerified = content.includes("implemented_verified");
|
|
626
|
-
const checksFileExists = /existsSync/.test(content) && /required.*file/i.test(content);
|
|
627
|
-
const checksScenarioSelfAttest = /fixture_status.*ready|scenario.*status.*PASS/.test(content);
|
|
628
|
-
const hasPlaceholderTest = /场景注册占位/.test(content) || /expect\s*\(\s*true\s*\)\s*\.\s*toBe\s*\(\s*true\s*\)/.test(content) || /registered\s+only/.test(content);
|
|
629
|
-
const hasTodoPlaceholder = /\bit\s*\.\s*todo\s*\(/.test(content) || /\bdescribe\s*\.\s*todo\s*\(/.test(content);
|
|
630
|
-
if (hasPlaceholderTest || hasTodoPlaceholder) {
|
|
631
|
-
categories.suspicious_test_pollution.push(rel);
|
|
632
|
-
}
|
|
633
|
-
else if (isScenarioMatrix) {
|
|
634
|
-
categories.batch_construction_test.push(rel);
|
|
635
|
-
}
|
|
636
|
-
else if (usefulContractExemptions.has(rel)) {
|
|
637
|
-
categories.useful_contract_test.push(rel);
|
|
638
|
-
}
|
|
639
|
-
else if (isBatchGateRelated && (checksImplementedVerified || checksFileExists)) {
|
|
640
|
-
categories.suspicious_test_pollution.push(rel);
|
|
641
|
-
}
|
|
642
|
-
else if (checksScenarioSelfAttest && !content.includes("真实") && !content.includes("real")) {
|
|
643
|
-
categories.suspicious_test_pollution.push(rel);
|
|
644
|
-
}
|
|
645
|
-
else if (checksFileExists && !isBatchGateRelated) {
|
|
646
|
-
categories.useful_contract_test.push(rel);
|
|
647
|
-
}
|
|
648
|
-
else {
|
|
649
|
-
categories.product_test.push(rel);
|
|
650
|
-
}
|
|
651
|
-
}
|
|
652
|
-
}
|
|
653
|
-
}
|
|
654
|
-
scanTestDir(testDir);
|
|
655
|
-
_info(` product_test: ${categories.product_test.length} 个`);
|
|
656
|
-
_info(` useful_contract_test: ${categories.useful_contract_test.length} 个`);
|
|
657
|
-
_info(` batch_construction_test: ${categories.batch_construction_test.length} 个`);
|
|
658
|
-
_info(` suspicious_test_pollution: ${categories.suspicious_test_pollution.length} 个`);
|
|
659
|
-
for (const t of categories.suspicious_test_pollution) {
|
|
660
|
-
_info(` [可疑] ${t}`);
|
|
661
|
-
}
|
|
662
|
-
if (categories.suspicious_test_pollution.length > 0) {
|
|
663
|
-
hardFail("SUSPICIOUS_TEST_POLLUTION", `发现 ${categories.suspicious_test_pollution.length} 个可疑测试文件: 可能只为 Batch 状态、implemented_verified、文件存在、scenario 自证而存在`, categories.suspicious_test_pollution, "测试体系", "旧 gate 把这些测试作为通过证据,但它们可能是循环自证", "删除测试污染");
|
|
664
|
-
}
|
|
665
|
-
}
|
|
666
|
-
// ── 8. 关键问题消费验证 (problem-17/38/57) ──
|
|
667
|
-
async function checkCriticalProblemConsumption(rootDir, hardFail, _info) {
|
|
668
|
-
const taskContextPath = path.join(rootDir, "src/engine/task_context.ts");
|
|
669
|
-
const cliPath = path.join(rootDir, "src/bin/soloforge.ts");
|
|
670
|
-
// problem-17: StateFact 分区 — save() 必须调用 validateStateFactPartition,hard_fail 必须 throw
|
|
671
|
-
const stateFactPath = path.join(rootDir, "src/engine/state_fact_classifier.ts");
|
|
672
|
-
if (!fs.existsSync(stateFactPath)) {
|
|
673
|
-
hardFail("CRITICAL_PROBLEM_FILE_MISSING", "problem-17: state_fact_classifier.ts 不存在", ["src/engine/state_fact_classifier.ts"], "problem-17", "发布门禁不检查 problem-17 实现", "创建 state_fact_classifier.ts");
|
|
674
|
-
}
|
|
675
|
-
else {
|
|
676
|
-
const sfContent = safeRead(stateFactPath);
|
|
677
|
-
const tcContent = safeRead(taskContextPath);
|
|
678
|
-
if (!sfContent || !sourceContainsIdentifier(sfContent, "validateStateFactPartition")) {
|
|
679
|
-
hardFail("CRITICAL_PROBLEM_EXPORT_MISSING", "problem-17: state_fact_classifier.ts 未导出 validateStateFactPartition", ["src/engine/state_fact_classifier.ts"], "problem-17", "StateFact 分类器缺少核心导出函数", "添加 validateStateFactPartition 导出");
|
|
680
|
-
}
|
|
681
|
-
if (!tcContent || !sourceContainsIdentifier(tcContent, "validateStateFactPartition")) {
|
|
682
|
-
hardFail("CRITICAL_PROBLEM_NOT_CONSUMED", "problem-17: task_context.ts save() 未调用 validateStateFactPartition", ["src/engine/task_context.ts", "src/engine/state_fact_classifier.ts"], "problem-17", "StateFact 分区定义存在但未接入 TaskContext 保存路径", "在 task_context.ts save() 中接入 validateStateFactPartition");
|
|
683
|
-
}
|
|
684
|
-
else {
|
|
685
|
-
// 验证 hard_fail 时 throw(不是静默跳过)
|
|
686
|
-
const tcLines = tcContent.split("\n");
|
|
687
|
-
const vspLine = tcLines.findIndex(l => l.includes("validateStateFactPartition"));
|
|
688
|
-
if (vspLine === -1) {
|
|
689
|
-
hardFail("CRITICAL_PROBLEM_NOT_CONSUMED", "problem-17: task_context.ts save() 未调用 validateStateFactPartition", ["src/engine/task_context.ts"], "problem-17", "StateFact 分区定义存在但未接入 TaskContext 保存路径", "接入 validateStateFactPartition");
|
|
690
|
-
}
|
|
691
|
-
else {
|
|
692
|
-
// 检查调用后有 hard_fail throw 路径
|
|
693
|
-
const afterVsp = tcLines.slice(vspLine, vspLine + 15).join("\n");
|
|
694
|
-
if (!afterVsp.includes("throw") || !afterVsp.includes("hardFails") && !afterVsp.includes("hard_fail")) {
|
|
695
|
-
hardFail("CRITICAL_PROBLEM_SOFT_ENFORCEMENT", "problem-17: task_context.ts 中 validateStateFactPartition 调用后缺少 hard_fail throw 路径", ["src/engine/task_context.ts"], "problem-17", "StateFact 校验结果被忽略而非阻断", "校验 hard_fail 时 throw Error");
|
|
696
|
-
}
|
|
697
|
-
}
|
|
698
|
-
}
|
|
699
|
-
}
|
|
700
|
-
// problem-38: Retention Policy — cleanup 必须调用 evaluateCleanup/checkForbiddenContent,存在 referenced evidence 保护
|
|
701
|
-
const retentionPath = path.join(rootDir, "src/engine/retention_policy.ts");
|
|
702
|
-
if (!fs.existsSync(retentionPath)) {
|
|
703
|
-
hardFail("CRITICAL_PROBLEM_FILE_MISSING", "problem-38: retention_policy.ts 不存在", ["src/engine/retention_policy.ts"], "problem-38", "发布门禁不检查 problem-38 实现", "创建 retention_policy.ts");
|
|
704
|
-
}
|
|
705
|
-
else {
|
|
706
|
-
const retContent = safeRead(retentionPath);
|
|
707
|
-
if (!retContent || !retContent.includes("evaluateCleanup") || !retContent.includes("checkForbiddenContent")) {
|
|
708
|
-
hardFail("CRITICAL_PROBLEM_EXPORT_MISSING", "problem-38: retention_policy.ts 未导出 evaluateCleanup 或 checkForbiddenContent", ["src/engine/retention_policy.ts"], "problem-38", "Retention Policy 缺少核心清理函数", "添加 evaluateCleanup 和 checkForbiddenContent 导出");
|
|
709
|
-
}
|
|
710
|
-
const tcContent = safeRead(taskContextPath);
|
|
711
|
-
const cliContent = safeRead(cliPath);
|
|
712
|
-
const tcHasCleanup = tcContent?.includes("evaluateCleanup") ?? false;
|
|
713
|
-
const cliHasCleanup = cliContent?.includes("evaluateCleanup") ?? false;
|
|
714
|
-
const cliHasCheck = cliContent?.includes("checkForbiddenContent") ?? false;
|
|
715
|
-
if (!tcHasCleanup && !cliHasCleanup) {
|
|
716
|
-
hardFail("CRITICAL_PROBLEM_NOT_CONSUMED", "problem-38: evaluateCleanup 未被 task_context.ts 或 soloforge.ts 调用", ["src/engine/task_context.ts", "src/bin/soloforge.ts", "src/engine/retention_policy.ts"], "problem-38", "Retention Policy 定义存在但无清理消费者", "将 evaluateCleanup 接入 TaskContext cleanup 或 CLI cleanup 命令");
|
|
717
|
-
}
|
|
718
|
-
// 验证 CLI cleanup 中有 referenced evidence 保护逻辑
|
|
719
|
-
if (cliContent) {
|
|
720
|
-
const cliLines = cliContent.split("\n");
|
|
721
|
-
const cleanupFn = cliLines.findIndex(l => l.match(/^(async\s+)?function\s+cmdCleanup/));
|
|
722
|
-
if (cleanupFn !== -1) {
|
|
723
|
-
// 搜索到下一个顶层函数或文件末尾
|
|
724
|
-
let cleanupEnd = cliLines.length;
|
|
725
|
-
for (let i = cleanupFn + 3; i < cliLines.length; i++) {
|
|
726
|
-
if (cliLines[i].match(/^async function\s+\w+|^function\s+\w+/)) {
|
|
727
|
-
cleanupEnd = i;
|
|
728
|
-
break;
|
|
729
|
-
}
|
|
730
|
-
}
|
|
731
|
-
const cleanupBody = cliLines.slice(cleanupFn, cleanupEnd).join("\n");
|
|
732
|
-
if (!cleanupBody.includes("referencedEvidenceIds") || !cleanupBody.includes("is_referenced")) {
|
|
733
|
-
hardFail("CRITICAL_PROBLEM_SOFT_ENFORCEMENT", "problem-38: CLI cleanup 缺少真实 evidence 引用扫描(无 referencedEvidenceIds 或 is_referenced 逻辑)", ["src/bin/soloforge.ts"], "problem-38", "cleanup 未扫描 task context / governance report 中的 evidence 引用", "添加真实引用扫描");
|
|
734
|
-
}
|
|
735
|
-
// 验证策略异常导致非零退出
|
|
736
|
-
if (!cleanupBody.includes("process.exit(1)")) {
|
|
737
|
-
hardFail("CRITICAL_PROBLEM_SOFT_ENFORCEMENT", "problem-38: CLI cleanup 策略异常时未非零退出", ["src/bin/soloforge.ts"], "problem-38", "策略异常被吞而非阻断", "添加 process.exit(1) 在 catch 中");
|
|
738
|
-
}
|
|
739
|
-
}
|
|
740
|
-
}
|
|
741
|
-
}
|
|
742
|
-
// problem-57: Knowledge Asset Audit — audit-template-mechanisms 必须调用 auditKnowledgeAssets 且 hard_fail/异常 process.exit(1)
|
|
743
|
-
const kaAuditPath = path.join(rootDir, "src/engine/knowledge_asset_audit.ts");
|
|
744
|
-
if (!fs.existsSync(kaAuditPath)) {
|
|
745
|
-
hardFail("CRITICAL_PROBLEM_FILE_MISSING", "problem-57: knowledge_asset_audit.ts 不存在", ["src/engine/knowledge_asset_audit.ts"], "problem-57", "发布门禁不检查 problem-57 实现", "创建 knowledge_asset_audit.ts");
|
|
746
|
-
}
|
|
747
|
-
else {
|
|
748
|
-
const kaContent = safeRead(kaAuditPath);
|
|
749
|
-
if (!kaContent || !kaContent.includes("auditKnowledgeAssets")) {
|
|
750
|
-
hardFail("CRITICAL_PROBLEM_EXPORT_MISSING", "problem-57: knowledge_asset_audit.ts 未导出 auditKnowledgeAssets", ["src/engine/knowledge_asset_audit.ts"], "problem-57", "Knowledge Asset Audit 缺少核心审计函数", "添加 auditKnowledgeAssets 导出");
|
|
751
|
-
}
|
|
752
|
-
const cliContent = safeRead(cliPath);
|
|
753
|
-
if (!cliContent?.includes("auditKnowledgeAssets")) {
|
|
754
|
-
hardFail("CRITICAL_PROBLEM_NOT_CONSUMED", "problem-57: auditKnowledgeAssets 未被 soloforge.ts CLI 消费", ["src/bin/soloforge.ts", "src/engine/knowledge_asset_audit.ts"], "problem-57", "Knowledge Asset Audit 定义存在但未接入 CLI", "将 auditKnowledgeAssets 接入 audit-template-mechanisms 命令");
|
|
755
|
-
}
|
|
756
|
-
else {
|
|
757
|
-
// 验证 hard_fail 阻断路径
|
|
758
|
-
const cliLines = cliContent.split("\n");
|
|
759
|
-
const kaCallLine = cliLines.findIndex(l => l.includes("auditKnowledgeAssets") && l.includes("await"));
|
|
760
|
-
if (kaCallLine !== -1) {
|
|
761
|
-
// 搜索到函数末尾(下一个 async function 或文件末尾)
|
|
762
|
-
let kaEnd = cliLines.length;
|
|
763
|
-
for (let i = kaCallLine + 1; i < cliLines.length; i++) {
|
|
764
|
-
if (cliLines[i].match(/^async function\s+\w+|^function\s+\w+/)) {
|
|
765
|
-
kaEnd = i;
|
|
766
|
-
break;
|
|
767
|
-
}
|
|
768
|
-
}
|
|
769
|
-
const afterKaCall = cliLines.slice(kaCallLine, kaEnd).join("\n");
|
|
770
|
-
if (!afterKaCall.includes("hard_fail_count") || !afterKaCall.includes("process.exit(1)")) {
|
|
771
|
-
hardFail("CRITICAL_PROBLEM_SOFT_ENFORCEMENT", "problem-57: auditKnowledgeAssets 调用后 hard_fail 未阻断(缺少 process.exit(1))", ["src/bin/soloforge.ts"], "problem-57", "知识资产审计 hard_fail 未阻断命令", "添加 hard_fail_count > 0 时 process.exit(1)");
|
|
772
|
-
}
|
|
773
|
-
// 验证异常也阻断(搜索整个函数体中的 catch 块)
|
|
774
|
-
const catchBlocks = afterKaCall.match(/catch\s*\(e[^)]*\)\s*\{[^}]+\}/g);
|
|
775
|
-
const hasKaAudit = afterKaCall.includes("auditKnowledgeAssets");
|
|
776
|
-
if (catchBlocks && hasKaAudit) {
|
|
777
|
-
for (const cb of catchBlocks) {
|
|
778
|
-
// 只检查紧跟 auditKnowledgeAssets 的 catch
|
|
779
|
-
if (cb.includes("process.exit(1)"))
|
|
780
|
-
continue;
|
|
781
|
-
// 检查是否是 auditKnowledgeAssets 的 catch(通过位置判断)
|
|
782
|
-
}
|
|
783
|
-
}
|
|
784
|
-
// 简化: 检查 auditKnowledgeAssets 后面的 catch 块中是否有 process.exit(1)
|
|
785
|
-
const kaCatchIdx = afterKaCall.lastIndexOf("catch");
|
|
786
|
-
if (kaCatchIdx !== -1) {
|
|
787
|
-
const afterCatch = afterKaCall.slice(kaCatchIdx);
|
|
788
|
-
if (!afterCatch.includes("process.exit(1)")) {
|
|
789
|
-
hardFail("CRITICAL_PROBLEM_SOFT_ENFORCEMENT", "problem-57: auditKnowledgeAssets 异常时未阻断(catch 中缺少 process.exit(1))", ["src/bin/soloforge.ts"], "problem-57", "知识资产审计异常被吞而非阻断", "catch 中添加 process.exit(1)");
|
|
790
|
-
}
|
|
791
|
-
}
|
|
792
|
-
}
|
|
793
|
-
}
|
|
794
|
-
}
|
|
795
|
-
_info(" problem-17/38/57 消费验证完成");
|
|
796
|
-
// 问题六十:证据驱动与反幻觉契约 — 行为级检查
|
|
797
|
-
{
|
|
798
|
-
const evidenceGroundingPath = path.join(rootDir, "src/engine/evidence_grounding_contract.ts");
|
|
799
|
-
if (!fs.existsSync(evidenceGroundingPath)) {
|
|
800
|
-
hardFail("CRITICAL_PROBLEM_FILE_MISSING", "problem-60: evidence_grounding_contract.ts 不存在", ["src/engine/evidence_grounding_contract.ts"], "problem-60", "发布门禁不检查 problem-60 实现", "创建 evidence_grounding_contract.ts");
|
|
801
|
-
}
|
|
802
|
-
else {
|
|
803
|
-
// 行为级检查:动态导入并验证核心门禁行为
|
|
804
|
-
try {
|
|
805
|
-
const eg = await import(path.join(rootDir, "dist/engine/evidence_grounding_contract.js"));
|
|
806
|
-
const sys = eg.createEvidenceGroundingSystem();
|
|
807
|
-
// 检查 1:无证据高风险 claim 必须被 blocked
|
|
808
|
-
{
|
|
809
|
-
const noEvClaims = [{
|
|
810
|
-
id: "gate-test-no-ev", claim_text: "项目使用 React", category: "project_fact",
|
|
811
|
-
evidence_ids: [], is_uncertain: false, risk_level: "high",
|
|
812
|
-
}];
|
|
813
|
-
const noEvResult = sys.verifier.verify(noEvClaims, "high");
|
|
814
|
-
if (noEvResult.unsupported.length === 0) {
|
|
815
|
-
hardFail("CRITICAL_PROBLEM_BEHAVIOR", "problem-60: 无证据高风险 claim 未被 blocked", ["src/engine/evidence_grounding_contract.ts"], "problem-60", "FactClaimVerifier 未阻断无证据声明", "验证 classify 逻辑");
|
|
816
|
-
}
|
|
817
|
-
}
|
|
818
|
-
// 检查 2:generated_inference 单独支撑 project_fact 必须被 blocked
|
|
819
|
-
{
|
|
820
|
-
const infEv = sys.registry.register({
|
|
821
|
-
source_type: "generated_inference", authority: "weak", freshness: "unknown",
|
|
822
|
-
permission: "allowed", scope: "test", description: "推理",
|
|
823
|
-
});
|
|
824
|
-
const infClaims = [{
|
|
825
|
-
id: "gate-test-inference", claim_text: "项目使用 Vue", category: "tech_stack",
|
|
826
|
-
evidence_ids: [infEv.id], is_uncertain: false, risk_level: "high",
|
|
827
|
-
}];
|
|
828
|
-
const infResult = sys.verifier.verify(infClaims, "high");
|
|
829
|
-
if (infResult.unsupported.length === 0) {
|
|
830
|
-
hardFail("CRITICAL_PROBLEM_BEHAVIOR", "problem-60: generated_inference 单独支撑 project_fact 未被 blocked", ["src/engine/evidence_grounding_contract.ts"], "problem-60", "FactClaimVerifier 未阻断推理自证", "验证 isSelfAttestation 逻辑");
|
|
831
|
-
}
|
|
832
|
-
}
|
|
833
|
-
// 检查 3:validation_plan 冒充 validation_result 必须被 blocked
|
|
834
|
-
{
|
|
835
|
-
const planEv = sys.registry.register({
|
|
836
|
-
source_type: "generated_inference", authority: "weak", freshness: "unknown",
|
|
837
|
-
permission: "allowed", scope: "test", description: "验证计划",
|
|
838
|
-
});
|
|
839
|
-
const planClaims = [{
|
|
840
|
-
id: "gate-test-plan-as-result", claim_text: "验证已通过",
|
|
841
|
-
category: "validation_result",
|
|
842
|
-
evidence_ids: [planEv.id], is_uncertain: false, risk_level: "high",
|
|
843
|
-
}];
|
|
844
|
-
const planResult = sys.verifier.verify(planClaims, "high");
|
|
845
|
-
if (planResult.unsupported.length === 0) {
|
|
846
|
-
hardFail("CRITICAL_PROBLEM_BEHAVIOR", "problem-60: validation_plan 冒充 validation_result 未被 blocked", ["src/engine/evidence_grounding_contract.ts"], "problem-60", "FactClaimVerifier 未阻断验证计划冒充", "验证 validation_result 检查逻辑");
|
|
847
|
-
}
|
|
848
|
-
}
|
|
849
|
-
// 检查 4:forbidden source 必须被 blocked
|
|
850
|
-
{
|
|
851
|
-
const matrix = sys.builder.buildContext([], {
|
|
852
|
-
target_claims: [], source_types: [], keywords: [], max_results: 10,
|
|
853
|
-
});
|
|
854
|
-
matrix.evidence.push({
|
|
855
|
-
id: "ev-forbidden-test", source_type: "project_file",
|
|
856
|
-
authority: "authoritative", freshness: "current",
|
|
857
|
-
permission: "forbidden", scope: "sensitive",
|
|
858
|
-
description: "敏感数据", timestamp: new Date().toISOString(),
|
|
859
|
-
});
|
|
860
|
-
matrix.risk_summary = { low: 0, medium: 0, high: 0, critical: 1 };
|
|
861
|
-
const forbiddenResult = sys.gate.evaluate(matrix, "high");
|
|
862
|
-
if (forbiddenResult.allowed) {
|
|
863
|
-
hardFail("CRITICAL_PROBLEM_BEHAVIOR", "problem-60: forbidden source 未被 UnsupportedClaimGate 阻断", ["src/engine/evidence_grounding_contract.ts"], "problem-60", "UnsupportedClaimGate 允许 forbidden 证据通过", "验证 forbidden 检查逻辑");
|
|
864
|
-
}
|
|
865
|
-
}
|
|
866
|
-
// 检查 5:conflict unresolved 必须被 blocked(高风险)
|
|
867
|
-
{
|
|
868
|
-
const confMatrix = sys.builder.buildContext([], {
|
|
869
|
-
target_claims: [], source_types: [], keywords: [], max_results: 10,
|
|
870
|
-
});
|
|
871
|
-
confMatrix.conflicts.push({
|
|
872
|
-
claim_id: "claim-conflict-test",
|
|
873
|
-
conflicting_evidence_ids: ["ev-a", "ev-b"],
|
|
874
|
-
description: "矛盾",
|
|
875
|
-
resolution_status: "unresolved",
|
|
876
|
-
});
|
|
877
|
-
confMatrix.risk_summary = { low: 0, medium: 0, high: 1, critical: 0 };
|
|
878
|
-
const confResult = sys.gate.evaluate(confMatrix, "high");
|
|
879
|
-
if (confResult.allowed) {
|
|
880
|
-
hardFail("CRITICAL_PROBLEM_BEHAVIOR", "problem-60: unresolved conflict 未被 UnsupportedClaimGate 阻断", ["src/engine/evidence_grounding_contract.ts"], "problem-60", "UnsupportedClaimGate 允许未裁决冲突通过", "验证 conflict 检查逻辑");
|
|
881
|
-
}
|
|
882
|
-
}
|
|
883
|
-
// 检查 6:classification-only 证据不得支撑 architecture 声明
|
|
884
|
-
{
|
|
885
|
-
sys.registry.clear();
|
|
886
|
-
const clsOnlyEv = sys.registry.register({
|
|
887
|
-
source_type: "task_context", authority: "authoritative", freshness: "current",
|
|
888
|
-
permission: "allowed", scope: "classification", description: "任务分类结果",
|
|
889
|
-
});
|
|
890
|
-
const clsOnlyClaims = [{
|
|
891
|
-
id: "gate-test-cls-only", claim_text: "技术方案基于现有系统分析",
|
|
892
|
-
category: "architecture",
|
|
893
|
-
evidence_ids: [clsOnlyEv.id], is_uncertain: false, risk_level: "high",
|
|
894
|
-
}];
|
|
895
|
-
const clsOnlyResult = sys.verifier.verify(clsOnlyClaims, "high");
|
|
896
|
-
if (clsOnlyResult.unsupported.length === 0) {
|
|
897
|
-
hardFail("CRITICAL_PROBLEM_BEHAVIOR", "problem-60: classification-only 证据支撑 architecture 声明未被 blocked", ["src/engine/evidence_grounding_contract.ts"], "problem-60", "FactClaimVerifier 允许 task_context:classification 支撑项目事实声明", "验证 CATEGORY_REQUIRED_SOURCES 逻辑");
|
|
898
|
-
}
|
|
899
|
-
}
|
|
900
|
-
// 检查 7:project_file + project_source_file 证据可以支撑 architecture 声明
|
|
901
|
-
{
|
|
902
|
-
sys.registry.clear();
|
|
903
|
-
const pfEv = sys.registry.register({
|
|
904
|
-
source_type: "project_file", evidence_role: "project_source_file",
|
|
905
|
-
authority: "authoritative", freshness: "current",
|
|
906
|
-
permission: "allowed", scope: "src/", description: "项目源码文件",
|
|
907
|
-
});
|
|
908
|
-
const pfClaims = [{
|
|
909
|
-
id: "gate-test-pf-ok", claim_text: "技术方案基于现有系统分析",
|
|
910
|
-
category: "architecture",
|
|
911
|
-
evidence_ids: [pfEv.id], is_uncertain: false, risk_level: "high",
|
|
912
|
-
}];
|
|
913
|
-
const pfResult = sys.verifier.verify(pfClaims, "high");
|
|
914
|
-
if (pfResult.unsupported.length > 0) {
|
|
915
|
-
hardFail("CRITICAL_PROBLEM_BEHAVIOR", "problem-60: project_source_file 证据支撑 architecture 声明被错误 blocked", ["src/engine/evidence_grounding_contract.ts"], "problem-60", "FactClaimVerifier 误阻断了有效证据", "验证 CATEGORY_REQUIRED_ROLES 逻辑");
|
|
916
|
-
}
|
|
917
|
-
}
|
|
918
|
-
// 检查 8:template_guidance 证据不得支撑 architecture 声明
|
|
919
|
-
{
|
|
920
|
-
sys.registry.clear();
|
|
921
|
-
const tgEv = sys.registry.register({
|
|
922
|
-
source_type: "knowledge_asset", evidence_role: "template_guidance",
|
|
923
|
-
authority: "trusted", freshness: "current",
|
|
924
|
-
permission: "allowed", scope: "knowledge", description: "默认模板",
|
|
925
|
-
});
|
|
926
|
-
const tgClaims = [{
|
|
927
|
-
id: "gate-test-tg-block", claim_text: "技术方案基于现有系统分析",
|
|
928
|
-
category: "architecture",
|
|
929
|
-
evidence_ids: [tgEv.id], is_uncertain: false, risk_level: "high",
|
|
930
|
-
}];
|
|
931
|
-
const tgResult = sys.verifier.verify(tgClaims, "high");
|
|
932
|
-
if (tgResult.unsupported.length === 0) {
|
|
933
|
-
hardFail("CRITICAL_PROBLEM_BEHAVIOR", "problem-60: template_guidance 证据支撑 architecture 声明未被 blocked", ["src/engine/evidence_grounding_contract.ts"], "problem-60", "FactClaimVerifier 允许 template_guidance 支撑项目事实声明", "验证 CATEGORY_REQUIRED_ROLES 逻辑");
|
|
934
|
-
}
|
|
935
|
-
}
|
|
936
|
-
// 检查 9:project_source_file 证据角色可以支撑 architecture 声明
|
|
937
|
-
{
|
|
938
|
-
sys.registry.clear();
|
|
939
|
-
const psfEv = sys.registry.register({
|
|
940
|
-
source_type: "project_file", evidence_role: "project_source_file",
|
|
941
|
-
authority: "authoritative", freshness: "current",
|
|
942
|
-
permission: "allowed", scope: "src/", description: "项目源码文件",
|
|
943
|
-
});
|
|
944
|
-
const psfClaims = [{
|
|
945
|
-
id: "gate-test-psf-ok", claim_text: "技术方案基于现有系统分析",
|
|
946
|
-
category: "architecture",
|
|
947
|
-
evidence_ids: [psfEv.id], is_uncertain: false, risk_level: "high",
|
|
948
|
-
}];
|
|
949
|
-
const psfResult = sys.verifier.verify(psfClaims, "high");
|
|
950
|
-
if (psfResult.unsupported.length > 0) {
|
|
951
|
-
hardFail("CRITICAL_PROBLEM_BEHAVIOR", "problem-60: project_source_file 角色支撑 architecture 声明被错误 blocked", ["src/engine/evidence_grounding_contract.ts"], "problem-60", "FactClaimVerifier 误阻断了有效 project_source_file 证据", "验证 CATEGORY_REQUIRED_ROLES 逻辑");
|
|
952
|
-
}
|
|
953
|
-
}
|
|
954
|
-
// 检查 10:普通 code_change 不应因无 project_source_file 被 blocked(无 architecture claim 时)
|
|
955
|
-
{
|
|
956
|
-
sys.registry.clear();
|
|
957
|
-
const clsEv = sys.registry.register({
|
|
958
|
-
source_type: "task_context", evidence_role: "classification",
|
|
959
|
-
authority: "authoritative", freshness: "current",
|
|
960
|
-
permission: "allowed", scope: "classification", description: "任务分类结果",
|
|
961
|
-
});
|
|
962
|
-
// 普通 code_change 只有 user_confirmation claim(无 architecture claim)
|
|
963
|
-
const ccClaims = [{
|
|
964
|
-
id: "gate-test-cc-ok", claim_text: "任务路由和执行范围已确认",
|
|
965
|
-
category: "user_confirmation",
|
|
966
|
-
evidence_ids: [clsEv.id], is_uncertain: false, risk_level: "high",
|
|
967
|
-
}];
|
|
968
|
-
const ccResult = sys.verifier.verify(ccClaims, "high");
|
|
969
|
-
if (ccResult.unsupported.length > 0) {
|
|
970
|
-
hardFail("CRITICAL_PROBLEM_BEHAVIOR", "problem-60: 普通 code_change 的 user_confirmation claim 被 classification 证据错误 blocked", ["src/engine/evidence_grounding_contract.ts"], "problem-60", "FactClaimVerifier 误阻断了不需要项目事实的普通任务", "验证 claim 语义逻辑");
|
|
971
|
-
}
|
|
972
|
-
}
|
|
973
|
-
// 检查 11:architecture_design 无真实项目证据必须 blocked
|
|
974
|
-
{
|
|
975
|
-
sys.registry.clear();
|
|
976
|
-
const clsOnlyEv = sys.registry.register({
|
|
977
|
-
source_type: "task_context", evidence_role: "classification",
|
|
978
|
-
authority: "authoritative", freshness: "current",
|
|
979
|
-
permission: "allowed", scope: "classification", description: "任务分类结果",
|
|
980
|
-
});
|
|
981
|
-
const tgOnlyEv = sys.registry.register({
|
|
982
|
-
source_type: "knowledge_asset", evidence_role: "template_guidance",
|
|
983
|
-
authority: "trusted", freshness: "current",
|
|
984
|
-
permission: "allowed", scope: "knowledge", description: "默认模板",
|
|
985
|
-
});
|
|
986
|
-
const archClaims = [{
|
|
987
|
-
id: "gate-test-arch-block", claim_text: "技术方案基于现有系统分析",
|
|
988
|
-
category: "architecture",
|
|
989
|
-
evidence_ids: [clsOnlyEv.id, tgOnlyEv.id], is_uncertain: false, risk_level: "high",
|
|
990
|
-
}];
|
|
991
|
-
const archResult = sys.verifier.verify(archClaims, "high");
|
|
992
|
-
if (archResult.unsupported.length === 0) {
|
|
993
|
-
hardFail("CRITICAL_PROBLEM_BEHAVIOR", "problem-60: architecture_design 无真实项目证据未被 blocked(classification + template_guidance 不够)", ["src/engine/evidence_grounding_contract.ts"], "problem-60", "FactClaimVerifier 允许非项目证据支撑架构声明", "验证 CATEGORY_REQUIRED_ROLES + claim 语义逻辑");
|
|
994
|
-
}
|
|
995
|
-
}
|
|
996
|
-
}
|
|
997
|
-
catch (behaviorErr) {
|
|
998
|
-
hardFail("CRITICAL_PROBLEM_BEHAVIOR", `problem-60: 行为级检查执行失败: ${behaviorErr?.message ?? behaviorErr}`, ["src/engine/evidence_grounding_contract.ts"], "problem-60", "证据驱动机制行为检查不可执行", "修复 import 或机制代码");
|
|
999
|
-
}
|
|
1000
|
-
}
|
|
1001
|
-
// 静态检查:导出完整性
|
|
1002
|
-
const egContent = safeRead(evidenceGroundingPath);
|
|
1003
|
-
if (egContent) {
|
|
1004
|
-
const requiredExports = ["createEvidenceGroundingSystem", "assessTaskRisk", "EvidenceSourceRegistry", "FactClaimVerifier", "UnsupportedClaimGate"];
|
|
1005
|
-
for (const exp of requiredExports) {
|
|
1006
|
-
if (!egContent.includes(exp)) {
|
|
1007
|
-
hardFail("CRITICAL_PROBLEM_EXPORT_MISSING", `problem-60: evidence_grounding_contract.ts 缺少导出: ${exp}`, ["src/engine/evidence_grounding_contract.ts"], "problem-60", "证据驱动机制缺少核心导出", `添加 ${exp} 导出`);
|
|
1008
|
-
}
|
|
1009
|
-
}
|
|
1010
|
-
}
|
|
1011
|
-
// 静态检查:InstructionContract schema 必须包含 evidence 字段
|
|
1012
|
-
const instrContractPath = path.join(rootDir, "src/engine/instruction_contract.ts");
|
|
1013
|
-
const instrContent = safeRead(instrContractPath);
|
|
1014
|
-
if (instrContent) {
|
|
1015
|
-
const evidenceFields = ["evidence_matrix", "unsupported_claim_policy", "uncertainty_policy", "conflict_resolution_policy"];
|
|
1016
|
-
for (const field of evidenceFields) {
|
|
1017
|
-
if (!instrContent.includes(field)) {
|
|
1018
|
-
hardFail("CRITICAL_PROBLEM_SCHEMA_INCOMPLETE", `problem-60: instruction_contract.ts schema 缺少证据字段: ${field}`, ["src/engine/instruction_contract.ts"], "problem-60", "施工指令契约缺少证据驱动字段", `添加 ${field} 字段`);
|
|
1019
|
-
}
|
|
1020
|
-
}
|
|
1021
|
-
}
|
|
1022
|
-
// 静态检查:主链路必须有 runtime 阻断(不能只是 advisory)
|
|
1023
|
-
const toolsPath = path.join(rootDir, "src/adapters/claude_code/tools.ts");
|
|
1024
|
-
const toolsContent = safeRead(toolsPath);
|
|
1025
|
-
if (!toolsContent?.includes("evidence_grounding_contract")) {
|
|
1026
|
-
hardFail("CRITICAL_PROBLEM_NOT_CONSUMED", "problem-60: tools.ts 未消费 evidence_grounding_contract", ["src/adapters/claude_code/tools.ts"], "problem-60", "证据驱动机制未接入主链路", "在 sf_expand/sf_verify/sf_deliver 中接入");
|
|
1027
|
-
}
|
|
1028
|
-
// sf_expand 必须有 blocked/manual_required 分支
|
|
1029
|
-
if (toolsContent && !toolsContent.includes("_evGate.allowed") && !toolsContent.includes("evidence_blocked")) {
|
|
1030
|
-
hardFail("CRITICAL_PROBLEM_ADVISORY_ONLY", "problem-60: sf_expand 证据检查只有 advisory,缺少 blocked 分支", ["src/adapters/claude_code/tools.ts"], "problem-60", "sf_expand 证据门禁不阻断", "添加 evidence gate blocked 分支");
|
|
1031
|
-
}
|
|
1032
|
-
// sf_verify: 验证计划描述行中不得包含 source_type: "validation_result"
|
|
1033
|
-
if (toolsContent) {
|
|
1034
|
-
// 找到 sf_verify handler 中问题六十部分
|
|
1035
|
-
const verifyStart = toolsContent.indexOf("问题六十:验证结论必须经过 FactClaimVerifier");
|
|
1036
|
-
const verifyEnd = toolsContent.indexOf("// 验证后核心体验评估", verifyStart);
|
|
1037
|
-
if (verifyStart >= 0 && verifyEnd >= 0) {
|
|
1038
|
-
const verifySection = toolsContent.substring(verifyStart, verifyEnd);
|
|
1039
|
-
// 检查验证计划注册调用中是否使用了 validation_result
|
|
1040
|
-
const planRegMatch = verifySection.match(/register\(\{[^}]*验证计划:[^}]*\}\)/s);
|
|
1041
|
-
if (planRegMatch && planRegMatch[0].includes("source_type: \"validation_result\"")) {
|
|
1042
|
-
hardFail("CRITICAL_PROBLEM_PLAN_AS_RESULT", "problem-60: sf_verify 把验证计划注册为 validation_result", ["src/adapters/claude_code/tools.ts"], "problem-60", "验证计划冒充验证结果", "验证计划应注册为 task_context 类型");
|
|
1043
|
-
}
|
|
1044
|
-
}
|
|
1045
|
-
}
|
|
1046
|
-
// 静态检查:负向测试
|
|
1047
|
-
const testPath = path.join(rootDir, "tests/engine/evidence_grounding_contract.test.ts");
|
|
1048
|
-
if (!fs.existsSync(testPath)) {
|
|
1049
|
-
hardFail("CRITICAL_PROBLEM_TEST_MISSING", "problem-60: 缺少负向测试文件", ["tests/engine/evidence_grounding_contract.test.ts"], "problem-60", "证据驱动机制缺少测试覆盖", "创建 evidence_grounding_contract.test.ts");
|
|
1050
|
-
}
|
|
1051
|
-
// 静态检查:知识规则
|
|
1052
|
-
const kaRulePath = path.join(rootDir, "templates/knowledge/rules/证据驱动与反幻觉规则.md");
|
|
1053
|
-
if (!fs.existsSync(kaRulePath)) {
|
|
1054
|
-
hardFail("CRITICAL_PROBLEM_ASSET_MISSING", "problem-60: 缺少知识规则文件 证据驱动与反幻觉规则.md", ["templates/knowledge/rules/证据驱动与反幻觉规则.md"], "problem-60", "证据驱动知识规则缺失", "创建知识规则文件");
|
|
1055
|
-
}
|
|
1056
|
-
// 静态检查:workflow_template
|
|
1057
|
-
const wfPath = path.join(rootDir, "src/adapters/shared/workflow_template.ts");
|
|
1058
|
-
const wfContent = safeRead(wfPath);
|
|
1059
|
-
if (!wfContent?.includes("wf-evidence-grounding")) {
|
|
1060
|
-
hardFail("CRITICAL_PROBLEM_TEMPLATE_MISSING", "problem-60: workflow_template.ts 缺少 wf-evidence-grounding 硬规则", ["src/adapters/shared/workflow_template.ts"], "problem-60", "工作流模板未包含证据驱动规则", "添加 wf-evidence-grounding 硬规则");
|
|
1061
|
-
}
|
|
1062
|
-
// 静态检查:TaskContext 类型必须有证据字段
|
|
1063
|
-
const typesPath = path.join(rootDir, "src/types.ts");
|
|
1064
|
-
const typesContent = safeRead(typesPath);
|
|
1065
|
-
if (typesContent && !typesContent.includes("evidence_matrix?:") && !typesContent.includes("evidence_gate_result?:")) {
|
|
1066
|
-
hardFail("CRITICAL_PROBLEM_TASKCTX_MISSING", "problem-60: TaskContext 缺少 evidence_matrix/evidence_gate_result 字段", ["src/types.ts"], "problem-60", "TaskContext 未保存证据结果", "添加 evidence_matrix 和 evidence_gate_result 字段");
|
|
1067
|
-
}
|
|
1068
|
-
// 静态检查:task_context.ts 必须有 setEvidenceGroundingResult 写入方法
|
|
1069
|
-
const tcPath = path.join(rootDir, "src/engine/task_context.ts");
|
|
1070
|
-
const tcContent = safeRead(tcPath);
|
|
1071
|
-
if (tcContent && !sourceContainsIdentifier(tcContent, "setEvidenceGroundingResult")) {
|
|
1072
|
-
hardFail("CRITICAL_PROBLEM_NO_WRITEBACK", "problem-60: task_context.ts 缺少 setEvidenceGroundingResult 写入方法", ["src/engine/task_context.ts"], "problem-60", "TaskContext 只有类型字段没有写入方法", "添加 setEvidenceGroundingResult 方法");
|
|
1073
|
-
}
|
|
1074
|
-
// 静态检查:tools.ts 主链路必须调用 setEvidenceGroundingResult
|
|
1075
|
-
if (toolsContent && !toolsContent.includes("setEvidenceGroundingResult")) {
|
|
1076
|
-
hardFail("CRITICAL_PROBLEM_NO_RUNTIME_WRITEBACK", "problem-60: tools.ts 未调用 setEvidenceGroundingResult 写回 TaskContext", ["src/adapters/claude_code/tools.ts"], "problem-60", "主链路不写回证据结果到 TaskContext", "在 sf_expand/sf_verify/sf_deliver 中调用 setEvidenceGroundingResult");
|
|
1077
|
-
}
|
|
1078
|
-
// 静态检查:tools.ts 不得出现 registry.query({}).map() 无差别证据绑定
|
|
1079
|
-
if (toolsContent) {
|
|
1080
|
-
const toolsLines = toolsContent.split("\n");
|
|
1081
|
-
for (let i = 0; i < toolsLines.length; i++) {
|
|
1082
|
-
if (/registry\.query\(\{\}\)\.map/.test(toolsLines[i])) {
|
|
1083
|
-
hardFail("CRITICAL_PROBLEM_INDISCRIMINATE_BINDING", `problem-60: tools.ts:${i + 1} 使用 registry.query({}).map() 无差别绑定证据到所有 claim`, ["src/adapters/claude_code/tools.ts"], "problem-60", "所有 registry 证据被无差别绑定到所有 claim,不区分语义", "按 claim 语义筛选 evidence_ids");
|
|
1084
|
-
}
|
|
1085
|
-
}
|
|
1086
|
-
}
|
|
1087
|
-
// 行为检查:setEvidenceGroundingResult 写入后 load 能读回
|
|
1088
|
-
try {
|
|
1089
|
-
const tcModule = await import(path.join(rootDir, "dist/engine/task_context.js"));
|
|
1090
|
-
const tmpStateDir = path.join(rootDir, ".soloforge", "state");
|
|
1091
|
-
const fsModule = await import("node:fs");
|
|
1092
|
-
if (!fsModule.existsSync(tmpStateDir)) {
|
|
1093
|
-
fsModule.mkdirSync(tmpStateDir, { recursive: true });
|
|
1094
|
-
}
|
|
1095
|
-
const tmpMgr = new tcModule.TaskContextManager(tmpStateDir);
|
|
1096
|
-
const tmpCtx = await tmpMgr.create("gate-evidence-writeback-test", "test");
|
|
1097
|
-
const testMatrix = {
|
|
1098
|
-
task_id: tmpCtx.task_id, claims: [], evidence: [],
|
|
1099
|
-
conflicts: [], unsupported_claims: ["test-claim"],
|
|
1100
|
-
risk_summary: { low: 0, medium: 0, high: 1, critical: 0 },
|
|
1101
|
-
created_at: new Date().toISOString(),
|
|
1102
|
-
};
|
|
1103
|
-
const testGate = {
|
|
1104
|
-
allowed: false, reason_zh: "测试", diagnostic_code: "SF-EVIDENCE-TEST",
|
|
1105
|
-
unsupported_claims: ["test-claim"], unresolved_conflicts: [],
|
|
1106
|
-
missing_evidence: [], risk_level: "high",
|
|
1107
|
-
requires_user_confirmation: [],
|
|
1108
|
-
};
|
|
1109
|
-
await tmpMgr.setEvidenceGroundingResult(tmpCtx.task_id, {
|
|
1110
|
-
evidence_matrix: testMatrix,
|
|
1111
|
-
evidence_gate_result: testGate,
|
|
1112
|
-
unsupported_claims: ["test-claim"],
|
|
1113
|
-
});
|
|
1114
|
-
const loaded = await tmpMgr.load(tmpCtx.task_id);
|
|
1115
|
-
if (!loaded?.evidence_matrix || !loaded?.evidence_gate_result) {
|
|
1116
|
-
hardFail("CRITICAL_PROBLEM_WRITEBACK_FAILED", "problem-60: setEvidenceGroundingResult 写入后 load 无法读回", ["src/engine/task_context.ts"], "problem-60", "TaskContext 写入方法不工作", "修复 setEvidenceGroundingResult 或 save/load");
|
|
1117
|
-
}
|
|
1118
|
-
if (loaded.evidence_gate_result?.allowed !== false) {
|
|
1119
|
-
hardFail("CRITICAL_PROBLEM_WRITEBACK_CORRUPT", "problem-60: setEvidenceGroundingResult 写入的 gate result 数据损坏", ["src/engine/task_context.ts"], "problem-60", "写入的 allowed=false 被读回为 true", "检查序列化逻辑");
|
|
1120
|
-
}
|
|
1121
|
-
// 清理测试任务
|
|
1122
|
-
try {
|
|
1123
|
-
fsModule.rmSync(path.join(tmpStateDir, `${tmpCtx.task_id}.json`), { force: true });
|
|
1124
|
-
}
|
|
1125
|
-
catch { }
|
|
1126
|
-
}
|
|
1127
|
-
catch (wbErr) {
|
|
1128
|
-
hardFail("CRITICAL_PROBLEM_WRITEBACK_ERROR", `problem-60: setEvidenceGroundingResult 行为检查失败: ${wbErr?.message ?? wbErr}`, ["src/engine/task_context.ts"], "problem-60", "TaskContext 写入方法不可用", "修复 import 或方法实现");
|
|
1129
|
-
}
|
|
1130
|
-
}
|
|
1131
|
-
_info(" problem-60 证据驱动消费验证完成");
|
|
1132
|
-
}
|
|
1133
|
-
// ── 7. Batch 问题文档格式一致性 ──
|
|
1134
|
-
async function checkBatchIssueFormatConsistency(rootDir, hardFail, _info) {
|
|
1135
|
-
// 复用 scripts/batch_issue_details.mjs 的共享解析逻辑,不维护独立的问题识别规则
|
|
1136
|
-
const scriptPath = path.join(rootDir, "scripts", "batch_issue_details.mjs");
|
|
1137
|
-
let loadBatchIssueDetails;
|
|
1138
|
-
let validateCanonicalIssueLedger;
|
|
1139
|
-
try {
|
|
1140
|
-
const mod = await import(scriptPath);
|
|
1141
|
-
loadBatchIssueDetails = mod.loadBatchIssueDetails;
|
|
1142
|
-
validateCanonicalIssueLedger = mod.validateCanonicalIssueLedger;
|
|
1143
|
-
}
|
|
1144
|
-
catch (e) {
|
|
1145
|
-
hardFail("BATCH_ISSUE_FORMAT_INCONSISTENT", `无法加载共享解析脚本: ${e.message}`, ["scripts/batch_issue_details.mjs"], "构建系统", "共享解析脚本不可用", "修复脚本");
|
|
1146
|
-
return;
|
|
1147
|
-
}
|
|
1148
|
-
if (!loadBatchIssueDetails || !validateCanonicalIssueLedger) {
|
|
1149
|
-
hardFail("BATCH_ISSUE_FORMAT_INCONSISTENT", "共享解析脚本缺少 Batch 加载或 canonical ledger 校验导出", ["scripts/batch_issue_details.mjs"], "构建系统", "共享解析脚本导出不正确", "修复脚本");
|
|
1150
|
-
return;
|
|
1151
|
-
}
|
|
1152
|
-
const expectedCounts = { 1: 19, 2: 12, 3: 9, 4: 14, 5: 6, 6: 5, 7: 2, 8: 5, 9: 1 };
|
|
1153
|
-
const parsedBatches = [];
|
|
1154
|
-
const requiredPerProblemSections = [
|
|
1155
|
-
"问题背景", "用户反馈 / 触发场景", "根因分析", "解决方案", "方案细节",
|
|
1156
|
-
"硬规则", "非目标", "影响范围", "落地文件", "验收标准", "回归风险",
|
|
1157
|
-
"与其他问题的关联", "发布门禁要求",
|
|
1158
|
-
];
|
|
1159
|
-
for (let batch = 1; batch <= 9; batch++) {
|
|
1160
|
-
const details = loadBatchIssueDetails(batch, rootDir);
|
|
1161
|
-
parsedBatches.push(details);
|
|
1162
|
-
if (!details.loaded) {
|
|
1163
|
-
hardFail("BATCH_ISSUE_FORMAT_INCONSISTENT", `Batch${batch} 问题集未加载: ${details.error}`, [`docs/SoloForge-Batch${batch}问题集.md`], `Batch${batch}`, "旧 gate 只检查文档存在,不验证是否可解析", "第 3 步统一格式");
|
|
1164
|
-
continue;
|
|
1165
|
-
}
|
|
1166
|
-
// 检查问题数量(问题X 已被 loadBatchIssueDetails 过滤)
|
|
1167
|
-
const expected = expectedCounts[batch];
|
|
1168
|
-
if (details.issue_count !== expected) {
|
|
1169
|
-
hardFail("BATCH_ISSUE_COUNT_MISMATCH", `Batch${batch} 实际问题数=${details.issue_count},期望=${expected}`, [`docs/SoloForge-Batch${batch}问题集.md`], `Batch${batch}`, "旧 gate 不检查问题数量一致性", "第 3 步统一格式");
|
|
1170
|
-
}
|
|
1171
|
-
// 检查方案细节表和落点表
|
|
1172
|
-
const content = details.markdown;
|
|
1173
|
-
if (!/Batch\s+\d+\s+全问题方案细节表/.test(content)) {
|
|
1174
|
-
hardFail("BATCH_ISSUE_FORMAT_INCONSISTENT", `Batch${batch} 缺少全问题方案细节表`, [`docs/SoloForge-Batch${batch}问题集.md`], `Batch${batch}`, "旧 gate 不检查文档结构一致性", "第 3 步统一格式");
|
|
1175
|
-
}
|
|
1176
|
-
if (!/Batch\s+\d+\s+全问题(细节)?落点表/.test(content)) {
|
|
1177
|
-
hardFail("BATCH_ISSUE_FORMAT_INCONSISTENT", `Batch${batch} 缺少全问题落点表`, [`docs/SoloForge-Batch${batch}问题集.md`], `Batch${batch}`, "旧 gate 不检查文档结构一致性", "第 3 步统一格式");
|
|
1178
|
-
}
|
|
1179
|
-
if (!/Batch\s+\d+\s+全问题真实性落点表/.test(content)) {
|
|
1180
|
-
hardFail("BATCH_ISSUE_FORMAT_INCONSISTENT", `Batch${batch} 缺少全问题真实性落点表`, [`docs/SoloForge-Batch${batch}问题集.md`], `Batch${batch}`, "旧 gate 不检查文档结构一致性", "第 3 步统一格式");
|
|
1181
|
-
}
|
|
1182
|
-
// 基于 loadBatchIssueDetails 结果检查必备章节
|
|
1183
|
-
for (const issue of details.issues) {
|
|
1184
|
-
const sectionNames = (issue.sections || []).map((s) => s.heading);
|
|
1185
|
-
const missing = requiredPerProblemSections.filter(s => !sectionNames.some(sn => sn.includes(s)));
|
|
1186
|
-
if (missing.length > 0) {
|
|
1187
|
-
hardFail("BATCH_ISSUE_FORMAT_INCONSISTENT", `Batch${batch} ${issue.issue_label} 缺少必备章节: ${missing.join(", ")}(其他 Batch 的问题均有这些章节)`, [`docs/SoloForge-Batch${batch}问题集.md`], `Batch${batch}/${issue.issue_label}`, "旧 gate 只检查文档存在和行数,不检查问题内部结构完整性", "第 3 步统一格式");
|
|
1188
|
-
}
|
|
1189
|
-
// 检查章节顺序
|
|
1190
|
-
const expectedOrder = [
|
|
1191
|
-
"问题背景", "用户反馈 / 触发场景", "根因分析", "解决方案", "方案细节",
|
|
1192
|
-
"硬规则", "非目标", "影响范围", "落地文件", "验收标准", "回归风险",
|
|
1193
|
-
"与其他问题的关联", "发布门禁要求",
|
|
1194
|
-
];
|
|
1195
|
-
if (sectionNames.length >= expectedOrder.length) {
|
|
1196
|
-
const orderOk = expectedOrder.length === sectionNames.length
|
|
1197
|
-
&& expectedOrder.every((v, i) => sectionNames[i] === v);
|
|
1198
|
-
if (!orderOk) {
|
|
1199
|
-
hardFail("BATCH_ISSUE_FORMAT_INCONSISTENT", `Batch${batch} ${issue.issue_label} 章节顺序不符合模板要求: 实际 ${sectionNames.slice(0, 5).join(", ")}...`, [`docs/SoloForge-Batch${batch}问题集.md`], `Batch${batch}/${issue.issue_label}`, "旧 gate 只检查章节存在,不检查章节顺序", "第 3 步统一格式");
|
|
1200
|
-
}
|
|
1201
|
-
}
|
|
1202
|
-
}
|
|
1203
|
-
_info(` Batch${batch}: 已检查 (${details.issue_count} 个问题)`);
|
|
1204
|
-
}
|
|
1205
|
-
try {
|
|
1206
|
-
const roadmapPath = path.join(rootDir, "dist", "engine", "implementation_roadmap_registry.js");
|
|
1207
|
-
const roadmap = await import(roadmapPath);
|
|
1208
|
-
const roadmapProblems = roadmap.listAllProblems();
|
|
1209
|
-
const ledgerFindings = validateCanonicalIssueLedger(parsedBatches, roadmapProblems, 73);
|
|
1210
|
-
for (const finding of ledgerFindings) {
|
|
1211
|
-
hardFail("CANONICAL_ISSUE_LEDGER_INCONSISTENT", finding.message, ["scripts/batch_issue_details.mjs", "src/engine/implementation_roadmap_registry.ts"], finding.issue_label ?? finding.problem_id ?? "canonical-ledger", "旧 gate 只校验单份文档格式与数量,不校验 Batch 文档和 roadmap 的唯一身份映射", "修正 canonical issue ID、文档归属或 roadmap 登记");
|
|
1212
|
-
}
|
|
1213
|
-
const roadmapFindings = roadmap.validateImplementationRoadmap()
|
|
1214
|
-
.filter((finding) => finding.severity === "hard_fail");
|
|
1215
|
-
for (const finding of roadmapFindings) {
|
|
1216
|
-
hardFail("CANONICAL_ISSUE_LEDGER_INCONSISTENT", finding.message, ["src/engine/implementation_roadmap_registry.ts"], finding.subject_id ?? "roadmap", "旧 gate 不执行 roadmap 内部双向引用校验", "修正 ProblemEntry 与 ImplementationBatch 的双向归属");
|
|
1217
|
-
}
|
|
1218
|
-
if (ledgerFindings.length === 0 && roadmapFindings.length === 0) {
|
|
1219
|
-
_info(" canonical ledger: 问题文档与 roadmap 的 73 个问题身份、归属一致");
|
|
1220
|
-
}
|
|
1221
|
-
}
|
|
1222
|
-
catch (e) {
|
|
1223
|
-
hardFail("CANONICAL_ISSUE_LEDGER_INCONSISTENT", `无法执行 canonical 问题账本对账: ${e.message}`, ["scripts/batch_issue_details.mjs", "src/engine/implementation_roadmap_registry.ts"], "canonical-ledger", "旧 gate 不加载 roadmap 执行文档双向对账", "先完成 build 并修复账本校验入口");
|
|
1224
|
-
}
|
|
1225
|
-
_info(" 说明: 本检查不修改文档;格式或 canonical 身份不一致会阻断发布。");
|
|
1226
|
-
}
|
|
1227
|
-
// ── 机制身份一致性 ──
|
|
1228
|
-
async function checkMechanismIdentityConsistency(rootDir, hardFail, _info) {
|
|
1229
|
-
// 加载 DL registry
|
|
1230
|
-
const dlPath = path.join(rootDir, "dist/engine/dual_layer_mechanism_registry.js");
|
|
1231
|
-
if (!fs.existsSync(dlPath)) {
|
|
1232
|
-
hardFail("MECHANISM_IDENTITY", "dual_layer_mechanism_registry.js 未编译", ["dist/engine/"], "机制身份一致性", "旧 gate 不检查机制身份一致性", "npm run build");
|
|
1233
|
-
return;
|
|
1234
|
-
}
|
|
1235
|
-
let dlModule;
|
|
1236
|
-
try {
|
|
1237
|
-
dlModule = await import(dlPath);
|
|
1238
|
-
}
|
|
1239
|
-
catch (e) {
|
|
1240
|
-
hardFail("MECHANISM_IDENTITY", `无法加载 dual_layer_mechanism_registry: ${e.message}`, ["dist/engine/"], "机制身份一致性", "旧 gate 不检查机制身份一致性", "修复编译错误");
|
|
1241
|
-
return;
|
|
1242
|
-
}
|
|
1243
|
-
const canonicalIds = dlModule.getAllCanonicalMechanismIds();
|
|
1244
|
-
const resolveId = dlModule.resolveMechanismId;
|
|
1245
|
-
const aliases = dlModule.MECHANISM_ALIASES;
|
|
1246
|
-
// 加载 MC registry
|
|
1247
|
-
const mcPath = path.join(rootDir, "dist/engine/mechanism_contract_registry.js");
|
|
1248
|
-
if (!fs.existsSync(mcPath)) {
|
|
1249
|
-
hardFail("MECHANISM_IDENTITY", "mechanism_contract_registry.js 未编译", ["dist/engine/"], "机制身份一致性", "旧 gate 不检查机制身份一致性", "npm run build");
|
|
1250
|
-
return;
|
|
1251
|
-
}
|
|
1252
|
-
let mcModule;
|
|
1253
|
-
try {
|
|
1254
|
-
mcModule = await import(mcPath);
|
|
1255
|
-
}
|
|
1256
|
-
catch (e) {
|
|
1257
|
-
hardFail("MECHANISM_IDENTITY", `无法加载 mechanism_contract_registry: ${e.message}`, ["dist/engine/"], "机制身份一致性", "旧 gate 不检查机制身份一致性", "修复编译错误");
|
|
1258
|
-
return;
|
|
1259
|
-
}
|
|
1260
|
-
const mcContracts = mcModule.listMechanismContracts();
|
|
1261
|
-
// 检查 MC 中 active/enforced 的机制必须能解析到 DL canonical ID
|
|
1262
|
-
for (const c of mcContracts) {
|
|
1263
|
-
if (c.status === "deprecated")
|
|
1264
|
-
continue;
|
|
1265
|
-
const resolved = resolveId(c.id);
|
|
1266
|
-
if (!canonicalIds.has(resolved)) {
|
|
1267
|
-
hardFail("MECHANISM_IDENTITY", `mechanism_contract_registry 中 ${c.id} (status=${c.status}) 无法解析到 dual_layer_mechanism_registry 的正式机制 ID (resolved=${resolved})`, ["src/engine/mechanism_contract_registry.ts", "src/engine/dual_layer_mechanism_registry.ts"], c.id, "旧 gate 不检查 MC 与 DL 的机制身份一致性", `在 dual_layer_mechanism_registry.ts 中添加 ${resolved} 或建立 alias 映射`);
|
|
1268
|
-
}
|
|
1269
|
-
}
|
|
1270
|
-
// 检查 DL 中的机制必须能解析到 MC 中(canonical 或 deprecated alias)
|
|
1271
|
-
const mcIds = new Set(mcContracts.map((c) => c.id));
|
|
1272
|
-
for (const id of canonicalIds) {
|
|
1273
|
-
if (!mcIds.has(id)) {
|
|
1274
|
-
hardFail("MECHANISM_IDENTITY", `dual_layer_mechanism_registry 中 ${id} 在 mechanism_contract_registry 中不存在`, ["src/engine/dual_layer_mechanism_registry.ts", "src/engine/mechanism_contract_registry.ts"], id, "旧 gate 不检查 DL 与 MC 的双向一致性", `在 mechanism_contract_registry.ts 中添加 ${id}`);
|
|
1275
|
-
}
|
|
1276
|
-
}
|
|
1277
|
-
// 检查 templates/knowledge frontmatter owner_mechanism_id 可解析
|
|
1278
|
-
const knowledgeDir = path.join(rootDir, "templates/knowledge");
|
|
1279
|
-
if (fs.existsSync(knowledgeDir)) {
|
|
1280
|
-
const knowledgeFiles = findFilesRecursive(knowledgeDir, ".md");
|
|
1281
|
-
for (const f of knowledgeFiles) {
|
|
1282
|
-
const content = safeRead(f);
|
|
1283
|
-
if (!content)
|
|
1284
|
-
continue;
|
|
1285
|
-
const match = content.match(/^owner_mechanism_id:\s*(.+)$/m);
|
|
1286
|
-
if (match) {
|
|
1287
|
-
const ownerId = match[1].trim();
|
|
1288
|
-
const resolved = resolveId(ownerId);
|
|
1289
|
-
if (!canonicalIds.has(resolved)) {
|
|
1290
|
-
hardFail("MECHANISM_IDENTITY", `模板 ${path.relative(rootDir, f)} 的 owner_mechanism_id="${ownerId}" 无法解析到正式机制 ID (resolved=${resolved})`, [path.relative(rootDir, f)], ownerId, "旧 gate 不检查知识模板的 owner_mechanism_id 可解析性", `将 owner_mechanism_id 改为正式机制 ID 或建立 alias 映射`);
|
|
1291
|
-
}
|
|
1292
|
-
}
|
|
1293
|
-
}
|
|
1294
|
-
}
|
|
1295
|
-
// 检查 consumable_asset_registry owner_mechanism_id 可解析
|
|
1296
|
-
const carPath = path.join(rootDir, "dist/engine/consumable_asset_registry.js");
|
|
1297
|
-
if (fs.existsSync(carPath)) {
|
|
1298
|
-
try {
|
|
1299
|
-
const carModule = await import(carPath);
|
|
1300
|
-
const assets = carModule.listBuiltinConsumableAssets();
|
|
1301
|
-
for (const a of assets) {
|
|
1302
|
-
if (!a.owner_mechanism_id)
|
|
1303
|
-
continue;
|
|
1304
|
-
const resolved = resolveId(a.owner_mechanism_id);
|
|
1305
|
-
if (!canonicalIds.has(resolved)) {
|
|
1306
|
-
hardFail("MECHANISM_IDENTITY", `consumable_asset_registry 中 ${a.id} 的 owner_mechanism_id="${a.owner_mechanism_id}" 无法解析到正式机制 ID`, ["src/engine/consumable_asset_registry.ts"], a.owner_mechanism_id, "旧 gate 不检查 consumable_asset 的 owner_mechanism_id 可解析性", `将 owner_mechanism_id 改为正式机制 ID 或建立 alias 映射`);
|
|
1307
|
-
}
|
|
1308
|
-
}
|
|
1309
|
-
}
|
|
1310
|
-
catch { /* 模块加载失败,跳过 */ }
|
|
1311
|
-
}
|
|
1312
|
-
// 检查 workflow_contract_registry required_mechanisms/advisory_mechanisms 可解析
|
|
1313
|
-
const wcPath = path.join(rootDir, "dist/engine/workflow_contract_registry.js");
|
|
1314
|
-
if (fs.existsSync(wcPath)) {
|
|
1315
|
-
try {
|
|
1316
|
-
const wcModule = await import(wcPath);
|
|
1317
|
-
const contracts = wcModule.listWorkflowContracts();
|
|
1318
|
-
for (const c of contracts) {
|
|
1319
|
-
for (const mId of [...c.required_mechanisms, ...c.advisory_mechanisms]) {
|
|
1320
|
-
const resolved = resolveId(mId);
|
|
1321
|
-
if (!canonicalIds.has(resolved)) {
|
|
1322
|
-
hardFail("MECHANISM_IDENTITY", `workflow_contract_registry 中 ${c.id} 引用机制 "${mId}" 无法解析到正式机制 ID (resolved=${resolved})`, ["src/engine/workflow_contract_registry.ts"], mId, "旧 gate 不检查 workflow required_mechanisms 的可解析性", `将 ${mId} 改为正式机制 ID 或建立 alias 映射`);
|
|
1323
|
-
}
|
|
1324
|
-
}
|
|
1325
|
-
}
|
|
1326
|
-
}
|
|
1327
|
-
catch { /* 模块加载失败,跳过 */ }
|
|
1328
|
-
}
|
|
1329
|
-
// 检查 asset_manifest owner_mechanism_id 可解析
|
|
1330
|
-
const amSrcPath = path.join(rootDir, "src/engine/asset_manifest.ts");
|
|
1331
|
-
if (fs.existsSync(amSrcPath)) {
|
|
1332
|
-
const amContent = safeRead(amSrcPath);
|
|
1333
|
-
if (amContent) {
|
|
1334
|
-
const ownerMatches = amContent.matchAll(/owner_mechanism_id:\s*"([^"]+)"/g);
|
|
1335
|
-
for (const m of ownerMatches) {
|
|
1336
|
-
const ownerId = m[1];
|
|
1337
|
-
const resolved = resolveId(ownerId);
|
|
1338
|
-
if (!canonicalIds.has(resolved)) {
|
|
1339
|
-
hardFail("MECHANISM_IDENTITY", `asset_manifest.ts 中 owner_mechanism_id="${ownerId}" 无法解析到正式机制 ID`, ["src/engine/asset_manifest.ts"], ownerId, "旧 gate 不检查 asset_manifest 的 owner_mechanism_id 可解析性", `将 owner_mechanism_id 改为正式机制 ID 或建立 alias 映射`);
|
|
1340
|
-
}
|
|
1341
|
-
}
|
|
1342
|
-
}
|
|
1343
|
-
}
|
|
1344
|
-
}
|
|
1345
|
-
function findFilesRecursive(dir, ext) {
|
|
1346
|
-
const results = [];
|
|
1347
|
-
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
1348
|
-
const full = path.join(dir, entry.name);
|
|
1349
|
-
if (entry.isDirectory())
|
|
1350
|
-
results.push(...findFilesRecursive(full, ext));
|
|
1351
|
-
else if (entry.name.endsWith(ext))
|
|
1352
|
-
results.push(full);
|
|
1353
|
-
}
|
|
1354
|
-
return results;
|
|
1355
|
-
}
|
|
1356
|
-
// ── Phase 10: P0/P1 知识资产 schema 完整性 ──
|
|
1357
|
-
async function checkKnowledgeAssetSchema(rootDir, hardFail, _info) {
|
|
1358
|
-
const matter = (await import("gray-matter")).default;
|
|
1359
|
-
const { validateKnowledgeAssetFrontmatter } = await import("./knowledge_asset_schema.js");
|
|
1360
|
-
const knowledgeDir = path.join(rootDir, "templates", "knowledge");
|
|
1361
|
-
if (!fs.existsSync(knowledgeDir))
|
|
1362
|
-
return;
|
|
1363
|
-
const mdFiles = findFilesRecursive(knowledgeDir, ".md");
|
|
1364
|
-
for (const filePath of mdFiles) {
|
|
1365
|
-
const raw = fs.readFileSync(filePath, "utf-8");
|
|
1366
|
-
const { data: frontmatter } = matter(raw);
|
|
1367
|
-
if (!frontmatter || Object.keys(frontmatter).length === 0)
|
|
1368
|
-
continue;
|
|
1369
|
-
if (!frontmatter.asset_kind)
|
|
1370
|
-
continue;
|
|
1371
|
-
const findings = validateKnowledgeAssetFrontmatter(frontmatter, filePath);
|
|
1372
|
-
for (const f of findings) {
|
|
1373
|
-
if (f.severity === "hard_fail") {
|
|
1374
|
-
hardFail(`KA_SCHEMA_${f.kind}`, f.message_zh, [filePath], f.asset_id, "旧 validate-release 不独立校验知识资产 schema", "补齐缺失的 frontmatter 字段");
|
|
1375
|
-
}
|
|
1376
|
-
}
|
|
1377
|
-
}
|
|
1378
|
-
}
|
|
1379
|
-
// ── Phase 11: engine console 直写检查 ──
|
|
1380
|
-
function checkEngineConsoleLog(rootDir, hardFail) {
|
|
1381
|
-
// 扫描全 src/ 目录(不仅 engine)
|
|
1382
|
-
const srcDir = path.join(rootDir, "src");
|
|
1383
|
-
if (!fs.existsSync(srcDir))
|
|
1384
|
-
return;
|
|
1385
|
-
const files = findFilesRecursive(srcDir, ".ts");
|
|
1386
|
-
for (const file of files) {
|
|
1387
|
-
const content = fs.readFileSync(file, "utf-8");
|
|
1388
|
-
const lines = content.split("\n");
|
|
1389
|
-
for (let i = 0; i < lines.length; i++) {
|
|
1390
|
-
const line = lines[i];
|
|
1391
|
-
if (/^\s*\/\//.test(line))
|
|
1392
|
-
continue;
|
|
1393
|
-
if (/^\s*\*|^\s*\/\*/.test(line))
|
|
1394
|
-
continue;
|
|
1395
|
-
if (/"console\.log"|`console\.log`|'console\.log'|console\\.log/.test(line))
|
|
1396
|
-
continue;
|
|
1397
|
-
// 日志模块内部 stdout/stderr 封装允许 console.log / console.error
|
|
1398
|
-
if (/logger\.ts$/.test(file) && /^\s*console\.(log|error)\(/.test(line))
|
|
1399
|
-
continue;
|
|
1400
|
-
const directConsole = line.match(/console\.(log|warn|error|debug)\s*\(/);
|
|
1401
|
-
if (directConsole) {
|
|
1402
|
-
const rel = path.relative(rootDir, file);
|
|
1403
|
-
hardFail("ENGINE_DIRECT_CONSOLE", `${rel}:${i + 1} 使用 console.${directConsole[1]}(应使用 logger 模块)`, [rel], "发布门禁 console 检查", "旧 gate 不检查 src/ 全目录 console 直写", "替换为 logger 模块调用");
|
|
1404
|
-
}
|
|
1405
|
-
}
|
|
1406
|
-
}
|
|
1407
|
-
}
|
|
1408
|
-
// ── Phase 12: 中文注释检查 ──
|
|
1409
|
-
function checkChineseComments(rootDir, hardFail) {
|
|
1410
|
-
const srcDir = path.join(rootDir, "src");
|
|
1411
|
-
if (!fs.existsSync(srcDir))
|
|
1412
|
-
return;
|
|
1413
|
-
const tsFiles = findFilesRecursive(srcDir, ".ts");
|
|
1414
|
-
for (const file of tsFiles) {
|
|
1415
|
-
const content = fs.readFileSync(file, "utf-8");
|
|
1416
|
-
const lines = content.split("\n");
|
|
1417
|
-
for (let i = 0; i < lines.length; i++) {
|
|
1418
|
-
const line = lines[i];
|
|
1419
|
-
if (!/^\s*\/\//.test(line))
|
|
1420
|
-
continue;
|
|
1421
|
-
if (/[一-龥]/.test(line))
|
|
1422
|
-
continue;
|
|
1423
|
-
// 跳过装饰分隔线
|
|
1424
|
-
if (/^\s*\/\/\s*[─═\-~=*#]+\s*$/.test(line))
|
|
1425
|
-
continue;
|
|
1426
|
-
// 跳过工具指令
|
|
1427
|
-
if (/@ts-|eslint|TODO|FIXME|NOTE|prettier|istanbul|c8/.test(line))
|
|
1428
|
-
continue;
|
|
1429
|
-
// 跳过机制 ID 标签
|
|
1430
|
-
if (/\/\/\s*──\s*\d+\./.test(line))
|
|
1431
|
-
continue;
|
|
1432
|
-
if (/\/\/\s*mc-[a-z]/.test(line))
|
|
1433
|
-
continue;
|
|
1434
|
-
// 跳过纯代码标识符
|
|
1435
|
-
if (/^\s*\/\/\s*[a-z][a-z0-9_.\/-]+\s*$/.test(line))
|
|
1436
|
-
continue;
|
|
1437
|
-
// 跳过大小标注
|
|
1438
|
-
if (/^\s*\/\/\s*\d+\s*(MB|KB|GB|ms|min|分钟|秒)/.test(line))
|
|
1439
|
-
continue;
|
|
1440
|
-
// 跳过技术术语注释
|
|
1441
|
-
if (/^\s*\/\/\s*[a-z_]+\.[a-z_]+/.test(line))
|
|
1442
|
-
continue;
|
|
1443
|
-
// 检查连续 4+ 字母
|
|
1444
|
-
if (/[a-zA-Z]{4,}/.test(line)) {
|
|
1445
|
-
const rel = path.relative(rootDir, file);
|
|
1446
|
-
hardFail("ENGLISH_COMMENT", `${rel}:${i + 1}: ${line.trim()}(应使用中文注释)`, [rel], "中文注释检查", "旧 gate 不检查中文注释", "将英文注释改为中文");
|
|
1447
|
-
}
|
|
1448
|
-
}
|
|
1449
|
-
}
|
|
1450
|
-
}
|
|
1451
|
-
// ── 13. 第五批文档↔roadmap↔scenario 一致性 ──
|
|
1452
|
-
async function checkLastBatchConsistency(rootDir, hardFail, _info) {
|
|
1453
|
-
// 动态导入避免循环依赖
|
|
1454
|
-
const roadmapPath = path.join(rootDir, "dist", "engine", "implementation_roadmap_registry.js");
|
|
1455
|
-
const scenarioPath = path.join(rootDir, "dist", "engine", "release_gate_scenario_registry.js");
|
|
1456
|
-
let listAllProblems;
|
|
1457
|
-
let listBatches;
|
|
1458
|
-
let RELEASE_GATE_SCENARIOS;
|
|
1459
|
-
let runAllReleaseGateScenarios;
|
|
1460
|
-
try {
|
|
1461
|
-
const roadmap = await import(roadmapPath);
|
|
1462
|
-
listAllProblems = roadmap.listAllProblems;
|
|
1463
|
-
listBatches = roadmap.listBatches;
|
|
1464
|
-
}
|
|
1465
|
-
catch {
|
|
1466
|
-
hardFail("LAST_BATCH_CONSISTENCY", "无法导入 implementation_roadmap_registry", ["src/engine/implementation_roadmap_registry.ts"], "末批一致性", "旧 gate 不检查 roadmap↔scenario 一致性", "先 build");
|
|
1467
|
-
return;
|
|
1468
|
-
}
|
|
1469
|
-
try {
|
|
1470
|
-
const scenario = await import(scenarioPath);
|
|
1471
|
-
RELEASE_GATE_SCENARIOS = scenario.RELEASE_GATE_SCENARIOS;
|
|
1472
|
-
runAllReleaseGateScenarios = scenario.runAllReleaseGateScenarios;
|
|
1473
|
-
}
|
|
1474
|
-
catch {
|
|
1475
|
-
hardFail("LAST_BATCH_CONSISTENCY", "无法导入 release_gate_scenario_registry", ["src/engine/release_gate_scenario_registry.ts"], "末批一致性", "旧 gate 不检查 roadmap↔scenario 一致性", "先 build");
|
|
1476
|
-
return;
|
|
1477
|
-
}
|
|
1478
|
-
// 1. 末批必须存在且包含 problem-55 到 problem-60
|
|
1479
|
-
const batches = listBatches();
|
|
1480
|
-
const lastBatch = batches.find((b) => b.batch_id === "batch-5");
|
|
1481
|
-
if (!lastBatch) {
|
|
1482
|
-
hardFail("LAST_BATCH_CONSISTENCY", "implementation_roadmap_registry 缺少 batch-5", ["src/engine/implementation_roadmap_registry.ts"], "末批一致性", "旧 gate 不检查末批是否存在于 roadmap", "新增 batch-5 并登记 problem-55 到 problem-60");
|
|
1483
|
-
return;
|
|
1484
|
-
}
|
|
1485
|
-
const expectedLastProblems = ["problem-55", "problem-56", "problem-57", "problem-58", "problem-59", "problem-60"];
|
|
1486
|
-
const missing = expectedLastProblems.filter((pid) => !lastBatch.included_problem_ids.includes(pid));
|
|
1487
|
-
if (missing.length > 0) {
|
|
1488
|
-
hardFail("LAST_BATCH_CONSISTENCY", `batch-5 缺少问题: ${missing.join(", ")}`, ["src/engine/implementation_roadmap_registry.ts"], "末批一致性", "旧 gate 不检查末批问题归属完整性", `将 ${missing.join(", ")} 加入 batch-5`);
|
|
1489
|
-
}
|
|
1490
|
-
// 2. problem-58 和 problem-60 不得在 batch-4
|
|
1491
|
-
const prevBatch = batches.find((b) => b.batch_id === "batch-4");
|
|
1492
|
-
if (prevBatch) {
|
|
1493
|
-
const misattrib = ["problem-58", "problem-60"].filter((pid) => prevBatch.included_problem_ids.includes(pid));
|
|
1494
|
-
if (misattrib.length > 0) {
|
|
1495
|
-
hardFail("LAST_BATCH_CONSISTENCY", `problem-58/60 错误归属到 batch-4: ${misattrib.join(", ")}`, ["src/engine/implementation_roadmap_registry.ts"], "末批一致性", "旧 gate 不检查问题是否被错误归入其他批次", "将 problem-58/60 从 batch-4 迁到 batch-5");
|
|
1496
|
-
}
|
|
1497
|
-
}
|
|
1498
|
-
// 3. 场景矩阵必须覆盖问题五十五到问题六十
|
|
1499
|
-
const scenarios = RELEASE_GATE_SCENARIOS;
|
|
1500
|
-
const allCoveredIssues = scenarios.flatMap((s) => s.covered_issues);
|
|
1501
|
-
const expectedIssueLabels = ["问题五十五", "问题五十六", "问题五十七", "问题五十八", "问题五十九", "问题六十"];
|
|
1502
|
-
const uncovered = expectedIssueLabels.filter((label) => !allCoveredIssues.includes(label));
|
|
1503
|
-
if (uncovered.length > 0) {
|
|
1504
|
-
hardFail("LAST_BATCH_CONSISTENCY", `场景矩阵未覆盖: ${uncovered.join(", ")}`, ["src/engine/release_gate_scenario_registry.ts"], "末批一致性", "旧 gate 不检查场景矩阵是否覆盖所有末批问题", `为 ${uncovered.join(", ")} 新增场景`);
|
|
1505
|
-
}
|
|
1506
|
-
// 4. 场景矩阵必须全部通过
|
|
1507
|
-
const results = runAllReleaseGateScenarios();
|
|
1508
|
-
const failedScenarios = results.filter((r) => !r.passed);
|
|
1509
|
-
if (failedScenarios.length > 0) {
|
|
1510
|
-
hardFail("LAST_BATCH_CONSISTENCY", `场景矩阵未全部通过: ${failedScenarios.map((r) => `${r.scenario_id}: ${r.failures.join("; ")}`).join(", ")}`, ["src/engine/release_gate_scenario_registry.ts"], "末批一致性", "旧 gate 不运行场景矩阵验证", "修复失败场景");
|
|
1511
|
-
}
|
|
1512
|
-
_info(" 第五批一致性校验通过");
|
|
1513
|
-
}
|
|
1514
|
-
// ── 14. 依赖漏洞扫描 ──
|
|
1515
|
-
function checkDependencyAudit(rootDir, hardFail, _info) {
|
|
1516
|
-
const reportPath = path.join(rootDir, ".soloforge", "advisory-report.json");
|
|
1517
|
-
if (!fs.existsSync(reportPath)) {
|
|
1518
|
-
hardFail("DEPENDENCY_AUDIT", "未找到依赖漏洞扫描报告 (.soloforge/advisory-report.json)", ["package.json"], "依赖健康", "旧 gate 不检查依赖漏洞", "运行 npm run audit-deps");
|
|
1519
|
-
return;
|
|
1520
|
-
}
|
|
1521
|
-
try {
|
|
1522
|
-
const report = JSON.parse(fs.readFileSync(reportPath, "utf-8"));
|
|
1523
|
-
if (!report.timestamp) {
|
|
1524
|
-
hardFail("DEPENDENCY_AUDIT", "漏洞扫描报告缺少时间戳", ["package.json"], "依赖健康", "旧 gate 不验证报告完整性", "重新运行 npm run audit-deps");
|
|
1525
|
-
return;
|
|
1526
|
-
}
|
|
1527
|
-
// 报告过期检查: 超过 24 小时视为过期
|
|
1528
|
-
const reportAge = Date.now() - new Date(report.timestamp).getTime();
|
|
1529
|
-
const maxAge = 24 * 60 * 60 * 1000;
|
|
1530
|
-
if (reportAge > maxAge) {
|
|
1531
|
-
hardFail("DEPENDENCY_AUDIT", `漏洞扫描报告已过期 (生成于 ${report.timestamp})`, ["package.json"], "依赖健康", "旧 gate 不检查报告时效", "重新运行 npm run audit-deps");
|
|
1532
|
-
return;
|
|
1533
|
-
}
|
|
1534
|
-
const blocked = report.blocked || [];
|
|
1535
|
-
if (blocked.length > 0) {
|
|
1536
|
-
const details = blocked.map((b) => `[${b.severity}] ${b.package}: ${b.title}`).join("; ");
|
|
1537
|
-
hardFail("DEPENDENCY_AUDIT", `发现 ${blocked.length} 个阻断级漏洞: ${details}`, ["package.json"], "依赖健康", "旧 gate 不扫描依赖漏洞", "npm audit fix 或升级依赖");
|
|
1538
|
-
return;
|
|
1539
|
-
}
|
|
1540
|
-
const total = report.vulnerability_summary?.total || 0;
|
|
1541
|
-
_info(` 依赖漏洞扫描通过: ${total} 个已知漏洞(无阻断级)`);
|
|
1542
|
-
}
|
|
1543
|
-
catch {
|
|
1544
|
-
hardFail("DEPENDENCY_AUDIT", "漏洞扫描报告格式无效", ["package.json"], "依赖健康", "旧 gate 不验证报告格式", "删除 .soloforge/advisory-report.json 并重新运行 npm run audit-deps");
|
|
1545
|
-
}
|
|
1546
|
-
}
|
|
1547
|
-
// ── 16. 工作流导航契约行为验证(问题六十五) ──
|
|
1548
|
-
async function checkWorkflowNavigationBehavior(rootDir, hardFail, _info) {
|
|
1549
|
-
// 1. 编译产物存在性
|
|
1550
|
-
const navPath = path.join(rootDir, "dist", "engine", "next_action_planner.js");
|
|
1551
|
-
if (!fs.existsSync(navPath)) {
|
|
1552
|
-
hardFail("NAVIGATION_MODULE_MISSING", "problem-65: next_action_planner.js 未编译到 dist/", ["src/engine/next_action_planner.ts"], "problem-65", "发布门禁不检查问题-65 导航机制是否存在", "实现 next_action_planner 并编译");
|
|
1553
|
-
return;
|
|
1554
|
-
}
|
|
1555
|
-
// 2. 核心导出存在性
|
|
1556
|
-
let nav;
|
|
1557
|
-
try {
|
|
1558
|
-
nav = await import(navPath);
|
|
1559
|
-
}
|
|
1560
|
-
catch (e) {
|
|
1561
|
-
hardFail("NAVIGATION_IMPORT_ERROR", `problem-65: next_action_planner 导入失败: ${e.message}`, ["src/engine/next_action_planner.ts"], "problem-65", "导航模块存在但不可导入", "修复导入错误");
|
|
1562
|
-
return;
|
|
1563
|
-
}
|
|
1564
|
-
if (typeof nav.planNextAction !== "function") {
|
|
1565
|
-
hardFail("NAVIGATION_EXPORT_MISSING", "problem-65: next_action_planner 未导出 planNextAction 函数", ["src/engine/next_action_planner.ts"], "problem-65", "导航模块缺少核心导出", "添加 planNextAction 导出");
|
|
1566
|
-
}
|
|
1567
|
-
if (typeof nav.computeDisallowedActions !== "function") {
|
|
1568
|
-
hardFail("NAVIGATION_DISALLOWED_MISSING", "problem-65: next_action_planner 未导出 computeDisallowedActions 函数", ["src/engine/next_action_planner.ts"], "problem-65", "禁止动作规则计算函数缺失", "添加 computeDisallowedActions 导出");
|
|
1569
|
-
}
|
|
1570
|
-
const repairPath = path.join(rootDir, "dist", "engine", "config_auto_repair.js");
|
|
1571
|
-
if (!fs.existsSync(repairPath)) {
|
|
1572
|
-
hardFail("NAVIGATION_CONFIG_REPAIR_MODULE_MISSING", "problem-65: config_auto_repair.js 未编译到 dist/,机械配置问题无法自动修复", ["src/engine/config_auto_repair.ts"], "problem-65", "导航只提示配置待确认,不检查自动修复能力是否存在", "实现 config_auto_repair 并接入导航");
|
|
1573
|
-
}
|
|
1574
|
-
else {
|
|
1575
|
-
try {
|
|
1576
|
-
const repairMod = await import(repairPath);
|
|
1577
|
-
if (typeof repairMod.analyzeConfigRepair !== "function" || typeof repairMod.repairProjectConfig !== "function") {
|
|
1578
|
-
hardFail("NAVIGATION_CONFIG_REPAIR_EXPORT_MISSING", "problem-65: config_auto_repair 必须导出 analyzeConfigRepair 和 repairProjectConfig", ["src/engine/config_auto_repair.ts"], "problem-65", "自动修复模块存在但主链路不可消费", "补齐自动修复导出函数");
|
|
1579
|
-
}
|
|
1580
|
-
}
|
|
1581
|
-
catch (e) {
|
|
1582
|
-
hardFail("NAVIGATION_CONFIG_REPAIR_IMPORT_ERROR", `problem-65: config_auto_repair 导入失败: ${e.message}`, ["src/engine/config_auto_repair.ts"], "problem-65", "自动修复模块存在但不可导入", "修复 config_auto_repair 导入错误");
|
|
1583
|
-
}
|
|
1584
|
-
}
|
|
1585
|
-
// 3. 行为验证: 未初始化项目应返回 uninitialized
|
|
1586
|
-
const tmpDir = path.join(rootDir, ".soloforge-gate-nav-test-" + Date.now());
|
|
1587
|
-
try {
|
|
1588
|
-
fs.mkdirSync(tmpDir, { recursive: true });
|
|
1589
|
-
const plan = await nav.planNextAction(tmpDir);
|
|
1590
|
-
if (plan.project_stage !== "uninitialized") {
|
|
1591
|
-
hardFail("NAVIGATION_BEHAVIOR_UNINIT", `problem-65: 未初始化项目的阶段应为 uninitialized,实际为 ${plan.project_stage}`, ["src/engine/project_stage_detector.ts"], "problem-65", "导航未正确检测未初始化项目", "修复 detectProjectStage 逻辑");
|
|
1592
|
-
}
|
|
1593
|
-
if (!plan.work_package || plan.work_package.action !== "sf_init") {
|
|
1594
|
-
hardFail("NAVIGATION_BEHAVIOR_INIT_WP", `problem-65: 未初始化项目的工作包应为 sf_init,实际为 ${plan.work_package?.action ?? "null"}`, ["src/engine/next_action_planner.ts"], "problem-65", "导航工作包未正确推荐初始化", "修复 computeWorkPackage 逻辑");
|
|
1595
|
-
}
|
|
1596
|
-
if (!plan.confirmation_decisions) {
|
|
1597
|
-
hardFail("NAVIGATION_CONFIRMATION_TIER_MISSING", "problem-65: 导航计划缺少 confirmation_decisions 分级结构", ["src/engine/next_action_planner.ts", "src/engine/workflow_navigation_contract.ts"], "problem-65", "旧导航只输出笼统确认提示,用户不知道哪些必须确认", "补充 must_confirm/should_confirm/auto_resolvable 分级");
|
|
1598
|
-
}
|
|
1599
|
-
else {
|
|
1600
|
-
const decisions = plan.confirmation_decisions;
|
|
1601
|
-
if (!Array.isArray(decisions.must_confirm) || !Array.isArray(decisions.should_confirm) || !Array.isArray(decisions.auto_resolvable)) {
|
|
1602
|
-
hardFail("NAVIGATION_CONFIRMATION_TIER_INVALID", "problem-65: confirmation_decisions 必须同时包含 must_confirm / should_confirm / auto_resolvable 数组", ["src/engine/workflow_navigation_contract.ts"], "problem-65", "确认项没有结构化分级", "修复 ConfirmationDecisionSummary 类型和 planNextAction 输出");
|
|
1603
|
-
}
|
|
1604
|
-
if ((decisions.must_confirm?.length ?? 0) !== 0) {
|
|
1605
|
-
hardFail("NAVIGATION_GREENFIELD_FALSE_MUST_CONFIRM", "problem-65: 从 0 开发的未初始化项目不得要求确认既有项目事实", ["src/engine/next_action_planner.ts"], "problem-65", "空项目确认口径错误,把基线确认当成既有事实确认", "将新项目基线归类为 should_confirm,不阻塞初始化和只读规划");
|
|
1606
|
-
}
|
|
1607
|
-
const greenfieldHint = JSON.stringify(decisions.should_confirm ?? []);
|
|
1608
|
-
if (!greenfieldHint.includes("从 0 开发时没有既有项目事实可确认")) {
|
|
1609
|
-
hardFail("NAVIGATION_GREENFIELD_CONFIRMATION_EXPLANATION_MISSING", "problem-65: 新项目确认提示必须说明没有既有项目事实,只确认目标、边界、技术选择和默认口径", ["src/engine/next_action_planner.ts"], "problem-65", "用户不知道空项目如何确认", "补充新项目基线确认说明");
|
|
1610
|
-
}
|
|
1611
|
-
}
|
|
1612
|
-
}
|
|
1613
|
-
catch (e) {
|
|
1614
|
-
hardFail("NAVIGATION_BEHAVIOR_ERROR", `problem-65: 行为级检查执行失败: ${e.message}`, ["src/engine/next_action_planner.ts"], "problem-65", "导航机制行为检查不可执行", "修复导航机制代码");
|
|
1615
|
-
}
|
|
1616
|
-
finally {
|
|
1617
|
-
try {
|
|
1618
|
-
fs.rmSync(tmpDir, { recursive: true });
|
|
1619
|
-
}
|
|
1620
|
-
catch { }
|
|
1621
|
-
}
|
|
1622
|
-
// 3.1 行为验证: 机械配置问题必须归类为 auto_resolvable,不得要求用户确认业务口径
|
|
1623
|
-
const repairTmpDir = path.join(rootDir, ".soloforge-gate-config-repair-" + Date.now());
|
|
1624
|
-
try {
|
|
1625
|
-
const sfDir = path.join(repairTmpDir, ".soloforge");
|
|
1626
|
-
fs.mkdirSync(sfDir, { recursive: true });
|
|
1627
|
-
fs.writeFileSync(path.join(sfDir, "config.yaml"), [
|
|
1628
|
-
"schema_version: 1",
|
|
1629
|
-
"name: demo-saas",
|
|
1630
|
-
"tech_stack:",
|
|
1631
|
-
" backend:",
|
|
1632
|
-
" lang: java",
|
|
1633
|
-
" framework: spring-boot",
|
|
1634
|
-
" version: 3",
|
|
1635
|
-
" frontend:",
|
|
1636
|
-
" lang: typescript",
|
|
1637
|
-
" framework: react",
|
|
1638
|
-
" version: 18",
|
|
1639
|
-
"product_profile: saas",
|
|
1640
|
-
"repos: []",
|
|
1641
|
-
"build_commands:",
|
|
1642
|
-
" backend:",
|
|
1643
|
-
" build: mvn -q -DskipTests package",
|
|
1644
|
-
" test: mvn test",
|
|
1645
|
-
" full: mvn verify",
|
|
1646
|
-
" frontend:",
|
|
1647
|
-
" build: npm run build",
|
|
1648
|
-
" test: npm test",
|
|
1649
|
-
" full: npm run build && npm test",
|
|
1650
|
-
"scope:",
|
|
1651
|
-
" backend: demo-saas-backend",
|
|
1652
|
-
" frontend: demo-saas-frontend",
|
|
1653
|
-
].join("\n"), "utf-8");
|
|
1654
|
-
fs.writeFileSync(path.join(sfDir, "config.evidence.json"), JSON.stringify({
|
|
1655
|
-
schema_version: 2,
|
|
1656
|
-
generated_at: "2026-01-01T00:00:00.000Z",
|
|
1657
|
-
fields: {
|
|
1658
|
-
name: { value: "old-name", confidence: "high", confidence_source: "confirmed", evidence: ["old"] },
|
|
1659
|
-
},
|
|
1660
|
-
entries: [],
|
|
1661
|
-
}, null, 2), "utf-8");
|
|
1662
|
-
const repairPlan = await nav.planNextAction(repairTmpDir);
|
|
1663
|
-
const decisions = repairPlan.confirmation_decisions;
|
|
1664
|
-
const autoItems = decisions?.auto_resolvable ?? [];
|
|
1665
|
-
const hasConfigRepair = autoItems.some((item) => item.id === "config-auto-repair" && item.command_hint === "soloforge config repair");
|
|
1666
|
-
if (!hasConfigRepair) {
|
|
1667
|
-
hardFail("NAVIGATION_CONFIG_REPAIR_NOT_RECOMMENDED", "problem-65: version/scope/evidence 这类机械配置问题必须推荐 soloforge config repair", ["src/engine/next_action_planner.ts", "src/engine/config_auto_repair.ts"], "problem-65", "旧导航把机械配置问题误当成业务确认", "将机械配置问题归入 auto_resolvable");
|
|
1668
|
-
}
|
|
1669
|
-
if ((decisions?.must_confirm?.length ?? 0) > 0) {
|
|
1670
|
-
hardFail("NAVIGATION_CONFIG_REPAIR_FALSE_MUST_CONFIRM", "problem-65: 机械配置问题不得进入 must_confirm,不得要求用户逐字段确认", ["src/engine/next_action_planner.ts"], "problem-65", "旧导航把可自动修复项伪装成用户确认项", "保持 config repair 为 auto_resolvable");
|
|
1671
|
-
}
|
|
1672
|
-
const actionText = decisions?.recommended_action ?? "";
|
|
1673
|
-
if (!actionText.includes("soloforge config repair")) {
|
|
1674
|
-
hardFail("NAVIGATION_CONFIG_REPAIR_ACTION_MISSING", "problem-65: recommended_action 必须明确给出 soloforge config repair", ["src/engine/next_action_planner.ts"], "problem-65", "用户不知道下一步该运行哪个命令", "在 recommended_action 中输出自动修复命令");
|
|
1675
|
-
}
|
|
1676
|
-
}
|
|
1677
|
-
catch (e) {
|
|
1678
|
-
hardFail("NAVIGATION_CONFIG_REPAIR_BEHAVIOR_ERROR", `problem-65: 配置自动修复导航行为检查失败: ${e.message}`, ["src/engine/next_action_planner.ts", "src/engine/config_auto_repair.ts"], "problem-65", "配置自动修复行为未纳入发布门禁", "修复配置自动修复导航行为");
|
|
1679
|
-
}
|
|
1680
|
-
finally {
|
|
1681
|
-
try {
|
|
1682
|
-
fs.rmSync(repairTmpDir, { recursive: true });
|
|
1683
|
-
}
|
|
1684
|
-
catch { }
|
|
1685
|
-
}
|
|
1686
|
-
// 4. 知识文件存在性
|
|
1687
|
-
const rulePath = path.join(rootDir, "templates", "knowledge", "rules", "工作流导航契约规则.md");
|
|
1688
|
-
if (!fs.existsSync(rulePath)) {
|
|
1689
|
-
hardFail("NAVIGATION_RULE_MISSING", "problem-65: 缺少知识规则文件 工作流导航契约规则.md", ["templates/knowledge/rules/工作流导航契约规则.md"], "problem-65", "导航知识规则缺失", "创建知识规则文件");
|
|
1690
|
-
}
|
|
1691
|
-
const procedurePath = path.join(rootDir, "templates", "knowledge", "procedures", "全生命周期工作流导航.md");
|
|
1692
|
-
if (!fs.existsSync(procedurePath)) {
|
|
1693
|
-
hardFail("NAVIGATION_PROCEDURE_MISSING", "problem-65: 缺少知识流程文件 全生命周期工作流导航.md", ["templates/knowledge/procedures/全生命周期工作流导航.md"], "problem-65", "导航知识流程缺失", "创建知识流程文件");
|
|
1694
|
-
}
|
|
1695
|
-
// 5. CLI 命令存在性
|
|
1696
|
-
const cliDist = fs.readFileSync(path.join(rootDir, "dist", "bin", "soloforge.js"), "utf-8");
|
|
1697
|
-
if (!cliDist.includes('case "next"') && !cliDist.includes("cmdNext")) {
|
|
1698
|
-
hardFail("NAVIGATION_CLI_MISSING", "problem-65: CLI 缺少 next 命令入口", ["src/bin/soloforge.ts"], "problem-65", "CLI 无 next 命令", "添加 case 'next' dispatch");
|
|
1699
|
-
}
|
|
1700
|
-
if (!cliDist.includes('case "stage"') && !cliDist.includes("cmdStage")) {
|
|
1701
|
-
hardFail("NAVIGATION_CLI_STAGE_MISSING", "problem-65: CLI 缺少 stage 命令入口", ["src/bin/soloforge.ts"], "problem-65", "CLI 无 stage 命令", "添加 case 'stage' dispatch");
|
|
1702
|
-
}
|
|
1703
|
-
if (!cliDist.includes('case "repair"') || !cliDist.includes("cmdConfigRepair")) {
|
|
1704
|
-
hardFail("NAVIGATION_CONFIG_REPAIR_CLI_MISSING", "problem-65: CLI 缺少 config repair 命令入口", ["src/bin/soloforge.ts", "src/bin/config_commands.ts"], "problem-65", "自动修复能力存在但用户无法通过 CLI 调用", "添加 soloforge config repair");
|
|
1705
|
-
}
|
|
1706
|
-
_info(" problem-65 工作流导航行为验证完成");
|
|
1707
|
-
}
|
|
1708
|
-
// ── 17. 实现工程契约行为验证(问题六十六/六十七) ──
|
|
1709
|
-
async function checkImplementationContractBehavior(rootDir, hardFail, _info) {
|
|
1710
|
-
const oodPath = path.join(rootDir, "dist", "engine", "ood_solid_contract.js");
|
|
1711
|
-
const backendPath = path.join(rootDir, "dist", "engine", "backend_implementation_contract.js");
|
|
1712
|
-
if (!fs.existsSync(oodPath) || !fs.existsSync(backendPath)) {
|
|
1713
|
-
hardFail("IMPLEMENTATION_CONTRACT_MODULE_MISSING", "problem-66/67: OOD/SOLID 或后端工程契约未编译到 dist/", ["src/engine/ood_solid_contract.ts", "src/engine/backend_implementation_contract.ts"], "problem-66/problem-67", "仅登记问题而未验证运行时模块", "实现并编译两个工程契约模块");
|
|
1714
|
-
return;
|
|
1715
|
-
}
|
|
1716
|
-
try {
|
|
1717
|
-
const ood = await import(oodPath);
|
|
1718
|
-
const backend = await import(backendPath);
|
|
1719
|
-
const blockedOod = ood.evaluateOodDesignGate({
|
|
1720
|
-
task_id: "gate-ood",
|
|
1721
|
-
intent: "实现订单领域服务状态流转策略",
|
|
1722
|
-
route: "code_change",
|
|
1723
|
-
});
|
|
1724
|
-
if (blockedOod.allowed || blockedOod.status !== "blocked") {
|
|
1725
|
-
hardFail("OOD_SUMMARY_FALSE_PASS", "problem-66: 复杂业务编码缺少 OOD 摘要仍被放行", ["src/engine/ood_solid_contract.ts"], "problem-66", "文件存在不能证明编码前门禁有效", "修复 evaluateOodDesignGate 的缺摘要阻断");
|
|
1726
|
-
}
|
|
1727
|
-
const lowRisk = ood.evaluateOodDesignGate({
|
|
1728
|
-
task_id: "gate-ood-low",
|
|
1729
|
-
intent: "修复 README 文案错别字",
|
|
1730
|
-
route: "code_change",
|
|
1731
|
-
});
|
|
1732
|
-
if (!lowRisk.allowed || lowRisk.status !== "not_applicable") {
|
|
1733
|
-
hardFail("OOD_LOW_RISK_OVERBLOCK", "problem-66: 低风险文案任务被 OOD 门禁误阻断", ["src/engine/ood_solid_contract.ts"], "problem-66", "门禁不能以流程重量替代适用性判断", "修复低风险跳过判断");
|
|
1734
|
-
}
|
|
1735
|
-
const solidFindings = ood.reviewSolidCode({
|
|
1736
|
-
"src/OrderController.ts": "class OrderController { save(){ return this.repository.save(this.calculate()); } }",
|
|
1737
|
-
});
|
|
1738
|
-
if (!ood.hasBlockingSolidFindings(solidFindings)) {
|
|
1739
|
-
hardFail("SOLID_REVIEW_FALSE_PASS", "problem-66: Controller 职责膨胀没有产生阻断 finding", ["src/engine/ood_solid_contract.ts"], "problem-66", "必须用真实代码内容验证审查能力", "修复 SRP 阻断识别");
|
|
1740
|
-
}
|
|
1741
|
-
const blockedBackend = backend.evaluateBackendImplementationGate({
|
|
1742
|
-
task_id: "gate-backend",
|
|
1743
|
-
intent: "实现后端 API 支付接口",
|
|
1744
|
-
route: "code_change",
|
|
1745
|
-
});
|
|
1746
|
-
if (blockedBackend.allowed || blockedBackend.status !== "blocked") {
|
|
1747
|
-
hardFail("BACKEND_WORK_PACKAGE_FALSE_PASS", "problem-67: 后端实现缺少工程工作包仍被放行", ["src/engine/backend_implementation_contract.ts"], "problem-67", "文件存在不能证明编码前门禁有效", "修复 evaluateBackendImplementationGate");
|
|
1748
|
-
}
|
|
1749
|
-
const backendFindings = backend.reviewBackendImplementationFiles({
|
|
1750
|
-
"src/PaymentController.java": "@PostMapping(\"/pay\") @Transactional public PaymentEntity pay(@RequestBody PaymentEntity value) { webClient.post(); return value; }",
|
|
1751
|
-
});
|
|
1752
|
-
if (!backend.hasBlockingBackendFindings(backendFindings)) {
|
|
1753
|
-
hardFail("BACKEND_REVIEW_FALSE_PASS", "problem-67: 实体暴露或事务内外调没有产生阻断 finding", ["src/engine/backend_implementation_contract.ts"], "problem-67", "必须用真实代码内容验证后端审查能力", "修复后端工程 finding 检测");
|
|
1754
|
-
}
|
|
1755
|
-
if (backend.requiresBackendImplementationContract("实现简单 GET 详情只读接口", "code_change")) {
|
|
1756
|
-
hardFail("BACKEND_LOW_RISK_OVERBLOCK", "problem-67: 简单只读接口被完整后端工程工作包误阻断", ["src/engine/backend_implementation_contract.ts"], "problem-67", "后端契约必须具备适用性边界", "修复低风险只读任务跳过逻辑");
|
|
1757
|
-
}
|
|
1758
|
-
const alignmentFindings = backend.verifyBackendArtifactAlignment({
|
|
1759
|
-
apiDocumentText: "GET /api/payments/{id}",
|
|
1760
|
-
openapiText: "paths:\n /api/orders/{id}:",
|
|
1761
|
-
migrationText: "create table payment(id bigint);",
|
|
1762
|
-
});
|
|
1763
|
-
if (!backend.hasBlockingBackendFindings(alignmentFindings)) {
|
|
1764
|
-
hardFail("BACKEND_API_OPENAPI_DRIFT_FALSE_PASS", "problem-67: Markdown API 与 OpenAPI endpoint 漂移未阻断", ["src/engine/backend_implementation_contract.ts"], "problem-67", "契约对齐必须由行为检查证明", "修复 API/OpenAPI 漂移检测");
|
|
1765
|
-
}
|
|
1766
|
-
const lombokFindings = backend.reviewBackendImplementationFiles({
|
|
1767
|
-
"src/main/java/com/demoapp/account/entity/Account.java": "import jakarta.persistence.Entity; import lombok.Data; @Entity @Data public class Account { private Long id; }",
|
|
1768
|
-
"src/main/java/com/demoapp/account/dto/AccountCreateRequest.java": "import lombok.Getter; import lombok.Setter; @Getter @Setter public class AccountCreateRequest { private String name; }",
|
|
1769
|
-
});
|
|
1770
|
-
const modelContractFindings = lombokFindings.filter((item) => item.category === "model_lombok_contract" && item.severity === "hard_fail");
|
|
1771
|
-
if (modelContractFindings.length < 2) {
|
|
1772
|
-
hardFail("BACKEND_MODEL_LOMBOK_CONTRACT_FALSE_PASS", "problem-71: Java Entity/DTO/VO/Request Lombok 分层契约未阻断错误注解", ["src/engine/backend_implementation_contract.ts", "templates/scaffolds/spring-boot/Entity.java.hbs", "templates/scaffolds/spring-boot/DTO.java.hbs"], "problem-71", "后端工程契约不能只治理 Controller/DTO 命名,还必须约束数据模型注解语义", "添加 Entity @Getter/@Setter、DTO/VO/Request @Data 的行为检查和脚手架默认值");
|
|
1773
|
-
}
|
|
1774
|
-
}
|
|
1775
|
-
catch (e) {
|
|
1776
|
-
hardFail("IMPLEMENTATION_CONTRACT_EXECUTION_ERROR", `problem-66/67: 实现工程行为检查执行失败: ${e.message}`, ["src/engine/ood_solid_contract.ts", "src/engine/backend_implementation_contract.ts"], "problem-66/problem-67", "契约模块必须可运行并返回确定结果", "修复运行时异常");
|
|
1777
|
-
}
|
|
1778
|
-
const toolsText = safeRead(path.join(rootDir, "src", "adapters", "claude_code", "tools.ts")) ?? "";
|
|
1779
|
-
const requiredHooks = [
|
|
1780
|
-
"lazyOodSolid", "lazyBackendImplementation", "evaluateOodDesignGate",
|
|
1781
|
-
"evaluateBackendImplementationGate", "reviewSolidCode",
|
|
1782
|
-
"reviewBackendImplementationFiles", "hasBlockingSolidFindings", "hasBlockingBackendFindings",
|
|
1783
|
-
];
|
|
1784
|
-
for (const hook of requiredHooks) {
|
|
1785
|
-
if (!toolsText.includes(hook)) {
|
|
1786
|
-
hardFail("IMPLEMENTATION_CONTRACT_MAINPATH_MISSING", `problem-66/67: MCP 主链路缺少真实消费点 ${hook}`, ["src/adapters/claude_code/tools.ts"], "problem-66/problem-67", "只实现引擎函数不能证明用户路径受约束", "接入 sf_expand/sf_review/sf_verify/sf_deliver");
|
|
1787
|
-
}
|
|
1788
|
-
}
|
|
1789
|
-
_info(" problem-66/67 实现工程契约行为验证完成");
|
|
1790
|
-
}
|
|
1791
|
-
// ── 15. 发布问题全局合同 ──
|
|
1792
|
-
async function checkReleaseIssueDesignPath(rootDir, hardFail, _info) {
|
|
1793
|
-
const toolsText = safeRead(path.join(rootDir, "src", "adapters", "claude_code", "tools.ts")) ?? "";
|
|
1794
|
-
const cliText = safeRead(path.join(rootDir, "src", "bin", "soloforge.ts")) ?? "";
|
|
1795
|
-
const workflowText = safeRead(path.join(rootDir, "src", "adapters", "shared", "workflow_template.ts")) ?? "";
|
|
1796
|
-
// ══ 前置检查: roadmap 状态与发布文档一致性 ══
|
|
1797
|
-
const roadmapText = safeRead(path.join(rootDir, "src", "engine", "implementation_roadmap_registry.ts")) ?? "";
|
|
1798
|
-
const gateDocText = safeRead(path.join(rootDir, "docs", "正式发布门槛.md")) ?? "";
|
|
1799
|
-
if (/status:\s*"in_repair"/.test(roadmapText)) {
|
|
1800
|
-
hardFail("RELEASE_ISSUE_ROADMAP_IN_REPAIR", "发布问题仍有 in_repair 状态,不得通过发布门禁", ["src/engine/implementation_roadmap_registry.ts"], "release-issues", "roadmap 状态为 in_repair 时不能声称完成", "完成所有返修后改为 implemented_verified");
|
|
1801
|
-
}
|
|
1802
|
-
// 发布问题场景矩阵: 结构化场景注册表验证测试文件存在 + 执行证据
|
|
1803
|
-
{
|
|
1804
|
-
const { validateReleaseIssueScenarios, executeReleaseIssueScenarios } = await import("./release_issue_scenario_registry.js");
|
|
1805
|
-
const scenarioResult = validateReleaseIssueScenarios(rootDir);
|
|
1806
|
-
_info(` 发布问题场景: ${scenarioResult.scenario_count} 条,覆盖 ${scenarioResult.covered_problems.join(", ")}`);
|
|
1807
|
-
if (scenarioResult.missing_runners.length > 0) {
|
|
1808
|
-
hardFail("RELEASE_ISSUE_SCENARIO_NO_RUNNER", `发布问题场景缺少 runner: ${scenarioResult.missing_runners.join("; ")}`, ["src/engine/release_issue_scenario_registry.ts"], "release-issues", "所有场景必须有真实生产入口 runner", "为缺失场景添加 runner");
|
|
1809
|
-
}
|
|
1810
|
-
if (scenarioResult.missing_tests.length > 0) {
|
|
1811
|
-
hardFail("RELEASE_ISSUE_SCENARIO_TESTS_MISSING", `发布问题场景引用的测试文件缺失: ${scenarioResult.missing_tests.join("; ")}`, scenarioResult.missing_tests.map(m => m.split(": ")[1] ?? "unknown"), "release-issues", "场景测试文件必须存在", "创建缺失的测试文件");
|
|
1812
|
-
}
|
|
1813
|
-
// 运行所有场景收集执行证据(全部必须有 runner)
|
|
1814
|
-
const execResults = await executeReleaseIssueScenarios();
|
|
1815
|
-
const failed = execResults.filter(r => r.status === "fail");
|
|
1816
|
-
_info(` 发布问题场景执行: ${execResults.length} 条已执行,${failed.length} 条失败`);
|
|
1817
|
-
if (failed.length > 0) {
|
|
1818
|
-
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 逻辑");
|
|
1819
|
-
}
|
|
1820
|
-
// R10: 所有场景必须有 production_trace 且 tool_entrypoint 引用真实工具
|
|
1821
|
-
const noTrace = execResults.filter(r => !r.production_trace);
|
|
1822
|
-
if (noTrace.length > 0) {
|
|
1823
|
-
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");
|
|
1824
|
-
}
|
|
1825
|
-
// R10.1: 每个场景(非 engine_contract 声明)的 tool_entrypoint 必须包含真实工具名
|
|
1826
|
-
const allRealToolNames = ["sf_classify", "sf_expand", "sf_verify", "sf_deliver", "sf_learn", "sf_accept", "sf_record_verification_execution", "sf_scaffold", "sf_navigation", "soloforge next", "checkArchitectureDecisionWorkshopGate", "planNextAction"];
|
|
1827
|
-
const fakeTraceScenarios = execResults.filter(r => r.production_trace &&
|
|
1828
|
-
!allRealToolNames.some(t => r.production_trace.tool_entrypoint.includes(t)) &&
|
|
1829
|
-
!r.production_trace.gates_consumed?.includes("engine_contract"));
|
|
1830
|
-
if (fakeTraceScenarios.length > 0) {
|
|
1831
|
-
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");
|
|
1832
|
-
}
|
|
1833
|
-
// R12: production_trace 的 diagnostic_codes 必须非空(来自工具返回值或函数调用结果)
|
|
1834
|
-
const noDiagCodes = execResults.filter(r => r.production_trace && (!r.production_trace.diagnostic_codes || r.production_trace.diagnostic_codes.length === 0));
|
|
1835
|
-
if (noDiagCodes.length > 0) {
|
|
1836
|
-
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");
|
|
1837
|
-
}
|
|
1838
|
-
// R14: architecture-workshop 非 low-risk 场景必须真正触发 workshop(不得假绿)
|
|
1839
|
-
{
|
|
1840
|
-
const archNonLowRisk = execResults.filter(r => r.scenario_id.startsWith("release-scenario-architecture-workshop-") &&
|
|
1841
|
-
!r.scenario_id.includes("low-risk-skip"));
|
|
1842
|
-
const fakeGreenPatterns = ["workshop=false", "domains=0", "no workshop", "blocked by earlier gate"];
|
|
1843
|
-
const fakeGreens = archNonLowRisk.filter(r => r.status === "pass" && fakeGreenPatterns.some(p => r.evidence?.includes(p)));
|
|
1844
|
-
if (fakeGreens.length > 0) {
|
|
1845
|
-
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 能实际触发");
|
|
1846
|
-
}
|
|
1847
|
-
// 非 low-risk 场景必须同时有 sf_classify 和 sf_expand 入口
|
|
1848
|
-
const missingEntrypoint = archNonLowRisk.filter(r => r.production_trace &&
|
|
1849
|
-
(!r.production_trace.tool_entrypoint.includes("sf_classify") || !r.production_trace.tool_entrypoint.includes("sf_expand")));
|
|
1850
|
-
if (missingEntrypoint.length > 0) {
|
|
1851
|
-
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");
|
|
1852
|
-
}
|
|
1853
|
-
}
|
|
1854
|
-
// R15: production_trace.diagnostic_codes 不得包含运行时异常
|
|
1855
|
-
{
|
|
1856
|
-
const runtimeErrorPattern = /Cannot read|TypeError|ReferenceError|^undefined$|uncaught exception|\.error\b/i;
|
|
1857
|
-
const runtimeDiagCodes = execResults.filter(r => r.production_trace?.diagnostic_codes?.some(c => runtimeErrorPattern.test(c)));
|
|
1858
|
-
if (runtimeDiagCodes.length > 0) {
|
|
1859
|
-
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 必须来自真实业务/门禁诊断,不得把异常信息当作有效诊断码", "定位异常根因并修复,或确保场景提供完整输入使工具不抛异常");
|
|
1860
|
-
}
|
|
1861
|
-
}
|
|
1862
|
-
// R10: 每个 problem 必须至少有一个场景通过真实 MCP 工具入口执行
|
|
1863
|
-
const realToolNames = ["sf_classify", "sf_expand", "sf_verify", "sf_deliver", "sf_learn", "sf_accept", "sf_record_verification_execution", "sf_scaffold"];
|
|
1864
|
-
// 用 scenario_id 前缀识别 problem 归属
|
|
1865
|
-
const problemPrefixes = {
|
|
1866
|
-
"problem-61": ["release-scenario-architecture-workshop-", "release-scenario-decision-workshop-"],
|
|
1867
|
-
"problem-62": ["release-scenario-design-pack-"],
|
|
1868
|
-
"problem-63": ["release-scenario-template-contract-"],
|
|
1869
|
-
"problem-64": ["release-scenario-template-visibility-"],
|
|
1870
|
-
"problem-68": ["release-scenario-code-observability-"],
|
|
1871
|
-
};
|
|
1872
|
-
for (const [problem, prefixes] of Object.entries(problemPrefixes)) {
|
|
1873
|
-
const problemScenarios = execResults.filter(r => prefixes.some(p => r.scenario_id.startsWith(p)));
|
|
1874
|
-
const withRealTools = problemScenarios.filter(r => r.production_trace && realToolNames.some(t => r.production_trace.tool_entrypoint.includes(t)));
|
|
1875
|
-
if (withRealTools.length === 0 && problemScenarios.length > 0) {
|
|
1876
|
-
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");
|
|
1877
|
-
}
|
|
1878
|
-
}
|
|
1879
|
-
// R13: problem-61 必须证明 awaiting_confirmation 阻断 + 确认放行双向
|
|
1880
|
-
{
|
|
1881
|
-
const p61 = execResults.filter(r => r.scenario_id.startsWith("release-scenario-decision-workshop-"));
|
|
1882
|
-
// 阻断证据: evidence 包含 "awaiting" 或 diagnostic_codes 包含决策研讨阻断码
|
|
1883
|
-
const hasAwaiting = p61.some(r => r.evidence?.includes("awaiting") ||
|
|
1884
|
-
r.production_trace?.diagnostic_codes?.some(c => c.includes("决策研讨") || c.includes("awaiting_confirmation")));
|
|
1885
|
-
// 放行证据: 至少一个 decision_workshop 场景通过两次 sf_expand(tool_entrypoint 含两个 sf_expand)
|
|
1886
|
-
const hasConfirmedPass = p61.some(r => r.status === "pass" && r.production_trace?.tool_entrypoint &&
|
|
1887
|
-
(r.production_trace.tool_entrypoint.match(/sf_expand/g) ?? []).length >= 2);
|
|
1888
|
-
if (!hasAwaiting || !hasConfirmedPass) {
|
|
1889
|
-
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 阻断和确认放行双向证据");
|
|
1890
|
-
}
|
|
1891
|
-
}
|
|
1892
|
-
// problem-63 必须在同一正式产物任务上证明阻断、清零、接受与交付,不能由描述文字自证。
|
|
1893
|
-
{
|
|
1894
|
-
const p63 = execResults.filter(r => r.scenario_id.startsWith("release-scenario-template-contract-"));
|
|
1895
|
-
const lifecycleProof = p63.find(r => r.scenario_id === "release-scenario-template-contract-repair-directive")?.behavioral_proof;
|
|
1896
|
-
const sameTask = lifecycleProof?.task_id
|
|
1897
|
-
&& lifecycleProof.blocked_task_id === lifecycleProof.task_id
|
|
1898
|
-
&& lifecycleProof.delivered_task_id === lifecycleProof.task_id;
|
|
1899
|
-
const completed = lifecycleProof?.contract_blocked === true
|
|
1900
|
-
&& lifecycleProof?.repair_directive_cleared === true
|
|
1901
|
-
&& lifecycleProof?.artifact_status === "accepted"
|
|
1902
|
-
&& !!lifecycleProof?.acceptance_confirmation_ref
|
|
1903
|
-
&& lifecycleProof?.delivery_succeeded === true;
|
|
1904
|
-
if (!sameTask || !completed) {
|
|
1905
|
-
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 与真实工具链");
|
|
1906
|
-
}
|
|
1907
|
-
}
|
|
1908
|
-
}
|
|
1909
|
-
// R10: index_only 泄漏行为门禁 — 通过真实 sf_expand 验证 index_only 不进入 prompt
|
|
1910
|
-
{
|
|
1911
|
-
const { createToolHarness } = await import("./release_tool_harness.js");
|
|
1912
|
-
const { clearInjectionContractCache } = await import("./knowledge_injection_boundary.js");
|
|
1913
|
-
clearInjectionContractCache();
|
|
1914
|
-
try {
|
|
1915
|
-
const harness = await createToolHarness({ copyKnowledge: true });
|
|
1916
|
-
try {
|
|
1917
|
-
const all = harness.knowledgeIndex.getAllEntries();
|
|
1918
|
-
// 找到 index_only 条目
|
|
1919
|
-
const { buildTemplateAssetContracts } = await import("./template_asset_contract_registry.js");
|
|
1920
|
-
const contracts = buildTemplateAssetContracts(rootDir);
|
|
1921
|
-
const indexOnlyIds = new Set(contracts.filter(c => c.runtime_visibility === "index_only").map(c => c.asset_id));
|
|
1922
|
-
// R12: 前置条件缺失 = hardFail,不得静默跳过
|
|
1923
|
-
if (all.project.length === 0) {
|
|
1924
|
-
hardFail("RELEASE_ISSUE_INDEX_ONLY_PROMPT_LEAK", "copyKnowledge 后无项目资产被索引,前置条件不满足", ["src/engine/knowledge_injection_boundary.ts"], "release-issues", "index_only 行为检查必须有同步+索引的资产", "检查 copyKnowledgeToProject 和 KIM build");
|
|
1925
|
-
}
|
|
1926
|
-
if (indexOnlyIds.size === 0) {
|
|
1927
|
-
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 资产");
|
|
1928
|
-
}
|
|
1929
|
-
const clsRaw = await harness.callTool("sf_classify", { intent: "添加用户管理功能" });
|
|
1930
|
-
const cls = harness.parseResult(clsRaw);
|
|
1931
|
-
if (!cls.task_id) {
|
|
1932
|
-
hardFail("RELEASE_ISSUE_INDEX_ONLY_PROMPT_LEAK", "sf_classify 未返回 task_id,前置条件不满足", ["src/engine/classifier.ts"], "release-issues", "index_only 行为检查必须 sf_classify 返回有效 task_id", "检查分类器是否正常返回");
|
|
1933
|
-
}
|
|
1934
|
-
const expRaw = await harness.callTool("sf_expand", { task_id: cls.task_id });
|
|
1935
|
-
const exp = harness.parseResult(expRaw);
|
|
1936
|
-
// index_only 资产不得进入 matched_knowledge
|
|
1937
|
-
const leaked = (exp.matched_knowledge ?? []).filter((k) => indexOnlyIds.has(k.id));
|
|
1938
|
-
if (leaked.length > 0) {
|
|
1939
|
-
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", "修复注入边界逻辑");
|
|
1940
|
-
}
|
|
1941
|
-
// prompt 中也不得包含 index_only 资产内容
|
|
1942
|
-
const promptStr = exp.prompt ?? "";
|
|
1943
|
-
const leakedInPrompt = all.project.filter((e) => {
|
|
1944
|
-
const contract = contracts.find(c => c.asset_id === e.id || c.path.endsWith(e.name + ".md"));
|
|
1945
|
-
return contract?.runtime_visibility === "index_only" && e.body && promptStr.includes(e.body.slice(0, 50));
|
|
1946
|
-
});
|
|
1947
|
-
if (leakedInPrompt.length > 0) {
|
|
1948
|
-
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 中", "修复注入边界逻辑");
|
|
1949
|
-
}
|
|
1950
|
-
}
|
|
1951
|
-
finally {
|
|
1952
|
-
harness.cleanup();
|
|
1953
|
-
}
|
|
1954
|
-
}
|
|
1955
|
-
catch (err) {
|
|
1956
|
-
// R11: fail-closed — 缺少前置条件或异常 = hard_fail
|
|
1957
|
-
hardFail("RELEASE_ISSUE_INDEX_ONLY_PROMPT_LEAK", `index_only 行为检查失败: ${err.message}`, ["src/engine/knowledge_injection_boundary.ts"], "release-issues", "index_only 行为检查不得跳过", "修复 index_only 检查前置条件");
|
|
1958
|
-
}
|
|
1959
|
-
}
|
|
1960
|
-
// R10: 权威来源 fail-closed 主动负向测试 — 已注册但文件缺失必须被阻断
|
|
1961
|
-
{
|
|
1962
|
-
const { getConsumptionTraces, clearConsumptionTraces } = await import("./consumption_trace_store.js");
|
|
1963
|
-
// 先检查已有 traces
|
|
1964
|
-
const traces = getConsumptionTraces();
|
|
1965
|
-
const authorityLeaks = traces.filter((t) => t.matched_reason?.includes("权威来源文件缺失") && t.contract_decision === "allowed");
|
|
1966
|
-
if (authorityLeaks.length > 0) {
|
|
1967
|
-
hardFail("RELEASE_ISSUE_AUTHORITIVE_FAIL_OPEN", `权威来源缺失的资产被 allowed: ${authorityLeaks.map((t) => t.asset_id).join(", ")}`, ["src/knowledge/index_manager.ts"], "release-issues", "已注册资产权威来源缺失时必须 fail-closed", "检查 filterByContractGate 逻辑");
|
|
1968
|
-
}
|
|
1969
|
-
// 主动负向测试: 创建临时项目,manifest 指向不存在的权威文件
|
|
1970
|
-
try {
|
|
1971
|
-
const { copyKnowledgeToProject } = await import("./template_init_sync.js");
|
|
1972
|
-
const { KnowledgeIndexManager } = await import("../knowledge/index_manager.js");
|
|
1973
|
-
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "soloforge-r10-auth-"));
|
|
1974
|
-
try {
|
|
1975
|
-
await copyKnowledgeToProject(rootDir, tmpDir);
|
|
1976
|
-
const manifestPath = path.join(tmpDir, ".soloforge", "sync-manifest.json");
|
|
1977
|
-
const manifest = JSON.parse(fs.readFileSync(manifestPath, "utf-8"));
|
|
1978
|
-
const domainKey = Object.keys(manifest.entries).find(k => k.startsWith("domain/"));
|
|
1979
|
-
// R12: 找不到 domain 条目 = hardFail,不得静默通过
|
|
1980
|
-
if (!domainKey) {
|
|
1981
|
-
hardFail("RELEASE_ISSUE_AUTHORITIVE_FAIL_OPEN", "sync-manifest 中无 domain/ 条目可做篡改测试,前置条件不满足", ["src/engine/template_init_sync.ts"], "release-issues", "权威 fail-closed 测试必须找到可篡改的 domain 合同", "检查 copyKnowledgeToProject 是否同步了 domain 资产");
|
|
1982
|
-
}
|
|
1983
|
-
manifest.entries[domainKey].source_contract_path = "templates/knowledge/domain/不存在的权威文件.md";
|
|
1984
|
-
fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2), "utf-8");
|
|
1985
|
-
clearConsumptionTraces();
|
|
1986
|
-
const kim = new KnowledgeIndexManager({
|
|
1987
|
-
tech_stack: { backend: { lang: "java", framework: "spring-boot" }, frontend: { lang: "typescript", framework: "react" } },
|
|
1988
|
-
_projectPath: tmpDir,
|
|
1989
|
-
}, { watch: false });
|
|
1990
|
-
await kim.build();
|
|
1991
|
-
const domainEntries = kim.getAllEntries().project.filter((e) => e.file_path?.replace(/\\/g, "/").includes(domainKey));
|
|
1992
|
-
await kim.close();
|
|
1993
|
-
// 权威来源缺失 → 不得被索引
|
|
1994
|
-
if (domainEntries.length > 0) {
|
|
1995
|
-
hardFail("RELEASE_ISSUE_AUTHORITIVE_FAIL_OPEN", `权威缺失的资产被索引: ${domainKey}`, ["src/knowledge/index_manager.ts"], "release-issues", "已注册资产权威来源缺失时必须 fail-closed", "检查 filterByContractGate 逻辑");
|
|
1996
|
-
}
|
|
1997
|
-
}
|
|
1998
|
-
finally {
|
|
1999
|
-
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
2000
|
-
}
|
|
2001
|
-
}
|
|
2002
|
-
catch (err) {
|
|
2003
|
-
// R11: fail-closed — 找不到篡改目标或执行异常 = hard_fail
|
|
2004
|
-
hardFail("RELEASE_ISSUE_AUTHORITIVE_FAIL_OPEN", `权威 fail-closed 主动测试失败: ${err.message}`, ["src/knowledge/index_manager.ts"], "release-issues", "权威来源缺失测试不得跳过", "检查 filterByContractGate 和模板合同配置");
|
|
2005
|
-
}
|
|
2006
|
-
}
|
|
2007
|
-
// 工作流硬规则正文单真源检查
|
|
2008
|
-
{
|
|
2009
|
-
const { WORKFLOW_TEMPLATE_HARD_RULES } = await import("./asset_manifest.js");
|
|
2010
|
-
const { generateWorkflowRules } = await import("../adapters/shared/workflow_template.js");
|
|
2011
|
-
const emptyRules = WORKFLOW_TEMPLATE_HARD_RULES.filter(r => r.enforcement_status === "enforced" && (!r.user_instruction || r.user_instruction.trim() === ""));
|
|
2012
|
-
if (emptyRules.length > 0) {
|
|
2013
|
-
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", "为空规则补充用户可见指令文本");
|
|
2014
|
-
}
|
|
2015
|
-
const output = generateWorkflowRules({});
|
|
2016
|
-
for (const rule of WORKFLOW_TEMPLATE_HARD_RULES) {
|
|
2017
|
-
if (rule.user_instruction) {
|
|
2018
|
-
const lines = rule.user_instruction.split("\n").filter(l => l.trim());
|
|
2019
|
-
for (const line of lines) {
|
|
2020
|
-
if (!output.includes(line)) {
|
|
2021
|
-
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 中是否遗漏该规则");
|
|
2022
|
-
}
|
|
2023
|
-
}
|
|
2024
|
-
}
|
|
2025
|
-
if (!output.includes(`id=${rule.rule_id}`)) {
|
|
2026
|
-
hardFail("WORKFLOW_RULE_MARKER_MISSING", `规则 ${rule.rule_id} marker 未出现在生成输出`, ["src/adapters/shared/workflow_template.ts"], "release-issues", "每条规则 marker 必须出现在 generateWorkflowRules 输出", "将规则添加到 WORKFLOW_STEPS");
|
|
2027
|
-
}
|
|
2028
|
-
}
|
|
2029
|
-
}
|
|
2030
|
-
if (/发布问题.*100%|100%.*发布问题/.test(gateDocText)) {
|
|
2031
|
-
hardFail("RELEASE_ISSUE_DOC_PREMATURE_100", "发布门槛文档提前声称发布问题 100% 完成", ["docs/正式发布门槛.md"], "release-issues", "文档不得在返修未完成前声称 100%", "完成所有返修后更新文档");
|
|
2032
|
-
}
|
|
2033
|
-
// ══ 问题六十一: 通用决策研讨机制 ══
|
|
2034
|
-
// TaskContext 必须有强类型通用决策研讨字段
|
|
2035
|
-
const typesText = safeRead(path.join(rootDir, "src", "types.ts")) ?? "";
|
|
2036
|
-
if (!sourceContainsPattern(typesText, "decision_workshop?: import")) {
|
|
2037
|
-
hardFail("RELEASE_ISSUE_TASKCONTEXT_WEAK_TYPE", "TaskContext 缺少强类型 decision_workshop 字段", ["src/types.ts"], "problem-61", "使用 (ctx as any).decision_workshop 是弱类型", "在 TaskContext 添加 decision_workshop 强类型字段");
|
|
2038
|
-
}
|
|
2039
|
-
// tools.ts 不得使用 (ctx as any).decision_workshop
|
|
2040
|
-
if (sourceContainsPropertyAccess(toolsText, "ctx", "decision_workshop") && toolsText.includes("(ctx as any)")) {
|
|
2041
|
-
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");
|
|
2042
|
-
}
|
|
2043
|
-
// ExpandSchema 必须支持 decision_workshop 输入
|
|
2044
|
-
if (!sourceContainsIdentifier(toolsText, "decision_workshop:") || (!sourceContainsZodSchema(toolsText, "decision_workshop", "z.record(z.unknown())") && !sourceContainsZodSchema(toolsText, "decision_workshop", "z.unknown()"))) {
|
|
2045
|
-
hardFail("RELEASE_ISSUE_EXPAND_NO_WORKSHOP_INPUT", "ExpandSchema 不支持通用 decision_workshop 输入", ["src/adapters/claude_code/tools.ts"], "problem-61", "用户无法回传确认后的决策合同", "在 ExpandSchema 添加 decision_workshop 输入参数");
|
|
2046
|
-
}
|
|
2047
|
-
if (!sourceContainsIdentifier(toolsText, "parseContractObject") || !sourceContainsIdentifier(toolsText, "JSON.parse")) {
|
|
2048
|
-
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 字符串契约,解析失败返回结构化错误");
|
|
2049
|
-
}
|
|
2050
|
-
const dwTextForShape = safeRead(path.join(rootDir, "src", "engine", "decision_workshop.ts")) ?? "";
|
|
2051
|
-
if (!sourceContainsIdentifier(toolsText, "normalizeDecisionWorkshopContract") || !sourceContainsPattern(dwTextForShape, "MCP 客户端回传的领域字典已规范化")) {
|
|
2052
|
-
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 入口使用");
|
|
2053
|
-
}
|
|
2054
|
-
const s4RecoveryFields = [
|
|
2055
|
-
"technology_decision_contract",
|
|
2056
|
-
"technology_decision_record",
|
|
2057
|
-
"detail_discipline_contract",
|
|
2058
|
-
"provided_details",
|
|
2059
|
-
"first_principles_frame",
|
|
2060
|
-
"brainstorm_session",
|
|
2061
|
-
];
|
|
2062
|
-
const missingS4SchemaFields = s4RecoveryFields.filter((field) => !sourceContainsZodSchema(toolsText, field, "z.record(z.unknown())") && !sourceContainsZodSchema(toolsText, field, "z.unknown()"));
|
|
2063
|
-
const missingS4ContextFields = s4RecoveryFields.filter((field) => !sourceContainsPattern(typesText, `${field}?:`));
|
|
2064
|
-
const missingS4SaveFields = s4RecoveryFields.filter((field) => !sourceContainsPattern(toolsText, `(ctx as Record<string, unknown>)[field]`) && !sourceContainsPattern(toolsText, `ctx.${field} = parsed.value`));
|
|
2065
|
-
const staleS4AnyFields = s4RecoveryFields.filter((field) => sourceContainsPattern(toolsText, `(ctx as any).${field}`) || sourceContainsPattern(toolsText, `(params.ctx as any).${field}`));
|
|
2066
|
-
if (missingS4SchemaFields.length > 0 || missingS4ContextFields.length > 0 || missingS4SaveFields.length > 0 || staleS4AnyFields.length > 0) {
|
|
2067
|
-
hardFail("RELEASE_ISSUE_S4_RECOVERY_INPUT_MISSING", "S4 强门禁缺少可执行 sf_expand 恢复入口", ["src/adapters/claude_code/tools.ts", "src/types.ts"], "problem-16/26/27/42", `缺 schema=${missingS4SchemaFields.join(",")}; 缺 TaskContext=${missingS4ContextFields.join(",")}; 缺保存=${missingS4SaveFields.join(",")}; 弱类型=${staleS4AnyFields.join(",")}`, "所有返回“请提供 X 后重新 sf_expand”的强门禁,都必须在 ExpandSchema 接受 X、写入 TaskContext,并通过强类型主链路消费");
|
|
2068
|
-
}
|
|
2069
|
-
// 架构决策研讨子包必须接入 sf_expand
|
|
2070
|
-
if (!sourceContainsIdentifier(toolsText, "checkArchitectureDecisionWorkshopGate") ||
|
|
2071
|
-
!sourceContainsPattern(toolsText, "projectContext: detectedArchitectureContext")) {
|
|
2072
|
-
hardFail("RELEASE_ISSUE_MAINLINE_MISSING", "问题六十一架构研讨子包未接入 sf_expand", ["src/adapters/claude_code/tools.ts"], "problem-61", "仅有合同或模板不能证明主链路消费", "在 sf_expand 真实路由调用架构研讨门");
|
|
2073
|
-
}
|
|
2074
|
-
// 通用决策研讨必须接入 sf_expand(可组合决策包)
|
|
2075
|
-
if (!sourceContainsIdentifier(toolsText, "lazyDecisionWorkshop") || !sourceContainsIdentifier(toolsText, "matchDecisionPacks") || !sourceContainsIdentifier(toolsText, "nonArchPacks")) {
|
|
2076
|
-
hardFail("RELEASE_ISSUE_DECISION_WORKSHOP_MISSING", "问题六十一通用决策研讨未接入 sf_expand 可组合决策包", ["src/adapters/claude_code/tools.ts"], "problem-61", "非架构高影响任务也必须门禁,且必须支持组合多个决策包", "在 sf_expand 接入 matchDecisionPacks 门禁");
|
|
2077
|
-
}
|
|
2078
|
-
// DecisionPackRegistry 必须有 business_process 和 delivery_validation 独立包
|
|
2079
|
-
{
|
|
2080
|
-
const dwText = safeRead(path.join(rootDir, "src", "engine", "decision_workshop.ts")) ?? "";
|
|
2081
|
-
if (!dwText.includes("business_process") || !dwText.includes("delivery_validation")) {
|
|
2082
|
-
hardFail("RELEASE_ISSUE_DECISION_PACK_MISSING", "问题六十一 DecisionPackRegistry 缺少 business_process 或 delivery_validation 独立包", ["src/engine/decision_workshop.ts"], "problem-61", "业务流程和交付验证必须可独立触发", "在 DECISION_PACKS 添加 business_process 和 delivery_validation");
|
|
2083
|
-
}
|
|
2084
|
-
}
|
|
2085
|
-
try {
|
|
2086
|
-
const dw = await import(path.join(rootDir, "dist", "engine", "decision_workshop.js"));
|
|
2087
|
-
// must-fail: 未确认的技术选型必须阻断
|
|
2088
|
-
const techContract = dw.createDecisionWorkshop("gate-test", "technology_selection");
|
|
2089
|
-
const techGate = dw.evaluateDecisionWorkshop(techContract);
|
|
2090
|
-
if (techGate.allowed) {
|
|
2091
|
-
hardFail("RELEASE_ISSUE_DECISION_FALSE_PASS", "问题六十一未确认技术选型草稿错误放行", ["src/engine/decision_workshop.ts"], "problem-61", "技术选型未确认应阻断", "修复 evaluateDecisionWorkshop");
|
|
2092
|
-
}
|
|
2093
|
-
// must-fail: 低风险任务不需要研讨
|
|
2094
|
-
const lowRisk = dw.requiresDecisionWorkshop({ intent: "修复按钮颜色" });
|
|
2095
|
-
if (lowRisk.required) {
|
|
2096
|
-
hardFail("RELEASE_ISSUE_DECISION_LOW_RISK_BLOCKED", "问题六十一低风险任务错误触发决策研讨", ["src/engine/decision_workshop.ts"], "problem-61", "低风险任务不应触发研讨", "修复 requiresDecisionWorkshop 触发条件");
|
|
2097
|
-
}
|
|
2098
|
-
// must-pass: 确认的技术选型放行
|
|
2099
|
-
const confirmed = dw.createDecisionWorkshop("gate-test-2", "technology_selection");
|
|
2100
|
-
confirmed.extended_domains.technology_selection.status = "confirmed";
|
|
2101
|
-
confirmed.extended_domains.technology_selection.user_confirmation_ref = "user-ok";
|
|
2102
|
-
if (!dw.evaluateDecisionWorkshop(confirmed).allowed) {
|
|
2103
|
-
hardFail("RELEASE_ISSUE_DECISION_CONFIRMED_BLOCKED", "问题六十一已确认决策仍被阻断", ["src/engine/decision_workshop.ts"], "problem-61", "已确认决策应放行", "修复 evaluateDecisionWorkshop 确认检查");
|
|
2104
|
-
}
|
|
2105
|
-
}
|
|
2106
|
-
catch (error) {
|
|
2107
|
-
hardFail("RELEASE_ISSUE_DECISION_LOAD_FAILED", `无法执行问题六十一行为复验: ${error?.message ?? error}`, ["src/engine/decision_workshop.ts"], "problem-61", "模块不可执行", "修复构建或导出");
|
|
2108
|
-
}
|
|
2109
|
-
// ══ 问题六十二: 标准资产覆盖机制 ══
|
|
2110
|
-
if (!sourceContainsCall(toolsText, "verifyDesignArtifactPack") ||
|
|
2111
|
-
!sourceContainsPattern(toolsText, "ctx.design_artifact_pack.status !== \"implementation_ready\"") ||
|
|
2112
|
-
!sourceContainsCall(toolsText, "checkDesignArtifactWriteGate")) {
|
|
2113
|
-
hardFail("RELEASE_ISSUE_MAINLINE_MISSING", "问题六十二设计产物包子机制未接入真实消费路径", ["src/adapters/claude_code/tools.ts"], "problem-62", "仅有文档校验函数不能阻断用户编码/交付", "在验证、写入与交付路径消费设计产物包状态");
|
|
2114
|
-
}
|
|
2115
|
-
if (!sourceContainsCall(toolsText, "auditDesignImplementationTraceability") ||
|
|
2116
|
-
!sourceContainsIdentifier(toolsText, "verifyChangedFilesAgainstDesignTraceability") ||
|
|
2117
|
-
!sourceContainsIdentifier(toolsText, "TOOL_DIAGNOSTIC_CODES.traceabilityVerifyFailed")) {
|
|
2118
|
-
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 门接入追踪契约");
|
|
2119
|
-
}
|
|
2120
|
-
const traceabilityText = safeRead(path.join(rootDir, "src", "engine", "traceability.ts")) ?? "";
|
|
2121
|
-
const nextPlannerText = safeRead(path.join(rootDir, "src", "engine", "next_action_planner.ts")) ?? "";
|
|
2122
|
-
if (!sourceContainsIdentifier(traceabilityText, "DESIGN_IMPLEMENTATION_TRACEABILITY_TEMPLATE_PATH") ||
|
|
2123
|
-
!sourceContainsIdentifier(traceabilityText, "recovery_command") ||
|
|
2124
|
-
!sourceContainsIdentifier(traceabilityText, "recovery_zh") ||
|
|
2125
|
-
!sourceContainsIdentifier(nextPlannerText, "DESIGN_IMPLEMENTATION_TRACEABILITY_TEMPLATE_PATH") ||
|
|
2126
|
-
!sourceContainsPattern(cliText, "finding.template_path") ||
|
|
2127
|
-
!sourceContainsPattern(cliText, "finding.recovery_command")) {
|
|
2128
|
-
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 输出模板路径与恢复命令");
|
|
2129
|
-
}
|
|
2130
|
-
const designPackText = safeRead(path.join(rootDir, "src", "engine", "design_artifact_pack.ts")) ?? "";
|
|
2131
|
-
if (!designPackText.includes("traceability_matrix") ||
|
|
2132
|
-
!designPackText.includes("auditDesignImplementationTraceability")) {
|
|
2133
|
-
hardFail("RELEASE_ISSUE_TRACEABILITY_DESIGN_AUDIT_MISSING", "问题七十三未并入设计产物包审计", ["src/engine/design_artifact_pack.ts"], "problem-73", "追踪矩阵不进入 audit-design-artifacts 会导致用户设计阶段无法发现缺口", "把追踪矩阵作为设计产物包权威资产审计");
|
|
2134
|
-
}
|
|
2135
|
-
const lifecycleContractText = safeRead(path.join(rootDir, "src", "engine", "design_lifecycle_contract.ts")) ?? "";
|
|
2136
|
-
const lifecycleKnowledgeText = safeRead(path.join(rootDir, "src", "engine", "lifecycle_knowledge_contract.ts")) ?? "";
|
|
2137
|
-
if (!lifecycleContractText.includes("detail_design") ||
|
|
2138
|
-
!lifecycleContractText.includes("docs/architecture/02-数据库设计文档.md") ||
|
|
2139
|
-
!lifecycleContractText.includes("docs/architecture/03-API接口规格文档.md") ||
|
|
2140
|
-
!lifecycleContractText.includes("optional_implementation_detail_document") ||
|
|
2141
|
-
!lifecycleContractText.includes("docs/architecture/04-开发切片计划.md") ||
|
|
2142
|
-
!lifecycleContractText.includes("DESIGN_LIFECYCLE_LEGACY_SLICE_PLAN_PATHS") ||
|
|
2143
|
-
!lifecycleContractText.includes("slice_planning") ||
|
|
2144
|
-
!designPackText.includes("getDesignLifecycleArtifactPaths")) {
|
|
2145
|
-
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 消费同一合同");
|
|
2146
|
-
}
|
|
2147
|
-
if (!lifecycleKnowledgeText.includes("evaluateLifecycleKnowledgeDecision") ||
|
|
2148
|
-
!lifecycleKnowledgeText.includes("selectProjectKnowledgeForTaskWithReasons") ||
|
|
2149
|
-
!lifecycleKnowledgeText.includes("auditDesignImplementationTraceability") ||
|
|
2150
|
-
!lifecycleKnowledgeText.includes("assessControlledGenerationChain")) {
|
|
2151
|
-
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");
|
|
2152
|
-
}
|
|
2153
|
-
const injectionBoundaryText = safeRead(path.join(rootDir, "src", "engine", "knowledge_injection_boundary.ts")) ?? "";
|
|
2154
|
-
if (injectionBoundaryText.includes("buildTemplateAssetContracts(process.cwd())")) {
|
|
2155
|
-
hardFail("RELEASE_ISSUE_KNOWLEDGE_CONTRACT_CWD_DRIFT", "知识注入边界仍用 process.cwd() 读取模板合同", ["src/engine/knowledge_injection_boundary.ts"], "project-knowledge-consumption", "用户项目、全局安装和测试目录会取错合同根目录", "改为从模块根或显式合同根读取模板合同");
|
|
2156
|
-
}
|
|
2157
|
-
if (!cliText.includes("cmdAuditDesignArtifacts") ||
|
|
2158
|
-
!cliText.includes("cmdUpgradeDesignArtifacts") ||
|
|
2159
|
-
!cliText.includes("currentTask?.design_artifact_pack")) {
|
|
2160
|
-
hardFail("RELEASE_ISSUE_USER_CLI_MISSING", "问题六十二缺少用户 CLI 审计/升级或 Claude Code 写入 hook 阻断路径", ["src/bin/soloforge.ts"], "problem-62", "MCP 内部调用不能覆盖用户现有文档升级与直接 Edit/Write 路径", "接入 audit/upgrade CLI 与 check-write 设计产物门");
|
|
2161
|
-
}
|
|
2162
|
-
// 标准资产覆盖机制必须使用真实注册表审计
|
|
2163
|
-
try {
|
|
2164
|
-
const cov = await import(path.join(rootDir, "dist", "engine", "standard_asset_coverage.js"));
|
|
2165
|
-
const car = await import(path.join(rootDir, "dist", "engine", "consumable_asset_registry.js"));
|
|
2166
|
-
const manifest = await import(path.join(rootDir, "dist", "engine", "asset_manifest.js"));
|
|
2167
|
-
// 从真实注册表构建消费证据
|
|
2168
|
-
const registeredAssets = car.listBuiltinConsumableAssets();
|
|
2169
|
-
const consumablePaths = new Set(registeredAssets.map((a) => a.path));
|
|
2170
|
-
const ownerMap = new Map(registeredAssets.map((a) => [a.path, a.owner_mechanism_id ?? ""]));
|
|
2171
|
-
const manifestEntries = manifest.ASSET_MANIFEST;
|
|
2172
|
-
const consumerMap = new Map(manifestEntries.map((e) => [e.path, []]));
|
|
2173
|
-
const visibilityMap = new Map(manifestEntries.map((e) => [e.path, e.consumption_mode ?? "unknown"]));
|
|
2174
|
-
const report = cov.auditStandardAssetCoverage(rootDir, consumablePaths, ownerMap, consumerMap, visibilityMap);
|
|
2175
|
-
// 必须能审计并返回结构化报告
|
|
2176
|
-
if (typeof report.total_assets !== "number" || typeof report.covered_assets !== "number") {
|
|
2177
|
-
hardFail("RELEASE_ISSUE_COVERAGE_REPORT_INVALID", "问题六十二覆盖审计报告结构不完整", ["src/engine/standard_asset_coverage.ts"], "problem-62", "审计报告缺少必须字段", "修复 auditStandardAssetCoverage 返回结构");
|
|
2178
|
-
}
|
|
2179
|
-
// 不得传空 Set/空 Map 通过覆盖检查 — 必须使用真实数据
|
|
2180
|
-
if (report.total_assets > 0 && report.covered_assets === report.total_assets && consumablePaths.size === 0) {
|
|
2181
|
-
hardFail("RELEASE_ISSUE_COVERAGE_EMPTY_REGISTRY_PASS", "问题六十二空注册表不应全部覆盖", ["src/engine/standard_asset_coverage.ts"], "problem-62", "空注册表时所有资产必须 uncovered", "修复覆盖检查使用真实注册表");
|
|
2182
|
-
}
|
|
2183
|
-
}
|
|
2184
|
-
catch (error) {
|
|
2185
|
-
hardFail("RELEASE_ISSUE_COVERAGE_LOAD_FAILED", `无法执行问题六十二覆盖审计行为复验: ${error?.message ?? error}`, ["src/engine/standard_asset_coverage.ts"], "problem-62", "模块不可执行", "修复构建或导出");
|
|
2186
|
-
}
|
|
2187
|
-
try {
|
|
2188
|
-
const workshop = await import(path.join(rootDir, "dist", "engine", "architecture_decision_workshop.js"));
|
|
2189
|
-
const designPack = await import(path.join(rootDir, "dist", "engine", "design_artifact_pack.js"));
|
|
2190
|
-
const lifecycle = await import(path.join(rootDir, "dist", "engine", "design_lifecycle_contract.js"));
|
|
2191
|
-
const lifecycleFindings = lifecycle.validateDesignLifecycleContract();
|
|
2192
|
-
if (lifecycleFindings.length > 0) {
|
|
2193
|
-
hardFail("RELEASE_ISSUE_DESIGN_LIFECYCLE_CONTRACT_INVALID", `设计生命周期合同不满足不变量: ${lifecycleFindings.map((finding) => finding.code).join(",")}`, ["src/engine/design_lifecycle_contract.ts"], "problem-62/problem-73", "生命周期合同必须明确设计、实现、测试、验收节点的输入输出和门禁", "修复 validateDesignLifecycleContract 报告的不变量缺口");
|
|
2194
|
-
}
|
|
2195
|
-
const detailStage = lifecycle.getDesignLifecycleStageContract("detail_design");
|
|
2196
|
-
const detailRequiredOutputs = detailStage.outputs.filter((artifact) => artifact.required).map((artifact) => artifact.path);
|
|
2197
|
-
if (!detailRequiredOutputs.includes("docs/architecture/02-数据库设计文档.md") ||
|
|
2198
|
-
!detailRequiredOutputs.includes("docs/architecture/03-API接口规格文档.md") ||
|
|
2199
|
-
detailRequiredOutputs.includes("docs/architecture/04-详细设计文档.md")) {
|
|
2200
|
-
hardFail("RELEASE_ISSUE_DETAIL_DESIGN_TOPOLOGY_INVALID", "详细设计阶段输出拓扑错误", ["src/engine/design_lifecycle_contract.ts"], "problem-62/problem-73", "详细设计必需载体是数据库设计和 API 规格,04-详细设计文档只能是可选兼容", "修复 detail_design 生命周期合同");
|
|
2201
|
-
}
|
|
2202
|
-
const lifecyclePaths = lifecycle.getDesignLifecycleArtifactPaths();
|
|
2203
|
-
if (lifecyclePaths.slice_plan !== "docs/architecture/04-开发切片计划.md") {
|
|
2204
|
-
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");
|
|
2205
|
-
}
|
|
2206
|
-
const packPaths = designPack.defaultDesignArtifactPaths();
|
|
2207
|
-
if (JSON.stringify(lifecyclePaths) !== JSON.stringify(packPaths)) {
|
|
2208
|
-
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 派生");
|
|
2209
|
-
}
|
|
2210
|
-
const draft = workshop.createArchitectureDecisionWorkshop("release-issue", "new_system");
|
|
2211
|
-
if (workshop.evaluateArchitectureDecisionWorkshop(draft).allowed) {
|
|
2212
|
-
hardFail("RELEASE_ISSUE_BEHAVIOR_FALSE_PASS", "问题六十一未确认六域的草稿错误放行", ["src/engine/architecture_decision_workshop.ts"], "problem-61", "必须有负向行为证据", "修复研讨生成门");
|
|
2213
|
-
}
|
|
2214
|
-
const missingPackResult = designPack.verifyDesignArtifactPack(rootDir, designPack.createDesignArtifactPack("release-issue"));
|
|
2215
|
-
if (missingPackResult.passed) {
|
|
2216
|
-
hardFail("RELEASE_ISSUE_BEHAVIOR_FALSE_PASS", "问题六十二缺少用户项目设计产物时错误放行", ["src/engine/design_artifact_pack.ts"], "problem-62", "必须读取真实资产并阻断缺失", "修复设计产物复验门");
|
|
2217
|
-
}
|
|
2218
|
-
const traceability = await import(path.join(rootDir, "dist", "engine", "traceability.js"));
|
|
2219
|
-
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), "sf-trace-gate-"));
|
|
2220
|
-
const write = (relativePath, content) => {
|
|
2221
|
-
const target = path.join(tmp, relativePath);
|
|
2222
|
-
fs.mkdirSync(path.dirname(target), { recursive: true });
|
|
2223
|
-
fs.writeFileSync(target, content);
|
|
2224
|
-
};
|
|
2225
|
-
write("docs/architecture/01-架构设计文档.md", "# 架构\n来源: REQ-001, PROTO-001\nARCH-001");
|
|
2226
|
-
const missingTrace = traceability.auditDesignImplementationTraceability(tmp);
|
|
2227
|
-
if (missingTrace.passed || !missingTrace.findings.some((f) => f.code === "TRACEABILITY_MATRIX_MISSING")) {
|
|
2228
|
-
hardFail("RELEASE_ISSUE_TRACEABILITY_MATRIX_FALSE_PASS", "问题七十三缺少追踪矩阵时错误放行", ["src/engine/traceability.ts", "src/engine/design_artifact_pack.ts"], "problem-73", "设计产物存在但无追踪矩阵必须阻断", "修复 auditDesignImplementationTraceability");
|
|
2229
|
-
}
|
|
2230
|
-
write("docs/traceability/01-需求原型设计实现追踪矩阵.md", [
|
|
2231
|
-
"# 需求原型设计实现追踪矩阵",
|
|
2232
|
-
"| 需求 | 原型 | 架构 | 详细设计 | 切片 | 验收 |",
|
|
2233
|
-
"| --- | --- | --- | --- | --- | --- |",
|
|
2234
|
-
"| REQ-001 | PROTO-001 | ARCH-001 | DD-T001, DD-A001 | PHASE-001, SLICE-001 | AC-001 |",
|
|
2235
|
-
].join("\n"));
|
|
2236
|
-
write("docs/architecture/02-数据库设计文档.md", "# 数据库设计\nARCH-001 -> DD-T001");
|
|
2237
|
-
write("docs/architecture/03-API接口规格文档.md", "# API 设计\nARCH-001 -> DD-A001");
|
|
2238
|
-
write("docs/architecture/04-开发切片计划.md", "# 开发切片计划\nPHASE-001\nSLICE-001\n来源 DD-T001, DD-A001\n验收 AC-001");
|
|
2239
|
-
const bindingFail = traceability.verifyChangedFilesAgainstDesignTraceability(tmp, ["src/main/java/demo/BedService.java"], {
|
|
2240
|
-
task_id: "trace-gate",
|
|
2241
|
-
created_at: new Date().toISOString(),
|
|
2242
|
-
intent: "实现资源管理",
|
|
2243
|
-
product_profile: "default",
|
|
2244
|
-
status: "executing",
|
|
2245
|
-
});
|
|
2246
|
-
if (bindingFail.passed || !bindingFail.findings.some((f) => f.code === "TRACEABILITY_CODE_BINDING_MISSING")) {
|
|
2247
|
-
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 追踪绑定门");
|
|
2248
|
-
}
|
|
2249
|
-
const bindingPass = traceability.verifyChangedFilesAgainstDesignTraceability(tmp, ["src/main/java/demo/BedService.java"], {
|
|
2250
|
-
task_id: "trace-gate-ok",
|
|
2251
|
-
created_at: new Date().toISOString(),
|
|
2252
|
-
intent: "实现资源管理 PHASE-001 SLICE-001 DD-T001 DD-A001 AC-001",
|
|
2253
|
-
product_profile: "default",
|
|
2254
|
-
status: "executing",
|
|
2255
|
-
});
|
|
2256
|
-
if (!bindingPass.passed) {
|
|
2257
|
-
hardFail("RELEASE_ISSUE_TRACEABILITY_CODE_BINDING_FALSE_BLOCK", "问题七十三合法 PHASE/SLICE/DD/AC 绑定被错误阻断", ["src/engine/traceability.ts"], "problem-73", "合法追踪绑定应允许编码验证继续", "修复 traceability binding 校验");
|
|
2258
|
-
}
|
|
2259
|
-
}
|
|
2260
|
-
catch (error) {
|
|
2261
|
-
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"], "发布问题", "模块不可执行", "修复构建或导出");
|
|
2262
|
-
}
|
|
2263
|
-
if (!workflowText.includes("wf-architecture-workshop-first") || !workflowText.includes("wf-design-artifact-pack")) {
|
|
2264
|
-
hardFail("RELEASE_ISSUE_USER_INJECTION_MISSING", "用户项目工作流模板未注入 发布问题硬协议", ["src/adapters/shared/workflow_template.ts"], "problem-61/problem-62", "运行时有门但用户不可预期会造成体验断裂", "向 workflow template 注入硬规则");
|
|
2265
|
-
}
|
|
2266
|
-
// workflow_template @sf-hard-rule 机制 ID 必须能解析到权威机制注册条目且资产文件存在
|
|
2267
|
-
try {
|
|
2268
|
-
const { validateWorkflowRuleSources } = await import("../adapters/shared/workflow_template.js");
|
|
2269
|
-
const wfValidation = validateWorkflowRuleSources(rootDir);
|
|
2270
|
-
if (!wfValidation.valid) {
|
|
2271
|
-
if (wfValidation.missing_mechanisms.length > 0) {
|
|
2272
|
-
hardFail("RELEASE_ISSUE_WF_RULE_MISSING_MECHANISM", `工作流模板引用了未注册的机制: ${wfValidation.missing_mechanisms.join(", ")}`, ["src/adapters/shared/workflow_template.ts"], "发布问题", "硬编码规则与权威机制注册表漂移", "在 dual_layer_mechanism_registry 中注册缺失机制或修正 workflow_template 引用");
|
|
2273
|
-
}
|
|
2274
|
-
if (wfValidation.missing_assets.length > 0) {
|
|
2275
|
-
hardFail("RELEASE_ISSUE_WF_RULE_MISSING_ASSET", `工作流模板规则的权威资产文件缺失: ${wfValidation.missing_assets.join(", ")}`, ["src/adapters/shared/workflow_template.ts"], "发布问题", "权威规则资产文件不存在", "恢复缺失的模板文件或修正注册表路径");
|
|
2276
|
-
}
|
|
2277
|
-
if (wfValidation.checksum_mismatch) {
|
|
2278
|
-
hardFail("RELEASE_ISSUE_WF_RULE_CONTENT_DRIFT", `工作流模板权威规则内容校验和不匹配: 嵌入=${wfValidation.embedded_checksum}, 实际=${wfValidation.computed_checksum}`, ["src/adapters/shared/workflow_template.ts"], "发布问题", "权威规则资产内容已变化但工作流模板未同步", "运行 updateEmbeddedChecksum 或重新生成工作流模板");
|
|
2279
|
-
}
|
|
2280
|
-
}
|
|
2281
|
-
}
|
|
2282
|
-
catch (error) {
|
|
2283
|
-
hardFail("RELEASE_ISSUE_WF_RULE_VALIDATION_FAILED", `工作流规则来源校验失败: ${error?.message ?? error}`, ["src/adapters/shared/workflow_template.ts"], "发布问题", "校验函数不可执行", "修复 validateWorkflowRuleSources 导出");
|
|
2284
|
-
}
|
|
2285
|
-
// ══ 问题六十三: 标准资产契约 ══
|
|
2286
|
-
const sacText = safeRead(path.join(rootDir, "src", "engine", "standard_asset_contract.ts")) ?? "";
|
|
2287
|
-
if (!sourceContainsIdentifier(sacText, "matchTemplateContract") || !sourceContainsIdentifier(sacText, "verifyOutputAgainstContract") || !sourceContainsIdentifier(sacText, "createRepairReverifyDirective")) {
|
|
2288
|
-
hardFail("RELEASE_ISSUE_CONTRACT_MISSING", "问题六十三缺少模板契约匹配、产物验证或修复重验函数", ["src/engine/standard_asset_contract.ts"], "problem-63", "缺少核心函数不能实现契约验证", "实现 matchTemplateContract / verifyOutputAgainstContract / createRepairReverifyDirective");
|
|
2289
|
-
}
|
|
2290
|
-
// sf_verify 必须按文件逐一匹配契约(不得使用 changed_files[0] 的契约校验全部文件)
|
|
2291
|
-
if (!sourceContainsIdentifier(toolsText, "lazyStandardAssetContract") || !sourceContainsIdentifier(toolsText, "TOOL_DIAGNOSTIC_CODES.contractDraft") || !sourceContainsIdentifier(toolsText, "repair_reverify_directive")) {
|
|
2292
|
-
hardFail("RELEASE_ISSUE_CONTRACT_MAINLINE_MISSING", "问题六十三未接入 sf_verify 模板契约验证和 sf_deliver 修复重验阻断", ["src/adapters/claude_code/tools.ts"], "problem-63", "仅有契约定义不能阻断交付", "在 sf_verify 消费模板契约验证、sf_deliver 消费修复重验阻断");
|
|
2293
|
-
}
|
|
2294
|
-
// 必须检查 per-file 匹配(不得 changed_files[0] 统一匹配)
|
|
2295
|
-
if (sourceContainsPattern(toolsText, "file_path: args.changed_files?.[0]") && !sourceContainsIdentifier(toolsText, "file_path: changedFile")) {
|
|
2296
|
-
hardFail("RELEASE_ISSUE_CONTRACT_SINGLE_FILE_MATCH", "问题六十三 sf_verify 仍使用 changed_files[0] 单一匹配", ["src/adapters/claude_code/tools.ts"], "problem-63", "一个契约不能校验所有文件", "改为按文件逐一匹配 matchTemplateContract");
|
|
2297
|
-
}
|
|
2298
|
-
// 草稿必须阻断(不得 continue 跳过)
|
|
2299
|
-
if (!sourceContainsIdentifier(toolsText, "SF-CONTRACT-DRAFT")) {
|
|
2300
|
-
hardFail("RELEASE_ISSUE_CONTRACT_DRAFT_SKIP", "问题六十三草稿文件未阻断下游消费", ["src/adapters/claude_code/tools.ts"], "problem-63", "草稿不得静默跳过", "草稿必须写入 blocked 状态并阻断");
|
|
2301
|
-
}
|
|
2302
|
-
try {
|
|
2303
|
-
const sac = await import(path.join(rootDir, "dist", "engine", "standard_asset_contract.js"));
|
|
2304
|
-
if (sac.matchTemplateContract({ file_path: "docs/architecture/01-架构设计文档.md" }) === null) {
|
|
2305
|
-
hardFail("RELEASE_ISSUE_CONTRACT_MATCH_FAILURE", "问题六十三模板匹配失败:架构设计文档路径应匹配模板契约", ["src/engine/standard_asset_contract.ts"], "problem-63", "精确路径应匹配 P0 模板", "修复 matchTemplateContract 路径匹配逻辑");
|
|
2306
|
-
}
|
|
2307
|
-
}
|
|
2308
|
-
catch (error) {
|
|
2309
|
-
hardFail("RELEASE_ISSUE_CONTRACT_LOAD_FAILED", `无法执行问题六十三行为复验: ${error?.message ?? error}`, ["src/engine/standard_asset_contract.ts"], "problem-63", "模块不可执行", "修复构建或导出");
|
|
2310
|
-
}
|
|
2311
|
-
// ══ 问题六十四: 模板资产可见性 ══
|
|
2312
|
-
const visText = safeRead(path.join(rootDir, "src", "engine", "template_asset_visibility.ts")) ?? "";
|
|
2313
|
-
if (!visText.includes("isInherentlyInternal") || !visText.includes("inferVisibilityFromPath") || !visText.includes("filterSyncAssets")) {
|
|
2314
|
-
hardFail("RELEASE_ISSUE_VISIBILITY_MISSING", "问题六十四缺少内部资产识别、可见性推断或同步过滤函数", ["src/engine/template_asset_visibility.ts"], "problem-64", "缺少核心函数不能实现可见性门禁", "实现 isInherentlyInternal / inferVisibilityFromPath / filterSyncAssets");
|
|
2315
|
-
}
|
|
2316
|
-
const syncText = safeRead(path.join(rootDir, "src", "engine", "template_init_sync.ts")) ?? "";
|
|
2317
|
-
if (!cliText.includes("getContractDecision") && !syncText.includes("getContractDecision")) {
|
|
2318
|
-
hardFail("RELEASE_ISSUE_VISIBILITY_SYNC_MISSING", "问题六十四 copyKnowledgeTemplates 未接入可见性门禁", ["src/engine/template_init_sync.ts"], "problem-64", "init/sync 不加门禁会泄漏内部资产到用户项目", "在 template_init_sync 中消费可见性门禁");
|
|
2319
|
-
}
|
|
2320
|
-
// copyKnowledgeTemplates 不得使用 subDirs 硬编码列表
|
|
2321
|
-
if (cliText.includes("const subDirs = [")) {
|
|
2322
|
-
hardFail("RELEASE_ISSUE_VISIBILITY_SUBDIRS_HARDCODE", "问题六十四 copyKnowledgeTemplates 仍使用 subDirs 硬编码列表", ["src/bin/soloforge.ts"], "problem-64", "硬编码 subDirs 无法覆盖新增目录", "改为递归发现并统一走可见性门禁");
|
|
2323
|
-
}
|
|
2324
|
-
// scaffolder 不得使用 process.cwd() 作为内置路径 fallback
|
|
2325
|
-
const scaffolderText = safeRead(path.join(rootDir, "src", "engine", "scaffolder.ts")) ?? "";
|
|
2326
|
-
if (scaffolderText.includes("process.cwd()")) {
|
|
2327
|
-
hardFail("RELEASE_ISSUE_SCAFFOLDER_CWD_FALLBACK", "问题六十四 scaffolder 仍使用 process.cwd() 作为内置路径", ["src/engine/scaffolder.ts"], "problem-64", "process.cwd() 在 npm 安装场景解析错误", "改为 import.meta.dirname 解析包内路径");
|
|
2328
|
-
}
|
|
2329
|
-
try {
|
|
2330
|
-
const vis = await import(path.join(rootDir, "dist", "engine", "template_asset_visibility.js"));
|
|
2331
|
-
// 内部资产必须被识别
|
|
2332
|
-
if (!vis.isInherentlyInternal("templates/knowledge/rules/演进回归规则.md")) {
|
|
2333
|
-
hardFail("RELEASE_ISSUE_VISIBILITY_INTERNAL_MISS", "问题六十四内部资产识别失败:演进回归规则应被识别为内部资产", ["src/engine/template_asset_visibility.ts"], "problem-64", "denylist 不生效", "修复 isInherentlyInternal 逻辑");
|
|
2334
|
-
}
|
|
2335
|
-
// 用户可见资产不应被识别为内部
|
|
2336
|
-
if (vis.isInherentlyInternal("templates/knowledge/acceptance_templates/架构设计模版.md")) {
|
|
2337
|
-
hardFail("RELEASE_ISSUE_VISIBILITY_USER_MISS", "问题六十四用户项目资产误判为内部资产", ["src/engine/template_asset_visibility.ts"], "problem-64", "用户可见资产不应被过滤", "修复 isInherentlyInternal 逻辑");
|
|
2338
|
-
}
|
|
2339
|
-
}
|
|
2340
|
-
catch (error) {
|
|
2341
|
-
hardFail("RELEASE_ISSUE_VISIBILITY_LOAD_FAILED", `无法执行问题六十四行为复验: ${error?.message ?? error}`, ["src/engine/template_asset_visibility.ts"], "problem-64", "模块不可执行", "修复构建或导出");
|
|
2342
|
-
}
|
|
2343
|
-
// ══ 发布问题返修新增门禁 ══
|
|
2344
|
-
// 问题六十一: sf_expand 不得使用不存在的 args.intent
|
|
2345
|
-
{
|
|
2346
|
-
const expandFnMatch = toolsText.match(/\/\/ 问题六十一[\s\S]*?matchDecisionPacks\(\{[^}]*\}\)/);
|
|
2347
|
-
if (expandFnMatch && expandFnMatch[0].includes("args.intent")) {
|
|
2348
|
-
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");
|
|
2349
|
-
}
|
|
2350
|
-
}
|
|
2351
|
-
// 问题六十二: standard_asset_coverage 不得以注册存在替代复验路径
|
|
2352
|
-
{
|
|
2353
|
-
const sacCovText = safeRead(path.join(rootDir, "src", "engine", "standard_asset_coverage.ts")) ?? "";
|
|
2354
|
-
if (sacCovText.includes("hasRevalidation = isRegistered") || sacCovText.includes("has_revalidation_path: isRegistered")) {
|
|
2355
|
-
hardFail("RELEASE_ISSUE_COVERAGE_FAKE_REVALIDATION", "问题六十二 hasRevalidation=isRegistered 将注册等同于复验路径", ["src/engine/standard_asset_coverage.ts"], "problem-62", "注册存在不等于有复验入口", "必须从真实消费链路验证复验路径");
|
|
2356
|
-
}
|
|
2357
|
-
// 覆盖审计不得从 ASSET_MANIFEST 创建空 consumerMap
|
|
2358
|
-
if (cliText.includes("ASSET_MANIFEST") && cliText.includes("[] as string[]") && cliText.includes("consumerMap")) {
|
|
2359
|
-
hardFail("RELEASE_ISSUE_COVERAGE_EMPTY_CONSUMER", "问题六十二 audit-template-visibility 从 ASSET_MANIFEST 创建空 consumerMap", ["src/bin/soloforge.ts"], "problem-62", "空 consumerMap 导致所有资产 missing_consumer=0 假通过", "从权威合同获取真实消费者");
|
|
2360
|
-
}
|
|
2361
|
-
// 覆盖报告中有 uncovered/missing_consumer 时必须 hard_fail
|
|
2362
|
-
// 消费者证据从逐资产运行时观察结果获取,不从合同声明字段复制
|
|
2363
|
-
try {
|
|
2364
|
-
const cov = await import(path.join(rootDir, "dist", "engine", "standard_asset_coverage.js"));
|
|
2365
|
-
const car = await import(path.join(rootDir, "dist", "engine", "consumable_asset_registry.js"));
|
|
2366
|
-
const contractReg = await import(path.join(rootDir, "dist", "engine", "template_asset_contract_registry.js"));
|
|
2367
|
-
const obsMod = await import(path.join(rootDir, "dist", "engine", "observed_consumption.js"));
|
|
2368
|
-
const registeredAssets = car.listBuiltinConsumableAssets();
|
|
2369
|
-
const contracts = contractReg.listTemplateAssetContracts();
|
|
2370
|
-
const consumablePaths = new Set(registeredAssets.map((a) => a.path));
|
|
2371
|
-
const ownerMap = new Map(contracts.map((c) => [c.path, c.owner_mechanism_id]));
|
|
2372
|
-
// 运行真实 scenario 生成消费 trace,然后构建消费者映射
|
|
2373
|
-
const obsReport = await obsMod.observeAllConsumption(rootDir);
|
|
2374
|
-
const consumerMap = new Map();
|
|
2375
|
-
for (const obs of obsReport.observations) {
|
|
2376
|
-
const consumers = consumerMap.get(obs.asset_path) ?? [];
|
|
2377
|
-
// entry_point 即为真实消费入口
|
|
2378
|
-
if (obs.entry_point && !consumers.includes(obs.entry_point)) {
|
|
2379
|
-
consumers.push(obs.entry_point);
|
|
2380
|
-
}
|
|
2381
|
-
consumerMap.set(obs.asset_path, consumers);
|
|
2382
|
-
}
|
|
2383
|
-
// 补充复验入口标识(与消费者证据不同维度,复验入口是审计/验证角色标识)
|
|
2384
|
-
for (const c of contracts) {
|
|
2385
|
-
const consumers = consumerMap.get(c.path) ?? [];
|
|
2386
|
-
if (c.validation_entrypoint && !consumers.includes(c.validation_entrypoint)) {
|
|
2387
|
-
consumers.push(c.validation_entrypoint);
|
|
2388
|
-
}
|
|
2389
|
-
consumerMap.set(c.path, consumers);
|
|
2390
|
-
}
|
|
2391
|
-
const visibilityMap = new Map(contracts.map((c) => [c.path, c.asset_visibility ?? "unknown"]));
|
|
2392
|
-
const report = cov.auditStandardAssetCoverage(rootDir, consumablePaths, ownerMap, consumerMap, visibilityMap);
|
|
2393
|
-
if (report.uncovered_assets > 0) {
|
|
2394
|
-
hardFail("RELEASE_ISSUE_COVERAGE_UNCOVERED", `问题六十二覆盖审计发现 ${report.uncovered_assets} 个未覆盖资产`, ["src/engine/standard_asset_coverage.ts", "src/engine/template_asset_contract_registry.ts"], "problem-62", "未覆盖资产不得通过发布门禁", "为每个资产建立真实消费证据");
|
|
2395
|
-
}
|
|
2396
|
-
if (report.missing_consumer > 0) {
|
|
2397
|
-
hardFail("RELEASE_ISSUE_COVERAGE_MISSING_CONSUMER", `问题六十二覆盖审计发现 ${report.missing_consumer} 个资产缺少主链路消费者`, ["src/engine/standard_asset_coverage.ts", "src/engine/template_asset_contract_registry.ts"], "problem-62", "无消费者证据不得通过发布门禁", "为每个资产建立真实主链路消费者");
|
|
2398
|
-
}
|
|
2399
|
-
if (report.missing_revalidation > 0) {
|
|
2400
|
-
hardFail("RELEASE_ISSUE_COVERAGE_MISSING_REVALIDATION", `问题六十二覆盖审计发现 ${report.missing_revalidation} 个资产缺少复验入口`, ["src/engine/standard_asset_coverage.ts", "src/engine/template_asset_contract_registry.ts"], "problem-62", "无复验入口不得通过发布门禁", "为每个资产建立真实复验入口");
|
|
2401
|
-
}
|
|
2402
|
-
}
|
|
2403
|
-
catch (error) {
|
|
2404
|
-
// template_asset_contract_registry 尚不存在 — 这是预期失败
|
|
2405
|
-
hardFail("RELEASE_ISSUE_CONTRACT_REGISTRY_MISSING", `问题六十三权威合同注册表不存在: ${error?.message ?? error}`, ["src/engine/template_asset_contract_registry.ts"], "problem-63", "214 资产必须有权威合同", "创建 template_asset_contract_registry.ts");
|
|
2406
|
-
}
|
|
2407
|
-
}
|
|
2408
|
-
// 问题六十三: templates 总数 = 权威合同覆盖数
|
|
2409
|
-
{
|
|
2410
|
-
const contractRegText = safeRead(path.join(rootDir, "src", "engine", "template_asset_contract_registry.ts")) ?? "";
|
|
2411
|
-
if (!contractRegText.includes("TemplateAssetContract") || !contractRegText.includes("listTemplateAssetContracts")) {
|
|
2412
|
-
hardFail("RELEASE_ISSUE_CONTRACT_REGISTRY_MISSING", "问题六十三缺少权威合同注册表(TemplateAssetContract / listTemplateAssetContracts)", ["src/engine/template_asset_contract_registry.ts"], "problem-63", "214 资产必须有单一权威元数据体系", "创建 template_asset_contract_registry.ts");
|
|
2413
|
-
}
|
|
2414
|
-
}
|
|
2415
|
-
// 问题六十四: 可见性不得使用 denylist 猜测
|
|
2416
|
-
{
|
|
2417
|
-
const visText2 = safeRead(path.join(rootDir, "src", "engine", "template_asset_visibility.ts")) ?? "";
|
|
2418
|
-
if (visText2.includes("INTERNAL_ASSET_PATTERNS")) {
|
|
2419
|
-
hardFail("RELEASE_ISSUE_VISIBILITY_DENYLIST", "问题六十四 template_asset_visibility.ts 仍使用 INTERNAL_ASSET_PATTERNS denylist", ["src/engine/template_asset_visibility.ts"], "problem-64", "denylist 猜测不是权威分类", "改用权威合同注册表的 asset_visibility 字段");
|
|
2420
|
-
}
|
|
2421
|
-
}
|
|
2422
|
-
// 问题六十四: 必须存在并执行真实技术栈受限资产,禁止以跳过或内存假资产代替。
|
|
2423
|
-
{
|
|
2424
|
-
const { buildTemplateAssetContracts } = await import("./template_asset_contract_registry.js");
|
|
2425
|
-
const restrictedScaffolds = buildTemplateAssetContracts(rootDir).filter((contract) => contract.consume_category === "scaffold_only" && contract.applicable_tech_stack.length > 0);
|
|
2426
|
-
if (restrictedScaffolds.length === 0) {
|
|
2427
|
-
hardFail("RELEASE_ISSUE_TECH_STACK_ASSET_MISSING", "问题六十四不存在真实 applicable_tech_stack 脚手架资产", ["src/engine/explicit_asset_registry.ts"], "problem-64", "没有真实受限资产不能证明技术栈隔离", "为内置脚手架声明权威 applicable_tech_stack 并走 sf_scaffold 验证");
|
|
2428
|
-
}
|
|
2429
|
-
const scenarioTestText = safeRead(path.join(rootDir, "tests", "engine", "release_issue_scenario_matrix.test.ts")) ?? "";
|
|
2430
|
-
const failClosedTestText = safeRead(path.join(rootDir, "tests", "engine", "contract_fail_closed.test.ts")) ?? "";
|
|
2431
|
-
if (/it\.skip\([\s\S]{0,80}技术栈|test-java-rule/.test(`${scenarioTestText}\n${failClosedTestText}`)) {
|
|
2432
|
-
hardFail("RELEASE_ISSUE_TECH_STACK_FAKE_TEST", "问题六十四仍以跳过测试或内存假资产代替真实技术栈复验", ["tests/engine/release_issue_scenario_matrix.test.ts", "tests/engine/contract_fail_closed.test.ts"], "problem-64", "假资产/skip 不证明用户实际链路", "仅使用 explicit_asset_registry 已登记资产执行真实 scaffold 场景");
|
|
2433
|
-
}
|
|
2434
|
-
}
|
|
2435
|
-
// sf_accept 必须为需要显式授权的验收入口,且处理器不得直接篡改产物状态。
|
|
2436
|
-
{
|
|
2437
|
-
const contractText = safeRead(path.join(rootDir, "src", "engine", "tool_invocation_contract_registry.ts")) ?? "";
|
|
2438
|
-
const acceptStart = toolsText.indexOf('registerSafeTool(\n "sf_accept"');
|
|
2439
|
-
const deliverStart = toolsText.indexOf('registerSafeTool(\n "sf_deliver"', acceptStart + 1);
|
|
2440
|
-
const acceptBody = toolsText.substring(acceptStart, deliverStart > 0 ? deliverStart : toolsText.length);
|
|
2441
|
-
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);
|
|
2442
|
-
const confirmsEvidence = acceptBody.includes("confirmation_ref") && acceptBody.includes("confirmed_by") && acceptBody.includes("updateArtifactStatus");
|
|
2443
|
-
const directStatusWrite = /artifact_output\.status\s*=\s*"accepted"/.test(acceptBody);
|
|
2444
|
-
if (!contractStrict || !confirmsEvidence || directStatusWrite) {
|
|
2445
|
-
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 接受产物");
|
|
2446
|
-
}
|
|
2447
|
-
}
|
|
2448
|
-
// 问题五十九: 新增 CLI 命令不得使用 console.log
|
|
2449
|
-
{
|
|
2450
|
-
const auditFnStart = cliText.indexOf("async function cmdAuditTemplateVisibility");
|
|
2451
|
-
const nextFnStart = cliText.indexOf("\nasync function ", auditFnStart + 1);
|
|
2452
|
-
const fnBody = cliText.substring(auditFnStart, nextFnStart > 0 ? nextFnStart : cliText.length);
|
|
2453
|
-
if (fnBody.includes("console.log")) {
|
|
2454
|
-
hardFail("RELEASE_ISSUE_LOGGER_VIOLATION", "问题五十九 cmdAuditTemplateVisibility 使用 console.log 违反日志治理", ["src/bin/soloforge.ts"], "problem-59", "新增代码必须使用统一 logger", "替换 console.log 为 userInfo/userJson");
|
|
2455
|
-
}
|
|
2456
|
-
}
|
|
2457
|
-
// 问题六十二/六十三: 逐资产运行时消费证据 — 不得接受"consumer file exists"或"export name exists"作为真实消费证明
|
|
2458
|
-
{
|
|
2459
|
-
const { observeAllConsumption } = await import("./observed_consumption.js");
|
|
2460
|
-
const report = await observeAllConsumption(rootDir);
|
|
2461
|
-
if (report.fail > 0) {
|
|
2462
|
-
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 中每个资产的观察结果");
|
|
2463
|
-
}
|
|
2464
|
-
if (report.total < 215) {
|
|
2465
|
-
hardFail("RELEASE_ISSUE_CONSUMPTION_EVIDENCE_INCOMPLETE", `问题六十二消费证据仅覆盖 ${report.total} 个资产,预期至少 215`, ["src/engine/observed_consumption.ts"], "problem-62", "消费证据覆盖不全", "确保所有注册资产都有消费观察记录");
|
|
2466
|
-
}
|
|
2467
|
-
// trace 必须来自真实入口(init/sync_templates),不得仅来自 contract_gate 兜底
|
|
2468
|
-
const traceCounts = report.trace_counts;
|
|
2469
|
-
if ((traceCounts.init ?? 0) === 0 && (traceCounts.sync_templates ?? 0) === 0) {
|
|
2470
|
-
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");
|
|
2471
|
-
}
|
|
2472
|
-
// 硬检查: mainline trace 的 declared_consumer 必须与合同 mainline_consumer 精确匹配
|
|
2473
|
-
for (const obs of report.observations) {
|
|
2474
|
-
if (obs.consume_category === "mainline" && obs.validation_result === "fail" && obs.failure_reason?.includes("无精确消费 trace")) {
|
|
2475
|
-
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");
|
|
2476
|
-
}
|
|
2477
|
-
}
|
|
2478
|
-
}
|
|
2479
|
-
// 负向测试: scaffold_only 资产必须有 scaffold trace,删除 scaffold scenario 后必须 fail
|
|
2480
|
-
{
|
|
2481
|
-
const { buildTemplateAssetContracts } = await import("./template_asset_contract_registry.js");
|
|
2482
|
-
const { getConsumptionTraces, clearConsumptionTraces, recordConsumptionTrace } = await import("./consumption_trace_store.js");
|
|
2483
|
-
clearConsumptionTraces();
|
|
2484
|
-
// 只运行 init+sync(不运行 scaffold),scaffold_only 资产应无合法 trace
|
|
2485
|
-
const { copyKnowledgeToProject, copyPatternsToGlobal } = await import("./template_init_sync.js");
|
|
2486
|
-
const tmpNegDir = fs.mkdtempSync(path.join(os.tmpdir(), "soloforge-neg-"));
|
|
2487
|
-
try {
|
|
2488
|
-
await copyKnowledgeToProject(rootDir, tmpNegDir);
|
|
2489
|
-
const globalDir = path.join(tmpNegDir, ".soloforge", "patterns");
|
|
2490
|
-
await copyPatternsToGlobal(rootDir, globalDir);
|
|
2491
|
-
}
|
|
2492
|
-
finally {
|
|
2493
|
-
fs.rmSync(tmpNegDir, { recursive: true, force: true });
|
|
2494
|
-
}
|
|
2495
|
-
// 收集 scaffold_only 合同,验证它们都没有 scaffold trace
|
|
2496
|
-
const contracts = buildTemplateAssetContracts(rootDir);
|
|
2497
|
-
const scaffoldContracts = contracts.filter(c => c.consume_category === "scaffold_only");
|
|
2498
|
-
const traces = getConsumptionTraces();
|
|
2499
|
-
const scaffoldTracedPaths = new Set(traces.filter(t => t.consumer === "scaffold").map(t => t.asset_path));
|
|
2500
|
-
const scaffoldWithTrace = scaffoldContracts.filter(c => scaffoldTracedPaths.has(c.path));
|
|
2501
|
-
if (scaffoldWithTrace.length > 0) {
|
|
2502
|
-
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 是否独立");
|
|
2503
|
-
}
|
|
2504
|
-
clearConsumptionTraces();
|
|
2505
|
-
}
|
|
2506
|
-
// 问题六十四: copyKnowledgeTemplates 必须对无合同资产 fail-closed
|
|
2507
|
-
{
|
|
2508
|
-
const copyFnSource = syncText || cliText;
|
|
2509
|
-
const copyFnStart = copyFnSource.indexOf("async function copyKnowledge") !== -1
|
|
2510
|
-
? copyFnSource.indexOf("async function copyKnowledge")
|
|
2511
|
-
: copyFnSource.indexOf("export async function copyKnowledgeToProject");
|
|
2512
|
-
const copyFnEnd = copyFnSource.indexOf("\nasync function ", copyFnStart + 1);
|
|
2513
|
-
const copyFnBody = copyFnSource.substring(copyFnStart, copyFnEnd > 0 ? copyFnEnd : copyFnSource.length);
|
|
2514
|
-
// 必须有 "skipped_no_contract" 或 "unregistered" — 证明无合同时会跳过
|
|
2515
|
-
if (!copyFnBody.includes("skipped_no_contract") && !copyFnBody.includes("unregistered")) {
|
|
2516
|
-
hardFail("RELEASE_ISSUE_COPY_NO_CONTRACT_FAIL_OPEN", "问题六十四 copyKnowledgeTemplates 未对无合同资产 fail-closed", ["src/engine/template_init_sync.ts"], "problem-64", "无合同资产不应被复制", "添加 skipped_no_contract 计数并在无合同时 continue");
|
|
2517
|
-
}
|
|
2518
|
-
}
|
|
2519
|
-
}
|
|
2520
|
-
// ── 18. 代码可维护性与可观测性契约行为验证(问题六十八) ──
|
|
2521
|
-
async function checkCodeObservabilityBehavior(rootDir, hardFail, _info) {
|
|
2522
|
-
const obsPath = path.join(rootDir, "dist", "engine", "code_maintainability_observability_contract.js");
|
|
2523
|
-
if (!fs.existsSync(obsPath)) {
|
|
2524
|
-
hardFail("CODE_OBSERVABILITY_MODULE_MISSING", "problem-68: code_maintainability_observability_contract.js 未编译到 dist/", ["src/engine/code_maintainability_observability_contract.ts"], "problem-68", "发布门禁不检查问题-68 实现是否存在", "实现 code_maintainability_observability_contract 并编译");
|
|
2525
|
-
return;
|
|
2526
|
-
}
|
|
2527
|
-
let obs;
|
|
2528
|
-
try {
|
|
2529
|
-
obs = await import(obsPath);
|
|
2530
|
-
}
|
|
2531
|
-
catch (e) {
|
|
2532
|
-
hardFail("CODE_OBSERVABILITY_IMPORT_ERROR", `problem-68: code_maintainability_observability_contract 导入失败: ${e.message}`, ["src/engine/code_maintainability_observability_contract.ts"], "problem-68", "可观测性模块存在但不可导入", "修复导入错误");
|
|
2533
|
-
return;
|
|
2534
|
-
}
|
|
2535
|
-
// 核心导出存在性
|
|
2536
|
-
const requiredExports = ["reviewMissingLogs", "detectSensitiveLogs", "reviewCommentQuality", "hasBlockingObservabilityFindings", "requiresCodeObservabilityContract", "isLowRiskChange", "detectProjectLogger", "verifyChangedFilesObservability", "evaluateDeliveryBlock"];
|
|
2537
|
-
for (const exp of requiredExports) {
|
|
2538
|
-
if (typeof obs[exp] !== "function") {
|
|
2539
|
-
hardFail("CODE_OBSERVABILITY_EXPORT_MISSING", `problem-68: code_maintainability_observability_contract.ts 缺少导出函数: ${exp}`, ["src/engine/code_maintainability_observability_contract.ts"], "problem-68", "可观测性模块缺少核心导出", `添加 ${exp} 导出`);
|
|
2540
|
-
}
|
|
2541
|
-
}
|
|
2542
|
-
// 行为验证: 支付写操作无日志必须被检测
|
|
2543
|
-
try {
|
|
2544
|
-
const paymentFindings = obs.reviewMissingLogs({
|
|
2545
|
-
"PaymentService.java": `public void refund(String orderId, BigDecimal amount) {
|
|
2546
|
-
orderRepository.save(order);
|
|
2547
|
-
paymentGateway.refund(orderId, amount);
|
|
2548
|
-
}`,
|
|
2549
|
-
});
|
|
2550
|
-
if (!obs.hasBlockingObservabilityFindings(paymentFindings)) {
|
|
2551
|
-
hardFail("CODE_OBSERVABILITY_PAYMENT_FALSE_PASS", "problem-68: 支付写操作无日志未被检测到", ["src/engine/code_maintainability_observability_contract.ts"], "problem-68", "文件存在不能证明审查能力有效", "修复 reviewMissingLogs 检测逻辑");
|
|
2552
|
-
}
|
|
2553
|
-
// 行为验证: catch 吞异常无日志必须被检测
|
|
2554
|
-
const catchFindings = obs.reviewMissingLogs({
|
|
2555
|
-
"OrderService.ts": `async processOrder(orderId: string) {
|
|
2556
|
-
try {
|
|
2557
|
-
await this.client.submit(orderId);
|
|
2558
|
-
} catch (e) {
|
|
2559
|
-
return false;
|
|
2560
|
-
}
|
|
2561
|
-
}`,
|
|
2562
|
-
});
|
|
2563
|
-
if (!obs.hasBlockingObservabilityFindings(catchFindings)) {
|
|
2564
|
-
hardFail("CODE_OBSERVABILITY_CATCH_FALSE_PASS", "problem-68: catch 吞异常无日志未被检测到", ["src/engine/code_maintainability_observability_contract.ts"], "problem-68", "catch 吞异常必须产生阻断 finding", "修复 reviewMissingLogs 检测逻辑");
|
|
2565
|
-
}
|
|
2566
|
-
// 行为验证: 敏感信息日志泄漏必须被检测
|
|
2567
|
-
const sensitiveFindings = obs.detectSensitiveLogs({
|
|
2568
|
-
"UserService.ts": `function login(user) {
|
|
2569
|
-
logger.info("user login", { token: "eyJhbGciOiJIUzI1NiJ9.xxxxx", password: user.password, phone: "13812345678" });
|
|
2570
|
-
}`,
|
|
2571
|
-
});
|
|
2572
|
-
if (!obs.hasBlockingObservabilityFindings(sensitiveFindings)) {
|
|
2573
|
-
hardFail("CODE_OBSERVABILITY_SENSITIVE_FALSE_PASS", "problem-68: 敏感信息日志泄漏未被检测到", ["src/engine/code_maintainability_observability_contract.ts"], "problem-68", "token/password/手机号泄漏必须被阻断", "修复 detectSensitiveLogs 检测逻辑");
|
|
2574
|
-
}
|
|
2575
|
-
// 行为验证: 低风险任务不应触发
|
|
2576
|
-
const notTriggered = !obs.requiresCodeObservabilityContract("修复 README 错别字", "code_change");
|
|
2577
|
-
if (!notTriggered) {
|
|
2578
|
-
hardFail("CODE_OBSERVABILITY_LOW_RISK_OVERBLOCK", "problem-68: 低风险文案任务错误触发可观测性检查", ["src/engine/code_maintainability_observability_contract.ts"], "problem-68", "低风险任务不应触发检查", "修复 requiresCodeObservabilityContract 判断逻辑");
|
|
2579
|
-
}
|
|
2580
|
-
// 行为验证: 项目 logger 类型检测
|
|
2581
|
-
const javaLogger = obs.detectProjectLogger({
|
|
2582
|
-
"Application.java": "import org.slf4j.LoggerFactory; private static final Logger log = LoggerFactory.getLogger(App.class);",
|
|
2583
|
-
});
|
|
2584
|
-
if (javaLogger.type !== "slf4j") {
|
|
2585
|
-
hardFail("CODE_OBSERVABILITY_LOGGER_DETECT_FAIL", `problem-68: SLF4J logger 未被正确识别 (got: ${javaLogger.type})`, ["src/engine/code_maintainability_observability_contract.ts"], "problem-68", "项目 logger 类型检测必须准确", "修复 detectProjectLogger 逻辑");
|
|
2586
|
-
}
|
|
2587
|
-
// 行为验证: 迁移脚本无审计日志必须被检测
|
|
2588
|
-
const migrationFindings = obs.reviewMissingLogs({
|
|
2589
|
-
"scripts/data_fix_order_status.ts": `async function migrateOrderStatus() {
|
|
2590
|
-
const orders = await db.query("SELECT * FROM orders WHERE status IS NULL");
|
|
2591
|
-
for (const order of orders) {
|
|
2592
|
-
await db.update("UPDATE orders SET status = 'pending' WHERE id = ?", [order.id]);
|
|
2593
|
-
}
|
|
2594
|
-
}`,
|
|
2595
|
-
});
|
|
2596
|
-
if (!obs.hasBlockingObservabilityFindings(migrationFindings)) {
|
|
2597
|
-
hardFail("CODE_OBSERVABILITY_MIGRATION_FALSE_PASS", "problem-68: 迁移脚本无审计日志未被检测到", ["src/engine/code_maintainability_observability_contract.ts"], "problem-68", "数据修复脚本必须有审计日志", "修复 reviewMissingLogs 迁移脚本检测逻辑");
|
|
2598
|
-
}
|
|
2599
|
-
// 行为验证: 普通 Spring 后端 Slice 的 CRUD/事务双写无日志无注释也必须被检测。
|
|
2600
|
-
const smartCareSliceFindings = obs.verifyChangedFilesObservability({
|
|
2601
|
-
changed_files: ["src/main/java/com/demoapp/account/service/impl/AccountServiceImpl.java"],
|
|
2602
|
-
file_contents: {
|
|
2603
|
-
"src/main/java/com/demoapp/account/service/impl/AccountServiceImpl.java": `@Service
|
|
2604
|
-
public class AccountServiceImpl implements AccountService {
|
|
2605
|
-
@Transactional
|
|
2606
|
-
public AccountVO create(AccountCreateRequest request) {
|
|
2607
|
-
Account account = convert(request);
|
|
2608
|
-
accountMapper.insert(account);
|
|
2609
|
-
SysUser user = buildUser(request);
|
|
2610
|
-
sysUserMapper.insert(user);
|
|
2611
|
-
return toVO(account);
|
|
2612
|
-
}
|
|
2613
|
-
@Transactional
|
|
2614
|
-
public void resign(Long accountId) {
|
|
2615
|
-
accountMapper.updateStatus(accountId, AccountStatus.RESIGNED);
|
|
2616
|
-
sysUserMapper.updateAccountStatus(accountId, 0);
|
|
2617
|
-
}
|
|
2618
|
-
}`,
|
|
2619
|
-
},
|
|
2620
|
-
intent: "完成 Slice 2 资源目录与账号管理后端实现",
|
|
2621
|
-
});
|
|
2622
|
-
const smartCareBlocked = smartCareSliceFindings.some((f) => f.category === "missing_log_business_write" && f.severity === "hard_fail")
|
|
2623
|
-
&& smartCareSliceFindings.some((f) => f.category === "missing_comment_complex");
|
|
2624
|
-
if (!smartCareBlocked) {
|
|
2625
|
-
hardFail("CODE_OBSERVABILITY_BACKEND_SLICE_FALSE_PASS", "problem-68: 普通后端 Slice 的 Controller/Service 事务双写和级联规则无日志无注释未被阻断", ["src/engine/code_maintainability_observability_contract.ts"], "problem-68", "旧门禁只覆盖支付/安全/迁移,真实 CRUD 后端实现仍可无日志无注释通过", "扩展后端实现文件检测,覆盖 Controller/Service/DTO/Entity");
|
|
2626
|
-
}
|
|
2627
|
-
const javaDocAndChineseFindings = obs.verifyChangedFilesObservability({
|
|
2628
|
-
changed_files: ["src/main/java/com/demoapp/account/service/impl/AccountServiceImpl.java"],
|
|
2629
|
-
file_contents: {
|
|
2630
|
-
"src/main/java/com/demoapp/account/service/impl/AccountServiceImpl.java": `@Service
|
|
2631
|
-
public class AccountServiceImpl implements AccountService {
|
|
2632
|
-
public AccountVO create(AccountCreateRequest request) {
|
|
2633
|
-
Account account = convert(request);
|
|
2634
|
-
accountMapper.insert(account);
|
|
2635
|
-
logger.info("account created accountId=" + account.getId());
|
|
2636
|
-
return toVO(account);
|
|
2637
|
-
}
|
|
2638
|
-
}`,
|
|
2639
|
-
},
|
|
2640
|
-
intent: "完成 Slice 2 账号管理后端实现",
|
|
2641
|
-
});
|
|
2642
|
-
const javaDocAndChineseBlocked = ["missing_class_doc", "missing_method_doc", "missing_important_line_comment", "non_chinese_log"].every((category) => javaDocAndChineseFindings.some((f) => f.category === category && f.severity === "hard_fail"));
|
|
2643
|
-
if (!javaDocAndChineseBlocked) {
|
|
2644
|
-
hardFail("CODE_OBSERVABILITY_CHINESE_DOC_CONTRACT_FALSE_PASS", "problem-68: 后端类/方法中文 Javadoc、关键行中文注释或中文日志缺失未被阻断", ["src/engine/code_maintainability_observability_contract.ts"], "problem-68", "只检查是否有日志/注释会放过英文日志、无类说明、无方法入参出参说明和关键行业务意图缺失", "扩展 reviewCommentQuality/reviewMissingLogs,强制中文日志、中文注释、类 Javadoc、方法 Javadoc 和关键行注释");
|
|
2645
|
-
}
|
|
2646
|
-
const crossStackFindings = obs.verifyChangedFilesObservability({
|
|
2647
|
-
changed_files: ["src/routes/account.route.ts", "app/api/account.py", "src/pages/AccountForm.tsx"],
|
|
2648
|
-
file_contents: {
|
|
2649
|
-
"src/routes/account.route.ts": `router.post('/account', async (req, res) => {
|
|
2650
|
-
const account = await accountRepo.create(req.body);
|
|
2651
|
-
await userRepo.create({ accountId: account.id });
|
|
2652
|
-
res.json(account);
|
|
2653
|
-
});`,
|
|
2654
|
-
"app/api/account.py": `@router.post("/account")
|
|
2655
|
-
async def create_account(payload: AccountCreate):
|
|
2656
|
-
account = await account_repo.create(payload)
|
|
2657
|
-
await user_repo.create(account_id=account.id)
|
|
2658
|
-
return account`,
|
|
2659
|
-
"src/pages/AccountForm.tsx": `export function AccountForm() {
|
|
2660
|
-
async function handleSubmit(values) {
|
|
2661
|
-
await apiClient.post('/api/tenant/users', values);
|
|
2662
|
-
setStatus('created');
|
|
2663
|
-
}
|
|
2664
|
-
return <form onSubmit={handleSubmit}>...</form>;
|
|
2665
|
-
}`,
|
|
2666
|
-
},
|
|
2667
|
-
intent: "实现账号新增前后端接口与表单",
|
|
2668
|
-
});
|
|
2669
|
-
const crossStackBlocked = crossStackFindings.filter((f) => f.category === "missing_log_business_write" && f.severity === "hard_fail").length >= 3;
|
|
2670
|
-
if (!crossStackBlocked) {
|
|
2671
|
-
hardFail("CODE_OBSERVABILITY_CROSS_STACK_FALSE_PASS", "problem-68: 非 Spring 后端或前端业务写操作无日志/埋点未被阻断", ["src/engine/code_maintainability_observability_contract.ts"], "problem-68", "问题六十八不能只覆盖 Spring 后端文件", "扩展检测到 Nest/Express/FastAPI/Go/React/Vue 等通用实现形态");
|
|
2672
|
-
}
|
|
2673
|
-
}
|
|
2674
|
-
catch (e) {
|
|
2675
|
-
hardFail("CODE_OBSERVABILITY_EXECUTION_ERROR", `problem-68: 可观测性行为检查执行失败: ${e.message}`, ["src/engine/code_maintainability_observability_contract.ts"], "problem-68", "契约模块必须可运行并返回确定结果", "修复运行时异常");
|
|
2676
|
-
}
|
|
2677
|
-
// 主链路消费检查 — sf_verify 必须调用 verifyChangedFilesObservability
|
|
2678
|
-
const toolsText = safeRead(path.join(rootDir, "src", "adapters", "claude_code", "tools.ts")) ?? "";
|
|
2679
|
-
const requiredHooks = [
|
|
2680
|
-
"lazyCodeObservability", "reviewCodeObservability",
|
|
2681
|
-
"hasBlockingObservabilityFindings", "requiresCodeObservabilityContract",
|
|
2682
|
-
"evaluateCodeObservabilityGate", "evaluateDeliveryBlock",
|
|
2683
|
-
"verifyChangedFilesObservability",
|
|
2684
|
-
];
|
|
2685
|
-
for (const hook of requiredHooks) {
|
|
2686
|
-
if (!toolsText.includes(hook)) {
|
|
2687
|
-
hardFail("CODE_OBSERVABILITY_MAINPATH_MISSING", `problem-68: MCP 主链路缺少真实消费点 ${hook}`, ["src/adapters/claude_code/tools.ts"], "problem-68", "只实现引擎函数不能证明用户路径受约束", "接入 sf_expand/sf_review/sf_verify/sf_deliver");
|
|
2688
|
-
}
|
|
2689
|
-
}
|
|
2690
|
-
// 行为验证: sf_verify 必须真实消费 verifyChangedFilesObservability — 编译后检查
|
|
2691
|
-
try {
|
|
2692
|
-
const toolsJsPath = path.join(rootDir, "dist", "adapters", "claude_code", "tools.js");
|
|
2693
|
-
if (fs.existsSync(toolsJsPath)) {
|
|
2694
|
-
const toolsJs = safeRead(toolsJsPath) ?? "";
|
|
2695
|
-
const hasObsVerifyCall = toolsJs.includes("codeObservabilityFinding")
|
|
2696
|
-
&& toolsJs.includes("verifyChangedFilesObservability");
|
|
2697
|
-
if (!hasObsVerifyCall) {
|
|
2698
|
-
hardFail("CODE_OBSERVABILITY_SF_VERIFY_NOT_CONSUMING", "problem-68: sf_verify 编译产物未包含可观测性诊断常量或 verifyChangedFilesObservability 调用", ["src/adapters/claude_code/tools.ts"], "problem-68", "字符串引用不能证明 sf_verify 真实消费可观测性检查", "在 sf_verify implementationFiles 分支中调用 verifyChangedFilesObservability 并处理结果");
|
|
2699
|
-
}
|
|
2700
|
-
}
|
|
2701
|
-
}
|
|
2702
|
-
catch {
|
|
2703
|
-
// 编译产物不存在时由 build 门禁处理
|
|
2704
|
-
}
|
|
2705
|
-
// 行为验证: sf_verify 必须能阻断 — 敏感信息 + 支付写操作必须产生 hard_fail
|
|
2706
|
-
try {
|
|
2707
|
-
const mustFailFindings = obs.verifyChangedFilesObservability({
|
|
2708
|
-
changed_files: ["PaymentService.ts"],
|
|
2709
|
-
file_contents: {
|
|
2710
|
-
"PaymentService.ts": `const api_key = "sk_live_abcdef123456";
|
|
2711
|
-
async function processPayment(order) { order.save(); }`,
|
|
2712
|
-
},
|
|
2713
|
-
intent: "添加支付退款日志和脱敏处理",
|
|
2714
|
-
});
|
|
2715
|
-
if (!obs.hasBlockingObservabilityFindings(mustFailFindings)) {
|
|
2716
|
-
hardFail("CODE_OBSERVABILITY_VERIFY_MUST_FAIL_PASS", "problem-68: sf_verify 未对敏感信息泄漏+支付无日志场景产生阻断", ["src/engine/code_maintainability_observability_contract.ts"], "problem-68", "verifyChangedFilesObservability 必须对支付敏感信息场景 hard_fail", "修复 verifyChangedFilesObservability 检测逻辑");
|
|
2717
|
-
}
|
|
2718
|
-
// sf_verify 必须允许合规代码通过
|
|
2719
|
-
const mustPassFindings = obs.verifyChangedFilesObservability({
|
|
2720
|
-
changed_files: ["RefundService.ts"],
|
|
2721
|
-
file_contents: {
|
|
2722
|
-
"RefundService.ts": `const logger = require('./logger');
|
|
2723
|
-
async function processRefund(orderId: string) {
|
|
2724
|
-
await db.refund(orderId);
|
|
2725
|
-
logger.info("退款成功 orderId=" + orderId);
|
|
2726
|
-
}`,
|
|
2727
|
-
},
|
|
2728
|
-
intent: "添加支付退款日志和脱敏处理",
|
|
2729
|
-
});
|
|
2730
|
-
if (obs.hasBlockingObservabilityFindings(mustPassFindings)) {
|
|
2731
|
-
hardFail("CODE_OBSERVABILITY_VERIFY_FALSE_BLOCK", "problem-68: sf_verify 对合规代码错误阻断", ["src/engine/code_maintainability_observability_contract.ts"], "problem-68", "合规代码不应被阻断", "修复 verifyChangedFilesObservability 检测逻辑");
|
|
2732
|
-
}
|
|
2733
|
-
// 行为验证: logger.info("退款成功") 无可定位字段必须 hard_fail
|
|
2734
|
-
const unlocatableFailFindings = obs.verifyChangedFilesObservability({
|
|
2735
|
-
changed_files: ["RefundService.ts"],
|
|
2736
|
-
file_contents: {
|
|
2737
|
-
"RefundService.ts": `const logger = require('./logger');
|
|
2738
|
-
async function refund(order) { order.save(); logger.info("退款成功"); }`,
|
|
2739
|
-
},
|
|
2740
|
-
intent: "添加支付退款日志和脱敏处理",
|
|
2741
|
-
});
|
|
2742
|
-
const unlocatableHardFails = unlocatableFailFindings.filter((f) => f.category === "unlocatable_log" && f.severity === "hard_fail");
|
|
2743
|
-
if (unlocatableHardFails.length === 0) {
|
|
2744
|
-
hardFail("CODE_OBSERVABILITY_UNLOCATABLE_LOG_PASS", "problem-68: logger.info('退款成功') 无可定位字段未被阻断", ["src/engine/code_maintainability_observability_contract.ts"], "problem-68", "仅含事件词的日志不可通过支付写操作检查", "修复可定位字段判断逻辑");
|
|
2745
|
-
}
|
|
2746
|
-
// 行为验证: logger.info("退款成功 orderId=" + orderId) 必须通过
|
|
2747
|
-
const unlocatablePassFindings = obs.verifyChangedFilesObservability({
|
|
2748
|
-
changed_files: ["RefundService.ts"],
|
|
2749
|
-
file_contents: {
|
|
2750
|
-
"RefundService.ts": `const logger = require('./logger');
|
|
2751
|
-
async function refund(order) { order.save(); logger.info("退款成功 orderId=" + orderId); }`,
|
|
2752
|
-
},
|
|
2753
|
-
intent: "添加支付退款日志和脱敏处理",
|
|
2754
|
-
});
|
|
2755
|
-
const unlocatableBlockers = unlocatablePassFindings.filter((f) => f.category === "unlocatable_log" && f.severity === "hard_fail");
|
|
2756
|
-
if (unlocatableBlockers.length > 0) {
|
|
2757
|
-
hardFail("CODE_OBSERVABILITY_LOCATABLE_FALSE_BLOCK", "problem-68: logger.info('退款成功 orderId=...') 含可定位字段被错误阻断", ["src/engine/code_maintainability_observability_contract.ts"], "problem-68", "包含对象 ID 的日志不应被阻断", "修复可定位字段判断逻辑");
|
|
2758
|
-
}
|
|
2759
|
-
}
|
|
2760
|
-
catch (e) {
|
|
2761
|
-
hardFail("CODE_OBSERVABILITY_VERIFY_EXECUTION_ERROR", `problem-68: sf_verify 行为检查执行失败: ${e.message}`, ["src/engine/code_maintainability_observability_contract.ts"], "problem-68", "verifyChangedFilesObservability 必须可运行并返回确定结果", "修复运行时异常");
|
|
2762
|
-
}
|
|
2763
|
-
_info(" problem-68 代码可维护性与可观测性行为验证完成");
|
|
2764
|
-
}
|
|
2765
|
-
// ── 21. 模板卫生与用户项目知识消费验证 ──
|
|
2766
|
-
async function checkTemplateAndProjectKnowledgeHygiene(rootDir, hardFail, _info) {
|
|
2767
|
-
try {
|
|
2768
|
-
const matrix = await import(path.join(rootDir, "dist", "engine", "project_knowledge_system_regression_matrix.js"));
|
|
2769
|
-
const report = matrix.validateProjectKnowledgeSystemMatrix?.();
|
|
2770
|
-
if (!report?.passed) {
|
|
2771
|
-
const messages = (report?.findings ?? []).map((finding) => `${finding.code}: ${finding.message}`).join("; ");
|
|
2772
|
-
hardFail("PROJECT_KNOWLEDGE_SYSTEM_MATRIX_INCOMPLETE", `problem-69: 知识资产与项目规则消费体系 20 项防回归矩阵不完整: ${messages || "未知缺口"}`, ["src/engine/project_knowledge_system_regression_matrix.ts", "docs/SoloForge-Batch8问题集.md"], "problem-69", "旧门禁只检查部分项目知识行为,未覆盖用户讨论的 20 项完整细节", "补齐 20 项矩阵、生产入口、must-fail/must-pass 与文档引用");
|
|
2773
|
-
}
|
|
2774
|
-
}
|
|
2775
|
-
catch (e) {
|
|
2776
|
-
hardFail("PROJECT_KNOWLEDGE_SYSTEM_MATRIX_EXCEPTION", `problem-69: 知识资产与项目规则消费体系矩阵执行失败: ${e.message}`, ["src/engine/project_knowledge_system_regression_matrix.ts"], "problem-69", "项目知识体系矩阵必须可执行", "修复矩阵模块或编译产物");
|
|
2777
|
-
}
|
|
2778
|
-
const scaffoldDir = path.join(rootDir, "templates", "scaffolds");
|
|
2779
|
-
const scaffoldFindings = [];
|
|
2780
|
-
function scanScaffolds(dir) {
|
|
2781
|
-
if (!fs.existsSync(dir))
|
|
2782
|
-
return;
|
|
2783
|
-
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
2784
|
-
const full = path.join(dir, entry.name);
|
|
2785
|
-
if (entry.isDirectory()) {
|
|
2786
|
-
scanScaffolds(full);
|
|
2787
|
-
continue;
|
|
2788
|
-
}
|
|
2789
|
-
if (!entry.isFile())
|
|
2790
|
-
continue;
|
|
2791
|
-
const rel = path.relative(rootDir, full).replace(/\\/g, "/");
|
|
2792
|
-
const lines = safeReadLines(full);
|
|
2793
|
-
for (let i = 0; i < lines.length; i++) {
|
|
2794
|
-
if (/\b(?:TODO|FIXME|HACK|XXX)\b/.test(lines[i])) {
|
|
2795
|
-
scaffoldFindings.push(`${rel}:${i + 1}`);
|
|
2796
|
-
}
|
|
2797
|
-
}
|
|
2798
|
-
}
|
|
2799
|
-
}
|
|
2800
|
-
scanScaffolds(scaffoldDir);
|
|
2801
|
-
for (const finding of scaffoldFindings) {
|
|
2802
|
-
hardFail("TEMPLATE_SCAFFOLD_PLACEHOLDER_LEAK", `脚手架模板仍包含未落地占位标记: ${finding}`, [finding.split(":")[0]], "template-hygiene", "历史门禁只检查模板是否注册,不检查用户生成代码是否带 TODO/FIXME", "清理脚手架占位标记并补行为测试");
|
|
2803
|
-
}
|
|
2804
|
-
try {
|
|
2805
|
-
const contractMod = await import(path.join(rootDir, "dist", "engine", "template_asset_contract_registry.js"));
|
|
2806
|
-
const contracts = contractMod.listTemplateAssetContracts?.() ?? [];
|
|
2807
|
-
const forbidden = /\b(?:Batch[1-8]|validate-batch|ReleaseFix|problem-\d+)\b/i;
|
|
2808
|
-
for (const contract of contracts) {
|
|
2809
|
-
if (!contract.user_visible)
|
|
2810
|
-
continue;
|
|
2811
|
-
if (!contract.path || !/\.(md|ya?ml|hbs|json)$/i.test(contract.path))
|
|
2812
|
-
continue;
|
|
2813
|
-
const abs = path.join(rootDir, contract.path);
|
|
2814
|
-
const content = safeRead(abs);
|
|
2815
|
-
if (!content || !forbidden.test(content))
|
|
2816
|
-
continue;
|
|
2817
|
-
hardFail("USER_VISIBLE_TEMPLATE_INTERNAL_TRACE", `用户可见模板泄漏内部施工语义: ${contract.path}`, [contract.path], "template-hygiene", "旧门禁只检查内置资产可见性,不检查用户可见模板内容是否混入内部批次/问题编号", "清理用户可见模板内部语义");
|
|
2818
|
-
}
|
|
2819
|
-
}
|
|
2820
|
-
catch (e) {
|
|
2821
|
-
hardFail("TEMPLATE_CONTRACT_AUDIT_FAILED", `无法执行用户可见模板内容审计: ${e.message}`, ["src/engine/template_asset_contract_registry.ts"], "template-hygiene", "模板内容卫生必须可运行审计", "修复模板合同注册表或编译产物");
|
|
2822
|
-
}
|
|
2823
|
-
try {
|
|
2824
|
-
const obs = await import(path.join(rootDir, "dist", "engine", "code_maintainability_observability_contract.js"));
|
|
2825
|
-
const ordinaryApiImplementationTriggers = obs.requiresCodeObservabilityContract?.("实现业务端业务办理列表接口", "code_change") === true;
|
|
2826
|
-
if (!ordinaryApiImplementationTriggers) {
|
|
2827
|
-
hardFail("CODE_OBSERVABILITY_BUSINESS_API_NOT_TRIGGERED", "problem-68: 普通业务接口实现未触发代码注释与日志契约,真实项目会绕过问题六十八", ["src/engine/code_maintainability_observability_contract.ts", "src/adapters/claude_code/tools.ts"], "problem-68", "旧行为只覆盖支付/安全等关键词,未覆盖普通 Controller/API/Service 编码", "扩展触发条件并在 sf_expand 聚合返回工作包");
|
|
2828
|
-
}
|
|
2829
|
-
}
|
|
2830
|
-
catch (e) {
|
|
2831
|
-
hardFail("CODE_OBSERVABILITY_TRIGGER_AUDIT_FAILED", `问题六十八触发审计执行失败: ${e.message}`, ["src/engine/code_maintainability_observability_contract.ts"], "problem-68", "触发判断必须可运行", "修复编译或导出");
|
|
2832
|
-
}
|
|
2833
|
-
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), "soloforge-project-knowledge-"));
|
|
2834
|
-
try {
|
|
2835
|
-
const goodDir = path.join(tmp, ".soloforge", "knowledge", "rules");
|
|
2836
|
-
fs.mkdirSync(goodDir, { recursive: true });
|
|
2837
|
-
fs.writeFileSync(path.join(goodDir, "API响应规则.md"), `---
|
|
2838
|
-
id: demo-api-response-rule
|
|
2839
|
-
asset_kind: hard_rule
|
|
2840
|
-
routes:
|
|
2841
|
-
- code_change
|
|
2842
|
-
- artifact_generation
|
|
2843
|
-
primary_triggers:
|
|
2844
|
-
- API
|
|
2845
|
-
- 接口
|
|
2846
|
-
- 响应
|
|
2847
|
-
tech_stack:
|
|
2848
|
-
- spring
|
|
2849
|
-
enforcement:
|
|
2850
|
-
level: hard_rule
|
|
2851
|
-
---
|
|
2852
|
-
# API 响应规则
|
|
2853
|
-
|
|
2854
|
-
必须使用项目统一响应结构,错误码、字段表和 OpenAPI 保持一致。
|
|
2855
|
-
`, "utf-8");
|
|
2856
|
-
const projectKnowledge = await import(path.join(rootDir, "dist", "engine", "project_knowledge_contract.js"));
|
|
2857
|
-
const lifecycleKnowledge = await import(path.join(rootDir, "dist", "engine", "lifecycle_knowledge_contract.js"));
|
|
2858
|
-
const report = projectKnowledge.auditProjectKnowledge(tmp);
|
|
2859
|
-
if (report.hard_fail_count !== 0 || report.injectable < 1) {
|
|
2860
|
-
hardFail("PROJECT_KNOWLEDGE_RULE_NOT_CONSUMABLE", "用户项目 .soloforge/knowledge hard rule 未被识别为可消费规则", ["src/engine/project_knowledge_contract.ts"], "project-knowledge-consumption", "旧链路只同步/索引内置模板,未证明用户项目自定义规则可被承载消费", "修复项目知识合同审计与选择逻辑");
|
|
2861
|
-
}
|
|
2862
|
-
const selected = projectKnowledge.selectProjectKnowledgeForTaskWithReasons(report, {
|
|
2863
|
-
intent: "实现业务端 API 接口统一响应",
|
|
2864
|
-
route: "code_change",
|
|
2865
|
-
tech_stack: ["spring"],
|
|
2866
|
-
});
|
|
2867
|
-
if (!selected.selected.some((decision) => decision.asset.id === "demo-api-response-rule")) {
|
|
2868
|
-
hardFail("PROJECT_KNOWLEDGE_RULE_NOT_SELECTED", "用户项目自定义 hard rule 未按意图/路由/技术栈被选中", ["src/engine/project_knowledge_contract.ts"], "project-knowledge-consumption", "索引存在不等于任务会消费", "补齐 selectProjectKnowledgeForTask 行为和门禁");
|
|
2869
|
-
}
|
|
2870
|
-
const selection = projectKnowledge.selectProjectKnowledgeForTaskWithReasons(report, {
|
|
2871
|
-
intent: "实现业务端 API 接口统一响应 PHASE-001 SLICE-001 DD-A001 AC-001",
|
|
2872
|
-
route: "code_change",
|
|
2873
|
-
tech_stack: ["spring"],
|
|
2874
|
-
lifecycle_stage: "implementation",
|
|
2875
|
-
changed_files: ["backend/web/src/main/java/com/example/web/tenant/TenantUserController.java"],
|
|
2876
|
-
traceability_ids: ["PHASE-001", "SLICE-001", "DD-A001", "AC-001"],
|
|
2877
|
-
});
|
|
2878
|
-
const selectedDecision = selection.selected.find((decision) => decision.asset.id === "demo-api-response-rule");
|
|
2879
|
-
if (!selectedDecision || !selectedDecision.reason_zh || !Array.isArray(selectedDecision.matched_signals)) {
|
|
2880
|
-
hardFail("PROJECT_KNOWLEDGE_SELECTION_REASON_MISSING", "用户项目规则选择缺少 why selected / matched_signals 结构化解释", ["src/engine/project_knowledge_contract.ts", "src/engine/intent_expander.ts"], "project-knowledge-consumption", "用户不知道为什么规则被选中就无法判断必须确认和修复路径", "让项目知识选择返回 SelectionDecision 而不是裸资产");
|
|
2881
|
-
}
|
|
2882
|
-
const unifiedDecision = lifecycleKnowledge.evaluateLifecycleKnowledgeDecision({
|
|
2883
|
-
projectPath: tmp,
|
|
2884
|
-
consumer: "sf_expand",
|
|
2885
|
-
intent: "实现业务端 API 接口统一响应 PHASE-001 SLICE-001 DD-A001 AC-001",
|
|
2886
|
-
route: "code_change",
|
|
2887
|
-
lifecycle_stage: "implementation",
|
|
2888
|
-
changed_files: ["backend/web/src/main/java/com/example/web/tenant/TenantUserController.java"],
|
|
2889
|
-
verified_files: ["backend/web/src/main/java/com/example/web/tenant/TenantUserController.java"],
|
|
2890
|
-
traceability_ids: ["PHASE-001", "SLICE-001", "DD-A001", "AC-001"],
|
|
2891
|
-
tech_stack: ["spring"],
|
|
2892
|
-
generation_traces: [
|
|
2893
|
-
{ tool_name: "sf_classify", status: "passed", evidence_kind: "result" },
|
|
2894
|
-
{ tool_name: "sf_expand", status: "passed", evidence_kind: "result" },
|
|
2895
|
-
],
|
|
2896
|
-
record_trace: true,
|
|
2897
|
-
});
|
|
2898
|
-
if (unifiedDecision.contract_id !== "lifecycle_knowledge_contract/v1" ||
|
|
2899
|
-
!unifiedDecision.knowledge_selection.selected.some((decision) => decision.asset.id === "demo-api-response-rule") ||
|
|
2900
|
-
!unifiedDecision.authoritative_paths.traceability_matrix ||
|
|
2901
|
-
!Array.isArray(unifiedDecision.recovery_commands)) {
|
|
2902
|
-
hardFail("LIFECYCLE_KNOWLEDGE_DECISION_BUNDLE_INVALID", "统一生命周期知识决策包未同时携带权威路径、SelectionDecision、恢复命令和消费 trace", ["src/engine/lifecycle_knowledge_contract.ts", "src/engine/project_knowledge_contract.ts"], "project-knowledge-consumption", "next/expand/verify/deliver 如果不消费同一决策包,会再次产生局部口径", "修复 evaluateLifecycleKnowledgeDecision 返回结构和入口消费");
|
|
2903
|
-
}
|
|
2904
|
-
const expander = await import(path.join(rootDir, "dist", "engine", "intent_expander.js"));
|
|
2905
|
-
const expandResult = await expander.expand({
|
|
2906
|
-
intent: "实现业务端 API 接口统一响应",
|
|
2907
|
-
classification: {
|
|
2908
|
-
task_type: "feature",
|
|
2909
|
-
risk: "low",
|
|
2910
|
-
complexity: "low",
|
|
2911
|
-
ambiguity: "low",
|
|
2912
|
-
affected_repos: ["backend"],
|
|
2913
|
-
mode: "autonomous",
|
|
2914
|
-
strategy: "full_pipeline",
|
|
2915
|
-
},
|
|
2916
|
-
projectPath: tmp,
|
|
2917
|
-
config: {
|
|
2918
|
-
name: "release-gate-project-knowledge",
|
|
2919
|
-
tech_stack: {
|
|
2920
|
-
backend: { lang: "java", framework: "spring-boot", version: "3" },
|
|
2921
|
-
frontend: { lang: "typescript", framework: "react", version: "18" },
|
|
2922
|
-
},
|
|
2923
|
-
product_profile: "saas",
|
|
2924
|
-
repos: [{ name: "backend", path: "backend", lang: "java", framework: "spring-boot", scope: ["backend/src/"] }],
|
|
2925
|
-
build_commands: {
|
|
2926
|
-
backend: { build: "mvn compile", test: "mvn test", full: "mvn verify" },
|
|
2927
|
-
frontend: { build: "npm run build", test: "npm test", full: "npm test" },
|
|
2928
|
-
},
|
|
2929
|
-
scope: { backend: ["backend/src/"], frontend: ["src/"] },
|
|
2930
|
-
_projectPath: tmp,
|
|
2931
|
-
},
|
|
2932
|
-
knowledgeIndex: { query: () => [], markUsed: () => { } },
|
|
2933
|
-
route_decision: {
|
|
2934
|
-
route: "code_change",
|
|
2935
|
-
execution_shape: "code_execution",
|
|
2936
|
-
mutation_allowed: true,
|
|
2937
|
-
input_materials: [],
|
|
2938
|
-
missing_required_inputs: [],
|
|
2939
|
-
scope: { read_only: false },
|
|
2940
|
-
constraints: [],
|
|
2941
|
-
language_policy: { primary: "zh" },
|
|
2942
|
-
confidence: 0.9,
|
|
2943
|
-
evidence: [],
|
|
2944
|
-
rejected_routes: [],
|
|
2945
|
-
conflicts: [],
|
|
2946
|
-
decision_version: 1,
|
|
2947
|
-
},
|
|
2948
|
-
});
|
|
2949
|
-
if (!expandResult.project_knowledge?.selected?.some((asset) => asset.id === "demo-api-response-rule")
|
|
2950
|
-
|| !String(expandResult.prompt).includes("## 用户项目规则")
|
|
2951
|
-
|| !String(expandResult.prompt).includes("选中原因")
|
|
2952
|
-
|| !expandResult.project_knowledge?.selection_decisions?.some((decision) => decision.id === "demo-api-response-rule" && decision.reason_zh)) {
|
|
2953
|
-
hardFail("PROJECT_KNOWLEDGE_NOT_IN_EXPAND_MAINPATH", "用户项目规则未进入 sf_expand 真实 prompt 和结构化结果", ["src/engine/intent_expander.ts", "src/engine/project_knowledge_contract.ts"], "project-knowledge-consumption", "审计/选择通过不等于 MCP 主链路会消费", "将项目规则接入 sf_expand 并补主链路测试");
|
|
2954
|
-
}
|
|
2955
|
-
const nextPlanner = await import(path.join(rootDir, "dist", "engine", "next_action_planner.js"));
|
|
2956
|
-
const nextPlan = await nextPlanner.planNextAction(tmp);
|
|
2957
|
-
if (!nextPlan.project_knowledge_context || nextPlan.project_knowledge_context.total < 1) {
|
|
2958
|
-
hardFail("PROJECT_KNOWLEDGE_NOT_IN_NEXT", "soloforge next 未携带项目知识上下文,用户无法知道下一步会应用哪些项目规则", ["src/engine/next_action_planner.ts", "src/bin/soloforge.ts"], "project-knowledge-consumption", "旧导航只看阶段,不看项目规则", "将项目知识上下文接入 next JSON 和人类输出");
|
|
2959
|
-
}
|
|
2960
|
-
if (nextPlan.project_knowledge_context?.selected?.length
|
|
2961
|
-
&& !nextPlan.project_knowledge_context.selected.some((item) => item.reason_zh && item.enforcement)) {
|
|
2962
|
-
hardFail("PROJECT_KNOWLEDGE_NEXT_REASON_MISSING", "soloforge next 项目规则上下文缺少选中原因或强制级别", ["src/engine/next_action_planner.ts", "src/bin/soloforge.ts"], "project-knowledge-consumption", "next 只列规则名不能支撑用户确认哪些必须满足", "在 next 中展示 SelectionDecision 的 reason/enforcement/verification");
|
|
2963
|
-
}
|
|
2964
|
-
const badTmp = fs.mkdtempSync(path.join(os.tmpdir(), "soloforge-project-knowledge-bad-"));
|
|
2965
|
-
try {
|
|
2966
|
-
const badDir = path.join(badTmp, ".soloforge", "knowledge", "rules");
|
|
2967
|
-
fs.mkdirSync(badDir, { recursive: true });
|
|
2968
|
-
fs.writeFileSync(path.join(badDir, "未路由强规则.md"), `---
|
|
2969
|
-
id: unrouted-hard-rule
|
|
2970
|
-
asset_kind: hard_rule
|
|
2971
|
-
enforcement:
|
|
2972
|
-
level: hard_rule
|
|
2973
|
-
---
|
|
2974
|
-
# 未路由强规则
|
|
2975
|
-
|
|
2976
|
-
必须使用统一响应。
|
|
2977
|
-
`, "utf-8");
|
|
2978
|
-
const badReport = projectKnowledge.auditProjectKnowledge(badTmp);
|
|
2979
|
-
if (badReport.hard_fail_count === 0) {
|
|
2980
|
-
hardFail("PROJECT_KNOWLEDGE_UNROUTED_RULE_FALSE_PASS", "用户项目 hard rule 缺少 routes/primary_triggers 时错误放行", ["src/engine/project_knowledge_contract.ts"], "project-knowledge-consumption", "规则文件存在不等于可稳定消费", "对未路由 hard rule fail-closed");
|
|
2981
|
-
}
|
|
2982
|
-
}
|
|
2983
|
-
finally {
|
|
2984
|
-
fs.rmSync(badTmp, { recursive: true, force: true });
|
|
2985
|
-
}
|
|
2986
|
-
const conflictTmp = fs.mkdtempSync(path.join(os.tmpdir(), "soloforge-project-knowledge-conflict-"));
|
|
2987
|
-
try {
|
|
2988
|
-
const conflictDir = path.join(conflictTmp, ".soloforge", "knowledge", "rules");
|
|
2989
|
-
fs.mkdirSync(conflictDir, { recursive: true });
|
|
2990
|
-
fs.writeFileSync(path.join(conflictDir, "响应A.md"), `---
|
|
2991
|
-
id: response-a
|
|
2992
|
-
asset_kind: hard_rule
|
|
2993
|
-
routes: [code_change]
|
|
2994
|
-
primary_triggers: [API]
|
|
2995
|
-
conflict_group: api_response_format
|
|
2996
|
-
rule_value: ApiResponse
|
|
2997
|
-
enforcement:
|
|
2998
|
-
level: hard_rule
|
|
2999
|
-
---
|
|
3000
|
-
# 响应 A
|
|
3001
|
-
|
|
3002
|
-
必须使用 ApiResponse。
|
|
3003
|
-
`, "utf-8");
|
|
3004
|
-
fs.writeFileSync(path.join(conflictDir, "响应B.md"), `---
|
|
3005
|
-
id: response-b
|
|
3006
|
-
asset_kind: hard_rule
|
|
3007
|
-
routes: [code_change]
|
|
3008
|
-
primary_triggers: [API]
|
|
3009
|
-
conflict_group: api_response_format
|
|
3010
|
-
rule_value: Result
|
|
3011
|
-
enforcement:
|
|
3012
|
-
level: hard_rule
|
|
3013
|
-
---
|
|
3014
|
-
# 响应 B
|
|
3015
|
-
|
|
3016
|
-
必须使用 Result。
|
|
3017
|
-
`, "utf-8");
|
|
3018
|
-
const conflictReport = projectKnowledge.auditProjectKnowledge(conflictTmp);
|
|
3019
|
-
if (!conflictReport.assets.some((asset) => asset.findings.some((finding) => finding.code === "PROJECT_KNOWLEDGE_RULE_CONFLICT"))) {
|
|
3020
|
-
hardFail("PROJECT_KNOWLEDGE_CONFLICT_FALSE_PASS", "项目 API 响应等规则冲突未进入用户确认", ["src/engine/project_knowledge_contract.ts"], "project-knowledge-consumption", "旧项目知识审计只看是否可选中,不看项目规则之间互斥", "补冲突组/显式 conflicts_with 检测");
|
|
3021
|
-
}
|
|
3022
|
-
}
|
|
3023
|
-
finally {
|
|
3024
|
-
fs.rmSync(conflictTmp, { recursive: true, force: true });
|
|
3025
|
-
}
|
|
3026
|
-
const semanticConflictTmp = fs.mkdtempSync(path.join(os.tmpdir(), "soloforge-project-knowledge-semantic-conflict-"));
|
|
3027
|
-
try {
|
|
3028
|
-
const semanticDir = path.join(semanticConflictTmp, ".soloforge", "knowledge", "rules");
|
|
3029
|
-
fs.mkdirSync(semanticDir, { recursive: true });
|
|
3030
|
-
fs.writeFileSync(path.join(semanticDir, "响应ApiResponse.md"), `---
|
|
3031
|
-
id: response-api-response
|
|
3032
|
-
asset_kind: hard_rule
|
|
3033
|
-
routes: [code_change]
|
|
3034
|
-
primary_triggers: [API响应]
|
|
3035
|
-
enforcement:
|
|
3036
|
-
level: hard_rule
|
|
3037
|
-
---
|
|
3038
|
-
# API 响应
|
|
3039
|
-
|
|
3040
|
-
必须使用 ApiResponse。
|
|
3041
|
-
`, "utf-8");
|
|
3042
|
-
fs.writeFileSync(path.join(semanticDir, "响应Result.md"), `---
|
|
3043
|
-
id: response-result
|
|
3044
|
-
asset_kind: hard_rule
|
|
3045
|
-
routes: [code_change]
|
|
3046
|
-
primary_triggers: [接口响应]
|
|
3047
|
-
enforcement:
|
|
3048
|
-
level: hard_rule
|
|
3049
|
-
---
|
|
3050
|
-
# 接口响应
|
|
3051
|
-
|
|
3052
|
-
必须使用 Result。
|
|
3053
|
-
`, "utf-8");
|
|
3054
|
-
const semanticConflictReport = projectKnowledge.auditProjectKnowledge(semanticConflictTmp);
|
|
3055
|
-
if (!semanticConflictReport.assets.some((asset) => asset.findings.some((finding) => finding.code === "PROJECT_KNOWLEDGE_RULE_CONFLICT"))) {
|
|
3056
|
-
hardFail("PROJECT_KNOWLEDGE_SEMANTIC_CONFLICT_FALSE_PASS", "API 响应格式语义冲突依赖手写 conflict_group,未自动进入用户确认", ["src/engine/project_knowledge_contract.ts"], "project-knowledge-consumption", "项目规则冲突不能要求用户预先正确标注才能发现", "补 API 响应/分页/日志/DB/权限语义冲突检测");
|
|
3057
|
-
}
|
|
3058
|
-
}
|
|
3059
|
-
finally {
|
|
3060
|
-
fs.rmSync(semanticConflictTmp, { recursive: true, force: true });
|
|
3061
|
-
}
|
|
3062
|
-
}
|
|
3063
|
-
catch (e) {
|
|
3064
|
-
hardFail("PROJECT_KNOWLEDGE_AUDIT_FAILED", `用户项目知识消费行为审计执行失败: ${e.message}`, ["src/engine/project_knowledge_contract.ts"], "project-knowledge-consumption", "项目知识消费必须有可执行行为门禁", "修复项目知识合同模块和编译产物");
|
|
3065
|
-
}
|
|
3066
|
-
finally {
|
|
3067
|
-
fs.rmSync(tmp, { recursive: true, force: true });
|
|
3068
|
-
}
|
|
3069
|
-
_info(" 模板卫生与项目知识消费验证完成");
|
|
3070
|
-
}
|
|
3071
|
-
async function checkLongTermMechanization(rootDir, hardFail, _info) {
|
|
3072
|
-
try {
|
|
3073
|
-
const matrix = await import("./historical_issue_mechanization_matrix.js");
|
|
3074
|
-
const report = matrix.validateHistoricalIssueMechanizationMatrix?.();
|
|
3075
|
-
if (!report?.passed) {
|
|
3076
|
-
const messages = (report?.findings ?? []).map((finding) => `${finding.code}: ${finding.message}`).join("; ");
|
|
3077
|
-
hardFail("HISTORICAL_FIRST_PRINCIPLES_MATRIX_INCOMPLETE", `历史问题第一性原理机制化矩阵不完整: ${messages || "未知缺口"}`, ["src/engine/historical_issue_mechanization_matrix.ts", "docs/SoloForge-Batch8问题集.md"], "problem-70", "旧复审只统计 mechanized/partial/not,不强制每个历史问题归入长期机制族", "补齐历史问题机制族、生产入口、must-fail/must-pass 和发布门禁");
|
|
3078
|
-
}
|
|
3079
|
-
}
|
|
3080
|
-
catch (e) {
|
|
3081
|
-
hardFail("HISTORICAL_FIRST_PRINCIPLES_MATRIX_EXCEPTION", `历史问题第一性原理矩阵检查异常: ${e.message}`, ["src/engine/historical_issue_mechanization_matrix.ts"], "problem-70", "旧 gate 不执行历史问题矩阵", "修复历史问题机制化矩阵模块");
|
|
3082
|
-
}
|
|
3083
|
-
try {
|
|
3084
|
-
const health = await import("./mechanism_health_check.js");
|
|
3085
|
-
const report = health.runFullHealthCheck(rootDir);
|
|
3086
|
-
for (const finding of report.findings.filter((f) => f.severity === "hard_fail")) {
|
|
3087
|
-
hardFail("LONGTERM_MECHANISM_HEALTH", finding.message_zh, [finding.target], "历史问题长期机制化", "旧 gate 不检查机制死代码/未消费资产", "修复机制消费链路");
|
|
3088
|
-
}
|
|
3089
|
-
}
|
|
3090
|
-
catch (e) {
|
|
3091
|
-
hardFail("LONGTERM_MECHANISM_HEALTH_EXCEPTION", `机制运行时健康度检查异常: ${e.message}`, ["src/engine/mechanism_health_check.ts"], "历史问题长期机制化", "旧 gate 不执行机制健康检查", "修复检查模块");
|
|
3092
|
-
}
|
|
3093
|
-
try {
|
|
3094
|
-
const kg = await import("./knowledge_governance_gate.js");
|
|
3095
|
-
const report = kg.runKnowledgeGovernanceCheck({
|
|
3096
|
-
project_language: "zh",
|
|
3097
|
-
contents: [{ id: "release-gate", domain: "user_feedback", content: "发布门禁保持中文语义优先" }],
|
|
3098
|
-
});
|
|
3099
|
-
if (report.hard_fail_count > 0) {
|
|
3100
|
-
hardFail("LONGTERM_KNOWLEDGE_GOVERNANCE", `知识治理存在 ${report.hard_fail_count} 个 hard_fail`, ["src/engine/knowledge_governance_gate.ts"], "历史问题长期机制化", "旧 gate 只跑历史知识场景,不接统一治理入口", "修复知识治理检查");
|
|
3101
|
-
}
|
|
3102
|
-
}
|
|
3103
|
-
catch (e) {
|
|
3104
|
-
hardFail("LONGTERM_KNOWLEDGE_GOVERNANCE_EXCEPTION", `知识治理检查异常: ${e.message}`, ["src/engine/knowledge_governance_gate.ts"], "历史问题长期机制化", "旧 gate 不执行知识治理入口", "修复检查模块");
|
|
3105
|
-
}
|
|
3106
|
-
try {
|
|
3107
|
-
const logGov = await import("./log_governance.js");
|
|
3108
|
-
const clean = logGov.enforceLogGovernance("用户可见输出保持中文且无内部噪音");
|
|
3109
|
-
const noisy = logGov.enforceLogGovernance("[soloForge] internal trace validate-release");
|
|
3110
|
-
if (!clean.passed || noisy.passed) {
|
|
3111
|
-
hardFail("LONGTERM_LOG_GOVERNANCE_BEHAVIOR", "日志治理 must-pass/must-fail 行为不成立", ["src/engine/log_governance.ts"], "历史问题长期机制化", "旧 gate 只扫描 console,不验证输出治理行为", "修复 log_governance 行为");
|
|
3112
|
-
}
|
|
3113
|
-
}
|
|
3114
|
-
catch (e) {
|
|
3115
|
-
hardFail("LONGTERM_LOG_GOVERNANCE_EXCEPTION", `日志治理检查异常: ${e.message}`, ["src/engine/log_governance.ts"], "历史问题长期机制化", "旧 gate 不执行日志治理入口", "修复检查模块");
|
|
3116
|
-
}
|
|
3117
|
-
try {
|
|
3118
|
-
const cfg = await import("./config_write_boundary.js");
|
|
3119
|
-
const runtimeCtx = cfg.classifyConfigContext(rootDir, { runtime_inference: true });
|
|
3120
|
-
const runtimeDecision = cfg.isWriteAllowed(runtimeCtx, path.join(rootDir, ".soloforge", "config.yaml"));
|
|
3121
|
-
const greenfieldDecision = cfg.isWriteAllowed({ kind: "greenfield", project_path: rootDir, evidence: ["empty_project"], confirmed: false }, path.join(rootDir, ".soloforge", "config.yaml"));
|
|
3122
|
-
if (runtimeDecision.allowed || !greenfieldDecision.allowed) {
|
|
3123
|
-
hardFail("LONGTERM_CONFIG_BOUNDARY_BEHAVIOR", "配置落盘边界 must-pass/must-fail 行为不成立", ["src/engine/config_write_boundary.ts"], "历史问题长期机制化", "旧 gate 不区分运行时推断与空项目写入", "修复配置写入边界");
|
|
3124
|
-
}
|
|
3125
|
-
}
|
|
3126
|
-
catch (e) {
|
|
3127
|
-
hardFail("LONGTERM_CONFIG_BOUNDARY_EXCEPTION", `配置落盘边界检查异常: ${e.message}`, ["src/engine/config_write_boundary.ts"], "历史问题长期机制化", "旧 gate 不执行配置落盘边界", "修复检查模块");
|
|
3128
|
-
}
|
|
3129
|
-
_info(" 历史问题长期机制化行为验证完成");
|
|
3130
|
-
}
|
|
3131
|
-
async function checkDiagnosticCentralization(rootDir, hardFail) {
|
|
3132
|
-
const toolsPath = path.join(rootDir, "src", "adapters", "claude_code", "tools.ts");
|
|
3133
|
-
const toolsText = safeRead(toolsPath) ?? "";
|
|
3134
|
-
const literalMatches = [...toolsText.matchAll(/["'`]SF-[A-Z]+-\d{4}["'`]/g)];
|
|
3135
|
-
if (literalMatches.length > 0) {
|
|
3136
|
-
hardFail("DIAGNOSTIC_CODE_HARDCODED_IN_TOOLS", `tools.ts 仍有 ${literalMatches.length} 个硬编码诊断码字面量`, ["src/adapters/claude_code/tools.ts"], "problem-36", "旧 gate 不检查诊断码集中治理", "改用 diagnostic_registry 导出的 TOOL_DIAGNOSTIC_CODES");
|
|
3137
|
-
}
|
|
3138
|
-
const registry = await import("./diagnostic_registry.js");
|
|
3139
|
-
const required = Object.values(registry.TOOL_DIAGNOSTIC_CODES);
|
|
3140
|
-
const registered = new Set(registry.listAllDiagnostics().map((d) => d.code));
|
|
3141
|
-
const missing = required.filter((code) => !registered.has(code));
|
|
3142
|
-
if (missing.length > 0) {
|
|
3143
|
-
hardFail("DIAGNOSTIC_CODE_REGISTRY_MISSING", `诊断码常量未在注册表登记: ${missing.join(", ")}`, ["src/engine/diagnostic_registry.ts"], "problem-36", "旧 gate 不检查诊断码注册完整性", "补齐 BUILTIN_DIAGNOSTICS");
|
|
3144
|
-
}
|
|
3145
|
-
}
|
|
3146
|
-
async function checkControlPlaneTrustBehavior(rootDir, hardFail) {
|
|
3147
|
-
try {
|
|
3148
|
-
const control = await import("./control_plane_contract.js");
|
|
3149
|
-
const toolContracts = await import("./tool_invocation_contract_registry.js");
|
|
3150
|
-
const matrix = control.CONTROL_PLANE_MATRIX ?? [];
|
|
3151
|
-
const branchDetails = control.CONTROL_PLANE_BRANCH_DETAILS ?? [];
|
|
3152
|
-
if (matrix.length !== 15) {
|
|
3153
|
-
hardFail("CONTROL_PLANE_MATRIX_INCOMPLETE", `控制面矩阵数量应为 15,实际为 ${matrix.length}`, ["src/engine/control_plane_contract.ts"], "problem-72", "旧 gate 不覆盖 MCP 控制面可用性与旁路", "补齐控制面矩阵");
|
|
3154
|
-
}
|
|
3155
|
-
if (branchDetails.length < 30) {
|
|
3156
|
-
hardFail("CONTROL_PLANE_BRANCH_DETAILS_INCOMPLETE", `控制面枝叶细节至少 30 条,实际为 ${branchDetails.length}`, ["src/engine/control_plane_contract.ts"], "problem-72", "旧 gate 不覆盖枝叶防回归细节", "补齐枝叶细节");
|
|
3157
|
-
}
|
|
3158
|
-
if (!control.isSoloforgeStateBypassCommand("rm -rf .soloforge/state/current-task.json")) {
|
|
3159
|
-
hardFail("CONTROL_PLANE_BYPASS_GUARD_FALSE_NEGATIVE", "Bash 直接删除 .soloforge/state 未被识别为旁路", ["src/engine/control_plane_contract.ts", "src/bin/soloforge.ts"], "problem-72", "旧 gate 不验证 Bash/Edit/Write 旁路", "修复旁路拦截");
|
|
3160
|
-
}
|
|
3161
|
-
if (control.isSoloforgeStateBypassCommand("cat .soloforge/state/current-task.json")) {
|
|
3162
|
-
hardFail("CONTROL_PLANE_BYPASS_GUARD_FALSE_POSITIVE", "只读查看 .soloforge/state 被误判为写旁路", ["src/engine/control_plane_contract.ts"], "problem-72", "旧 gate 不检查旁路误拦", "修复旁路判断");
|
|
3163
|
-
}
|
|
3164
|
-
const contractFindings = control.validateControlPlaneToolContracts(toolContracts.listToolInvocationContracts());
|
|
3165
|
-
const hardContractFindings = contractFindings.filter((finding) => finding.severity === "hard_fail");
|
|
3166
|
-
if (hardContractFindings.length > 0) {
|
|
3167
|
-
hardFail("CONTROL_PLANE_TOOL_CONTRACT_INVALID", `工具控制面契约存在 ${hardContractFindings.length} 个 hard_fail: ${hardContractFindings.map((f) => f.code).join(", ")}`, ["src/engine/tool_invocation_contract_registry.ts"], "problem-72", "旧 gate 不检查工具错标和死链路", "修复工具契约");
|
|
3168
|
-
}
|
|
3169
|
-
const fakeContractFindings = control.validateControlPlaneToolContracts([{
|
|
3170
|
-
tool_name: "sf_fake_readonly_writer",
|
|
3171
|
-
category: "read_only_bypass",
|
|
3172
|
-
side_effects: ["task_context_write"],
|
|
3173
|
-
requires_authorization: false,
|
|
3174
|
-
requires_workflow: false,
|
|
3175
|
-
description: "错误契约",
|
|
3176
|
-
default_next_tools: [],
|
|
3177
|
-
forbidden_next_tools: [],
|
|
3178
|
-
}]);
|
|
3179
|
-
if (!fakeContractFindings.some((finding) => finding.code === "CONTROL_PLANE_READ_ONLY_HAS_SIDE_EFFECT")) {
|
|
3180
|
-
hardFail("CONTROL_PLANE_TOOL_CONTRACT_FALSE_PASS", "read_only_bypass 写状态的假契约未被阻断", ["src/engine/control_plane_contract.ts"], "problem-72", "旧 gate 不验证契约错标 must-fail", "修复工具契约验证");
|
|
3181
|
-
}
|
|
3182
|
-
const bypassAssessment = control.assessControlledGenerationChain({
|
|
3183
|
-
changed_files: ["src/Foo.java"],
|
|
3184
|
-
verified_files: ["src/Foo.java"],
|
|
3185
|
-
traces: [{ tool_name: "Bash", status: "passed", evidence_kind: "command_execution" }],
|
|
3186
|
-
delivery_status: "delivered",
|
|
3187
|
-
});
|
|
3188
|
-
if (bypassAssessment.accepted || !bypassAssessment.findings.some((finding) => finding.code === "CONTROLLED_GENERATION_MISSING_MCP_PROVENANCE")) {
|
|
3189
|
-
hardFail("CONTROLLED_GENERATION_BYPASS_FALSE_PASS", "非 MCP 生成代码被错误接受为完整可信交付", ["src/engine/control_plane_contract.ts"], "problem-72", "旧 gate 不验证来源归因", "修复受控生成链路");
|
|
3190
|
-
}
|
|
3191
|
-
const partialAssessment = control.assessControlledGenerationChain({
|
|
3192
|
-
changed_files: ["src/Foo.java", "src/Bar.java"],
|
|
3193
|
-
verified_files: ["src/Foo.java"],
|
|
3194
|
-
traces: [
|
|
3195
|
-
{ tool_name: "sf_classify", task_id: "t1", status: "passed" },
|
|
3196
|
-
{ tool_name: "sf_expand", task_id: "t1", status: "passed" },
|
|
3197
|
-
{ tool_name: "sf_verify", task_id: "t1", status: "passed", evidence_kind: "command_execution" },
|
|
3198
|
-
],
|
|
3199
|
-
delivery_status: "delivered",
|
|
3200
|
-
});
|
|
3201
|
-
if (partialAssessment.accepted || !partialAssessment.findings.some((finding) => finding.code === "CONTROLLED_GENERATION_CHANGED_FILE_UNVERIFIED")) {
|
|
3202
|
-
hardFail("CONTROLLED_GENERATION_SCOPE_FALSE_PASS", "changed_files 子集验证被错误接受", ["src/engine/control_plane_contract.ts"], "problem-72", "旧 gate 不验证范围完整性", "修复验证范围对账");
|
|
3203
|
-
}
|
|
3204
|
-
const passAssessment = control.assessControlledGenerationChain({
|
|
3205
|
-
changed_files: ["src/Foo.java"],
|
|
3206
|
-
verified_files: ["src/Foo.java"],
|
|
3207
|
-
traces: [
|
|
3208
|
-
{ tool_name: "sf_classify", task_id: "t1", status: "passed" },
|
|
3209
|
-
{ tool_name: "sf_expand", task_id: "t1", status: "passed" },
|
|
3210
|
-
{ tool_name: "sf_verify", task_id: "t1", status: "passed", evidence_kind: "command_execution" },
|
|
3211
|
-
{ tool_name: "sf_deliver", task_id: "t1", status: "passed" },
|
|
3212
|
-
],
|
|
3213
|
-
delivery_status: "delivered",
|
|
3214
|
-
});
|
|
3215
|
-
if (!passAssessment.accepted || passAssessment.confidence !== "full") {
|
|
3216
|
-
hardFail("CONTROLLED_GENERATION_VALID_CHAIN_BLOCKED", "完整 MCP 受控生成链路被误阻断", ["src/engine/control_plane_contract.ts"], "problem-72", "旧 gate 不验证 must-pass", "修复受控生成链路");
|
|
3217
|
-
}
|
|
3218
|
-
const cliText = safeRead(path.join(rootDir, "src", "bin", "soloforge.ts")) ?? "";
|
|
3219
|
-
if (!cliText.includes("case \"doctor\"") || !cliText.includes("auditControlPlaneProject")) {
|
|
3220
|
-
hardFail("CONTROL_PLANE_DOCTOR_MISSING", "CLI 未提供 soloforge doctor 控制面诊断入口", ["src/bin/soloforge.ts"], "problem-72", "旧 gate 没有 MCP 控制面恢复入口", "补 soloforge doctor");
|
|
3221
|
-
}
|
|
3222
|
-
if (!cliText.includes("仍处于 ${currentTask.status}") ||
|
|
3223
|
-
!cliText.includes("缺少 design_artifact_pack") ||
|
|
3224
|
-
!cliText.includes("没有受控 SoloForge 任务") ||
|
|
3225
|
-
!cliText.includes("不得取消/归档当前任务后改用 Bash/Edit/Write") ||
|
|
3226
|
-
!cliText.includes("禁止通过 Bash 直接写业务实现文件")) {
|
|
3227
|
-
hardFail("CONTROLLED_IMPLEMENTATION_WRITE_GATE_MISSING", "check-write/check-bash 未覆盖 expanding 卡死、设计产物存在但缺 design_artifact_pack、无受控任务和 Bash 直接编码旁路", ["src/bin/soloforge.ts"], "problem-72", "旧 gate 只在交付层发现非 MCP 来源,未在写入入口阻断真实用户项目旁路", "在 check-write/check-bash 对业务实现文件增加受控任务与设计产物包前置门");
|
|
3228
|
-
}
|
|
3229
|
-
const assetManifestText = safeRead(path.join(rootDir, "src", "engine", "asset_manifest.ts")) ?? "";
|
|
3230
|
-
const workflowRuleText = safeRead(path.join(rootDir, "templates", "knowledge", "rules", "工作流导航契约规则.md")) ?? "";
|
|
3231
|
-
const lifecycleProcedureText = safeRead(path.join(rootDir, "templates", "knowledge", "procedures", "全生命周期工作流导航.md")) ?? "";
|
|
3232
|
-
const antiBypassNeedles = [
|
|
3233
|
-
"不得建议取消任务后直接写",
|
|
3234
|
-
"不得建议“先用 Bash 直接修改业务代码”",
|
|
3235
|
-
"不得手动删除 `.soloforge/state`",
|
|
3236
|
-
"归档后仍必须重新 `sf_classify -> sf_expand`",
|
|
3237
|
-
];
|
|
3238
|
-
const antiBypassText = `${assetManifestText}\n${workflowRuleText}\n${lifecycleProcedureText}`;
|
|
3239
|
-
const missingAntiBypassNeedles = antiBypassNeedles.filter((needle) => !antiBypassText.includes(needle));
|
|
3240
|
-
if (missingAntiBypassNeedles.length > 0) {
|
|
3241
|
-
hardFail("CONTROL_PLANE_BLOCKED_RECOVERY_PROMPT_MISSING", `适配器/知识规则缺少阻断恢复反旁路硬规则: ${missingAntiBypassNeedles.join(", ")}`, ["src/engine/asset_manifest.ts", "templates/knowledge/rules/工作流导航契约规则.md", "templates/knowledge/procedures/全生命周期工作流导航.md"], "problem-72", "运行时 hook 能拦截写入,但模型仍可能口头建议取消任务、Bash 直写或手动清状态", "把阻断恢复反旁路协议注入 adapter workflow 和工作流导航知识资产");
|
|
3242
|
-
}
|
|
3243
|
-
}
|
|
3244
|
-
catch (e) {
|
|
3245
|
-
hardFail("CONTROL_PLANE_BEHAVIOR_EXCEPTION", `控制面可信行为验证异常: ${e.message}`, ["src/engine/control_plane_contract.ts"], "problem-72", "旧 gate 不验证控制面可信", "修复控制面契约模块");
|
|
3246
|
-
}
|
|
3247
|
-
}
|
|
3248
|
-
// ── 主入口 ──
|
|
3249
|
-
export async function runReleaseReadinessGate(rootDir) {
|
|
3250
|
-
const hardFails = [];
|
|
3251
|
-
const phases = [];
|
|
3252
|
-
let capturedNoiseCount = 0;
|
|
3253
|
-
// 初始化日志器为静默模式,防止 debug/internalWarn 输出
|
|
3254
|
-
const { initLogger, resetLogger } = await import("./logger.js");
|
|
3255
|
-
initLogger({ silent: true });
|
|
3256
|
-
// 兜底: 仍然拦截 console.error,捕获任何绕过日志器的直接调用
|
|
3257
|
-
const origConsoleError = console.error;
|
|
3258
|
-
const noiseLogs = [];
|
|
3259
|
-
console.error = (...args) => { noiseLogs.push(args.join(" ")); };
|
|
3260
|
-
function hardFail(code, message, files, issueOrMech, oldGateMissed, nextStep) {
|
|
3261
|
-
hardFails.push({ code, message, files, issueOrMech, oldGateMissed, nextStep });
|
|
3262
|
-
}
|
|
3263
|
-
function _info(_msg) { }
|
|
3264
|
-
function beginPhase(name) {
|
|
3265
|
-
phases.push({ name, hard_fail_count: -1 }); // -1 标记进行中
|
|
3266
|
-
}
|
|
3267
|
-
function endPhase(name) {
|
|
3268
|
-
const phase = phases.find(p => p.name === name && p.hard_fail_count === -1);
|
|
3269
|
-
if (phase)
|
|
3270
|
-
phase.hard_fail_count = hardFails.length - (phases.filter(p => p.hard_fail_count >= 0).reduce((s, p) => s + p.hard_fail_count, 0));
|
|
3271
|
-
else
|
|
3272
|
-
phases.push({ name, hard_fail_count: 0 });
|
|
3273
|
-
}
|
|
3274
|
-
// 0
|
|
3275
|
-
beginPhase("dist 旧产物风险");
|
|
3276
|
-
checkDistFreshness(rootDir, hardFail);
|
|
3277
|
-
endPhase("dist 旧产物风险");
|
|
3278
|
-
// 1
|
|
3279
|
-
beginPhase("Batch 施工痕迹泄漏");
|
|
3280
|
-
checkBatchTraceLeakage(rootDir, hardFail, _info);
|
|
3281
|
-
endPhase("Batch 施工痕迹泄漏");
|
|
3282
|
-
// 2
|
|
3283
|
-
beginPhase("双层模型语义归位");
|
|
3284
|
-
await checkDualLayerSemantics(rootDir, hardFail, _info);
|
|
3285
|
-
endPhase("双层模型语义归位");
|
|
3286
|
-
// 3
|
|
3287
|
-
beginPhase("主链路真实消费");
|
|
3288
|
-
checkMainlineConsumption(rootDir, hardFail, _info);
|
|
3289
|
-
endPhase("主链路真实消费");
|
|
3290
|
-
// 4
|
|
3291
|
-
beginPhase("模板/adapter 更新空洞");
|
|
3292
|
-
checkTemplateAdapterGaps(rootDir, hardFail);
|
|
3293
|
-
endPhase("模板/adapter 更新空洞");
|
|
3294
|
-
// 5
|
|
3295
|
-
beginPhase("旧 gate 误导标记");
|
|
3296
|
-
checkOldGateMisdirection(rootDir, hardFail, _info);
|
|
3297
|
-
endPhase("旧 gate 误导标记");
|
|
3298
|
-
// 6
|
|
3299
|
-
beginPhase("测试污染初筛");
|
|
3300
|
-
checkTestPollution(rootDir, hardFail, _info);
|
|
3301
|
-
endPhase("测试污染初筛");
|
|
3302
|
-
// 7
|
|
3303
|
-
beginPhase("Batch 问题文档格式一致性");
|
|
3304
|
-
await checkBatchIssueFormatConsistency(rootDir, hardFail, _info);
|
|
3305
|
-
endPhase("Batch 问题文档格式一致性");
|
|
3306
|
-
// 8
|
|
3307
|
-
beginPhase("关键问题消费验证");
|
|
3308
|
-
await checkCriticalProblemConsumption(rootDir, hardFail, _info);
|
|
3309
|
-
endPhase("关键问题消费验证");
|
|
3310
|
-
// 9
|
|
3311
|
-
beginPhase("机制身份一致性");
|
|
3312
|
-
await checkMechanismIdentityConsistency(rootDir, hardFail, _info);
|
|
3313
|
-
endPhase("机制身份一致性");
|
|
3314
|
-
// 10: P0/P1 知识资产 schema 完整性
|
|
3315
|
-
beginPhase("P0/P1 知识资产 schema");
|
|
3316
|
-
await checkKnowledgeAssetSchema(rootDir, hardFail, _info);
|
|
3317
|
-
endPhase("P0/P1 知识资产 schema");
|
|
3318
|
-
// 11: console.log 检查
|
|
3319
|
-
beginPhase("engine console.log 检查");
|
|
3320
|
-
checkEngineConsoleLog(rootDir, hardFail);
|
|
3321
|
-
endPhase("engine console.log 检查");
|
|
3322
|
-
// 12: 中文注释检查
|
|
3323
|
-
beginPhase("中文注释检查");
|
|
3324
|
-
checkChineseComments(rootDir, hardFail);
|
|
3325
|
-
endPhase("中文注释检查");
|
|
3326
|
-
// 13: 第五批文档↔roadmap↔scenario 一致性
|
|
3327
|
-
beginPhase("第五批一致性校验");
|
|
3328
|
-
await checkLastBatchConsistency(rootDir, hardFail, _info);
|
|
3329
|
-
endPhase("第五批一致性校验");
|
|
3330
|
-
// 14: 依赖漏洞扫描(在 console.error 恢复前执行以避免干扰)
|
|
3331
|
-
beginPhase("依赖漏洞扫描");
|
|
3332
|
-
checkDependencyAudit(rootDir, hardFail, _info);
|
|
3333
|
-
endPhase("依赖漏洞扫描");
|
|
3334
|
-
// 15: 发布问题全局合同(问题六十一至六十五)
|
|
3335
|
-
beginPhase("发布问题全局合同");
|
|
3336
|
-
await checkReleaseIssueDesignPath(rootDir, hardFail, _info);
|
|
3337
|
-
endPhase("发布问题全局合同");
|
|
3338
|
-
// 16: 工作流导航契约行为验证(问题六十五)
|
|
3339
|
-
beginPhase("工作流导航契约行为验证");
|
|
3340
|
-
await checkWorkflowNavigationBehavior(rootDir, hardFail, _info);
|
|
3341
|
-
endPhase("工作流导航契约行为验证");
|
|
3342
|
-
// 17: OOD/SOLID 与后端实现工程契约行为验证(问题六十六/六十七)
|
|
3343
|
-
beginPhase("实现工程契约行为验证");
|
|
3344
|
-
await checkImplementationContractBehavior(rootDir, hardFail, _info);
|
|
3345
|
-
endPhase("实现工程契约行为验证");
|
|
3346
|
-
// 18: 代码可维护性与可观测性契约行为验证(问题六十八)
|
|
3347
|
-
beginPhase("代码可维护性与可观测性行为验证");
|
|
3348
|
-
await checkCodeObservabilityBehavior(rootDir, hardFail, _info);
|
|
3349
|
-
endPhase("代码可维护性与可观测性行为验证");
|
|
3350
|
-
// 19: 历史问题长期机制化行为验证
|
|
3351
|
-
beginPhase("历史问题长期机制化行为验证");
|
|
3352
|
-
await checkLongTermMechanization(rootDir, hardFail, _info);
|
|
3353
|
-
endPhase("历史问题长期机制化行为验证");
|
|
3354
|
-
// 20: 诊断码集中治理检查
|
|
3355
|
-
beginPhase("诊断码集中治理检查");
|
|
3356
|
-
await checkDiagnosticCentralization(rootDir, hardFail);
|
|
3357
|
-
endPhase("诊断码集中治理检查");
|
|
3358
|
-
// 21: 模板卫生与用户项目知识消费验证
|
|
3359
|
-
beginPhase("模板卫生与项目知识消费验证");
|
|
3360
|
-
await checkTemplateAndProjectKnowledgeHygiene(rootDir, hardFail, _info);
|
|
3361
|
-
endPhase("模板卫生与项目知识消费验证");
|
|
3362
|
-
// 22: MCP 控制面可信与受控生成链路验证
|
|
3363
|
-
beginPhase("MCP 控制面可信与受控生成链路验证");
|
|
3364
|
-
await checkControlPlaneTrustBehavior(rootDir, hardFail);
|
|
3365
|
-
endPhase("MCP 控制面可信与受控生成链路验证");
|
|
3366
|
-
// 恢复 console.error 和日志器
|
|
3367
|
-
console.error = origConsoleError;
|
|
3368
|
-
resetLogger();
|
|
3369
|
-
// 噪音检测: 捕获任何绕过日志器的直接 console.error("[soloForge]...") 调用
|
|
3370
|
-
capturedNoiseCount = noiseLogs.filter(l => l.includes("[soloForge]")).length;
|
|
3371
|
-
if (capturedNoiseCount > 0) {
|
|
3372
|
-
hardFail("OUTPUT_NOISE", `发布门禁运行时产生 ${capturedNoiseCount} 条模块噪音日志`, ["src/engine/logger.ts"], "发布门禁输出质量", "旧 gate 不检查自身输出噪音", "日志治理");
|
|
3373
|
-
}
|
|
3374
|
-
return {
|
|
3375
|
-
passed: hardFails.length === 0,
|
|
3376
|
-
hard_fail_count: hardFails.length,
|
|
3377
|
-
hard_fails: hardFails,
|
|
3378
|
-
phases: phases.map(p => ({ name: p.name, hard_fail_count: p.hard_fail_count >= 0 ? p.hard_fail_count : 0 })),
|
|
3379
|
-
noise_log_count: capturedNoiseCount,
|
|
3380
|
-
};
|
|
3381
|
-
}
|
|
3382
|
-
//# sourceMappingURL=release_readiness_gate.js.map
|