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,62 @@
|
|
|
1
|
+
# src/mind/governance/entry_point_policy.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Entry point allow-list policy for audit severity downgrading.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from collections.abc import Iterable
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
# ID: 86699225-ae44-4a9a-926c-87bb365f5b7c
|
|
13
|
+
class EntryPointAllowList:
|
|
14
|
+
"""
|
|
15
|
+
Allow-list of entry_point_type values for which we downgrade dead-public-symbol findings.
|
|
16
|
+
|
|
17
|
+
These are architectural patterns that intentionally have public symbols
|
|
18
|
+
without direct internal callers (CLI commands, base classes, data models, etc).
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
def __init__(self, allowed_types: Iterable[str]) -> None:
|
|
22
|
+
self.allowed = {t.strip() for t in allowed_types if t and t.strip()}
|
|
23
|
+
|
|
24
|
+
@classmethod
|
|
25
|
+
# ID: a0594887-ebb4-429f-b2cf-976e266e2796
|
|
26
|
+
def default(cls) -> EntryPointAllowList:
|
|
27
|
+
"""Standard allow-list based on CORE's architectural patterns."""
|
|
28
|
+
return cls(
|
|
29
|
+
allowed_types=[
|
|
30
|
+
# Structural/data constructs
|
|
31
|
+
"data_model",
|
|
32
|
+
"enum",
|
|
33
|
+
"magic_method",
|
|
34
|
+
"visitor_method",
|
|
35
|
+
"base_class",
|
|
36
|
+
"boilerplate_method",
|
|
37
|
+
# CLI & wrappers
|
|
38
|
+
"cli_command",
|
|
39
|
+
"cli_wrapper",
|
|
40
|
+
"registry_accessor",
|
|
41
|
+
# Orchestration/factories
|
|
42
|
+
"orchestrator",
|
|
43
|
+
"factory",
|
|
44
|
+
# Providers/adapters/clients
|
|
45
|
+
"provider_method",
|
|
46
|
+
"client_surface",
|
|
47
|
+
"client_adapter",
|
|
48
|
+
"io_handler",
|
|
49
|
+
"git_adapter",
|
|
50
|
+
"utility_function",
|
|
51
|
+
# Knowledge & governance pipelines
|
|
52
|
+
"knowledge_core",
|
|
53
|
+
"governance_check",
|
|
54
|
+
"auditor_pipeline",
|
|
55
|
+
# Capabilities
|
|
56
|
+
"capability",
|
|
57
|
+
]
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
def __contains__(self, entry_point_type: str | None) -> bool:
|
|
61
|
+
"""Check if an entry_point_type is in the allow-list."""
|
|
62
|
+
return bool(entry_point_type) and entry_point_type in self.allowed
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# src/mind/governance/executable_rule.py
|
|
2
|
+
"""
|
|
3
|
+
ExecutableRule - Represents a constitutional rule that can be executed via an engine.
|
|
4
|
+
|
|
5
|
+
This dataclass bridges the gap between policy JSON declarations and runtime execution.
|
|
6
|
+
It extracts the essential execution information from policy rules, allowing the audit
|
|
7
|
+
system to execute rules directly from JSON without requiring Python Check classes.
|
|
8
|
+
|
|
9
|
+
Design Philosophy:
|
|
10
|
+
- Rules live in .intent/ policies (Mind layer)
|
|
11
|
+
- Engines execute them (Body layer)
|
|
12
|
+
- This dataclass is just the connector (pure data)
|
|
13
|
+
|
|
14
|
+
Ref: Dynamic Rule Execution Architecture
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
from dataclasses import dataclass, field
|
|
20
|
+
from typing import Any
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@dataclass
|
|
24
|
+
# ID: ff4bed96-5d93-4e3f-84dc-5f980af199fb
|
|
25
|
+
class ExecutableRule:
|
|
26
|
+
"""
|
|
27
|
+
Represents a constitutional rule ready for execution.
|
|
28
|
+
|
|
29
|
+
Extracted from policy JSON with structure:
|
|
30
|
+
{
|
|
31
|
+
"id": "rule.name",
|
|
32
|
+
"enforcement": "error",
|
|
33
|
+
"authority": "policy", # "constitution" | "policy"
|
|
34
|
+
"check": {
|
|
35
|
+
"engine": "ast_gate",
|
|
36
|
+
"params": {"check_type": "...", ...}
|
|
37
|
+
},
|
|
38
|
+
"scope": ["src/**/*.py"],
|
|
39
|
+
"exclusions": ["tests/**"]
|
|
40
|
+
}
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
rule_id: str
|
|
44
|
+
"""Unique rule identifier (e.g., 'async.runtime.no_nested_loop_creation')"""
|
|
45
|
+
|
|
46
|
+
engine: str
|
|
47
|
+
"""Engine identifier (e.g., 'ast_gate', 'llm_gate', 'knowledge_gate')"""
|
|
48
|
+
|
|
49
|
+
params: dict[str, Any]
|
|
50
|
+
"""Engine-specific parameters (e.g., {'check_type': 'restrict_event_loop_creation'})"""
|
|
51
|
+
|
|
52
|
+
enforcement: str
|
|
53
|
+
"""Severity level: 'error' or 'warning'"""
|
|
54
|
+
|
|
55
|
+
statement: str = ""
|
|
56
|
+
"""Human-readable rule statement"""
|
|
57
|
+
|
|
58
|
+
scope: list[str] = field(default_factory=lambda: ["src/**/*.py"])
|
|
59
|
+
"""File patterns to include (glob patterns)"""
|
|
60
|
+
|
|
61
|
+
exclusions: list[str] = field(default_factory=list)
|
|
62
|
+
"""File patterns to exclude (glob patterns)"""
|
|
63
|
+
|
|
64
|
+
policy_id: str = ""
|
|
65
|
+
"""Source policy identifier for traceability"""
|
|
66
|
+
|
|
67
|
+
is_context_level: bool = False
|
|
68
|
+
"""
|
|
69
|
+
Whether this rule dispatches via ``engine.verify_context`` (whole
|
|
70
|
+
repository) or ``engine.verify(file_path)`` (one call per matching
|
|
71
|
+
file).
|
|
72
|
+
|
|
73
|
+
ADR-076: mode is owned by the engine *per check_type*, not by the
|
|
74
|
+
engine as a whole. ``rule_extractor`` consults
|
|
75
|
+
``engine_cls.is_context_level_for(check_type)`` (a classmethod, no
|
|
76
|
+
instantiation) and stores the result here. Mixed-mode engines —
|
|
77
|
+
notably ``artifact_gate`` — return True for some check_types and
|
|
78
|
+
False for others. Engines that do not override the classmethod
|
|
79
|
+
inherit ``False`` from BaseEngine.
|
|
80
|
+
"""
|
|
81
|
+
|
|
82
|
+
authority: str = "policy"
|
|
83
|
+
"""
|
|
84
|
+
Who declared this rule and how binding it is.
|
|
85
|
+
|
|
86
|
+
- "constitution": Declared by the sovereign constitution. Always blocks,
|
|
87
|
+
regardless of strict_mode. These rules cannot be made advisory.
|
|
88
|
+
- "policy": Declared by an operational policy. Advisory by default;
|
|
89
|
+
blocks only when IntentGuard is initialised with strict_mode=True.
|
|
90
|
+
|
|
91
|
+
Sourced directly from the rule's 'authority' field in the .intent/ document.
|
|
92
|
+
Defaults to "policy" (the safer, less disruptive tier) when absent.
|
|
93
|
+
"""
|
|
94
|
+
|
|
95
|
+
requires_findings_from: list[str] = field(default_factory=list)
|
|
96
|
+
"""
|
|
97
|
+
Pre-selector dependency list (ADR-043 D2).
|
|
98
|
+
|
|
99
|
+
When non-empty, the rule's per-file scope is intersected at execution
|
|
100
|
+
time with the set of files that have findings under any of the listed
|
|
101
|
+
rule IDs in the current audit run. Empty list means no pre-selection
|
|
102
|
+
(run against full scope as today).
|
|
103
|
+
|
|
104
|
+
Populated by rule_extractor from the enforcement mapping YAML. The
|
|
105
|
+
audit driver runs rules in topological order over these edges so
|
|
106
|
+
prior findings are available when a dependent rule executes.
|
|
107
|
+
Validation (referenced IDs exist, no cycles, not combined with
|
|
108
|
+
is_context_level=True) happens at extraction time.
|
|
109
|
+
"""
|
|
110
|
+
|
|
111
|
+
rule_content_hash: str = ""
|
|
112
|
+
"""
|
|
113
|
+
SHA-256 of the canonicalised (rule + enforcement strategy) dict — the
|
|
114
|
+
cache key for ADR-044's llm_gate verdict cache. Combines the rule's
|
|
115
|
+
canonical fields with its enforcement mapping so any meaningful
|
|
116
|
+
governance change (prompt text edit, threshold change, scope
|
|
117
|
+
narrowing) invalidates the affected cached verdicts.
|
|
118
|
+
|
|
119
|
+
Computed by rule_extractor at audit-context load time via
|
|
120
|
+
shared.infrastructure.intent.intent_repository.compute_rule_content_hash.
|
|
121
|
+
Empty default means "cache disabled" — the llm_gate engine treats a
|
|
122
|
+
blank hash as a signal to bypass DB cache and always call the LLM.
|
|
123
|
+
"""
|
|
124
|
+
|
|
125
|
+
def __repr__(self) -> str:
|
|
126
|
+
"""Concise representation for logging."""
|
|
127
|
+
return f"ExecutableRule({self.rule_id}, engine={self.engine}, authority={self.authority})"
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
# src/mind/governance/filtered_audit.py
|
|
2
|
+
"""
|
|
3
|
+
Filtered Constitutional Audit - Run specific rules or policies.
|
|
4
|
+
|
|
5
|
+
Enables focused remediation by allowing execution of:
|
|
6
|
+
- Single rules: --rule linkage.capability.unassigned
|
|
7
|
+
- Single policies: --policy standard_code_linkage
|
|
8
|
+
- Multiple rules: --rule rule1 --rule rule2
|
|
9
|
+
- Rule patterns: --rule-pattern "linkage.*"
|
|
10
|
+
|
|
11
|
+
This uses the existing dynamic rule execution engine but with filtering.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
import asyncio
|
|
17
|
+
import re
|
|
18
|
+
from typing import TYPE_CHECKING
|
|
19
|
+
|
|
20
|
+
from shared.logger import getLogger
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
from mind.governance.audit_context import AuditorContext
|
|
25
|
+
from mind.governance.executable_rule import ExecutableRule
|
|
26
|
+
from shared.models import AuditFinding
|
|
27
|
+
|
|
28
|
+
logger = getLogger(__name__)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
# ID: f8a9b7c6-5d4e-3f2a-1b0c-9d8e7f6a5b4c
|
|
32
|
+
class RuleFilter:
|
|
33
|
+
"""Filters rules based on user-specified criteria."""
|
|
34
|
+
|
|
35
|
+
def __init__(
|
|
36
|
+
self,
|
|
37
|
+
rule_ids: list[str] | None = None,
|
|
38
|
+
policy_ids: list[str] | None = None,
|
|
39
|
+
rule_patterns: list[str] | None = None,
|
|
40
|
+
):
|
|
41
|
+
self.rule_ids = set(rule_ids or [])
|
|
42
|
+
self.policy_ids = set(policy_ids or [])
|
|
43
|
+
self.rule_patterns = [re.compile(p) for p in (rule_patterns or [])]
|
|
44
|
+
|
|
45
|
+
# ID: ee2ebac1-0f32-45ce-ab11-ed0c4106ab20
|
|
46
|
+
def matches(self, rule: ExecutableRule) -> bool:
|
|
47
|
+
"""Check if rule matches filter criteria."""
|
|
48
|
+
# If no filters specified, match everything
|
|
49
|
+
if not self.rule_ids and not self.policy_ids and not self.rule_patterns:
|
|
50
|
+
return True
|
|
51
|
+
|
|
52
|
+
# Check exact rule ID match
|
|
53
|
+
if self.rule_ids and rule.rule_id in self.rule_ids:
|
|
54
|
+
return True
|
|
55
|
+
|
|
56
|
+
# Check policy ID match
|
|
57
|
+
if self.policy_ids and rule.policy_id in self.policy_ids:
|
|
58
|
+
return True
|
|
59
|
+
|
|
60
|
+
# Check pattern match
|
|
61
|
+
for pattern in self.rule_patterns:
|
|
62
|
+
if pattern.match(rule.rule_id):
|
|
63
|
+
return True
|
|
64
|
+
|
|
65
|
+
return False
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
# ID: 5872afdb-b32c-48d0-b280-e2403aca3b64
|
|
69
|
+
def normalize_file_filter(
|
|
70
|
+
files: list[str] | None,
|
|
71
|
+
repo_path, # Path-like; quoted to avoid an Iterable hop.
|
|
72
|
+
) -> frozenset[str] | None:
|
|
73
|
+
"""
|
|
74
|
+
Normalize a CLI --files list to a frozenset of repo-relative POSIX
|
|
75
|
+
paths suitable for execute_rule's file_filter parameter.
|
|
76
|
+
|
|
77
|
+
Accepts repo-relative ('src/foo.py'), './'-prefixed
|
|
78
|
+
('./src/foo.py'), and absolute paths. Paths outside the repo are
|
|
79
|
+
rejected loudly — silently dropping them would mask user error and
|
|
80
|
+
produce a confusing empty audit.
|
|
81
|
+
|
|
82
|
+
Returns None when the input is empty/None — the audit runs without
|
|
83
|
+
a file filter (full scope).
|
|
84
|
+
"""
|
|
85
|
+
from pathlib import Path
|
|
86
|
+
|
|
87
|
+
if not files:
|
|
88
|
+
return None
|
|
89
|
+
|
|
90
|
+
repo_root = Path(repo_path).resolve()
|
|
91
|
+
normalized: set[str] = set()
|
|
92
|
+
for raw in files:
|
|
93
|
+
# Always resolve before validating. pathlib's `/` operator drops
|
|
94
|
+
# the LHS when the RHS is absolute, so a single expression handles
|
|
95
|
+
# both repo-relative and absolute inputs. Resolving first
|
|
96
|
+
# normalizes `..` segments and follows symlinks, so the
|
|
97
|
+
# `relative_to(repo_root)` check below is a real boundary, not a
|
|
98
|
+
# lexical one — `/<repo>/x/../../etc/passwd` and `/<repo>/symlink`
|
|
99
|
+
# pointing outside both reject. Closes CodeQL py/path-injection.
|
|
100
|
+
absolute = (repo_root / Path(raw)).resolve()
|
|
101
|
+
try:
|
|
102
|
+
rel = absolute.relative_to(repo_root)
|
|
103
|
+
except ValueError as exc:
|
|
104
|
+
raise ValueError(
|
|
105
|
+
f"--files path {raw!r} is outside the repository root "
|
|
106
|
+
f"{repo_root}: {exc}"
|
|
107
|
+
) from exc
|
|
108
|
+
normalized.add(str(rel).replace("\\", "/"))
|
|
109
|
+
|
|
110
|
+
return frozenset(normalized)
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
# ID: d5383238-b6d4-48d9-880b-8f48df47d57e
|
|
114
|
+
async def run_filtered_audit(
|
|
115
|
+
context: AuditorContext,
|
|
116
|
+
*,
|
|
117
|
+
rule_ids: list[str] | None = None,
|
|
118
|
+
policy_ids: list[str] | None = None,
|
|
119
|
+
rule_patterns: list[str] | None = None,
|
|
120
|
+
executed_rule_ids: set[str] | None = None,
|
|
121
|
+
files: list[str] | None = None,
|
|
122
|
+
) -> tuple[list, set[str], dict[str, int]]:
|
|
123
|
+
"""
|
|
124
|
+
Execute filtered subset of constitutional rules.
|
|
125
|
+
|
|
126
|
+
Args:
|
|
127
|
+
context: AuditorContext with repo and policy info
|
|
128
|
+
rule_ids: Specific rule IDs to execute
|
|
129
|
+
policy_ids: Execute all rules from these policies
|
|
130
|
+
rule_patterns: Regex patterns for rule IDs
|
|
131
|
+
executed_rule_ids: Set to track executed rules (optional)
|
|
132
|
+
files: Optional list of file paths (repo-relative, ./-prefixed,
|
|
133
|
+
or absolute) scoping per-file rules. Context-level rules
|
|
134
|
+
skip gracefully when this is set — they cannot be
|
|
135
|
+
meaningfully scoped to a file list. Closes #279.
|
|
136
|
+
|
|
137
|
+
Returns:
|
|
138
|
+
tuple(findings, executed_rules, stats)
|
|
139
|
+
"""
|
|
140
|
+
from mind.governance.rule_executor import execute_rule
|
|
141
|
+
from mind.governance.rule_extractor import extract_executable_rules
|
|
142
|
+
|
|
143
|
+
if executed_rule_ids is None:
|
|
144
|
+
executed_rule_ids = set()
|
|
145
|
+
|
|
146
|
+
# ADR-039: rebuild the filesystem scan once per audit run so files
|
|
147
|
+
# committed since the last cycle are visible to every rule.
|
|
148
|
+
context.reload_governance()
|
|
149
|
+
context.invalidate_file_cache()
|
|
150
|
+
|
|
151
|
+
# ADR-044: TTL sweep at audit start. Idempotent per AuditorContext.
|
|
152
|
+
await context.sweep_llm_gate_cache()
|
|
153
|
+
|
|
154
|
+
file_filter = normalize_file_filter(files, context.repo_path)
|
|
155
|
+
|
|
156
|
+
# Extract all executable rules from policies
|
|
157
|
+
all_rules = extract_executable_rules(context.policies, context.enforcement_loader)
|
|
158
|
+
|
|
159
|
+
# Create filter
|
|
160
|
+
rule_filter = RuleFilter(
|
|
161
|
+
rule_ids=rule_ids,
|
|
162
|
+
policy_ids=policy_ids,
|
|
163
|
+
rule_patterns=rule_patterns,
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
# Filter rules
|
|
167
|
+
filtered_rules = [r for r in all_rules if rule_filter.matches(r)]
|
|
168
|
+
|
|
169
|
+
if not filtered_rules:
|
|
170
|
+
logger.warning(
|
|
171
|
+
"No rules matched filter criteria: rule_ids=%s, policy_ids=%s, patterns=%s",
|
|
172
|
+
rule_ids,
|
|
173
|
+
policy_ids,
|
|
174
|
+
rule_patterns,
|
|
175
|
+
)
|
|
176
|
+
return (
|
|
177
|
+
[],
|
|
178
|
+
executed_rule_ids,
|
|
179
|
+
{
|
|
180
|
+
"total_rules": len(all_rules),
|
|
181
|
+
"filtered_rules": 0,
|
|
182
|
+
"executed_rules": 0,
|
|
183
|
+
"total_findings": 0,
|
|
184
|
+
"skipped_context_level": 0,
|
|
185
|
+
},
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
logger.info(
|
|
189
|
+
"Filtered audit: %d rules selected (out of %d total)%s",
|
|
190
|
+
len(filtered_rules),
|
|
191
|
+
len(all_rules),
|
|
192
|
+
(
|
|
193
|
+
f" — file filter active ({len(file_filter)} file(s))"
|
|
194
|
+
if file_filter is not None
|
|
195
|
+
else ""
|
|
196
|
+
),
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
# Execute filtered rules. ADR-043 D3: accumulator carries
|
|
200
|
+
# AuditFinding objects through the loop so requires_findings_from
|
|
201
|
+
# narrowing can read check_id and file_path off them; conversion to
|
|
202
|
+
# dicts is deferred to the return statement so the external contract
|
|
203
|
+
# is unchanged. Rules are topologically sorted by
|
|
204
|
+
# extract_executable_rules.
|
|
205
|
+
all_findings: list[AuditFinding] = []
|
|
206
|
+
failed_rules = []
|
|
207
|
+
skipped_context_level: list[str] = []
|
|
208
|
+
|
|
209
|
+
for rule in filtered_rules:
|
|
210
|
+
# ADR-081 Step 2b — cooperative yield at the per-rule boundary so
|
|
211
|
+
# heavy audit cycles can reach a cancellation point between rules.
|
|
212
|
+
# execute_rule itself is sync-dominated (AST walks per file); this
|
|
213
|
+
# yield bounds the worst case to one rule's worth of synchronous
|
|
214
|
+
# work between SIGTERM and Worker.start()'s `finally` block running.
|
|
215
|
+
# Per-engine inner yields are deferred pending Step 0 evidence
|
|
216
|
+
# naming which engines dominate the loop-hold.
|
|
217
|
+
await asyncio.sleep(0)
|
|
218
|
+
|
|
219
|
+
# Track skipped-context-level explicitly for stats / operator
|
|
220
|
+
# transparency. execute_rule logs the skip; we count it here.
|
|
221
|
+
if file_filter is not None and rule.is_context_level:
|
|
222
|
+
skipped_context_level.append(rule.rule_id)
|
|
223
|
+
|
|
224
|
+
try:
|
|
225
|
+
findings = await execute_rule(
|
|
226
|
+
rule,
|
|
227
|
+
context,
|
|
228
|
+
file_filter=file_filter,
|
|
229
|
+
prior_findings=all_findings,
|
|
230
|
+
)
|
|
231
|
+
all_findings.extend(findings)
|
|
232
|
+
executed_rule_ids.add(rule.rule_id)
|
|
233
|
+
|
|
234
|
+
logger.debug(
|
|
235
|
+
"Rule %s: %d findings",
|
|
236
|
+
rule.rule_id,
|
|
237
|
+
len(findings),
|
|
238
|
+
)
|
|
239
|
+
except Exception as e:
|
|
240
|
+
logger.error(
|
|
241
|
+
"Rule %s execution failed: %s",
|
|
242
|
+
rule.rule_id,
|
|
243
|
+
e,
|
|
244
|
+
exc_info=True,
|
|
245
|
+
)
|
|
246
|
+
failed_rules.append(rule.rule_id)
|
|
247
|
+
|
|
248
|
+
stats = {
|
|
249
|
+
"total_rules": len(all_rules),
|
|
250
|
+
"filtered_rules": len(filtered_rules),
|
|
251
|
+
"executed_rules": len(executed_rule_ids),
|
|
252
|
+
"failed_rules": len(failed_rules),
|
|
253
|
+
"total_findings": len(all_findings),
|
|
254
|
+
"skipped_context_level": len(skipped_context_level),
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
logger.info(
|
|
258
|
+
"Filtered audit complete: %d/%d rules executed, %d findings%s",
|
|
259
|
+
stats["executed_rules"],
|
|
260
|
+
stats["filtered_rules"],
|
|
261
|
+
stats["total_findings"],
|
|
262
|
+
(
|
|
263
|
+
f", {len(skipped_context_level)} context-level rule(s) skipped under --files"
|
|
264
|
+
if skipped_context_level
|
|
265
|
+
else ""
|
|
266
|
+
),
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
if failed_rules:
|
|
270
|
+
logger.warning("Failed rules: %s", ", ".join(failed_rules))
|
|
271
|
+
|
|
272
|
+
return [f.as_dict() for f in all_findings], executed_rule_ids, stats
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# src/mind/governance/finding_processor.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Core logic for processing and downgrading audit findings.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from collections.abc import Iterable, Mapping, MutableMapping, Sequence
|
|
10
|
+
|
|
11
|
+
from mind.governance.entry_point_policy import EntryPointAllowList
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
# ID: f2778ec7-aa0d-4025-90c1-9af82c1f27fb
|
|
15
|
+
def safe_symbol_meta(
|
|
16
|
+
symbol_index: Mapping[str, Mapping[str, object]], symbol_key: str
|
|
17
|
+
) -> Mapping[str, object]:
|
|
18
|
+
"""Safely retrieve symbol metadata from index."""
|
|
19
|
+
return symbol_index.get(symbol_key, {}) or {}
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
# ID: 9875bf96-ccab-4a2a-bcd0-374da32f634e
|
|
23
|
+
def process_findings_with_downgrade(
|
|
24
|
+
findings: Sequence[MutableMapping[str, object]],
|
|
25
|
+
symbol_index: Mapping[str, Mapping[str, object]],
|
|
26
|
+
allow_list: EntryPointAllowList,
|
|
27
|
+
dead_rule_ids: Iterable[str],
|
|
28
|
+
downgrade_to: str = "info",
|
|
29
|
+
) -> tuple[list[MutableMapping[str, object]], list[dict[str, object]]]:
|
|
30
|
+
"""
|
|
31
|
+
Process findings and downgrade severity for allowed entry points.
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
findings: List of audit findings to process
|
|
35
|
+
symbol_index: Mapping of symbol keys to their metadata
|
|
36
|
+
allow_list: Entry point types that should be downgraded
|
|
37
|
+
dead_rule_ids: Rule IDs that identify dead-public-symbol findings
|
|
38
|
+
downgrade_to: Target severity level for downgrade
|
|
39
|
+
|
|
40
|
+
Returns:
|
|
41
|
+
Tuple of (processed_findings, auto_ignored_items)
|
|
42
|
+
"""
|
|
43
|
+
dead_ids = {r.strip() for r in dead_rule_ids if r and r.strip()}
|
|
44
|
+
processed: list[MutableMapping[str, object]] = []
|
|
45
|
+
auto_ignored: list[dict[str, object]] = []
|
|
46
|
+
|
|
47
|
+
for finding in findings:
|
|
48
|
+
rule_id = str(finding.get("rule_id", "") or "")
|
|
49
|
+
symbol_key = str(finding.get("symbol_key", "") or "")
|
|
50
|
+
severity = str(finding.get("severity", "") or "").lower()
|
|
51
|
+
|
|
52
|
+
if rule_id in dead_ids and symbol_key:
|
|
53
|
+
meta = safe_symbol_meta(symbol_index, symbol_key)
|
|
54
|
+
ep_type = str(meta.get("entry_point_type", "") or "")
|
|
55
|
+
pattern_name = str(meta.get("pattern_name", "") or "")
|
|
56
|
+
justification = str(meta.get("entry_point_justification", "") or "")
|
|
57
|
+
|
|
58
|
+
if ep_type in allow_list:
|
|
59
|
+
# Downgrade severity only if current is higher
|
|
60
|
+
if severity in {"error", "warn"}:
|
|
61
|
+
finding["severity"] = downgrade_to
|
|
62
|
+
|
|
63
|
+
auto_ignored.append(
|
|
64
|
+
{
|
|
65
|
+
"symbol_key": symbol_key,
|
|
66
|
+
"entry_point_type": ep_type,
|
|
67
|
+
"pattern_name": pattern_name or None,
|
|
68
|
+
"justification": justification or None,
|
|
69
|
+
"original_rule_id": rule_id,
|
|
70
|
+
"downgraded_to": finding.get("severity"),
|
|
71
|
+
}
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
processed.append(finding)
|
|
75
|
+
|
|
76
|
+
return processed, auto_ignored
|