core-runtime 0.1.1__py3-none-any.whl
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.
- api/__init__.py +4 -0
- api/cli/__init__.py +10 -0
- api/cli/audit_client.py +92 -0
- api/cli/census_client.py +77 -0
- api/cli/client.py +508 -0
- api/cli/coverage_client.py +121 -0
- api/cli/daemon_client.py +42 -0
- api/cli/fix_client.py +101 -0
- api/cli/inspect_client.py +143 -0
- api/cli/integration_client.py +42 -0
- api/cli/integrity_client.py +45 -0
- api/cli/proposals_client.py +101 -0
- api/cli/quality_client.py +83 -0
- api/cli/refactor_client.py +82 -0
- api/cli/sync_client.py +106 -0
- api/dependencies.py +37 -0
- api/errors.py +74 -0
- api/main.py +88 -0
- api/v1/__init__.py +4 -0
- api/v1/audit_routes.py +302 -0
- api/v1/census_routes.py +207 -0
- api/v1/coverage_routes.py +352 -0
- api/v1/daemon_routes.py +86 -0
- api/v1/development_routes.py +70 -0
- api/v1/fix_routes.py +428 -0
- api/v1/inspect_routes.py +220 -0
- api/v1/integration_routes.py +56 -0
- api/v1/integrity_routes.py +72 -0
- api/v1/knowledge_routes.py +36 -0
- api/v1/lint_routes.py +40 -0
- api/v1/proposals_routes.py +267 -0
- api/v1/quality_routes.py +272 -0
- api/v1/refactor_routes.py +225 -0
- api/v1/sync_routes.py +261 -0
- body/__init__.py +4 -0
- body/analyzers/__init__.py +25 -0
- body/analyzers/base_analyzer.py +28 -0
- body/analyzers/constitutional_path_analyzer.py +63 -0
- body/analyzers/file_analyzer.py +211 -0
- body/analyzers/knowledge_graph_analyzer.py +86 -0
- body/analyzers/prompt_analyzer.py +155 -0
- body/analyzers/symbol_extractor.py +280 -0
- body/atomic/__init__.py +74 -0
- body/atomic/build_tests_action.py +354 -0
- body/atomic/check_actions.py +142 -0
- body/atomic/crate_ops.py +59 -0
- body/atomic/executor.py +470 -0
- body/atomic/file_ops.py +153 -0
- body/atomic/fix_actions.py +1142 -0
- body/atomic/import_resolver.py +200 -0
- body/atomic/metadata_ops.py +161 -0
- body/atomic/modularity_fix.py +839 -0
- body/atomic/modularity_splitter.py +521 -0
- body/atomic/proposal_lifecycle_actions.py +171 -0
- body/atomic/registry.py +326 -0
- body/atomic/remediate_cognitive_role.py +104 -0
- body/atomic/sandbox_lifecycle.py +252 -0
- body/atomic/split_plan.py +155 -0
- body/atomic/sync_actions/__init__.py +22 -0
- body/atomic/sync_actions/chunking_helpers.py +218 -0
- body/atomic/sync_actions/sync_actions.py +431 -0
- body/atomic/test_actions.py +47 -0
- body/autonomy/__init__.py +16 -0
- body/autonomy/audit_analyzer.py +343 -0
- body/autonomy/micro_proposal_executor.py +316 -0
- body/crate_processing/canary_executor.py +144 -0
- body/evaluators/__init__.py +27 -0
- body/evaluators/atomic_actions_evaluator.py +162 -0
- body/evaluators/atomic_actions_format.py +45 -0
- body/evaluators/atomic_actions_rules.py +278 -0
- body/evaluators/base_evaluator.py +67 -0
- body/evaluators/clarity_evaluator.py +83 -0
- body/evaluators/constitutional_evaluator.py +227 -0
- body/evaluators/failure_evaluator.py +136 -0
- body/evaluators/performance_evaluator.py +341 -0
- body/evaluators/security_evaluator.py +393 -0
- body/flows/__init__.py +33 -0
- body/flows/executor.py +275 -0
- body/flows/registry.py +272 -0
- body/flows/result.py +113 -0
- body/governance/__init__.py +29 -0
- body/governance/body_contracts_service.py +317 -0
- body/governance/code_validator.py +118 -0
- body/governance/engine_dispatcher.py +128 -0
- body/governance/intent_guard.py +592 -0
- body/governance/intent_pattern_validators.py +197 -0
- body/governance/key_management_service.py +100 -0
- body/governance/path_validator.py +187 -0
- body/governance/remediation_service.py +263 -0
- body/governance/runtime_validator.py +184 -0
- body/infrastructure/bootstrap.py +135 -0
- body/infrastructure/lifespan.py +85 -0
- body/infrastructure/repositories/__init__.py +1 -0
- body/infrastructure/repositories/decision_trace_repository.py +210 -0
- body/infrastructure/repositories/refusal_repository.py +294 -0
- body/introspection/__init__.py +4 -0
- body/introspection/capability_discovery_service.py +107 -0
- body/introspection/discovery/from_kgb.py +33 -0
- body/introspection/discovery/from_source_scan.py +40 -0
- body/introspection/discovery/loader.py +62 -0
- body/introspection/discovery/registry.py +22 -0
- body/introspection/discovery/semantics.py +21 -0
- body/introspection/discovery/sync.py +47 -0
- body/introspection/drift_detector.py +81 -0
- body/introspection/drift_service.py +48 -0
- body/introspection/export_vectors.py +133 -0
- body/introspection/generate_capability_docs.py +130 -0
- body/introspection/generate_correction_map.py +98 -0
- body/introspection/graph_analysis_service.py +66 -0
- body/introspection/knowledge_graph_service.py +170 -0
- body/introspection/semantic_clusterer.py +128 -0
- body/introspection/symbol_index_builder.py +244 -0
- body/introspection/sync/engine.py +92 -0
- body/introspection/sync/scanner.py +56 -0
- body/introspection/sync/visitor.py +83 -0
- body/introspection/sync_service.py +62 -0
- body/invokers/__init__.py +4 -0
- body/invokers/capability_invoker.py +4 -0
- body/maintenance/command_sync_service.py +73 -0
- body/maintenance/dotenv_sync_service.py +99 -0
- body/maintenance/idempotency_harness.py +70 -0
- body/maintenance/maintenance_service.py +123 -0
- body/maintenance/memory_cleanup_service.py +131 -0
- body/maintenance/refactor_settings_access.py +274 -0
- body/maintenance/scripts/__init__.py +5 -0
- body/maintenance/scripts/context_export.py +278 -0
- body/maintenance/scripts/vector_verify.py +73 -0
- body/maintenance/sync_vectors.py +338 -0
- body/models/__init__.py +4 -0
- body/project_lifecycle/__init__.py +4 -0
- body/project_lifecycle/bootstrap_service.py +157 -0
- body/project_lifecycle/definition_service.py +264 -0
- body/project_lifecycle/integration_service.py +113 -0
- body/project_lifecycle/scaffolding_service.py +187 -0
- body/quality/coverage_analyzer.py +177 -0
- body/repositories/__init__.py +4 -0
- body/self_healing/atomic_actions_fixer.py +113 -0
- body/self_healing/body_ui_fixer.py +193 -0
- body/self_healing/capability_parser.py +65 -0
- body/self_healing/code_style_service.py +51 -0
- body/self_healing/complexity_filter.py +70 -0
- body/self_healing/docstring_service.py +345 -0
- body/self_healing/duplicate_id_service.py +407 -0
- body/self_healing/duplicates_service.py +165 -0
- body/self_healing/handlers/__init__.py +1 -0
- body/self_healing/handlers/id_assignment_handler.py +201 -0
- body/self_healing/handlers/import_sorting_handler.py +181 -0
- body/self_healing/header_service.py +308 -0
- body/self_healing/id_tagging_service.py +227 -0
- body/self_healing/knowledge_consolidation_service.py +80 -0
- body/self_healing/logging_service.py +292 -0
- body/self_healing/owner_tagging_service.py +5 -0
- body/self_healing/placeholder_fixer_service.py +27 -0
- body/self_healing/prune_private_capabilities.py +144 -0
- body/self_healing/purge_legacy_tags_service.py +146 -0
- body/self_healing/remediation_models.py +238 -0
- body/self_healing/test_context/__init__.py +10 -0
- body/self_healing/test_context/detectors.py +74 -0
- body/self_healing/test_context/examples.py +53 -0
- body/self_healing/test_context/formatter.py +65 -0
- body/self_healing/test_context/metrics.py +62 -0
- body/self_healing/test_context/models.py +83 -0
- body/self_healing/test_context/parsers.py +70 -0
- body/self_healing/test_context_analyzer.py +79 -0
- body/self_healing/test_failure_analyzer.py +259 -0
- body/self_healing/test_target_analyzer.py +118 -0
- body/self_healing/vulture_healer.py +161 -0
- body/services/__init__.py +4 -0
- body/services/artifact_service.py +155 -0
- body/services/blackboard_service/__init__.py +22 -0
- body/services/blackboard_service/blackboard_claim_service.py +216 -0
- body/services/blackboard_service/blackboard_proposal_service.py +305 -0
- body/services/blackboard_service/blackboard_query_service.py +333 -0
- body/services/blackboard_service/blackboard_service.py +602 -0
- body/services/capabilities.py +51 -0
- body/services/cim/__init__.py +22 -0
- body/services/cim/baselines.py +102 -0
- body/services/cim/census_service.py +190 -0
- body/services/cim/cim_constants.py +116 -0
- body/services/cim/cim_path_utils.py +123 -0
- body/services/cim/diff.py +152 -0
- body/services/cim/history.py +94 -0
- body/services/cim/models.py +319 -0
- body/services/cim/policy.py +149 -0
- body/services/cim/scanners.py +332 -0
- body/services/coherence_service.py +552 -0
- body/services/consequence_log_service.py +189 -0
- body/services/constitutional_rule_loader.py +141 -0
- body/services/constitutional_validator.py +366 -0
- body/services/crate_creation_service.py +217 -0
- body/services/crate_processing_service.py +279 -0
- body/services/crawl_service/__init__.py +10 -0
- body/services/crawl_service/main_module.py +531 -0
- body/services/crawl_service/orchestrator.py +452 -0
- body/services/crawl_service/symbol_processing.py +279 -0
- body/services/database_service.py +242 -0
- body/services/doc_service.py +57 -0
- body/services/file_service.py +260 -0
- body/services/governance_claims_service.py +240 -0
- body/services/governance_init.py +41 -0
- body/services/health_log_service.py +167 -0
- body/services/intent_schema_validator.py +211 -0
- body/services/llm_client.py +87 -0
- body/services/mind_state_service.py +129 -0
- body/services/policy_expression_evaluator.py +154 -0
- body/services/proposal_supervision_service.py +187 -0
- body/services/representation_coherence_service.py +209 -0
- body/services/service_registry.py +431 -0
- body/services/session_attached_service.py +51 -0
- body/services/symbol_query_service.py +218 -0
- body/services/symbol_service.py +94 -0
- body/services/validation/__init__.py +14 -0
- body/services/validation/python_validator.py +89 -0
- body/services/validation/validation_policies.py +121 -0
- body/services/worker_registry_service.py +184 -0
- body/validators/__init__.py +1 -0
- body/validators/logic_conservation_validator.py +201 -0
- body/workers/call_site_rewriter.py +527 -0
- body/workers/prompt_artifact_writer.py +323 -0
- cli/__init__.py +4 -0
- cli/admin_cli.py +98 -0
- cli/cli_user.py +121 -0
- cli/commands/__init__.py +4 -0
- cli/commands/audit_reporter.py +272 -0
- cli/commands/check/__init__.py +115 -0
- cli/commands/check/audit.py +130 -0
- cli/commands/check/converters.py +129 -0
- cli/commands/check/diagnostics_commands.py +70 -0
- cli/commands/check/formatters.py +310 -0
- cli/commands/check/imports.py +73 -0
- cli/commands/check/quality.py +71 -0
- cli/commands/check/quality_gates.py +107 -0
- cli/commands/check/rule.py +136 -0
- cli/commands/check/utils.py +28 -0
- cli/commands/check_atomic_actions.py +167 -0
- cli/commands/components.py +66 -0
- cli/commands/coverage/__init__.py +22 -0
- cli/commands/coverage/analysis_commands.py +87 -0
- cli/commands/coverage/check_commands.py +173 -0
- cli/commands/coverage/generation_commands.py +155 -0
- cli/commands/coverage/services/__init__.py +15 -0
- cli/commands/coverage/services/coverage_checker.py +50 -0
- cli/commands/coverage/services/coverage_reporter.py +81 -0
- cli/commands/coverage/services/gaps_analyzer.py +114 -0
- cli/commands/daemon.py +908 -0
- cli/commands/develop.py +127 -0
- cli/commands/diagnostics.py +32 -0
- cli/commands/fix/__init__.py +84 -0
- cli/commands/fix/all_commands.py +94 -0
- cli/commands/fix/atomic_actions.py +48 -0
- cli/commands/fix/audit.py +146 -0
- cli/commands/fix/body_ui.py +93 -0
- cli/commands/fix/code_style.py +52 -0
- cli/commands/fix/db_tools.py +90 -0
- cli/commands/fix/fix_ir.py +79 -0
- cli/commands/fix/handler_discovery.py +54 -0
- cli/commands/fix/imports.py +55 -0
- cli/commands/fix/list_commands.py +54 -0
- cli/commands/fix/metadata.py +160 -0
- cli/commands/fix/modularity.py +88 -0
- cli/commands/fix/settings_access.py +65 -0
- cli/commands/fix_governed.py +103 -0
- cli/commands/fix_logging.py +24 -0
- cli/commands/governance.py +294 -0
- cli/commands/guard.py +125 -0
- cli/commands/inspect/__init__.py +79 -0
- cli/commands/inspect/_helpers.py +226 -0
- cli/commands/inspect/analysis.py +158 -0
- cli/commands/inspect/decisions.py +140 -0
- cli/commands/inspect/diagnostics.py +126 -0
- cli/commands/inspect/drift.py +100 -0
- cli/commands/inspect/patterns.py +102 -0
- cli/commands/inspect/refusals.py +211 -0
- cli/commands/inspect/repo_census.py +175 -0
- cli/commands/inspect/status.py +48 -0
- cli/commands/interactive_test.py +85 -0
- cli/commands/mind.py +49 -0
- cli/commands/refactor.py +234 -0
- cli/commands/refactor_support/__init__.py +7 -0
- cli/commands/refactor_support/analyzer.py +107 -0
- cli/commands/refactor_support/config.py +67 -0
- cli/commands/refactor_support/display.py +170 -0
- cli/commands/refactor_support/recommendations.py +55 -0
- cli/commands/run.py +60 -0
- cli/commands/search.py +103 -0
- cli/commands/status.py +86 -0
- cli/commands/submit.py +23 -0
- cli/interactive.py +177 -0
- cli/logic/__init__.py +7 -0
- cli/logic/agent.py +110 -0
- cli/logic/audit_capability_domains.py +106 -0
- cli/logic/audit_renderer.py +150 -0
- cli/logic/autonomy/actions.py +36 -0
- cli/logic/autonomy/views.py +116 -0
- cli/logic/body_contracts_checker.py +23 -0
- cli/logic/build.py +27 -0
- cli/logic/byor.py +148 -0
- cli/logic/capability.py +27 -0
- cli/logic/cli_utils.py +210 -0
- cli/logic/context.py +7 -0
- cli/logic/db.py +154 -0
- cli/logic/db_manage.py +22 -0
- cli/logic/decision_inspect_logic.py +62 -0
- cli/logic/diagnostics.py +148 -0
- cli/logic/diagnostics_policy.py +100 -0
- cli/logic/diagnostics_registry.py +165 -0
- cli/logic/duplicates.py +19 -0
- cli/logic/embeddings_cli.py +43 -0
- cli/logic/governance/__init__.py +16 -0
- cli/logic/governance/engine.py +216 -0
- cli/logic/governance/forensics_service.py +67 -0
- cli/logic/governance/limb_status_service.py +83 -0
- cli/logic/governance/renderer.py +115 -0
- cli/logic/governance/traceability_service.py +78 -0
- cli/logic/governance_logic.py +33 -0
- cli/logic/hub/__init__.py +14 -0
- cli/logic/hub/app.py +107 -0
- cli/logic/hub/formatter.py +29 -0
- cli/logic/hub/introspection.py +20 -0
- cli/logic/hub/repository.py +17 -0
- cli/logic/init.py +22 -0
- cli/logic/interactive_test/__init__.py +21 -0
- cli/logic/interactive_test/session.py +102 -0
- cli/logic/interactive_test/steps/__init__.py +23 -0
- cli/logic/interactive_test/steps/execution.py +53 -0
- cli/logic/interactive_test/steps/generation.py +88 -0
- cli/logic/interactive_test/steps/healing.py +79 -0
- cli/logic/interactive_test/steps/utils.py +31 -0
- cli/logic/interactive_test/steps/verification.py +71 -0
- cli/logic/interactive_test/ui.py +203 -0
- cli/logic/interactive_test/workflow.py +168 -0
- cli/logic/interactive_test_logic.py +41 -0
- cli/logic/knowledge.py +47 -0
- cli/logic/legacy_scan_logic.py +306 -0
- cli/logic/list_audits.py +49 -0
- cli/logic/log_audit.py +53 -0
- cli/logic/new.py +8 -0
- cli/logic/project_docs.py +28 -0
- cli/logic/reconcile.py +127 -0
- cli/logic/refusal_inspect_logic.py +208 -0
- cli/logic/report.py +47 -0
- cli/logic/status.py +47 -0
- cli/logic/symbol_drift.py +77 -0
- cli/logic/sync.py +48 -0
- cli/logic/sync_domains.py +72 -0
- cli/logic/sync_manifest.py +31 -0
- cli/logic/tools.py +133 -0
- cli/logic/utils_migration.py +43 -0
- cli/logic/validate.py +107 -0
- cli/logic/vector_drift.py +109 -0
- cli/logic/yaml_processor.py +5 -0
- cli/renderers/audit_detail.py +37 -0
- cli/renderers/audit_overview.py +39 -0
- cli/resources/__init__.py +27 -0
- cli/resources/admin/__init__.py +23 -0
- cli/resources/admin/coverage.py +63 -0
- cli/resources/admin/debt_scan.py +195 -0
- cli/resources/admin/forensics.py +97 -0
- cli/resources/admin/health.py +66 -0
- cli/resources/admin/hub.py +9 -0
- cli/resources/admin/meta.py +47 -0
- cli/resources/admin/patterns.py +28 -0
- cli/resources/admin/refusals.py +31 -0
- cli/resources/admin/self_check.py +175 -0
- cli/resources/admin/status.py +66 -0
- cli/resources/admin/summary.py +67 -0
- cli/resources/admin/traces.py +46 -0
- cli/resources/admin/validate_env.py +56 -0
- cli/resources/code/__init__.py +31 -0
- cli/resources/code/actions.py +48 -0
- cli/resources/code/audit.py +416 -0
- cli/resources/code/audit_duplicates.py +22 -0
- cli/resources/code/check_imports.py +75 -0
- cli/resources/code/check_ui.py +62 -0
- cli/resources/code/clarity.py +51 -0
- cli/resources/code/complexity.py +55 -0
- cli/resources/code/docstrings.py +51 -0
- cli/resources/code/fix_atomic.py +51 -0
- cli/resources/code/format.py +62 -0
- cli/resources/code/hub.py +10 -0
- cli/resources/code/integrity.py +75 -0
- cli/resources/code/lint.py +37 -0
- cli/resources/code/logging.py +49 -0
- cli/resources/code/refactor.py +32 -0
- cli/resources/code/test.py +30 -0
- cli/resources/coherence/__init__.py +13 -0
- cli/resources/coherence/check.py +111 -0
- cli/resources/coherence/hub.py +13 -0
- cli/resources/coherence/repair_counts.py +73 -0
- cli/resources/coherence/report.py +144 -0
- cli/resources/coherence/seed.py +297 -0
- cli/resources/coherence/supersede.py +124 -0
- cli/resources/coherence/triage.py +81 -0
- cli/resources/constitution/__init__.py +19 -0
- cli/resources/constitution/audit.py +49 -0
- cli/resources/constitution/query.py +45 -0
- cli/resources/constitution/status.py +34 -0
- cli/resources/constitution/validate.py +36 -0
- cli/resources/context/__init__.py +21 -0
- cli/resources/context/build.py +374 -0
- cli/resources/context/cache.py +156 -0
- cli/resources/context/explain.py +140 -0
- cli/resources/context/hub.py +11 -0
- cli/resources/context/search.py +114 -0
- cli/resources/database/__init__.py +13 -0
- cli/resources/database/cleanup.py +107 -0
- cli/resources/database/export.py +61 -0
- cli/resources/database/hub.py +11 -0
- cli/resources/database/migrate.py +57 -0
- cli/resources/database/status.py +101 -0
- cli/resources/database/sync.py +84 -0
- cli/resources/database/sync_env.py +76 -0
- cli/resources/database/sync_registry.py +48 -0
- cli/resources/dev/__init__.py +14 -0
- cli/resources/dev/hub.py +11 -0
- cli/resources/dev/refactor.py +92 -0
- cli/resources/dev/stability.py +60 -0
- cli/resources/dev/strategic_audit.py +113 -0
- cli/resources/dev/sync.py +51 -0
- cli/resources/dev/test.py +34 -0
- cli/resources/intent/__init__.py +11 -0
- cli/resources/intent/hub.py +9 -0
- cli/resources/intent/sync_vocabulary.py +396 -0
- cli/resources/project/__init__.py +19 -0
- cli/resources/project/docs.py +41 -0
- cli/resources/project/new.py +40 -0
- cli/resources/project/onboard.py +31 -0
- cli/resources/proposals/__init__.py +28 -0
- cli/resources/proposals/create.py +82 -0
- cli/resources/proposals/integrate.py +49 -0
- cli/resources/proposals/list.py +76 -0
- cli/resources/proposals/manage.py +117 -0
- cli/resources/runtime/__init__.py +9 -0
- cli/resources/runtime/health.py +925 -0
- cli/resources/secrets/__init__.py +10 -0
- cli/resources/secrets/hub.py +9 -0
- cli/resources/secrets/manage.py +309 -0
- cli/resources/symbols/__init__.py +13 -0
- cli/resources/symbols/audit.py +46 -0
- cli/resources/symbols/fix_ids.py +43 -0
- cli/resources/symbols/hub.py +11 -0
- cli/resources/symbols/resolve_duplicates.py +30 -0
- cli/resources/symbols/sync.py +39 -0
- cli/resources/symbols/tag.py +47 -0
- cli/resources/vectors/__init__.py +11 -0
- cli/resources/vectors/cleanup.py +95 -0
- cli/resources/vectors/hub.py +9 -0
- cli/resources/vectors/query.py +105 -0
- cli/resources/vectors/status.py +30 -0
- cli/resources/vectors/sync.py +57 -0
- cli/resources/vectors/sync_code.py +67 -0
- cli/resources/workers/__init__.py +13 -0
- cli/resources/workers/blackboard.py +253 -0
- cli/resources/workers/remediate.py +337 -0
- cli/resources/workers/run.py +140 -0
- cli/utils/__init__.py +32 -0
- cli/utils/annotation_formatter.py +154 -0
- cli/utils/decorators.py +184 -0
- cli/utils/display.py +79 -0
- cli/utils/exit_codes.py +59 -0
- cli/utils/helpers.py +34 -0
- cli/utils/prompts.py +21 -0
- core_runtime-0.1.1.dist-info/LICENSE +21 -0
- core_runtime-0.1.1.dist-info/METADATA +346 -0
- core_runtime-0.1.1.dist-info/RECORD +962 -0
- core_runtime-0.1.1.dist-info/WHEEL +4 -0
- core_runtime-0.1.1.dist-info/entry_points.txt +4 -0
- mind/__init__.py +4 -0
- mind/coherence/__init__.py +1 -0
- mind/coherence/checker.py +314 -0
- mind/coherence/checks/__init__.py +4 -0
- mind/coherence/checks/base.py +34 -0
- mind/coherence/checks/r1_scoped.py +228 -0
- mind/coherence/checks/row2_grounding.py +69 -0
- mind/coherence/checks/row3_citation.py +119 -0
- mind/coherence/checks/row4_naming.py +126 -0
- mind/coherence/checks/sameconcern.py +136 -0
- mind/coherence/checks/specgap.py +233 -0
- mind/coherence/checks/vocabulary.py +112 -0
- mind/coherence/llm_judge.py +207 -0
- mind/enforcement/audit.py +78 -0
- mind/governance/__init__.py +22 -0
- mind/governance/assumption_extractor.py +326 -0
- mind/governance/audit_context.py +520 -0
- mind/governance/audit_postprocessor.py +36 -0
- mind/governance/audit_report_writer.py +46 -0
- mind/governance/audit_types.py +98 -0
- mind/governance/auditor.py +179 -0
- mind/governance/authority_package_builder.py +502 -0
- mind/governance/constitutional_auditor_dynamic.py +362 -0
- mind/governance/enforcement/__init__.py +24 -0
- mind/governance/enforcement_loader.py +245 -0
- mind/governance/enforcement_methods.py +28 -0
- mind/governance/entry_point_policy.py +62 -0
- mind/governance/executable_rule.py +127 -0
- mind/governance/filtered_audit.py +272 -0
- mind/governance/finding_processor.py +76 -0
- mind/governance/meta_validator.py +259 -0
- mind/governance/micro_proposal_validator.py +169 -0
- mind/governance/policy_coverage_service.py +183 -0
- mind/governance/policy_rule.py +94 -0
- mind/governance/rule_conflict_detector.py +127 -0
- mind/governance/rule_executor.py +306 -0
- mind/governance/rule_extractor.py +376 -0
- mind/governance/stateless_audit.py +206 -0
- mind/governance/violation_report.py +136 -0
- mind/logic/engines/_knowledge_gate_duplication.py +117 -0
- mind/logic/engines/action_gate.py +76 -0
- mind/logic/engines/artifact_gate.py +1168 -0
- mind/logic/engines/ast_gate/__init__.py +9 -0
- mind/logic/engines/ast_gate/base.py +263 -0
- mind/logic/engines/ast_gate/checks/__init__.py +35 -0
- mind/logic/engines/ast_gate/checks/async_checks.py +276 -0
- mind/logic/engines/ast_gate/checks/capability_checks.py +197 -0
- mind/logic/engines/ast_gate/checks/conservation_checks.py +126 -0
- mind/logic/engines/ast_gate/checks/generic_checks.py +244 -0
- mind/logic/engines/ast_gate/checks/import_checks.py +164 -0
- mind/logic/engines/ast_gate/checks/knowledge_source_check.py +88 -0
- mind/logic/engines/ast_gate/checks/logging_checks.py +133 -0
- mind/logic/engines/ast_gate/checks/metadata_checks.py +242 -0
- mind/logic/engines/ast_gate/checks/modularity_checks.py +436 -0
- mind/logic/engines/ast_gate/checks/naming_checks.py +120 -0
- mind/logic/engines/ast_gate/checks/prompt_model_checks.py +83 -0
- mind/logic/engines/ast_gate/checks/protected_namespace_access_check.py +298 -0
- mind/logic/engines/ast_gate/checks/purity_checks.py +421 -0
- mind/logic/engines/ast_gate/checks/purity_enforcement_check.py +56 -0
- mind/logic/engines/ast_gate/checks/runtime_import_boundary.py +198 -0
- mind/logic/engines/ast_gate/checks/schema_conformance_checks.py +130 -0
- mind/logic/engines/ast_gate/engine.py +317 -0
- mind/logic/engines/ast_gate.py +19 -0
- mind/logic/engines/base.py +106 -0
- mind/logic/engines/cli_gate/__init__.py +25 -0
- mind/logic/engines/cli_gate/base_check.py +45 -0
- mind/logic/engines/cli_gate/checks/__init__.py +31 -0
- mind/logic/engines/cli_gate/checks/async_execution.py +65 -0
- mind/logic/engines/cli_gate/checks/dangerous_explicit.py +60 -0
- mind/logic/engines/cli_gate/checks/discovery_strict.py +167 -0
- mind/logic/engines/cli_gate/checks/help_required.py +43 -0
- mind/logic/engines/cli_gate/checks/no_duplicates.py +57 -0
- mind/logic/engines/cli_gate/checks/no_layer_exposure.py +48 -0
- mind/logic/engines/cli_gate/checks/resource_first.py +58 -0
- mind/logic/engines/cli_gate/checks/standard_verbs.py +50 -0
- mind/logic/engines/cli_gate/engine.py +211 -0
- mind/logic/engines/glob_gate.py +214 -0
- mind/logic/engines/knowledge_gate.py +410 -0
- mind/logic/engines/llm_gate.py +407 -0
- mind/logic/engines/llm_gate_stub.py +67 -0
- mind/logic/engines/passive_gate.py +45 -0
- mind/logic/engines/regex_gate.py +97 -0
- mind/logic/engines/registry.py +134 -0
- mind/logic/engines/runtime_gate.py +265 -0
- mind/logic/engines/taxonomy_gate.py +229 -0
- mind/logic/engines/workflow_gate/__init__.py +22 -0
- mind/logic/engines/workflow_gate/base_check.py +42 -0
- mind/logic/engines/workflow_gate/checks/__init__.py +32 -0
- mind/logic/engines/workflow_gate/checks/alignment.py +93 -0
- mind/logic/engines/workflow_gate/checks/audit.py +80 -0
- mind/logic/engines/workflow_gate/checks/canary.py +47 -0
- mind/logic/engines/workflow_gate/checks/coverage.py +74 -0
- mind/logic/engines/workflow_gate/checks/dead_code.py +53 -0
- mind/logic/engines/workflow_gate/checks/import_resolution.py +97 -0
- mind/logic/engines/workflow_gate/checks/linter.py +104 -0
- mind/logic/engines/workflow_gate/checks/quality.py +49 -0
- mind/logic/engines/workflow_gate/checks/ruff_format.py +99 -0
- mind/logic/engines/workflow_gate/checks/tests.py +81 -0
- mind/logic/engines/workflow_gate/engine.py +207 -0
- shared/__init__.py +32 -0
- shared/action_logger.py +61 -0
- shared/action_types.py +199 -0
- shared/activity_logging.py +149 -0
- shared/ai/constitutional_envelope.py +341 -0
- shared/ai/prompt_model.py +585 -0
- shared/ai/response_parser.py +191 -0
- shared/ast_utility.py +279 -0
- shared/atomic_action.py +117 -0
- shared/cli/__init__.py +6 -0
- shared/cli/app_introspection.py +134 -0
- shared/cli/command_meta.py +224 -0
- shared/cli_types.py +92 -0
- shared/component_primitive.py +216 -0
- shared/config.py +216 -0
- shared/config_loader.py +54 -0
- shared/context.py +113 -0
- shared/exceptions.py +100 -0
- shared/governance/__init__.py +9 -0
- shared/governance/coherence_harvester.py +258 -0
- shared/governance_token.py +77 -0
- shared/infrastructure/__init__.py +5 -0
- shared/infrastructure/adapters/__init__.py +5 -0
- shared/infrastructure/adapters/embedding_provider.py +66 -0
- shared/infrastructure/bootstrap_registry.py +57 -0
- shared/infrastructure/clients/__init__.py +5 -0
- shared/infrastructure/clients/qdrant_client.py +455 -0
- shared/infrastructure/config_service.py +382 -0
- shared/infrastructure/config_validator.py +70 -0
- shared/infrastructure/context/__init__.py +45 -0
- shared/infrastructure/context/builder.py +804 -0
- shared/infrastructure/context/cache.py +101 -0
- shared/infrastructure/context/database.py +205 -0
- shared/infrastructure/context/limb_workspace.py +134 -0
- shared/infrastructure/context/models.py +65 -0
- shared/infrastructure/context/providers/__init__.py +18 -0
- shared/infrastructure/context/providers/ast.py +211 -0
- shared/infrastructure/context/providers/db.py +165 -0
- shared/infrastructure/context/providers/vectors.py +195 -0
- shared/infrastructure/context/redactor.py +109 -0
- shared/infrastructure/context/serializers.py +144 -0
- shared/infrastructure/context/service.py +271 -0
- shared/infrastructure/context/validator.py +247 -0
- shared/infrastructure/database/models/__init__.py +80 -0
- shared/infrastructure/database/models/autonomous_proposals.py +83 -0
- shared/infrastructure/database/models/decision_traces.py +129 -0
- shared/infrastructure/database/models/governance.py +183 -0
- shared/infrastructure/database/models/knowledge.py +205 -0
- shared/infrastructure/database/models/learning.py +99 -0
- shared/infrastructure/database/models/llm_config.py +274 -0
- shared/infrastructure/database/models/operations.py +152 -0
- shared/infrastructure/database/models/refusals.py +147 -0
- shared/infrastructure/database/models/system.py +124 -0
- shared/infrastructure/database/models/vectors.py +113 -0
- shared/infrastructure/database/models/workers.py +96 -0
- shared/infrastructure/database/session_manager.py +166 -0
- shared/infrastructure/diagnostic_service.py +103 -0
- shared/infrastructure/events/__init__.py +5 -0
- shared/infrastructure/events/base.py +44 -0
- shared/infrastructure/events/bus.py +76 -0
- shared/infrastructure/git_service.py +385 -0
- shared/infrastructure/intent/action_risk.py +135 -0
- shared/infrastructure/intent/audit_verdict.py +131 -0
- shared/infrastructure/intent/autonomy_dirty_tree.py +104 -0
- shared/infrastructure/intent/canonical_enums.py +116 -0
- shared/infrastructure/intent/cognitive_roles.py +96 -0
- shared/infrastructure/intent/errors.py +13 -0
- shared/infrastructure/intent/filesystem_operations.py +359 -0
- shared/infrastructure/intent/intent_connector.py +157 -0
- shared/infrastructure/intent/intent_repository.py +707 -0
- shared/infrastructure/intent/intent_validator.py +248 -0
- shared/infrastructure/intent/operational_capabilities.py +470 -0
- shared/infrastructure/intent/operational_config.py +1343 -0
- shared/infrastructure/intent/operational_mode.py +66 -0
- shared/infrastructure/intent/task_type_phases.py +180 -0
- shared/infrastructure/intent/test_coverage_paths.py +181 -0
- shared/infrastructure/intent/vocabulary_projection.py +241 -0
- shared/infrastructure/knowledge/knowledge_service.py +155 -0
- shared/infrastructure/knowledge_graph_service.py +214 -0
- shared/infrastructure/llm/client.py +448 -0
- shared/infrastructure/llm/client_registry.py +153 -0
- shared/infrastructure/llm/fallback_client.py +144 -0
- shared/infrastructure/llm/providers/anthropic.py +113 -0
- shared/infrastructure/llm/providers/base.py +130 -0
- shared/infrastructure/llm/providers/ollama.py +265 -0
- shared/infrastructure/llm/providers/openai.py +168 -0
- shared/infrastructure/repositories/__init__.py +5 -0
- shared/infrastructure/repositories/db/__init__.py +5 -0
- shared/infrastructure/repositories/db/common.py +138 -0
- shared/infrastructure/repositories/db/engine.py +26 -0
- shared/infrastructure/repositories/db/migration_service.py +75 -0
- shared/infrastructure/repositories/db/status_service.py +61 -0
- shared/infrastructure/repositories/memory_repository.py +134 -0
- shared/infrastructure/repositories/symbol_definition_repository.py +170 -0
- shared/infrastructure/repositories/task_repository.py +59 -0
- shared/infrastructure/repositories/vector_link_repository.py +83 -0
- shared/infrastructure/rooted_repository.py +50 -0
- shared/infrastructure/secrets_service.py +317 -0
- shared/infrastructure/specs/__init__.py +9 -0
- shared/infrastructure/specs/specs_repository.py +100 -0
- shared/infrastructure/storage/file_classifier.py +32 -0
- shared/infrastructure/storage/file_handler.py +330 -0
- shared/infrastructure/storage/file_provider.py +233 -0
- shared/infrastructure/storage/integrity_service.py +108 -0
- shared/infrastructure/validation/black_formatter.py +41 -0
- shared/infrastructure/validation/quality.py +46 -0
- shared/infrastructure/validation/ruff_linter.py +104 -0
- shared/infrastructure/validation/syntax_checker.py +45 -0
- shared/infrastructure/validation/test_runner.py +167 -0
- shared/infrastructure/validation/yaml_validator.py +45 -0
- shared/infrastructure/vector/__init__.py +15 -0
- shared/infrastructure/vector/adapters/__init__.py +20 -0
- shared/infrastructure/vector/adapters/constitutional/__init__.py +26 -0
- shared/infrastructure/vector/adapters/constitutional/chunker.py +246 -0
- shared/infrastructure/vector/adapters/constitutional/doc_key_resolver.py +109 -0
- shared/infrastructure/vector/adapters/constitutional/item_builder.py +158 -0
- shared/infrastructure/vector/adapters/constitutional/utils.py +39 -0
- shared/infrastructure/vector/adapters/constitutional_adapter.py +309 -0
- shared/infrastructure/vector/adapters/specs_adapter.py +171 -0
- shared/infrastructure/vector/cognitive_adapter.py +119 -0
- shared/infrastructure/vector/vector_index_service.py +230 -0
- shared/logger.py +195 -0
- shared/models/__init__.py +47 -0
- shared/models/action_result.py +77 -0
- shared/models/audit_models.py +106 -0
- shared/models/audit_rendering.py +30 -0
- shared/models/capability_models.py +22 -0
- shared/models/constitutional_validation.py +185 -0
- shared/models/drift_models.py +24 -0
- shared/models/embedding_payload.py +45 -0
- shared/models/execution_models.py +71 -0
- shared/models/pattern_graph.py +62 -0
- shared/models/prompt_model.py +244 -0
- shared/models/refusal_result.py +294 -0
- shared/models/remediation.py +35 -0
- shared/models/validation_result.py +34 -0
- shared/models/vector_models.py +62 -0
- shared/models/workflow_models.py +242 -0
- shared/path_resolver.py +408 -0
- shared/path_utils.py +60 -0
- shared/processors/base_processor.py +171 -0
- shared/processors/yaml_processor.py +72 -0
- shared/protocols/__init__.py +21 -0
- shared/protocols/brain_services.py +35 -0
- shared/protocols/cognitive.py +35 -0
- shared/protocols/executor.py +47 -0
- shared/protocols/interpreter.py +24 -0
- shared/protocols/knowledge.py +21 -0
- shared/protocols/llm.py +25 -0
- shared/protocols/typer_protocols.py +37 -0
- shared/time.py +18 -0
- shared/universal.py +43 -0
- shared/utils/__init__.py +81 -0
- shared/utils/audit_grouping.py +50 -0
- shared/utils/common_knowledge.py +82 -0
- shared/utils/domain_mapper.py +61 -0
- shared/utils/embedding_utils.py +182 -0
- shared/utils/glob_match.py +93 -0
- shared/utils/header_tools.py +177 -0
- shared/utils/parallel_processor.py +60 -0
- shared/utils/parsing.py +189 -0
- shared/utils/path_utils.py +268 -0
- shared/utils/subprocess_utils.py +87 -0
- shared/workers/__init__.py +19 -0
- shared/workers/base.py +533 -0
- shared/workers/declaration_validator.py +124 -0
- shared/workers/loop_hold_telemetry.py +210 -0
- shared/workers/schedule.py +123 -0
- will/__init__.py +4 -0
- will/agents/__init__.py +4 -0
- will/agents/base_planner.py +133 -0
- will/agents/code_generation/__init__.py +15 -0
- will/agents/code_generation/code_generator.py +247 -0
- will/agents/code_generation/context_formatters.py +99 -0
- will/agents/code_generation/correction_engine.py +157 -0
- will/agents/code_generation/extraction.py +165 -0
- will/agents/code_generation/pattern_validator.py +264 -0
- will/agents/code_generation/prompt_builders.py +209 -0
- will/agents/coder_agent.py +229 -0
- will/agents/coder_agent_refusal_handler.py +168 -0
- will/agents/cognitive_orchestrator.py +152 -0
- will/agents/conversational/__init__.py +13 -0
- will/agents/conversational/agent.py +271 -0
- will/agents/conversational/factory.py +72 -0
- will/agents/conversational/helpers.py +116 -0
- will/agents/execution_agent.py +294 -0
- will/agents/governance_mixin.py +132 -0
- will/agents/planner_agent.py +261 -0
- will/agents/resource_selector.py +228 -0
- will/agents/strategic_auditor/__init__.py +15 -0
- will/agents/strategic_auditor/agent.py +199 -0
- will/agents/strategic_auditor/context_gatherer.py +586 -0
- will/agents/strategic_auditor/effects.py +136 -0
- will/agents/strategic_auditor/models.py +61 -0
- will/agents/strategic_auditor/reasoning.py +169 -0
- will/agents/tagger_agent.py +294 -0
- will/agents/traced_agent_mixin.py +33 -0
- will/autonomy/__init__.py +20 -0
- will/autonomy/autonomous_developer.py +127 -0
- will/autonomy/proposal.py +585 -0
- will/autonomy/proposal_execution_pipeline.py +264 -0
- will/autonomy/proposal_executor.py +410 -0
- will/autonomy/proposal_mapper.py +187 -0
- will/autonomy/proposal_repository.py +118 -0
- will/autonomy/proposal_service.py +251 -0
- will/autonomy/proposal_state_manager.py +239 -0
- will/deciders/__init__.py +9 -0
- will/deciders/governance_decider.py +207 -0
- will/governance/__init__.py +13 -0
- will/governance/audit_remediation_runner.py +197 -0
- will/governance/audit_runner.py +368 -0
- will/governance/census_runner.py +278 -0
- will/governance/coverage_runner.py +489 -0
- will/governance/daemon_runner.py +164 -0
- will/governance/fix_runner.py +693 -0
- will/governance/inspect_runner.py +521 -0
- will/governance/integrity_runner.py +66 -0
- will/governance/lint_runner.py +93 -0
- will/governance/refactor_runner.py +372 -0
- will/governance/sync_runner.py +186 -0
- will/interpreters/__init__.py +44 -0
- will/interpreters/cli_args_interpreter.py +106 -0
- will/interpreters/natural_language_interpreter.py +276 -0
- will/interpreters/request_interpreter.py +126 -0
- will/lifecycle/__init__.py +12 -0
- will/lifecycle/integration_runner.py +54 -0
- will/maintenance/metadata_scribe_service.py +64 -0
- will/orchestration/__init__.py +4 -0
- will/orchestration/cognitive_service.py +185 -0
- will/orchestration/decision_tracer.py +257 -0
- will/orchestration/intent_alignment.py +59 -0
- will/orchestration/intent_guard.py +20 -0
- will/orchestration/phase_registry.py +92 -0
- will/orchestration/process_orchestrator.py +270 -0
- will/orchestration/prompt_pipeline.py +174 -0
- will/orchestration/remediation_orchestrator.py +292 -0
- will/orchestration/self_correction_engine.py +154 -0
- will/orchestration/validation_pipeline.py +45 -0
- will/orchestration/workflow_orchestrator.py +277 -0
- will/phases/__init__.py +24 -0
- will/phases/audit_phase.py +152 -0
- will/phases/canary/pytest_runner.py +156 -0
- will/phases/canary/result_builder.py +130 -0
- will/phases/canary/test_discovery.py +104 -0
- will/phases/canary_validation_phase.py +188 -0
- will/phases/code_generation/artifact_saver.py +175 -0
- will/phases/code_generation/code_sensor.py +117 -0
- will/phases/code_generation/file_path_extractor.py +53 -0
- will/phases/code_generation/work_directory_manager.py +83 -0
- will/phases/code_generation_phase.py +480 -0
- will/phases/execution_phase.py +179 -0
- will/phases/interpret_phase.py +266 -0
- will/phases/load_phase.py +102 -0
- will/phases/parse_phase.py +117 -0
- will/phases/planning_phase.py +182 -0
- will/phases/runtime_phase.py +112 -0
- will/phases/sandbox_validation_phase.py +130 -0
- will/phases/style_check_phase.py +209 -0
- will/phases/test_generation_phase.py +159 -0
- will/self_healing/alignment/persistence.py +53 -0
- will/self_healing/alignment/sandbox.py +51 -0
- will/self_healing/alignment/specialists.py +165 -0
- will/self_healing/alignment_orchestrator.py +140 -0
- will/self_healing/audit_remediation_service.py +199 -0
- will/self_healing/batch_remediation_service.py +280 -0
- will/self_healing/capability_reconciliation_service.py +96 -0
- will/self_healing/capability_tagging_service.py +224 -0
- will/self_healing/clarity_service.py +204 -0
- will/self_healing/complexity_service.py +260 -0
- will/self_healing/context_aware_test_generator.py +298 -0
- will/self_healing/coverage_remediation_service.py +97 -0
- will/self_healing/coverage_watcher.py +192 -0
- will/self_healing/enrichment_service.py +211 -0
- will/self_healing/linelength_service.py +168 -0
- will/self_healing/modularity_remediation_service.py +203 -0
- will/self_healing/remediation_evidence_writer.py +144 -0
- will/self_healing/remediation_executor.py +113 -0
- will/self_healing/remediation_interpretation/__init__.py +1 -0
- will/self_healing/remediation_interpretation/file_context_assembler.py +383 -0
- will/self_healing/remediation_interpretation/file_role_detector.py +599 -0
- will/self_healing/remediation_interpretation/finding_normalizer.py +221 -0
- will/self_healing/remediation_interpretation/models.py +198 -0
- will/self_healing/remediation_interpretation/reasoning_brief_builder.py +235 -0
- will/self_healing/remediation_interpretation/responsibility_extractor.py +421 -0
- will/self_healing/remediation_interpretation/service.py +202 -0
- will/self_healing/remediation_interpretation/strategy_catalog.py +252 -0
- will/self_healing/remediation_interpretation/strategy_selector.py +395 -0
- will/self_healing/remediation_pattern_matcher.py +126 -0
- will/self_healing/simple_test_generator.py +252 -0
- will/self_healing/single_file_remediation.py +137 -0
- will/self_healing/test_generation/automatic_repair.py +377 -0
- will/self_healing/test_generation/code_extractor.py +238 -0
- will/self_healing/test_generation/context_builder.py +140 -0
- will/self_healing/test_generation/executor.py +64 -0
- will/self_healing/test_generation/failure_parser.py +37 -0
- will/self_healing/test_generation/generation_workflow.py +140 -0
- will/self_healing/test_generation/generator.py +283 -0
- will/self_healing/test_generation/llm_correction.py +160 -0
- will/self_healing/test_generation/repair_workflow.py +128 -0
- will/self_healing/test_generation/single_test_fixer.py +77 -0
- will/self_healing/test_generation/test_extractor.py +50 -0
- will/self_healing/test_generation/test_scorer.py +53 -0
- will/self_healing/test_generation/test_validator.py +64 -0
- will/self_healing/test_generator.py +12 -0
- will/strategists/__init__.py +46 -0
- will/strategists/base_strategist.py +29 -0
- will/strategists/clarity_strategist.py +55 -0
- will/strategists/complexity_strategist.py +55 -0
- will/strategists/fix_strategist.py +467 -0
- will/strategists/sync_strategist.py +369 -0
- will/strategists/test_strategist.py +140 -0
- will/strategists/validation_strategist.py +315 -0
- will/test_generation/__init__.py +46 -0
- will/test_generation/adaptive_test_generator.py +123 -0
- will/test_generation/artifacts.py +102 -0
- will/test_generation/harness_detection.py +103 -0
- will/test_generation/helpers/__init__.py +14 -0
- will/test_generation/helpers/context_extractor.py +100 -0
- will/test_generation/helpers/test_executor.py +230 -0
- will/test_generation/llm_output.py +62 -0
- will/test_generation/models.py +25 -0
- will/test_generation/persistence.py +248 -0
- will/test_generation/phases/__init__.py +16 -0
- will/test_generation/phases/generation_phase.py +150 -0
- will/test_generation/phases/load_phase.py +53 -0
- will/test_generation/phases/parse_phase.py +50 -0
- will/test_generation/prompt_engine.py +123 -0
- will/test_generation/result_aggregator.py +73 -0
- will/test_generation/sandbox.py +203 -0
- will/test_generation/strategy_link.py +56 -0
- will/test_generation/test_extractor.py +140 -0
- will/test_generation/validation.py +89 -0
- will/tools/__init__.py +13 -0
- will/tools/anchor_builder.py +111 -0
- will/tools/anchor_search.py +73 -0
- will/tools/anchors/discovery.py +55 -0
- will/tools/anchors/storage.py +32 -0
- will/tools/architectural_context_builder.py +94 -0
- will/tools/cognitive_toolbox.py +47 -0
- will/tools/context/code_snippet_extractor.py +83 -0
- will/tools/context/embedding_search.py +76 -0
- will/tools/context/formatter.py +87 -0
- will/tools/context/models.py +38 -0
- will/tools/context/query_builder.py +42 -0
- will/tools/context/retriever.py +182 -0
- will/tools/context/standards.py +53 -0
- will/tools/file_navigator.py +180 -0
- will/tools/layers.py +31 -0
- will/tools/module_anchor_generator.py +137 -0
- will/tools/module_descriptor.py +154 -0
- will/tools/policy_vectorizer.py +184 -0
- will/tools/symbol_finder.py +188 -0
- will/tools/tool_generator.py +103 -0
- will/workers/audit_ingest_worker.py +207 -0
- will/workers/audit_violation_filter.py +108 -0
- will/workers/audit_violation_normalizer.py +108 -0
- will/workers/audit_violation_sensor.py +370 -0
- will/workers/blackboard_shop_manager.py +280 -0
- will/workers/capability_tagger.py +153 -0
- will/workers/circuit_breaker.py +335 -0
- will/workers/coherence_sensor.py +212 -0
- will/workers/commit_reachability_auditor.py +135 -0
- will/workers/db_sync_worker.py +96 -0
- will/workers/governance_embedding/__init__.py +9 -0
- will/workers/governance_embedding/governance_embedder_worker.py +189 -0
- will/workers/intent_inspector.py +599 -0
- will/workers/observer_worker.py +158 -0
- will/workers/prompt_extractor_worker.py +241 -0
- will/workers/proposal_consumer_effects.py +216 -0
- will/workers/proposal_consumer_revival.py +131 -0
- will/workers/proposal_consumer_worker.py +271 -0
- will/workers/proposal_pipeline_shop_manager.py +273 -0
- will/workers/repo_crawler.py +171 -0
- will/workers/repo_embedding/__init__.py +18 -0
- will/workers/repo_embedding/helpers.py +245 -0
- will/workers/repo_embedding/repo_embedder_workers.py +163 -0
- will/workers/test_coverage_sensor.py +208 -0
- will/workers/test_remediator/__init__.py +12 -0
- will/workers/test_remediator/_operations.py +295 -0
- will/workers/test_remediator/worker.py +187 -0
- will/workers/test_runner_sensor.py +430 -0
- will/workers/violation_executor.py +496 -0
- will/workers/violation_remediator.py +394 -0
- will/workers/violation_remediator_blackboard.py +225 -0
- will/workers/violation_remediator_body/__init__.py +12 -0
- will/workers/violation_remediator_body/blackboard.py +139 -0
- will/workers/violation_remediator_body/ceremony.py +154 -0
- will/workers/violation_remediator_body/context.py +70 -0
- will/workers/violation_remediator_body/llm.py +112 -0
- will/workers/violation_remediator_body/models.py +35 -0
- will/workers/violation_remediator_body/worker.py +518 -0
- will/workers/violation_remediator_proposal.py +328 -0
- will/workers/worker_shop_manager.py +244 -0
- will/workflows/__init__.py +23 -0
- will/workflows/dev_sync_reporter.py +274 -0
- will/workflows/dev_sync_workflow.py +118 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# src/mind/governance/policy_rule.py
|
|
2
|
+
"""
|
|
3
|
+
PolicyRule data structure for constitutional governance.
|
|
4
|
+
|
|
5
|
+
Represents a single constitutional rule with engine dispatch capability.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from dataclasses import dataclass
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@dataclass
|
|
15
|
+
# ID: d337536c-f552-432d-94a6-a2431db94dd3
|
|
16
|
+
class PolicyRule:
|
|
17
|
+
"""
|
|
18
|
+
Structured representation of a constitutional policy rule.
|
|
19
|
+
|
|
20
|
+
Attributes:
|
|
21
|
+
name: Unique rule identifier (e.g., "di.no_global_session_import")
|
|
22
|
+
pattern: Glob pattern for file matching (e.g., "src/**/*.py")
|
|
23
|
+
action: Rule action - "deny", "warn", or engine-based
|
|
24
|
+
description: Human-readable rule explanation
|
|
25
|
+
severity: "error" or "warning"
|
|
26
|
+
source_policy: Policy file this rule came from
|
|
27
|
+
engine: Optional engine ID for verification (e.g., "ast_gate")
|
|
28
|
+
params: Optional parameters for engine execution
|
|
29
|
+
authority: Binding tier — "constitution" always blocks;
|
|
30
|
+
"policy" blocks only when strict_mode=True
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
name: str
|
|
34
|
+
pattern: str
|
|
35
|
+
action: str
|
|
36
|
+
description: str
|
|
37
|
+
severity: str = "error"
|
|
38
|
+
source_policy: str = "unknown"
|
|
39
|
+
# Engine dispatch fields
|
|
40
|
+
engine: str | None = None
|
|
41
|
+
params: dict[str, Any] | None = None
|
|
42
|
+
# Binding tier — sourced from the rule's 'authority' field in .intent/
|
|
43
|
+
authority: str = "policy"
|
|
44
|
+
|
|
45
|
+
@classmethod
|
|
46
|
+
# ID: ef47b7d5-3232-4a9d-8edc-3532e70a92f2
|
|
47
|
+
def from_dict(cls, data: dict[str, Any], source: str = "unknown") -> PolicyRule:
|
|
48
|
+
"""
|
|
49
|
+
Parse rule from constitutional JSON/YAML.
|
|
50
|
+
|
|
51
|
+
Expected structure:
|
|
52
|
+
{
|
|
53
|
+
"id": "rule.name",
|
|
54
|
+
"statement": "description",
|
|
55
|
+
"authority": "policy",
|
|
56
|
+
"check": {
|
|
57
|
+
"engine": "ast_gate",
|
|
58
|
+
"params": {"check_type": "runtime_import_boundary", ...}
|
|
59
|
+
},
|
|
60
|
+
"enforcement": "error",
|
|
61
|
+
"scope": ["src/**/*.py"]
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
data: Raw rule dictionary from policy file
|
|
66
|
+
source: Source policy name for traceability
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
Parsed PolicyRule instance
|
|
70
|
+
"""
|
|
71
|
+
# Extract check block if present (engine dispatch)
|
|
72
|
+
check_block = data.get("check", {})
|
|
73
|
+
engine_id = check_block.get("engine") if isinstance(check_block, dict) else None
|
|
74
|
+
params = check_block.get("params", {}) if isinstance(check_block, dict) else {}
|
|
75
|
+
|
|
76
|
+
# Extract pattern from scope (first entry) or pattern field
|
|
77
|
+
scope = data.get("scope", [])
|
|
78
|
+
pattern = ""
|
|
79
|
+
if isinstance(scope, list) and scope:
|
|
80
|
+
pattern = str(scope[0])
|
|
81
|
+
elif data.get("pattern"):
|
|
82
|
+
pattern = str(data.get("pattern"))
|
|
83
|
+
|
|
84
|
+
return cls(
|
|
85
|
+
name=str(data.get("name") or data.get("id") or "unnamed"),
|
|
86
|
+
pattern=pattern,
|
|
87
|
+
action=str(data.get("action") or "deny"),
|
|
88
|
+
description=str(data.get("description") or data.get("statement") or ""),
|
|
89
|
+
severity=str(data.get("severity") or data.get("enforcement") or "error"),
|
|
90
|
+
source_policy=source,
|
|
91
|
+
engine=engine_id,
|
|
92
|
+
params=params,
|
|
93
|
+
authority=str(data.get("authority", "policy")),
|
|
94
|
+
)
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# src/mind/governance/rule_conflict_detector.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Rule Conflict Detector - Constitutional Governance Validation
|
|
5
|
+
|
|
6
|
+
CONSTITUTIONAL ALIGNMENT:
|
|
7
|
+
- Single Responsibility: Detect rule conflicts at load time
|
|
8
|
+
- Implements CORE-Rule-Conflict-Semantics.md
|
|
9
|
+
- No runtime enforcement logic
|
|
10
|
+
|
|
11
|
+
Per CORE-Rule-Conflict-Semantics.md:
|
|
12
|
+
- Conflicts between equal-authority rules are governance errors
|
|
13
|
+
- Must be resolved in .intent policies, not by runtime precedence
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
from collections import defaultdict
|
|
19
|
+
|
|
20
|
+
from mind.governance.policy_rule import PolicyRule
|
|
21
|
+
from shared.logger import getLogger
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
logger = getLogger(__name__)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
# ID: 27a0babb-934b-48ef-bf4b-7eed998c4f1d
|
|
28
|
+
class RuleConflictDetector:
|
|
29
|
+
"""
|
|
30
|
+
Detects conflicts between constitutional rules.
|
|
31
|
+
|
|
32
|
+
Constitutional Compliance:
|
|
33
|
+
- NO precedence-based conflict resolution
|
|
34
|
+
- Equal-authority conflicts are governance errors
|
|
35
|
+
- Enforces CORE-Rule-Conflict-Semantics.md
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
@staticmethod
|
|
39
|
+
# ID: 479c3822-cb01-4af4-86c6-2bd8743de061
|
|
40
|
+
def detect_conflicts(rules: list[PolicyRule]) -> list[dict[str, str]]:
|
|
41
|
+
"""
|
|
42
|
+
Detect conflicts between rules of equal authority.
|
|
43
|
+
|
|
44
|
+
Per CORE-Rule-Conflict-Semantics.md Section 2:
|
|
45
|
+
A rule conflict exists when:
|
|
46
|
+
1. Two or more rules apply at the same Phase (pattern overlap)
|
|
47
|
+
2. The rules have the same Authority level
|
|
48
|
+
3. The rules produce incompatible outcomes
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
rules: List of policy rules to check
|
|
52
|
+
|
|
53
|
+
Returns:
|
|
54
|
+
List of conflict descriptions with rule names and details
|
|
55
|
+
"""
|
|
56
|
+
conflicts = []
|
|
57
|
+
|
|
58
|
+
# Group rules by pattern to find overlapping enforcement
|
|
59
|
+
pattern_groups = defaultdict(list)
|
|
60
|
+
for rule in rules:
|
|
61
|
+
pattern_groups[rule.pattern].append(rule)
|
|
62
|
+
|
|
63
|
+
# Check each pattern group for conflicts
|
|
64
|
+
for pattern, pattern_rules in pattern_groups.items():
|
|
65
|
+
if len(pattern_rules) < 2:
|
|
66
|
+
continue
|
|
67
|
+
|
|
68
|
+
# Check for incompatible actions among equal-authority rules
|
|
69
|
+
for i, rule1 in enumerate(pattern_rules):
|
|
70
|
+
for rule2 in pattern_rules[i + 1 :]:
|
|
71
|
+
# If both rules have same severity (proxy for authority level)
|
|
72
|
+
# and incompatible actions, that's a conflict
|
|
73
|
+
if rule1.severity == rule2.severity:
|
|
74
|
+
if RuleConflictDetector._actions_are_incompatible(
|
|
75
|
+
rule1.action, rule2.action
|
|
76
|
+
):
|
|
77
|
+
conflicts.append(
|
|
78
|
+
{
|
|
79
|
+
"rule1": rule1.name,
|
|
80
|
+
"rule2": rule2.name,
|
|
81
|
+
"pattern": pattern,
|
|
82
|
+
"authority": rule1.severity,
|
|
83
|
+
"action1": rule1.action,
|
|
84
|
+
"action2": rule2.action,
|
|
85
|
+
}
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
return conflicts
|
|
89
|
+
|
|
90
|
+
@staticmethod
|
|
91
|
+
def _actions_are_incompatible(action1: str, action2: str) -> bool:
|
|
92
|
+
"""
|
|
93
|
+
Determine if two rule actions are mutually incompatible.
|
|
94
|
+
|
|
95
|
+
Incompatible actions:
|
|
96
|
+
- "deny" vs "allow" (one forbids, one permits)
|
|
97
|
+
- Different engine dispatch targets for same pattern
|
|
98
|
+
|
|
99
|
+
Compatible actions (not conflicts):
|
|
100
|
+
- "deny" and "deny" (redundant but not contradictory)
|
|
101
|
+
- "warn" and "warn" (redundant reporting)
|
|
102
|
+
- "warn" and "deny" (deny is stricter, no conflict)
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
action1: First rule action
|
|
106
|
+
action2: Second rule action
|
|
107
|
+
|
|
108
|
+
Returns:
|
|
109
|
+
True if actions conflict
|
|
110
|
+
"""
|
|
111
|
+
# Normalize actions
|
|
112
|
+
a1, a2 = action1.lower(), action2.lower()
|
|
113
|
+
|
|
114
|
+
# Explicit allow/deny conflict
|
|
115
|
+
if {a1, a2} == {"deny", "allow"}:
|
|
116
|
+
return True
|
|
117
|
+
|
|
118
|
+
# Different engine dispatches on same pattern is a conflict
|
|
119
|
+
if a1.startswith("engine:") and a2.startswith("engine:"):
|
|
120
|
+
if a1 != a2:
|
|
121
|
+
return True
|
|
122
|
+
|
|
123
|
+
# warn + deny is NOT a conflict (deny is stricter)
|
|
124
|
+
# deny + deny is NOT a conflict (redundant)
|
|
125
|
+
# warn + warn is NOT a conflict
|
|
126
|
+
|
|
127
|
+
return False
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
# src/mind/governance/rule_executor.py
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING
|
|
6
|
+
|
|
7
|
+
from mind.logic.engines.base import normalize_violation
|
|
8
|
+
from shared.logger import getLogger
|
|
9
|
+
from shared.models import AuditFinding, AuditSeverity
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
# #306/#307: marker the llm_gate engine emits when an LLM call fails for
|
|
13
|
+
# infrastructure reasons (timeout, connection error, rate limit). We
|
|
14
|
+
# aggregate these into one WARNING per rule rather than emitting one
|
|
15
|
+
# finding per file, because per-file findings get claimed by the
|
|
16
|
+
# autonomous remediation loop and produce churn against unmapped rules.
|
|
17
|
+
# The engine still surfaces a real per-file violation when the LLM
|
|
18
|
+
# returns a legitimate "violation: true" verdict — that path is unaffected.
|
|
19
|
+
_TRANSIENT_LLM_FAILURE_MARKER = "SYSTEM_ERROR_AI_OFFLINE"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
if TYPE_CHECKING:
|
|
23
|
+
from mind.governance.audit_context import AuditorContext
|
|
24
|
+
from mind.governance.executable_rule import ExecutableRule
|
|
25
|
+
|
|
26
|
+
logger = getLogger(__name__)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _map_enforcement_to_severity(enforcement: str) -> AuditSeverity:
|
|
30
|
+
# #432: `reporting` is informational by intent — surfacing a fact, not
|
|
31
|
+
# demanding action. It must not inflate the HIGH bucket alongside true
|
|
32
|
+
# warnings. `warning` stays HIGH for callers that want noisy-but-non-
|
|
33
|
+
# blocking signal even though no rule in the current tree uses it.
|
|
34
|
+
e = enforcement.lower()
|
|
35
|
+
if e in ("blocking", "error"):
|
|
36
|
+
return AuditSeverity.BLOCK
|
|
37
|
+
if e == "warning":
|
|
38
|
+
return AuditSeverity.HIGH
|
|
39
|
+
return AuditSeverity.INFO
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
# ID: d28e3c01-6744-4875-8511-0d216a07964a
|
|
43
|
+
async def execute_rule(
|
|
44
|
+
rule: ExecutableRule,
|
|
45
|
+
context: AuditorContext,
|
|
46
|
+
*,
|
|
47
|
+
file_filter: frozenset[str] | None = None,
|
|
48
|
+
prior_findings: list[AuditFinding] | None = None,
|
|
49
|
+
) -> list[AuditFinding]:
|
|
50
|
+
"""
|
|
51
|
+
Execute a single rule and return findings.
|
|
52
|
+
|
|
53
|
+
Args:
|
|
54
|
+
rule: The rule to execute.
|
|
55
|
+
context: AuditorContext with repo and policy info.
|
|
56
|
+
file_filter: Optional set of repo-relative POSIX file paths
|
|
57
|
+
scoping the per-file iteration. When provided (#279), the
|
|
58
|
+
rule runs only against the intersection of its declared
|
|
59
|
+
scope and this set; an empty intersection produces no
|
|
60
|
+
findings (no work). Context-level rules cannot be scoped to
|
|
61
|
+
a file list and are skipped with a warning when this filter
|
|
62
|
+
is set — the caller's per-file gate cannot meaningfully
|
|
63
|
+
constrain a cross-file check.
|
|
64
|
+
prior_findings: Findings accumulated by earlier rules in the
|
|
65
|
+
current audit run. Required when this rule declares
|
|
66
|
+
requires_findings_from (ADR-043 D2): the per-file scope is
|
|
67
|
+
further narrowed to files that already have findings under
|
|
68
|
+
the listed rule IDs. None or an empty list when the rule
|
|
69
|
+
has no preconditions; the audit driver topologically orders
|
|
70
|
+
rules so preconditions execute first
|
|
71
|
+
(rule_extractor._topologically_sort_rules).
|
|
72
|
+
"""
|
|
73
|
+
from mind.logic.engines.registry import EngineRegistry
|
|
74
|
+
|
|
75
|
+
findings: list[AuditFinding] = []
|
|
76
|
+
|
|
77
|
+
try:
|
|
78
|
+
engine = EngineRegistry.get(rule.engine)
|
|
79
|
+
except ValueError as e:
|
|
80
|
+
return [
|
|
81
|
+
AuditFinding(
|
|
82
|
+
check_id=f"{rule.rule_id}.engine_missing",
|
|
83
|
+
severity=AuditSeverity.BLOCK,
|
|
84
|
+
message=str(e),
|
|
85
|
+
file_path="none",
|
|
86
|
+
)
|
|
87
|
+
]
|
|
88
|
+
|
|
89
|
+
# #307: when an llm_gate rule falls back to LLMGateStubEngine (no LLM
|
|
90
|
+
# client wired), emit ONE WARNING for the rule and skip per-file
|
|
91
|
+
# evaluation. Without this, llm_gate rules silently produce zero
|
|
92
|
+
# findings — indistinguishable from a real pass. Per-file evaluation
|
|
93
|
+
# is also skipped because the stub returns ok=True for every file
|
|
94
|
+
# and would generate no findings anyway, while the per-rule WARNING
|
|
95
|
+
# is what the governor actually needs to see.
|
|
96
|
+
from mind.logic.engines.llm_gate_stub import LLMGateStubEngine
|
|
97
|
+
|
|
98
|
+
if isinstance(engine, LLMGateStubEngine):
|
|
99
|
+
return [
|
|
100
|
+
AuditFinding(
|
|
101
|
+
check_id=rule.rule_id,
|
|
102
|
+
severity=AuditSeverity.HIGH,
|
|
103
|
+
message=(
|
|
104
|
+
f"Rule '{rule.rule_id}' uses engine '{rule.engine}' which "
|
|
105
|
+
"is not operational in this run (no LLM client wired). "
|
|
106
|
+
"Audit signal for this rule is muted until the wiring is "
|
|
107
|
+
"available — see GitHub #306."
|
|
108
|
+
),
|
|
109
|
+
file_path="none",
|
|
110
|
+
context={
|
|
111
|
+
"engine_id": rule.engine,
|
|
112
|
+
"stub": True,
|
|
113
|
+
"reason": "no_llm_client",
|
|
114
|
+
},
|
|
115
|
+
)
|
|
116
|
+
]
|
|
117
|
+
|
|
118
|
+
if rule.is_context_level:
|
|
119
|
+
# ADR-279 / #279: --files scopes per-file checks; context-level
|
|
120
|
+
# rules look at the whole repo and can't be meaningfully filtered
|
|
121
|
+
# to a subset, so skip with a warning when a file filter is
|
|
122
|
+
# active. This keeps pre-commit-hook output focused on the
|
|
123
|
+
# staged file set.
|
|
124
|
+
if file_filter is not None:
|
|
125
|
+
logger.info(
|
|
126
|
+
"Skipping context-level rule %s under --files scope "
|
|
127
|
+
"(engine=%s; cross-file check cannot be filtered)",
|
|
128
|
+
rule.rule_id,
|
|
129
|
+
rule.engine,
|
|
130
|
+
)
|
|
131
|
+
return findings
|
|
132
|
+
if hasattr(engine, "verify_context"):
|
|
133
|
+
severity = _map_enforcement_to_severity(rule.enforcement)
|
|
134
|
+
engine_findings = await engine.verify_context(
|
|
135
|
+
context,
|
|
136
|
+
{**rule.params, "_scope_excludes": rule.exclusions},
|
|
137
|
+
)
|
|
138
|
+
for f in engine_findings:
|
|
139
|
+
f.severity = severity
|
|
140
|
+
# Restore check_id == rule.rule_id invariant (#485). The per-file
|
|
141
|
+
# path at the bottom of this function constructs AuditFinding with
|
|
142
|
+
# check_id=rule.rule_id; the context-level path historically passed
|
|
143
|
+
# engine-set check_ids through unmodified, letting them drift to
|
|
144
|
+
# `<engine_id>.<check_type>` shapes (e.g. cli_gate.resource_first
|
|
145
|
+
# for rule cli.resource_first). That drift made AuditViolationSensor
|
|
146
|
+
# dedup work only by string-prefix coincidence. Engine identity is
|
|
147
|
+
# still recoverable via the rule's mapping in .intent/; per-finding
|
|
148
|
+
# engine attribution stays available through f.context if a check
|
|
149
|
+
# records it there.
|
|
150
|
+
f.check_id = rule.rule_id
|
|
151
|
+
findings.extend(engine_findings)
|
|
152
|
+
return findings
|
|
153
|
+
|
|
154
|
+
files = context.get_files(include=rule.scope, exclude=rule.exclusions)
|
|
155
|
+
if file_filter is not None:
|
|
156
|
+
# Intersect the rule's scope with the user's --files set. Empty
|
|
157
|
+
# intersection produces no findings — the rule's scope didn't
|
|
158
|
+
# cover any of the requested files (e.g. user passed
|
|
159
|
+
# src/cli/foo.py against a rule scoped to src/api/**).
|
|
160
|
+
files = [
|
|
161
|
+
p
|
|
162
|
+
for p in files
|
|
163
|
+
if str(p.relative_to(context.repo_path)).replace("\\", "/") in file_filter
|
|
164
|
+
]
|
|
165
|
+
if rule.requires_findings_from:
|
|
166
|
+
# ADR-043 D2/D3: pre-selector narrowing. Run only against files
|
|
167
|
+
# that have findings under the listed precondition rule IDs in
|
|
168
|
+
# this audit run. Empty intersection produces no work and no
|
|
169
|
+
# findings — the precondition rule did not fire on any in-scope
|
|
170
|
+
# file. Aggregate findings with file_path="none" (transient LLM
|
|
171
|
+
# failure WARNINGs, stub WARNINGs) cannot match a real path and
|
|
172
|
+
# are filtered out naturally.
|
|
173
|
+
requires_set = frozenset(rule.requires_findings_from)
|
|
174
|
+
precondition_files = {
|
|
175
|
+
f.file_path for f in (prior_findings or []) if f.check_id in requires_set
|
|
176
|
+
}
|
|
177
|
+
files = [
|
|
178
|
+
p
|
|
179
|
+
for p in files
|
|
180
|
+
if str(p.relative_to(context.repo_path)).replace("\\", "/")
|
|
181
|
+
in precondition_files
|
|
182
|
+
]
|
|
183
|
+
severity = _map_enforcement_to_severity(rule.enforcement)
|
|
184
|
+
# #309: store (rel_path, underlying_error_message) pairs so the
|
|
185
|
+
# aggregate finding preserves the engine's diagnostic string.
|
|
186
|
+
transient_llm_failures: list[tuple[str, str]] = []
|
|
187
|
+
|
|
188
|
+
for file_path in files:
|
|
189
|
+
try:
|
|
190
|
+
# We add '_context' to the params so the Engine knows where to find the Cache.
|
|
191
|
+
# ADR-044: thread rule identity, content hash, and force-llm flag
|
|
192
|
+
# through so the llm_gate engine can perform DB-backed verdict
|
|
193
|
+
# caching. Underscored keys are engine-protocol fields, not rule
|
|
194
|
+
# params — engines ignore them if they don't care.
|
|
195
|
+
params_with_context = {
|
|
196
|
+
**rule.params,
|
|
197
|
+
"_context": context,
|
|
198
|
+
"_rule_id": rule.rule_id,
|
|
199
|
+
"_rule_content_hash": rule.rule_content_hash,
|
|
200
|
+
"_force_llm": getattr(context, "force_llm", False),
|
|
201
|
+
}
|
|
202
|
+
result = await engine.verify(file_path, params_with_context)
|
|
203
|
+
if not result.ok:
|
|
204
|
+
# #306/#307: transient LLM infrastructure failures are
|
|
205
|
+
# aggregated, not emitted per-file. The marker is set by
|
|
206
|
+
# LLMGateEngine when its LLM call fails for non-verdict
|
|
207
|
+
# reasons (timeout, connection error, etc.).
|
|
208
|
+
marker_violation = next(
|
|
209
|
+
(
|
|
210
|
+
v
|
|
211
|
+
for v in result.violations
|
|
212
|
+
if _TRANSIENT_LLM_FAILURE_MARKER in str(v)
|
|
213
|
+
),
|
|
214
|
+
None,
|
|
215
|
+
)
|
|
216
|
+
if marker_violation is not None:
|
|
217
|
+
rel_path = str(file_path.relative_to(context.repo_path))
|
|
218
|
+
err_msg, _ = normalize_violation(marker_violation)
|
|
219
|
+
transient_llm_failures.append((rel_path, err_msg))
|
|
220
|
+
continue
|
|
221
|
+
for v in result.violations:
|
|
222
|
+
# Normalize whether engine emitted a bare string or a
|
|
223
|
+
# structured dict. Details (when present) flow into
|
|
224
|
+
# AuditFinding.context, which as_dict() aliases back
|
|
225
|
+
# to "details" in the JSON report.
|
|
226
|
+
msg, details = normalize_violation(v)
|
|
227
|
+
findings.append(
|
|
228
|
+
AuditFinding(
|
|
229
|
+
check_id=rule.rule_id,
|
|
230
|
+
severity=severity,
|
|
231
|
+
message=msg,
|
|
232
|
+
file_path=str(file_path.relative_to(context.repo_path)),
|
|
233
|
+
context=details,
|
|
234
|
+
)
|
|
235
|
+
)
|
|
236
|
+
except Exception as e:
|
|
237
|
+
# HARDENING P0.1 (per-file): Engine crash on a single file →
|
|
238
|
+
# ENFORCEMENT_FAILURE finding. A crashing per-file check is NOT
|
|
239
|
+
# a passing check. Silent continue would make this rule
|
|
240
|
+
# indistinguishable from a clean pass for this file.
|
|
241
|
+
logger.error(
|
|
242
|
+
"ENFORCEMENT_FAILURE: Rule %s crashed on file %s: %s",
|
|
243
|
+
rule.rule_id,
|
|
244
|
+
file_path,
|
|
245
|
+
e,
|
|
246
|
+
exc_info=True,
|
|
247
|
+
)
|
|
248
|
+
findings.append(
|
|
249
|
+
AuditFinding(
|
|
250
|
+
check_id=f"{rule.rule_id}.enforcement_failure",
|
|
251
|
+
severity=AuditSeverity.BLOCK,
|
|
252
|
+
message=(
|
|
253
|
+
f"ENFORCEMENT_FAILURE: Rule crashed on {file_path}: {e}. "
|
|
254
|
+
f"Compliance status UNKNOWN — treat as non-compliant until fixed."
|
|
255
|
+
),
|
|
256
|
+
file_path=str(file_path.relative_to(context.repo_path)),
|
|
257
|
+
context={
|
|
258
|
+
"finding_type": "ENFORCEMENT_FAILURE",
|
|
259
|
+
"engine": rule.engine,
|
|
260
|
+
"policy_id": rule.policy_id,
|
|
261
|
+
"exception_type": type(e).__name__,
|
|
262
|
+
"exception_message": str(e),
|
|
263
|
+
},
|
|
264
|
+
)
|
|
265
|
+
)
|
|
266
|
+
continue
|
|
267
|
+
|
|
268
|
+
# #306/#307: emit one aggregate WARNING for transient LLM failures
|
|
269
|
+
# accumulated during this rule's run. Bounds Blackboard pollution —
|
|
270
|
+
# the autonomous remediation loop sees one finding per affected rule
|
|
271
|
+
# instead of one per file. sample_files preserves enough signal for
|
|
272
|
+
# the governor to investigate without churning the loop.
|
|
273
|
+
if transient_llm_failures:
|
|
274
|
+
# #309: deduplicate underlying error strings. A single root cause
|
|
275
|
+
# (e.g. the prompt-contract mismatch that made #308 look transient)
|
|
276
|
+
# shows up as one entry; a true intermittent shows many. Visible
|
|
277
|
+
# from the message without reading every per-file sample.
|
|
278
|
+
unique_errors = sorted({err for _, err in transient_llm_failures})
|
|
279
|
+
findings.append(
|
|
280
|
+
AuditFinding(
|
|
281
|
+
check_id=rule.rule_id,
|
|
282
|
+
severity=AuditSeverity.HIGH,
|
|
283
|
+
message=(
|
|
284
|
+
f"Rule '{rule.rule_id}' LLM evaluation failed transiently "
|
|
285
|
+
f"on {len(transient_llm_failures)} file(s) "
|
|
286
|
+
f"({len(unique_errors)} unique error(s)). Verdict for "
|
|
287
|
+
"those files is UNKNOWN until the LLM provider can keep "
|
|
288
|
+
"up with audit-scale throughput — see follow-up issue on "
|
|
289
|
+
"llm_gate concurrency/batching."
|
|
290
|
+
),
|
|
291
|
+
file_path="none",
|
|
292
|
+
context={
|
|
293
|
+
"finding_type": "LLM_TRANSIENT_FAILURE",
|
|
294
|
+
"engine_id": rule.engine,
|
|
295
|
+
"failure_count": len(transient_llm_failures),
|
|
296
|
+
"sample_files": [path for path, _ in transient_llm_failures[:5]],
|
|
297
|
+
"sample_errors": [
|
|
298
|
+
{"file": path, "error": err}
|
|
299
|
+
for path, err in transient_llm_failures[:5]
|
|
300
|
+
],
|
|
301
|
+
"unique_error_messages": unique_errors[:5],
|
|
302
|
+
},
|
|
303
|
+
)
|
|
304
|
+
)
|
|
305
|
+
|
|
306
|
+
return findings
|