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,496 @@
|
|
|
1
|
+
# src/will/workers/violation_executor.py
|
|
2
|
+
"""
|
|
3
|
+
ViolationExecutorWorker - Discovery path for unmapped rules.
|
|
4
|
+
|
|
5
|
+
Will-layer acting worker. Claims open audit violation findings whose rules
|
|
6
|
+
have no active RemediationMap entry, delegates the LLM remediation ceremony
|
|
7
|
+
to ViolationRemediator (Body layer), and surfaces AtomicAction candidates
|
|
8
|
+
to the Blackboard after each successful fix.
|
|
9
|
+
|
|
10
|
+
Constitutional role in the remediation system:
|
|
11
|
+
|
|
12
|
+
RemediatorWorker (Will) — Handles MAPPED rules → Proposals
|
|
13
|
+
ViolationExecutorWorker — Handles UNMAPPED rules → Candidates ← THIS
|
|
14
|
+
ViolationRemediator (Body) — Performs ceremony for both paths
|
|
15
|
+
|
|
16
|
+
RemediatorWorker has priority. It runs first and claims findings whose rules
|
|
17
|
+
are mapped. ViolationExecutorWorker claims only what remains — findings whose
|
|
18
|
+
rules have no active RemediationMap entry (confidence >= 0.80).
|
|
19
|
+
|
|
20
|
+
The primary output is not a fixed file. It is an AtomicAction candidate —
|
|
21
|
+
evidence that a particular LLM-reasoned fix worked for a particular rule,
|
|
22
|
+
surfaced on the Blackboard for human review and eventual codification.
|
|
23
|
+
|
|
24
|
+
When a rule is codified into an AtomicAction and added to the RemediationMap,
|
|
25
|
+
it graduates to RemediatorWorker and ViolationExecutorWorker never touches it
|
|
26
|
+
again. Reducing this worker's workload to zero means CORE has fully codified
|
|
27
|
+
its remediation knowledge.
|
|
28
|
+
|
|
29
|
+
See: .specs/papers/CORE-ViolationExecutor.md
|
|
30
|
+
.specs/papers/CORE-OptimizerWorker.md
|
|
31
|
+
|
|
32
|
+
Constitutional standing:
|
|
33
|
+
- Declaration: .intent/workers/violation_executor.yaml
|
|
34
|
+
- Class: acting
|
|
35
|
+
- Phase: execution
|
|
36
|
+
- Permitted tools: llm.remote_coder, file.read, crate.create,
|
|
37
|
+
canary.validate, crate.apply, git.commit
|
|
38
|
+
- Approval: true (inherited from ViolationRemediator ceremony)
|
|
39
|
+
|
|
40
|
+
LAYER: will/workers — acting worker. Delegates all execution ceremony to
|
|
41
|
+
will.workers.violation_remediator_body.ViolationRemediator.process_file().
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
from __future__ import annotations
|
|
45
|
+
|
|
46
|
+
from typing import Any
|
|
47
|
+
|
|
48
|
+
from shared.infrastructure.intent.operational_config import load_operational_config
|
|
49
|
+
from shared.logger import getLogger
|
|
50
|
+
from shared.workers.base import Worker
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
logger = getLogger(__name__)
|
|
54
|
+
|
|
55
|
+
_FINDING_SUBJECT_PREFIX = "audit.violation::"
|
|
56
|
+
_CANDIDATE_SUBJECT = "audit.remediation.candidate"
|
|
57
|
+
_BLAST_BOUND_SUBJECT = "coherence.violation_executor.blast_bound"
|
|
58
|
+
_CFG = load_operational_config().workers.violation_executor
|
|
59
|
+
|
|
60
|
+
# Bounded sample of deferred-file paths included in the blast-bound
|
|
61
|
+
# OPEN-finding payload for operator inspection. Keep small enough to fit
|
|
62
|
+
# comfortably in a CLI render and a blackboard JSONB row. Same pattern as
|
|
63
|
+
# ADR-070 D8's _REAP_SAMPLE_SIZE in orchestrator.py — payload-shaping
|
|
64
|
+
# constant, not a governance bound.
|
|
65
|
+
_DEFERRED_PATHS_SAMPLE_SIZE = 20
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
# ID: ba3704d8-23da-49d2-b67d-7b42f33fce83
|
|
69
|
+
class ViolationExecutorWorker(Worker):
|
|
70
|
+
"""
|
|
71
|
+
Acting worker. Discovery path for rules with no RemediationMap entry.
|
|
72
|
+
|
|
73
|
+
Claims open audit violation findings for unmapped rules, delegates
|
|
74
|
+
the full LLM + Crate + Canary ceremony to ViolationRemediator (Body),
|
|
75
|
+
and surfaces AtomicAction candidates on the Blackboard after success.
|
|
76
|
+
|
|
77
|
+
Args:
|
|
78
|
+
core_context: Initialized CoreContext.
|
|
79
|
+
write: If False, dry-run mode — ceremony runs but no files are changed.
|
|
80
|
+
"""
|
|
81
|
+
|
|
82
|
+
declaration_name = "violation_executor"
|
|
83
|
+
|
|
84
|
+
def __init__(self, core_context: Any, write: bool = False) -> None:
|
|
85
|
+
super().__init__()
|
|
86
|
+
self._ctx = core_context
|
|
87
|
+
self._write = write
|
|
88
|
+
# Constitutional blast bound — per-cycle files-rewritten cap.
|
|
89
|
+
# MUST be declared in the worker YAML at
|
|
90
|
+
# `mandate.schedule.files_per_cycle_max`. Missing declaration is a
|
|
91
|
+
# constitutional gap; the worker refuses to load (cognate with
|
|
92
|
+
# ADR-069 D3's no-runtime-fallback rule for lease_seconds). The
|
|
93
|
+
# YAML is the single source of truth — no module-level default.
|
|
94
|
+
try:
|
|
95
|
+
self._files_per_cycle_max: int = int(
|
|
96
|
+
self._declaration["mandate"]["schedule"]["files_per_cycle_max"]
|
|
97
|
+
)
|
|
98
|
+
except (KeyError, TypeError, ValueError) as exc:
|
|
99
|
+
raise ValueError(
|
|
100
|
+
"violation_executor.yaml is missing or has an invalid "
|
|
101
|
+
"mandate.schedule.files_per_cycle_max — the per-cycle blast "
|
|
102
|
+
"bound MUST be declared on the worker artifact (no runtime "
|
|
103
|
+
"fallback, cognate with ADR-069 D3 for lease_seconds). "
|
|
104
|
+
f"Underlying error: {type(exc).__name__}: {exc}"
|
|
105
|
+
) from exc
|
|
106
|
+
|
|
107
|
+
# ID: 4cb3dadb-8f63-4da1-8725-c88bcf819d3b
|
|
108
|
+
async def run(self) -> None:
|
|
109
|
+
"""
|
|
110
|
+
Main cycle. Steps 1-10 from CORE-ViolationExecutor.md.
|
|
111
|
+
"""
|
|
112
|
+
# Step 1: Heartbeat
|
|
113
|
+
await self.post_heartbeat()
|
|
114
|
+
|
|
115
|
+
mode = "WRITE" if self._write else "DRY-RUN"
|
|
116
|
+
logger.info("ViolationExecutorWorker: starting [%s]", mode)
|
|
117
|
+
|
|
118
|
+
# Step 2: Load RemediationMap — determine which rules are already mapped
|
|
119
|
+
mapped_rule_ids = self._load_mapped_rule_ids()
|
|
120
|
+
logger.info(
|
|
121
|
+
"ViolationExecutorWorker: %d rule(s) mapped in RemediationMap.",
|
|
122
|
+
len(mapped_rule_ids),
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
# Steps 1-2 (claim): Claim open findings for unmapped rules only
|
|
126
|
+
findings = await self._claim_unmapped_findings(mapped_rule_ids)
|
|
127
|
+
|
|
128
|
+
if not findings:
|
|
129
|
+
await self.post_report(
|
|
130
|
+
subject="violation_executor.run.complete",
|
|
131
|
+
payload={
|
|
132
|
+
"write": self._write,
|
|
133
|
+
"message": "No open unmapped violation findings.",
|
|
134
|
+
"mapped_rule_count": len(mapped_rule_ids),
|
|
135
|
+
},
|
|
136
|
+
)
|
|
137
|
+
logger.info(
|
|
138
|
+
"ViolationExecutorWorker: no unmapped findings — nothing to do."
|
|
139
|
+
)
|
|
140
|
+
return
|
|
141
|
+
|
|
142
|
+
logger.info(
|
|
143
|
+
"ViolationExecutorWorker: claimed %d unmapped finding(s) [%s].",
|
|
144
|
+
len(findings),
|
|
145
|
+
mode,
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
# Step 2 (group): Group by file_path
|
|
149
|
+
by_file: dict[str, list[dict[str, Any]]] = {}
|
|
150
|
+
for finding in findings:
|
|
151
|
+
payload = finding.get("payload") or {}
|
|
152
|
+
file_path = str(payload.get("file_path") or "").strip()
|
|
153
|
+
if not file_path:
|
|
154
|
+
logger.warning(
|
|
155
|
+
"ViolationExecutorWorker: skipping finding %s — missing file_path",
|
|
156
|
+
finding.get("id"),
|
|
157
|
+
)
|
|
158
|
+
continue
|
|
159
|
+
by_file.setdefault(file_path, []).append(finding)
|
|
160
|
+
|
|
161
|
+
logger.info(
|
|
162
|
+
"ViolationExecutorWorker: %d finding(s) across %d file(s) [%s].",
|
|
163
|
+
len(findings),
|
|
164
|
+
len(by_file),
|
|
165
|
+
mode,
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
# Blast-bound rail: cap files-per-cycle (2026-05-24 hardening sweep).
|
|
169
|
+
# The work is not lost — deferred files' findings are released back to
|
|
170
|
+
# `open` and re-enter the queue for the next cycle. Pacing, not censor.
|
|
171
|
+
# When the cap is hit, an OPEN coherence finding surfaces it for
|
|
172
|
+
# governor visibility (parallel to ADR-070 D8's writer-as-sensor
|
|
173
|
+
# OPEN-finding pattern when guards trip).
|
|
174
|
+
all_files = list(by_file.items())
|
|
175
|
+
blast_bound_hit = len(all_files) > self._files_per_cycle_max
|
|
176
|
+
deferred_paths: list[str] = []
|
|
177
|
+
if blast_bound_hit:
|
|
178
|
+
deferred = all_files[self._files_per_cycle_max :]
|
|
179
|
+
deferred_findings = [f for _, f_list in deferred for f in f_list]
|
|
180
|
+
deferred_paths = [path for path, _ in deferred]
|
|
181
|
+
|
|
182
|
+
await self._release_findings(deferred_findings)
|
|
183
|
+
await self._post_blast_bound_finding(
|
|
184
|
+
cap=self._files_per_cycle_max,
|
|
185
|
+
total_files=len(all_files),
|
|
186
|
+
deferred_paths=deferred_paths,
|
|
187
|
+
)
|
|
188
|
+
logger.warning(
|
|
189
|
+
"ViolationExecutorWorker: BLAST BOUND reached — processing "
|
|
190
|
+
"%d/%d files; %d finding(s) for %d deferred file(s) released "
|
|
191
|
+
"to open for next cycle.",
|
|
192
|
+
self._files_per_cycle_max,
|
|
193
|
+
len(all_files),
|
|
194
|
+
len(deferred_findings),
|
|
195
|
+
len(deferred_paths),
|
|
196
|
+
)
|
|
197
|
+
by_file = dict(all_files[: self._files_per_cycle_max])
|
|
198
|
+
|
|
199
|
+
succeeded = 0
|
|
200
|
+
failed = 0
|
|
201
|
+
candidates_surfaced = 0
|
|
202
|
+
|
|
203
|
+
# Steps 3-10: Process each file
|
|
204
|
+
for file_path, file_findings in by_file.items():
|
|
205
|
+
ok, handled_rule_ids = await self._process_file(
|
|
206
|
+
file_path, file_findings, mapped_rule_ids
|
|
207
|
+
)
|
|
208
|
+
if ok:
|
|
209
|
+
succeeded += 1
|
|
210
|
+
# Step 10: Surface candidate for each handled rule
|
|
211
|
+
for rule_id in handled_rule_ids:
|
|
212
|
+
await self._surface_candidate(rule_id, file_path)
|
|
213
|
+
candidates_surfaced += 1
|
|
214
|
+
else:
|
|
215
|
+
failed += 1
|
|
216
|
+
|
|
217
|
+
await self.post_report(
|
|
218
|
+
subject="violation_executor.run.complete",
|
|
219
|
+
payload={
|
|
220
|
+
"write": self._write,
|
|
221
|
+
"claimed": len(findings),
|
|
222
|
+
"files": len(by_file),
|
|
223
|
+
"succeeded": succeeded,
|
|
224
|
+
"failed": failed,
|
|
225
|
+
"candidates_surfaced": candidates_surfaced,
|
|
226
|
+
"blast_bound": {
|
|
227
|
+
"cap": self._files_per_cycle_max,
|
|
228
|
+
"hit": blast_bound_hit,
|
|
229
|
+
"deferred_files": len(deferred_paths),
|
|
230
|
+
},
|
|
231
|
+
},
|
|
232
|
+
)
|
|
233
|
+
logger.info(
|
|
234
|
+
"ViolationExecutorWorker: done [%s] — %d succeeded, %d failed, %d candidates.",
|
|
235
|
+
mode,
|
|
236
|
+
succeeded,
|
|
237
|
+
failed,
|
|
238
|
+
candidates_surfaced,
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
# -------------------------------------------------------------------------
|
|
242
|
+
# Per-file orchestration
|
|
243
|
+
# -------------------------------------------------------------------------
|
|
244
|
+
|
|
245
|
+
# ID: 0cd4ad14-321d-418c-8ac0-9f79d4f8c29a
|
|
246
|
+
async def _process_file(
|
|
247
|
+
self,
|
|
248
|
+
file_path: str,
|
|
249
|
+
findings: list[dict[str, Any]],
|
|
250
|
+
mapped_rule_ids: set[str],
|
|
251
|
+
) -> tuple[bool, list[str]]:
|
|
252
|
+
"""
|
|
253
|
+
Steps 3-9 for a single file.
|
|
254
|
+
|
|
255
|
+
Returns (success, list_of_rule_ids_processed).
|
|
256
|
+
"""
|
|
257
|
+
# Step 4: RemediationMap gate — race condition check.
|
|
258
|
+
# If any finding's rule became mapped AFTER we claimed it,
|
|
259
|
+
# release those findings back to open for RemediatorWorker.
|
|
260
|
+
late_mapped = [
|
|
261
|
+
f
|
|
262
|
+
for f in findings
|
|
263
|
+
if str((f.get("payload") or {}).get("rule") or "") in mapped_rule_ids
|
|
264
|
+
]
|
|
265
|
+
if late_mapped:
|
|
266
|
+
await self._release_findings(late_mapped)
|
|
267
|
+
findings = [f for f in findings if f not in late_mapped]
|
|
268
|
+
logger.info(
|
|
269
|
+
"ViolationExecutorWorker: released %d finding(s) back to open "
|
|
270
|
+
"(RemediationMap gate — late-mapped rule).",
|
|
271
|
+
len(late_mapped),
|
|
272
|
+
)
|
|
273
|
+
|
|
274
|
+
if not findings:
|
|
275
|
+
# All findings for this file were late-mapped and released.
|
|
276
|
+
return False, []
|
|
277
|
+
|
|
278
|
+
# Collect rule IDs from this file's findings (for candidate surfacing)
|
|
279
|
+
rule_ids = sorted(
|
|
280
|
+
{str((f.get("payload") or {}).get("rule") or "unknown") for f in findings}
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
# Steps 5-9: Delegate full ceremony to ViolationRemediator (Body layer).
|
|
284
|
+
# One LLM invocation covers all violations in this file.
|
|
285
|
+
# target_rule: single rule if one, semicolon-joined if multiple.
|
|
286
|
+
target_rule = rule_ids[0] if len(rule_ids) == 1 else "; ".join(rule_ids)
|
|
287
|
+
|
|
288
|
+
try:
|
|
289
|
+
from will.workers.violation_remediator_body import ViolationRemediator
|
|
290
|
+
|
|
291
|
+
# Ensure action_executor is available on the context.
|
|
292
|
+
# action_executor is monkey-patched at CLI bootstrap time but is not
|
|
293
|
+
# guaranteed to exist when CoreContext is injected by the daemon.
|
|
294
|
+
# Pattern mirrors proposal_executor.py and plan_executor.py.
|
|
295
|
+
if not hasattr(self._ctx, "action_executor"):
|
|
296
|
+
from body.atomic.executor import ActionExecutor
|
|
297
|
+
|
|
298
|
+
self._ctx.action_executor = ActionExecutor(self._ctx)
|
|
299
|
+
|
|
300
|
+
remediator = ViolationRemediator(
|
|
301
|
+
core_context=self._ctx,
|
|
302
|
+
target_rule=target_rule,
|
|
303
|
+
write=self._write,
|
|
304
|
+
caller_uuid=self._worker_uuid,
|
|
305
|
+
)
|
|
306
|
+
ok = await remediator.process_file(file_path, findings)
|
|
307
|
+
return ok, rule_ids if ok else []
|
|
308
|
+
|
|
309
|
+
except Exception as exc:
|
|
310
|
+
logger.error(
|
|
311
|
+
"ViolationExecutorWorker: ceremony failed for '%s' — %s",
|
|
312
|
+
file_path,
|
|
313
|
+
exc,
|
|
314
|
+
)
|
|
315
|
+
await self._abandon_findings(findings)
|
|
316
|
+
return False, []
|
|
317
|
+
|
|
318
|
+
# -------------------------------------------------------------------------
|
|
319
|
+
# Step 10: Surface candidate
|
|
320
|
+
# -------------------------------------------------------------------------
|
|
321
|
+
|
|
322
|
+
# ID: 14ff66a6-3e70-480b-9a97-d35327621c2f
|
|
323
|
+
async def _surface_candidate(self, rule_id: str, file_path: str) -> None:
|
|
324
|
+
"""
|
|
325
|
+
Step 10: Post an AtomicAction candidate to the Blackboard.
|
|
326
|
+
|
|
327
|
+
This is the primary discovery output of ViolationExecutorWorker.
|
|
328
|
+
OptimizerWorker (once implemented) will consume these candidates.
|
|
329
|
+
Until then, the human architect monitors them directly.
|
|
330
|
+
|
|
331
|
+
Subject: audit.remediation.candidate::{rule_id}
|
|
332
|
+
"""
|
|
333
|
+
try:
|
|
334
|
+
await self.post_report(
|
|
335
|
+
subject=f"{_CANDIDATE_SUBJECT}::{rule_id}",
|
|
336
|
+
payload={
|
|
337
|
+
"rule_id": rule_id,
|
|
338
|
+
"file_path": file_path,
|
|
339
|
+
"worker": "violation_executor",
|
|
340
|
+
"note": (
|
|
341
|
+
"AtomicAction candidate. A fix for this rule was "
|
|
342
|
+
"successfully produced by LLM and validated by Canary. "
|
|
343
|
+
"If this pattern recurs, codify it as an AtomicAction "
|
|
344
|
+
"and add to RemediationMap to graduate this rule to "
|
|
345
|
+
"RemediatorWorker. See CORE-ViolationExecutor.md §4."
|
|
346
|
+
),
|
|
347
|
+
},
|
|
348
|
+
)
|
|
349
|
+
logger.info(
|
|
350
|
+
"ViolationExecutorWorker: candidate surfaced — rule='%s' file='%s'",
|
|
351
|
+
rule_id,
|
|
352
|
+
file_path,
|
|
353
|
+
)
|
|
354
|
+
except Exception as exc:
|
|
355
|
+
# Candidate surfacing is best-effort — failure does not invalidate the fix.
|
|
356
|
+
logger.warning(
|
|
357
|
+
"ViolationExecutorWorker: candidate surfacing failed for rule '%s': %s",
|
|
358
|
+
rule_id,
|
|
359
|
+
exc,
|
|
360
|
+
)
|
|
361
|
+
|
|
362
|
+
# -------------------------------------------------------------------------
|
|
363
|
+
# RemediationMap loader
|
|
364
|
+
# -------------------------------------------------------------------------
|
|
365
|
+
|
|
366
|
+
# ID: a533cee7-1062-4ec0-9fd3-693e3152406d
|
|
367
|
+
def _load_mapped_rule_ids(self) -> set[str]:
|
|
368
|
+
"""
|
|
369
|
+
Load the set of rule IDs with active RemediationMap entries.
|
|
370
|
+
|
|
371
|
+
Delegates to _load_remediation_map() from body.autonomy.audit_analyzer
|
|
372
|
+
via PathResolver — the same pattern used by ViolationRemediatorWorker.
|
|
373
|
+
Never hardcodes paths or structure.
|
|
374
|
+
|
|
375
|
+
Returns empty set on any load error (safe fallback: treat all rules
|
|
376
|
+
as unmapped and claim all violation findings).
|
|
377
|
+
"""
|
|
378
|
+
try:
|
|
379
|
+
from body.autonomy.audit_analyzer import _load_remediation_map
|
|
380
|
+
from shared.path_resolver import PathResolver
|
|
381
|
+
|
|
382
|
+
path_resolver = PathResolver(self._ctx.git_service.repo_path)
|
|
383
|
+
remediation_map = _load_remediation_map(path_resolver)
|
|
384
|
+
return set(remediation_map.keys())
|
|
385
|
+
except Exception as exc:
|
|
386
|
+
logger.warning(
|
|
387
|
+
"ViolationExecutorWorker: could not load RemediationMap (%s). "
|
|
388
|
+
"Proceeding with empty mapped set — all violation findings eligible.",
|
|
389
|
+
exc,
|
|
390
|
+
)
|
|
391
|
+
return set()
|
|
392
|
+
|
|
393
|
+
# -------------------------------------------------------------------------
|
|
394
|
+
# Blackboard helpers
|
|
395
|
+
# -------------------------------------------------------------------------
|
|
396
|
+
|
|
397
|
+
# ID: 4788d491-6c2d-4222-9cd8-14b063c7a0ec
|
|
398
|
+
async def _claim_unmapped_findings(
|
|
399
|
+
self, mapped_rule_ids: set[str]
|
|
400
|
+
) -> list[dict[str, Any]]:
|
|
401
|
+
"""Atomically claim open audit.violation findings for unmapped rules."""
|
|
402
|
+
try:
|
|
403
|
+
from body.services.service_registry import service_registry
|
|
404
|
+
|
|
405
|
+
svc = await service_registry.get_blackboard_service()
|
|
406
|
+
return await svc.claim_unmapped_violation_findings(
|
|
407
|
+
mapped_rule_ids=mapped_rule_ids,
|
|
408
|
+
limit=_CFG.claim_limit,
|
|
409
|
+
claimed_by=self._worker_uuid,
|
|
410
|
+
)
|
|
411
|
+
except Exception as exc:
|
|
412
|
+
logger.error(
|
|
413
|
+
"ViolationExecutorWorker: claim_unmapped_violation_findings failed — %s",
|
|
414
|
+
exc,
|
|
415
|
+
)
|
|
416
|
+
return []
|
|
417
|
+
|
|
418
|
+
# ID: b3b9c33a-d475-413d-b963-2363bbb4bf84
|
|
419
|
+
async def _release_findings(self, findings: list[dict[str, Any]]) -> None:
|
|
420
|
+
"""Release claimed findings back to open status."""
|
|
421
|
+
try:
|
|
422
|
+
from body.services.service_registry import service_registry
|
|
423
|
+
|
|
424
|
+
svc = await service_registry.get_blackboard_service()
|
|
425
|
+
entry_ids = [str(f["id"]) for f in findings]
|
|
426
|
+
await svc.release_claimed_entries(entry_ids)
|
|
427
|
+
except Exception as exc:
|
|
428
|
+
logger.error(
|
|
429
|
+
"ViolationExecutorWorker: release_claimed_entries failed — %s", exc
|
|
430
|
+
)
|
|
431
|
+
|
|
432
|
+
# ID: a4fb50f5-af70-45b4-a40b-56ff94d1d937
|
|
433
|
+
async def _abandon_findings(self, findings: list[dict[str, Any]]) -> None:
|
|
434
|
+
"""Mark findings abandoned after an unrecoverable ceremony failure."""
|
|
435
|
+
try:
|
|
436
|
+
from body.services.service_registry import service_registry
|
|
437
|
+
|
|
438
|
+
svc = await service_registry.get_blackboard_service()
|
|
439
|
+
entry_ids = [str(f["id"]) for f in findings]
|
|
440
|
+
await svc.abandon_entries(entry_ids)
|
|
441
|
+
except Exception as exc:
|
|
442
|
+
logger.error("ViolationExecutorWorker: abandon_entries failed — %s", exc)
|
|
443
|
+
|
|
444
|
+
# ID: 7e1d8f4a-3c2b-4d5e-9a6f-2c4d8b3e9f1c
|
|
445
|
+
async def _post_blast_bound_finding(
|
|
446
|
+
self,
|
|
447
|
+
*,
|
|
448
|
+
cap: int,
|
|
449
|
+
total_files: int,
|
|
450
|
+
deferred_paths: list[str],
|
|
451
|
+
) -> None:
|
|
452
|
+
"""
|
|
453
|
+
Post an OPEN finding when the per-cycle blast bound is reached.
|
|
454
|
+
|
|
455
|
+
Mirrors the ADR-070 D8 writer-as-sensor OPEN-finding pattern: the
|
|
456
|
+
system noticed the rate-limit and surfaces it for governor visibility.
|
|
457
|
+
Not autonomously remediated — operator may choose to increase the
|
|
458
|
+
cap (amend the YAML), investigate why so many files are queued, or
|
|
459
|
+
accept the pacing.
|
|
460
|
+
|
|
461
|
+
Bounded sample of deferred paths included in the payload (max 20)
|
|
462
|
+
so the finding fits comfortably in a CLI render and a blackboard
|
|
463
|
+
JSONB row.
|
|
464
|
+
"""
|
|
465
|
+
try:
|
|
466
|
+
await self._post_entry(
|
|
467
|
+
entry_type="finding",
|
|
468
|
+
subject=_BLAST_BOUND_SUBJECT,
|
|
469
|
+
payload={
|
|
470
|
+
"rule_id": _BLAST_BOUND_SUBJECT,
|
|
471
|
+
"severity": "medium",
|
|
472
|
+
"drift_class": "per_cycle_cap_reached",
|
|
473
|
+
"cap": cap,
|
|
474
|
+
"total_files_queued": total_files,
|
|
475
|
+
"deferred_files_count": len(deferred_paths),
|
|
476
|
+
"deferred_paths_sample": deferred_paths[
|
|
477
|
+
:_DEFERRED_PATHS_SAMPLE_SIZE
|
|
478
|
+
],
|
|
479
|
+
"remediation": "deferred-to-next-cycle",
|
|
480
|
+
"remediation_hint": (
|
|
481
|
+
f"{total_files} files were queued in this cycle, "
|
|
482
|
+
f"above the declared cap of {cap}. "
|
|
483
|
+
f"{len(deferred_paths)} file(s) deferred to the next "
|
|
484
|
+
f"cycle. If the queue consistently exceeds the cap, "
|
|
485
|
+
f"investigate upstream (is a sensor over-emitting?) "
|
|
486
|
+
f"or amend the cap in violation_executor.yaml."
|
|
487
|
+
),
|
|
488
|
+
"pair_id": "violation_executor ↔ src/",
|
|
489
|
+
},
|
|
490
|
+
status="open",
|
|
491
|
+
)
|
|
492
|
+
except Exception as exc:
|
|
493
|
+
logger.warning(
|
|
494
|
+
"ViolationExecutorWorker: blast-bound finding post failed: %s",
|
|
495
|
+
exc,
|
|
496
|
+
)
|