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,394 @@
|
|
|
1
|
+
# src/will/workers/violation_remediator.py
|
|
2
|
+
"""
|
|
3
|
+
ViolationRemediatorWorker — closes the autonomous audit loop by converting
|
|
4
|
+
open audit.violation findings into Proposals and transitioning each
|
|
5
|
+
consumed entry to its appropriate terminal state.
|
|
6
|
+
|
|
7
|
+
Constitutional role: acting worker, remediation phase.
|
|
8
|
+
Declaration: .intent/workers/violation_remediator.yaml
|
|
9
|
+
|
|
10
|
+
Loop position:
|
|
11
|
+
AuditViolationSensor → Blackboard
|
|
12
|
+
→ ViolationRemediatorWorker (THIS)
|
|
13
|
+
→ Proposal (one per (action, file) — ADR-035 D1)
|
|
14
|
+
→ ProposalConsumerWorker → ProposalExecutor
|
|
15
|
+
→ on failure: ProposalStateManager.mark_failed
|
|
16
|
+
revives the deferred findings (§7a)
|
|
17
|
+
|
|
18
|
+
Design constraints: no LLM, no file writes, dedup against active proposals
|
|
19
|
+
on the (ref_id, file_path) key (ADR-035 D2). Findings are deferred AFTER
|
|
20
|
+
the proposal is persisted. Safe (approval_required=False) proposals are
|
|
21
|
+
created in APPROVED status so the consumer worker can execute without a
|
|
22
|
+
separate approval step.
|
|
23
|
+
|
|
24
|
+
Terminal-state semantics are documented on each collaborator function:
|
|
25
|
+
- Proposal creation and active-proposal indexing — see
|
|
26
|
+
violation_remediator_proposal.py (ADR-035, ADR-010, ADR-038).
|
|
27
|
+
- Blackboard transitions (resolve / defer / release / release_unmappable /
|
|
28
|
+
mark_delegated) — see violation_remediator_blackboard.py
|
|
29
|
+
(ADR-010, ADR-015 D4).
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
from __future__ import annotations
|
|
33
|
+
|
|
34
|
+
from typing import Any
|
|
35
|
+
|
|
36
|
+
from shared.infrastructure.intent.vocabulary_projection import (
|
|
37
|
+
VocabularyProjectionError,
|
|
38
|
+
load_vocabulary_projection,
|
|
39
|
+
)
|
|
40
|
+
from shared.logger import getLogger
|
|
41
|
+
from shared.workers.base import Worker
|
|
42
|
+
from will.workers.circuit_breaker import load_circuit_breaker_config, trip
|
|
43
|
+
from will.workers.violation_remediator_blackboard import (
|
|
44
|
+
defer_to_proposal,
|
|
45
|
+
load_open_findings,
|
|
46
|
+
mark_delegated,
|
|
47
|
+
release_entries,
|
|
48
|
+
release_unmappable,
|
|
49
|
+
resolve_entries,
|
|
50
|
+
)
|
|
51
|
+
from will.workers.violation_remediator_proposal import (
|
|
52
|
+
check_circuit_breaker,
|
|
53
|
+
create_proposal,
|
|
54
|
+
get_active_proposal_id_by_action_file,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
logger = getLogger(__name__)
|
|
59
|
+
|
|
60
|
+
_FINDING_SUBJECT_PREFIX = "audit.violation::"
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _entry_id(finding: dict[str, Any]) -> str:
|
|
64
|
+
"""Extract blackboard entry id ('id' or 'entry_id'); raise on contract violation."""
|
|
65
|
+
value = finding.get("id") or finding.get("entry_id")
|
|
66
|
+
if value is None:
|
|
67
|
+
raise ValueError(f"Finding has neither 'id' nor 'entry_id': {finding!r}")
|
|
68
|
+
return str(value)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _rules_of(findings: list[dict[str, Any]]) -> list[str]:
|
|
72
|
+
"""Deduplicated rule list from findings — used in completion report."""
|
|
73
|
+
return list(
|
|
74
|
+
{
|
|
75
|
+
f["payload"].get("check_id") or f["payload"].get("rule", "unknown")
|
|
76
|
+
for f in findings
|
|
77
|
+
}
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
# ID: b4c5d6e7-f8a9-0123-bcde-f12345678904
|
|
82
|
+
class ViolationRemediatorWorker(Worker):
|
|
83
|
+
"""
|
|
84
|
+
Acting worker that converts Blackboard violation findings into proposals.
|
|
85
|
+
|
|
86
|
+
Reads open audit.violation findings, maps each rule to a remediation
|
|
87
|
+
action via .intent/ remediation map, groups by (action, file) per
|
|
88
|
+
ADR-035 D1, deduplicates against active proposals on the same
|
|
89
|
+
(action, file) unit, creates per-finding proposals, transitions the
|
|
90
|
+
consumed entries to 'deferred_to_proposal' with the proposal_id
|
|
91
|
+
stored in their payload (per CORE-Finding.md §7).
|
|
92
|
+
|
|
93
|
+
Safe proposals (approval_required=False) are created in APPROVED status
|
|
94
|
+
so ProposalConsumerWorker can execute them without a separate approval step.
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
declaration_name = "violation_remediator"
|
|
98
|
+
|
|
99
|
+
def __init__(
|
|
100
|
+
self, core_context: Any = None, declaration_name: str = "", **kwargs: Any
|
|
101
|
+
) -> None:
|
|
102
|
+
"""Accept daemon kwargs — stores core_context for repo path resolution."""
|
|
103
|
+
super().__init__(declaration_name=declaration_name)
|
|
104
|
+
self._core_context = core_context
|
|
105
|
+
|
|
106
|
+
def _get_remediation_map(self) -> dict:
|
|
107
|
+
"""Load rule-to-action mappings from .intent/ via PathResolver."""
|
|
108
|
+
from body.autonomy.audit_analyzer import _load_remediation_map
|
|
109
|
+
from shared.path_resolver import PathResolver
|
|
110
|
+
|
|
111
|
+
path_resolver = PathResolver(self._core_context.git_service.repo_path)
|
|
112
|
+
return _load_remediation_map(path_resolver)
|
|
113
|
+
|
|
114
|
+
# ID: c5d6e7f8-a9b0-1234-cdef-123456789014
|
|
115
|
+
async def run(self) -> None:
|
|
116
|
+
"""One audit-loop cycle: load → group → dedup → propose → transition → report."""
|
|
117
|
+
projection = load_vocabulary_projection()
|
|
118
|
+
if isinstance(projection, VocabularyProjectionError):
|
|
119
|
+
logger.error(
|
|
120
|
+
"ViolationRemediatorWorker: skipping cycle — vocabulary projection broken: %s",
|
|
121
|
+
projection.reason,
|
|
122
|
+
)
|
|
123
|
+
await self.post_finding(
|
|
124
|
+
"governance.instrument_degraded",
|
|
125
|
+
{
|
|
126
|
+
"instrument": "vocabulary_projection",
|
|
127
|
+
"reason": projection.reason,
|
|
128
|
+
"worker": self.declaration_name,
|
|
129
|
+
},
|
|
130
|
+
)
|
|
131
|
+
return
|
|
132
|
+
|
|
133
|
+
open_findings = await self._load_open_findings()
|
|
134
|
+
|
|
135
|
+
if not open_findings:
|
|
136
|
+
await self.post_heartbeat()
|
|
137
|
+
logger.info("ViolationRemediatorWorker: no open violation findings")
|
|
138
|
+
return
|
|
139
|
+
|
|
140
|
+
logger.info(
|
|
141
|
+
"ViolationRemediatorWorker: %d open findings to process",
|
|
142
|
+
len(open_findings),
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
remediation_map = self._get_remediation_map()
|
|
146
|
+
|
|
147
|
+
action_groups: dict[tuple[str, str | None], list[dict[str, Any]]] = {}
|
|
148
|
+
ref_kinds: dict[str, str] = {}
|
|
149
|
+
unmappable: list[dict[str, Any]] = []
|
|
150
|
+
delegate: list[dict[str, Any]] = []
|
|
151
|
+
|
|
152
|
+
for finding in open_findings:
|
|
153
|
+
rule = finding["payload"].get("check_id") or finding["payload"].get(
|
|
154
|
+
"rule", ""
|
|
155
|
+
)
|
|
156
|
+
entry = remediation_map.get(rule)
|
|
157
|
+
|
|
158
|
+
if entry and entry.get("status") == "DELEGATE":
|
|
159
|
+
finding["_map_entry"] = entry
|
|
160
|
+
delegate.append(finding)
|
|
161
|
+
elif entry:
|
|
162
|
+
ref_id = entry["ref_id"]
|
|
163
|
+
ref_kind = entry["ref_kind"]
|
|
164
|
+
if ref_kind == "flow":
|
|
165
|
+
key = (ref_id, None)
|
|
166
|
+
else:
|
|
167
|
+
file_path = finding["payload"].get("file_path") or None
|
|
168
|
+
key = (ref_id, file_path)
|
|
169
|
+
action_groups.setdefault(key, []).append(finding)
|
|
170
|
+
ref_kinds[ref_id] = ref_kind
|
|
171
|
+
else:
|
|
172
|
+
unmappable.append(finding)
|
|
173
|
+
logger.debug(
|
|
174
|
+
"ViolationRemediatorWorker: no remediation mapping for rule '%s'",
|
|
175
|
+
rule,
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
active_proposal_ids = await self._get_active_proposal_id_by_action_file()
|
|
179
|
+
cb_config = load_circuit_breaker_config()
|
|
180
|
+
|
|
181
|
+
proposals_created: list[str] = []
|
|
182
|
+
proposals_skipped: list[str] = []
|
|
183
|
+
proposals_circuit_broken: list[str] = []
|
|
184
|
+
entries_deferred: int = 0
|
|
185
|
+
entries_resolved_dedup: int = 0
|
|
186
|
+
entries_released_after_failure: int = 0
|
|
187
|
+
entries_circuit_broken: int = 0
|
|
188
|
+
|
|
189
|
+
for (ref_id, file_path), findings in action_groups.items():
|
|
190
|
+
ref_kind = ref_kinds[ref_id]
|
|
191
|
+
entry_ids = [_entry_id(f) for f in findings]
|
|
192
|
+
group_label = f"{ref_id}::{file_path or '<no-file>'}"
|
|
193
|
+
|
|
194
|
+
subsuming_proposal_id = active_proposal_ids.get((ref_id, file_path))
|
|
195
|
+
if subsuming_proposal_id:
|
|
196
|
+
resolved = await self._resolve_entries(entry_ids, subsuming_proposal_id)
|
|
197
|
+
entries_resolved_dedup += resolved
|
|
198
|
+
proposals_skipped.append(group_label)
|
|
199
|
+
logger.info(
|
|
200
|
+
"ViolationRemediatorWorker: skipping '%s' — active proposal "
|
|
201
|
+
"%s exists; resolved %d subsumed finding(s) with proposal_id "
|
|
202
|
+
"linkage",
|
|
203
|
+
group_label,
|
|
204
|
+
subsuming_proposal_id,
|
|
205
|
+
resolved,
|
|
206
|
+
)
|
|
207
|
+
continue
|
|
208
|
+
|
|
209
|
+
(
|
|
210
|
+
cb_count,
|
|
211
|
+
cb_signature,
|
|
212
|
+
cb_last_pid,
|
|
213
|
+
cb_last_reason,
|
|
214
|
+
) = await self._check_circuit_breaker(
|
|
215
|
+
ref_id=ref_id,
|
|
216
|
+
ref_kind=ref_kind,
|
|
217
|
+
file_path=file_path,
|
|
218
|
+
config=cb_config,
|
|
219
|
+
)
|
|
220
|
+
if cb_count >= cb_config.threshold_n:
|
|
221
|
+
await trip(
|
|
222
|
+
worker=self,
|
|
223
|
+
ref_id=ref_id,
|
|
224
|
+
ref_kind=ref_kind,
|
|
225
|
+
file_path=file_path,
|
|
226
|
+
findings=findings,
|
|
227
|
+
count=cb_count,
|
|
228
|
+
signature=cb_signature,
|
|
229
|
+
last_proposal_id=cb_last_pid,
|
|
230
|
+
last_failure_reason=cb_last_reason,
|
|
231
|
+
mark_delegated=self._mark_delegated,
|
|
232
|
+
)
|
|
233
|
+
proposals_circuit_broken.append(group_label)
|
|
234
|
+
entries_circuit_broken += len(entry_ids)
|
|
235
|
+
continue
|
|
236
|
+
|
|
237
|
+
proposal_id = await self._create_proposal(ref_id, ref_kind, findings)
|
|
238
|
+
|
|
239
|
+
if proposal_id:
|
|
240
|
+
proposals_created.append(group_label)
|
|
241
|
+
deferred = await self._defer_to_proposal(entry_ids, proposal_id)
|
|
242
|
+
entries_deferred += deferred
|
|
243
|
+
logger.info(
|
|
244
|
+
"ViolationRemediatorWorker: created proposal '%s' for %s "
|
|
245
|
+
"'%s' (%d findings, %d entries deferred to proposal)",
|
|
246
|
+
proposal_id,
|
|
247
|
+
ref_kind,
|
|
248
|
+
group_label,
|
|
249
|
+
len(findings),
|
|
250
|
+
deferred,
|
|
251
|
+
)
|
|
252
|
+
else:
|
|
253
|
+
released = await self._release_entries(entry_ids)
|
|
254
|
+
entries_released_after_failure += released
|
|
255
|
+
logger.warning(
|
|
256
|
+
"ViolationRemediatorWorker: proposal for '%s' not created; "
|
|
257
|
+
"released %d finding(s) back to open",
|
|
258
|
+
group_label,
|
|
259
|
+
released,
|
|
260
|
+
)
|
|
261
|
+
|
|
262
|
+
entries_released = await self._release_unmappable(unmappable)
|
|
263
|
+
if entries_released:
|
|
264
|
+
logger.info(
|
|
265
|
+
"ViolationRemediatorWorker: released %d unmappable findings back to open",
|
|
266
|
+
entries_released,
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
entries_delegated = await self._mark_delegated(delegate)
|
|
270
|
+
for finding in delegate:
|
|
271
|
+
rule = finding["payload"].get("check_id") or finding["payload"].get(
|
|
272
|
+
"rule", "unknown"
|
|
273
|
+
)
|
|
274
|
+
file_path = finding["payload"].get("file_path", "unknown")
|
|
275
|
+
map_entry = finding.get("_map_entry", {})
|
|
276
|
+
description = map_entry.get("description", "")
|
|
277
|
+
logger.info(
|
|
278
|
+
"[DELEGATE] %s -> HUMAN REQUIRED\n"
|
|
279
|
+
" File: %s\n"
|
|
280
|
+
" Decision needed: %s\n"
|
|
281
|
+
" Resolve with: core-admin workers blackboard --reopen %s",
|
|
282
|
+
rule,
|
|
283
|
+
file_path,
|
|
284
|
+
description,
|
|
285
|
+
finding.get("id") or finding.get("entry_id"),
|
|
286
|
+
)
|
|
287
|
+
|
|
288
|
+
await self.post_report(
|
|
289
|
+
subject="violation_remediator.completed",
|
|
290
|
+
payload={
|
|
291
|
+
"open_findings": len(open_findings),
|
|
292
|
+
"unmappable": len(unmappable),
|
|
293
|
+
"action_groups": len(action_groups),
|
|
294
|
+
"proposals_created": len(proposals_created),
|
|
295
|
+
"proposals_skipped_dedup": len(proposals_skipped),
|
|
296
|
+
"proposals_circuit_broken": len(proposals_circuit_broken),
|
|
297
|
+
"entries_deferred": entries_deferred,
|
|
298
|
+
"entries_resolved_dedup": entries_resolved_dedup,
|
|
299
|
+
"entries_released_after_failure": entries_released_after_failure,
|
|
300
|
+
"entries_released": entries_released,
|
|
301
|
+
"entries_delegated": entries_delegated,
|
|
302
|
+
"entries_circuit_broken": entries_circuit_broken,
|
|
303
|
+
"created_actions": proposals_created,
|
|
304
|
+
"skipped_actions": proposals_skipped,
|
|
305
|
+
"circuit_broken_actions": proposals_circuit_broken,
|
|
306
|
+
"unmappable_rules": _rules_of(unmappable),
|
|
307
|
+
"delegated": len(delegate),
|
|
308
|
+
"delegated_rules": _rules_of(delegate),
|
|
309
|
+
},
|
|
310
|
+
)
|
|
311
|
+
|
|
312
|
+
logger.info(
|
|
313
|
+
"ViolationRemediatorWorker: done — %d proposals created "
|
|
314
|
+
"(%d entries deferred), %d skipped (dedup, %d subsumed entries "
|
|
315
|
+
"resolved), %d circuit-broken (%d entries delegated), "
|
|
316
|
+
"%d unmappable findings, %d entries released after failure",
|
|
317
|
+
len(proposals_created),
|
|
318
|
+
entries_deferred,
|
|
319
|
+
len(proposals_skipped),
|
|
320
|
+
entries_resolved_dedup,
|
|
321
|
+
len(proposals_circuit_broken),
|
|
322
|
+
entries_circuit_broken,
|
|
323
|
+
len(unmappable),
|
|
324
|
+
entries_released_after_failure,
|
|
325
|
+
)
|
|
326
|
+
|
|
327
|
+
# -------------------------------------------------------------------------
|
|
328
|
+
# Private helpers — collaborator-module shims. Kept as bound methods on
|
|
329
|
+
# the class so tests can patch/call them (worker._create_proposal etc.);
|
|
330
|
+
# they are one-line delegations to the corresponding free functions.
|
|
331
|
+
# -------------------------------------------------------------------------
|
|
332
|
+
|
|
333
|
+
async def _blackboard_service(self) -> Any:
|
|
334
|
+
from body.services.service_registry import service_registry
|
|
335
|
+
|
|
336
|
+
return await service_registry.get_blackboard_service()
|
|
337
|
+
|
|
338
|
+
# ID: d6e7f8a9-b0c1-2345-defa-234567890125
|
|
339
|
+
async def _load_open_findings(self) -> list[dict[str, Any]]:
|
|
340
|
+
return await load_open_findings(
|
|
341
|
+
await self._blackboard_service(),
|
|
342
|
+
prefix=f"{_FINDING_SUBJECT_PREFIX}%",
|
|
343
|
+
claimed_by=self._worker_uuid,
|
|
344
|
+
remediation_map=self._get_remediation_map(),
|
|
345
|
+
)
|
|
346
|
+
|
|
347
|
+
# ID: 8a7c5e91-2b4f-4d63-9e07-1a3c5d8b2f04
|
|
348
|
+
async def _get_active_proposal_id_by_action_file(
|
|
349
|
+
self,
|
|
350
|
+
) -> dict[tuple[str, str | None], str]:
|
|
351
|
+
return await get_active_proposal_id_by_action_file()
|
|
352
|
+
|
|
353
|
+
# ID: f8a9b0c1-d2e3-4567-fabc-456789012347
|
|
354
|
+
async def _create_proposal(
|
|
355
|
+
self, ref_id: str, ref_kind: str, findings: list[dict[str, Any]]
|
|
356
|
+
) -> str | None:
|
|
357
|
+
return await create_proposal(ref_id, ref_kind, findings)
|
|
358
|
+
|
|
359
|
+
# ID: a9b0c1d2-e3f4-5678-abcd-567890123458
|
|
360
|
+
async def _resolve_entries(self, entry_ids: list[str], proposal_id: str) -> int:
|
|
361
|
+
return await resolve_entries(
|
|
362
|
+
await self._blackboard_service(), entry_ids, proposal_id
|
|
363
|
+
)
|
|
364
|
+
|
|
365
|
+
# ID: 2f8b4e71-c950-4a6d-b3e8-7f1a5c2d906e
|
|
366
|
+
async def _defer_to_proposal(self, entry_ids: list[str], proposal_id: str) -> int:
|
|
367
|
+
return await defer_to_proposal(
|
|
368
|
+
await self._blackboard_service(), entry_ids, proposal_id
|
|
369
|
+
)
|
|
370
|
+
|
|
371
|
+
# ID: d2e3f4a5-b6c7-8901-defa-890123456781
|
|
372
|
+
async def _release_entries(self, entry_ids: list[str]) -> int:
|
|
373
|
+
return await release_entries(await self._blackboard_service(), entry_ids)
|
|
374
|
+
|
|
375
|
+
# ID: b0c1d2e3-f4a5-6789-bcde-678901234569
|
|
376
|
+
async def _release_unmappable(self, findings: list[dict[str, Any]]) -> int:
|
|
377
|
+
return await release_unmappable(await self._blackboard_service(), findings)
|
|
378
|
+
|
|
379
|
+
# ID: e16afa44-6fde-4782-9879-e4953b997e74
|
|
380
|
+
async def _check_circuit_breaker(
|
|
381
|
+
self,
|
|
382
|
+
*,
|
|
383
|
+
ref_id: str,
|
|
384
|
+
ref_kind: str,
|
|
385
|
+
file_path: str | None,
|
|
386
|
+
config: Any,
|
|
387
|
+
) -> tuple[int, str | None, str | None, str | None]:
|
|
388
|
+
return await check_circuit_breaker(
|
|
389
|
+
ref_id=ref_id, ref_kind=ref_kind, file_path=file_path, config=config
|
|
390
|
+
)
|
|
391
|
+
|
|
392
|
+
# ID: c1d2e3f4-a5b6-7890-cdef-789012345670
|
|
393
|
+
async def _mark_delegated(self, findings: list[dict[str, Any]]) -> int:
|
|
394
|
+
return await mark_delegated(await self._blackboard_service(), findings)
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
# src/will/workers/violation_remediator_blackboard.py
|
|
2
|
+
"""
|
|
3
|
+
Blackboard operations for ViolationRemediatorWorker.
|
|
4
|
+
|
|
5
|
+
Collaborator module. Owns the claim-time loader and the five terminal
|
|
6
|
+
transitions for findings:
|
|
7
|
+
|
|
8
|
+
- load_open_findings: claim open audit.violation findings; immediately
|
|
9
|
+
release any whose rule has no remediation mapping so they don't stay
|
|
10
|
+
parked at 'claimed'.
|
|
11
|
+
- resolve_entries: dedup-subsume path. Mark subsumed entries 'resolved'
|
|
12
|
+
with the subsuming proposal_id on payload (URS Q1.F / ADR-015 D4).
|
|
13
|
+
Status is 'resolved' rather than 'deferred_to_proposal' because the
|
|
14
|
+
subsuming proposal does not track the subsumed entries in its scope,
|
|
15
|
+
so the §7a revival contract does not apply.
|
|
16
|
+
- defer_to_proposal: happy path (ADR-010 / CORE-Finding.md §7 row 4).
|
|
17
|
+
Transition entries to 'deferred_to_proposal' with proposal_id on
|
|
18
|
+
payload — the linkage ProposalStateManager.mark_failed reads to
|
|
19
|
+
revive findings if the proposal later fails.
|
|
20
|
+
- release_entries: rollback when proposal creation fails. Returns
|
|
21
|
+
claimed entries to 'open' so the next cycle can retry cleanly.
|
|
22
|
+
- release_unmappable: same release path, driven from a list of finding
|
|
23
|
+
dicts whose rule has no remediation map entry.
|
|
24
|
+
- mark_delegated: terminal 'indeterminate' for entries whose rule is
|
|
25
|
+
DELEGATE — non-automatable, awaiting governor decision.
|
|
26
|
+
|
|
27
|
+
Implements:
|
|
28
|
+
ADR-010 — Finding→Proposal linkage and the §7/§7a revival contract
|
|
29
|
+
ADR-015 D4 — dedup-subsume payload pointer (audit linkage)
|
|
30
|
+
|
|
31
|
+
Every function takes the BlackboardService instance as its first
|
|
32
|
+
argument so the module is unit-testable against a stub service without
|
|
33
|
+
monkeypatching service_registry, and service-acquisition (and any
|
|
34
|
+
caching) lives on the caller side. Each transition is fail-soft: a
|
|
35
|
+
service-call exception is logged and the function returns 0 — a
|
|
36
|
+
service hiccup never reverses the worker's upstream accounting.
|
|
37
|
+
|
|
38
|
+
LAYER: will/workers — internal collaborator of ViolationRemediatorWorker.
|
|
39
|
+
No database access, no file writes, no LLM calls.
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
from __future__ import annotations
|
|
43
|
+
|
|
44
|
+
from typing import Any
|
|
45
|
+
|
|
46
|
+
from shared.logger import getLogger
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
logger = getLogger(__name__)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _entry_id(finding: dict[str, Any]) -> str:
|
|
53
|
+
"""Extract the blackboard-entry id from a finding dict.
|
|
54
|
+
|
|
55
|
+
Mirrors the helper in violation_remediator_proposal so this module is
|
|
56
|
+
self-contained; both raise ValueError on a contract violation rather
|
|
57
|
+
than silently propagating None to the SQL layer.
|
|
58
|
+
"""
|
|
59
|
+
value = finding.get("id") or finding.get("entry_id")
|
|
60
|
+
if value is None:
|
|
61
|
+
raise ValueError(f"Finding has neither 'id' nor 'entry_id': {finding!r}")
|
|
62
|
+
return str(value)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
# ID: 87787044-a1a2-4e07-b2dc-197c8e9598c7
|
|
66
|
+
async def load_open_findings(
|
|
67
|
+
service: Any,
|
|
68
|
+
*,
|
|
69
|
+
prefix: str,
|
|
70
|
+
claimed_by: Any,
|
|
71
|
+
remediation_map: dict[str, Any],
|
|
72
|
+
limit: int = 200,
|
|
73
|
+
) -> list[dict[str, Any]]:
|
|
74
|
+
"""Claim open audit.violation findings and filter to those with a remediation mapping.
|
|
75
|
+
|
|
76
|
+
Atomically claims up to *limit* findings whose subject starts with
|
|
77
|
+
*prefix*, then partitions them by whether *remediation_map* has an
|
|
78
|
+
entry for the rule. Mappable findings are returned. Unmappable ids
|
|
79
|
+
are released back to 'open' inside this call so they don't stay
|
|
80
|
+
parked at 'claimed' across cycles.
|
|
81
|
+
|
|
82
|
+
Fail-soft: a claim-time exception returns an empty list; a release-
|
|
83
|
+
time exception is logged but does not propagate (the mappable
|
|
84
|
+
findings the caller will work on are unaffected).
|
|
85
|
+
"""
|
|
86
|
+
try:
|
|
87
|
+
claimed = await service.claim_violation_findings(
|
|
88
|
+
prefix=prefix,
|
|
89
|
+
limit=limit,
|
|
90
|
+
claimed_by=claimed_by,
|
|
91
|
+
)
|
|
92
|
+
except Exception as e:
|
|
93
|
+
logger.error("ViolationRemediatorWorker: failed to load findings: %s", e)
|
|
94
|
+
return []
|
|
95
|
+
|
|
96
|
+
if not claimed:
|
|
97
|
+
return []
|
|
98
|
+
|
|
99
|
+
mappable: list[dict[str, Any]] = []
|
|
100
|
+
unmappable_ids: list[str] = []
|
|
101
|
+
for finding in claimed:
|
|
102
|
+
rule = finding["payload"].get("check_id") or finding["payload"].get("rule", "")
|
|
103
|
+
if remediation_map.get(rule):
|
|
104
|
+
mappable.append(finding)
|
|
105
|
+
else:
|
|
106
|
+
unmappable_ids.append(_entry_id(finding))
|
|
107
|
+
|
|
108
|
+
if unmappable_ids:
|
|
109
|
+
try:
|
|
110
|
+
released = await service.release_claimed_entries(unmappable_ids)
|
|
111
|
+
logger.info(
|
|
112
|
+
"ViolationRemediatorWorker: released %d/%d unmappable findings "
|
|
113
|
+
"at claim time",
|
|
114
|
+
released,
|
|
115
|
+
len(unmappable_ids),
|
|
116
|
+
)
|
|
117
|
+
except Exception as e:
|
|
118
|
+
logger.error(
|
|
119
|
+
"ViolationRemediatorWorker: failed to release unmappable "
|
|
120
|
+
"findings at claim time: %s",
|
|
121
|
+
e,
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
return mappable
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
# ID: 270f785d-0bab-418f-8c0d-2a919de92e9b
|
|
128
|
+
async def resolve_entries(
|
|
129
|
+
service: Any,
|
|
130
|
+
entry_ids: list[str],
|
|
131
|
+
proposal_id: str,
|
|
132
|
+
) -> int:
|
|
133
|
+
"""Mark subsumed entries 'resolved' with the subsuming proposal_id on payload.
|
|
134
|
+
|
|
135
|
+
Used by the dedup-subsume branch — see ADR-015 D4. Routes to
|
|
136
|
+
BlackboardService.resolve_entries_for_proposal, the dedicated mirror of
|
|
137
|
+
defer_entries_to_proposal for this path.
|
|
138
|
+
|
|
139
|
+
Returns count of entries resolved. Fail-soft on service error.
|
|
140
|
+
"""
|
|
141
|
+
if not entry_ids:
|
|
142
|
+
return 0
|
|
143
|
+
try:
|
|
144
|
+
return await service.resolve_entries_for_proposal(entry_ids, proposal_id)
|
|
145
|
+
except Exception as e:
|
|
146
|
+
logger.error("ViolationRemediatorWorker: failed to resolve entries: %s", e)
|
|
147
|
+
return 0
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
# ID: 145f905f-b1ac-4616-9bcc-6a4f0159afda
|
|
151
|
+
async def defer_to_proposal(
|
|
152
|
+
service: Any,
|
|
153
|
+
entry_ids: list[str],
|
|
154
|
+
proposal_id: str,
|
|
155
|
+
) -> int:
|
|
156
|
+
"""Transition entries to 'deferred_to_proposal' with proposal_id on payload.
|
|
157
|
+
|
|
158
|
+
Happy-path terminal transition for findings consumed into a newly-
|
|
159
|
+
created proposal — CORE-Finding.md §7 row 4 and ADR-010. The §7a
|
|
160
|
+
revival contract in ProposalStateManager.mark_failed depends on this
|
|
161
|
+
linkage.
|
|
162
|
+
|
|
163
|
+
Returns count of entries deferred. Fail-soft: a revival-layer failure
|
|
164
|
+
here does not reverse the caller's proposal_created accounting.
|
|
165
|
+
"""
|
|
166
|
+
if not entry_ids:
|
|
167
|
+
return 0
|
|
168
|
+
try:
|
|
169
|
+
return await service.defer_entries_to_proposal(entry_ids, proposal_id)
|
|
170
|
+
except Exception as e:
|
|
171
|
+
logger.error(
|
|
172
|
+
"ViolationRemediatorWorker: failed to defer entries to proposal %s: %s",
|
|
173
|
+
proposal_id,
|
|
174
|
+
e,
|
|
175
|
+
)
|
|
176
|
+
return 0
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
# ID: 2f3a6a63-bb19-410a-9497-1433e0811bf9
|
|
180
|
+
async def release_entries(service: Any, entry_ids: list[str]) -> int:
|
|
181
|
+
"""Release claimed entries back to 'open' by id.
|
|
182
|
+
|
|
183
|
+
Used when proposal creation fails and findings need to be retry-
|
|
184
|
+
eligible on the next run. Returns count of entries released.
|
|
185
|
+
Fail-soft on service error.
|
|
186
|
+
"""
|
|
187
|
+
if not entry_ids:
|
|
188
|
+
return 0
|
|
189
|
+
try:
|
|
190
|
+
return await service.release_claimed_entries(entry_ids)
|
|
191
|
+
except Exception as e:
|
|
192
|
+
logger.error("ViolationRemediatorWorker: failed to release entries: %s", e)
|
|
193
|
+
return 0
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
# ID: 75f8df09-f542-43fc-8506-85b7a1059be1
|
|
197
|
+
async def release_unmappable(service: Any, findings: list[dict[str, Any]]) -> int:
|
|
198
|
+
"""Release claimed findings whose rule has no remediation mapping.
|
|
199
|
+
|
|
200
|
+
Resolves entry ids and delegates to release_entries — same release
|
|
201
|
+
path, different driver (list of finding dicts rather than ids).
|
|
202
|
+
"""
|
|
203
|
+
if not findings:
|
|
204
|
+
return 0
|
|
205
|
+
entry_ids = [_entry_id(f) for f in findings]
|
|
206
|
+
return await release_entries(service, entry_ids)
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
# ID: 3a2edb4b-98c1-4ab5-ad7e-8f4c31d6bcdd
|
|
210
|
+
async def mark_delegated(service: Any, findings: list[dict[str, Any]]) -> int:
|
|
211
|
+
"""Mark DELEGATE findings 'indeterminate' — awaiting governor decision.
|
|
212
|
+
|
|
213
|
+
Terminal transition for non-automatable findings. Returns count of
|
|
214
|
+
entries marked. Fail-soft on service error.
|
|
215
|
+
"""
|
|
216
|
+
if not findings:
|
|
217
|
+
return 0
|
|
218
|
+
entry_ids = [_entry_id(f) for f in findings]
|
|
219
|
+
try:
|
|
220
|
+
return await service.mark_indeterminate(entry_ids)
|
|
221
|
+
except Exception as e:
|
|
222
|
+
logger.error(
|
|
223
|
+
"ViolationRemediatorWorker: failed to mark delegated entries: %s", e
|
|
224
|
+
)
|
|
225
|
+
return 0
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# src/will/workers/violation_remediator_body/__init__.py
|
|
2
|
+
"""
|
|
3
|
+
ViolationRemediator package.
|
|
4
|
+
|
|
5
|
+
Split from body/workers/violation_remediator.py.
|
|
6
|
+
Re-exports ViolationRemediator for backward compatibility.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from .worker import ViolationRemediator
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
__all__ = ["ViolationRemediator"]
|