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,239 @@
|
|
|
1
|
+
# src/will/autonomy/proposal_state_manager.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Proposal State Manager - Lifecycle State Transitions
|
|
5
|
+
|
|
6
|
+
CONSTITUTIONAL ALIGNMENT:
|
|
7
|
+
- Single Responsibility: Manage proposal lifecycle states
|
|
8
|
+
- Business logic separated from CRUD
|
|
9
|
+
- Uses repository for persistence
|
|
10
|
+
|
|
11
|
+
Handles state transitions:
|
|
12
|
+
- mark_completed, mark_failed
|
|
13
|
+
- approve, reject
|
|
14
|
+
|
|
15
|
+
Extracted from ProposalRepository to separate state management concerns.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
from datetime import UTC, datetime
|
|
21
|
+
from typing import Any
|
|
22
|
+
|
|
23
|
+
from sqlalchemy import update
|
|
24
|
+
|
|
25
|
+
from shared.exceptions import CoreError
|
|
26
|
+
from shared.logger import getLogger
|
|
27
|
+
from shared.workers.base import _sanitize_payload
|
|
28
|
+
from will.autonomy.proposal import ProposalStatus
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
logger = getLogger(__name__)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
ALLOWED_APPROVAL_AUTHORITIES: frozenset[str] = frozenset(
|
|
35
|
+
{
|
|
36
|
+
"risk_classification.safe_auto_approval",
|
|
37
|
+
"principal.governor",
|
|
38
|
+
}
|
|
39
|
+
)
|
|
40
|
+
"""Closed set per .intent/META/enums.json proposal_approval_authority.
|
|
41
|
+
Mirrored here for write-path validation; .intent/ is the canonical surface."""
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
# ID: 59b43e1f-0d5e-4424-b9cc-1fdfaa22d1e3
|
|
45
|
+
class ProposalNotFoundError(CoreError):
|
|
46
|
+
"""Raised when an approve/reject UPDATE matches zero rows.
|
|
47
|
+
|
|
48
|
+
Indicates either the proposal_id does not exist or the row is not in a
|
|
49
|
+
state where the requested transition can land. Distinguishes silent
|
|
50
|
+
no-op from successful state change so callers and operators get a clear
|
|
51
|
+
failure signal instead of a false-success banner.
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
# ID: 5a6b7c8d-9e0f-1a2b-3c4d-5e6f7a8b9c0d
|
|
56
|
+
class ProposalStateManager:
|
|
57
|
+
"""
|
|
58
|
+
Manages proposal lifecycle state transitions.
|
|
59
|
+
|
|
60
|
+
Enforces valid state changes and updates timestamps appropriately.
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
def __init__(self, session: Any):
|
|
64
|
+
self._session = session
|
|
65
|
+
|
|
66
|
+
# -------------------------
|
|
67
|
+
# Execution State Transitions
|
|
68
|
+
# -------------------------
|
|
69
|
+
|
|
70
|
+
# ID: 360b7769-23e8-416d-875b-45e8d3c8194c
|
|
71
|
+
async def mark_completed(self, proposal_id: str, results: dict[str, Any]) -> None:
|
|
72
|
+
"""Mark proposal as successfully completed."""
|
|
73
|
+
from shared.infrastructure.database.models.autonomous_proposals import (
|
|
74
|
+
AutonomousProposal,
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
stmt = (
|
|
78
|
+
update(AutonomousProposal)
|
|
79
|
+
.where(AutonomousProposal.proposal_id == proposal_id)
|
|
80
|
+
.values(
|
|
81
|
+
status=ProposalStatus.COMPLETED.value,
|
|
82
|
+
execution_completed_at=datetime.now(UTC),
|
|
83
|
+
execution_results=_sanitize_payload(results),
|
|
84
|
+
)
|
|
85
|
+
)
|
|
86
|
+
await self._session.execute(stmt)
|
|
87
|
+
await self._session.commit()
|
|
88
|
+
logger.info("Marked proposal as completed: %s", proposal_id)
|
|
89
|
+
|
|
90
|
+
# ID: 2f596c85-0d22-4de4-b919-791346cdb6aa
|
|
91
|
+
async def mark_failed(
|
|
92
|
+
self,
|
|
93
|
+
proposal_id: str,
|
|
94
|
+
reason: str,
|
|
95
|
+
results: dict[str, Any] | None = None,
|
|
96
|
+
) -> None:
|
|
97
|
+
"""Mark proposal as failed with reason and execution results.
|
|
98
|
+
|
|
99
|
+
UPDATE-only: transitions the proposal row on
|
|
100
|
+
core.autonomous_proposals to 'failed' status.
|
|
101
|
+
|
|
102
|
+
Revival of deferred findings and posting of the §7a revival report
|
|
103
|
+
are the calling Worker's orchestration responsibility per ADR-011.
|
|
104
|
+
The Worker detects ok=False from ProposalExecutor, invokes the
|
|
105
|
+
blackboard service's revival method (also UPDATE-only), and posts
|
|
106
|
+
the revival report via self.post_report() so the entry carries
|
|
107
|
+
Worker attribution. This method no longer invokes the blackboard
|
|
108
|
+
service directly.
|
|
109
|
+
"""
|
|
110
|
+
from shared.infrastructure.database.models.autonomous_proposals import (
|
|
111
|
+
AutonomousProposal,
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
stmt = (
|
|
115
|
+
update(AutonomousProposal)
|
|
116
|
+
.where(AutonomousProposal.proposal_id == proposal_id)
|
|
117
|
+
.values(
|
|
118
|
+
status=ProposalStatus.FAILED.value,
|
|
119
|
+
execution_completed_at=datetime.now(UTC),
|
|
120
|
+
failure_reason=_sanitize_payload(reason),
|
|
121
|
+
execution_results=_sanitize_payload(results or {}),
|
|
122
|
+
)
|
|
123
|
+
)
|
|
124
|
+
await self._session.execute(stmt)
|
|
125
|
+
await self._session.commit()
|
|
126
|
+
logger.error("Marked proposal as failed: %s - %s", proposal_id, reason)
|
|
127
|
+
|
|
128
|
+
# -------------------------
|
|
129
|
+
# Approval State Transitions
|
|
130
|
+
# -------------------------
|
|
131
|
+
|
|
132
|
+
# ID: befa870d-148c-4f53-9c31-614380e93673
|
|
133
|
+
async def approve(
|
|
134
|
+
self,
|
|
135
|
+
proposal_id: str,
|
|
136
|
+
approved_by: str,
|
|
137
|
+
approval_authority: str,
|
|
138
|
+
) -> None:
|
|
139
|
+
"""Approve proposal for execution.
|
|
140
|
+
|
|
141
|
+
approval_authority is non-omittable per URS NFR.5: a proposal cannot
|
|
142
|
+
transition to status='approved' without recording the authority under
|
|
143
|
+
which approval was granted (21 CFR Part 11 §11.50 "meaning of
|
|
144
|
+
signature"; ALCOA+ "Attributable" extends "who" to include role).
|
|
145
|
+
Validation happens at the write path, before any database operation.
|
|
146
|
+
|
|
147
|
+
Args:
|
|
148
|
+
proposal_id: Public proposal id.
|
|
149
|
+
approved_by: Identity of the approver (worker tag, operator name).
|
|
150
|
+
approval_authority: Structured reference to the rule or role that
|
|
151
|
+
authorized approval. Must be one of
|
|
152
|
+
ALLOWED_APPROVAL_AUTHORITIES; mirrors the
|
|
153
|
+
proposal_approval_authority enum in .intent/META/enums.json.
|
|
154
|
+
|
|
155
|
+
Raises:
|
|
156
|
+
ValueError: If approval_authority is falsy or not in the closed set.
|
|
157
|
+
"""
|
|
158
|
+
if not approval_authority:
|
|
159
|
+
raise ValueError(
|
|
160
|
+
"approval_authority is non-omittable per URS NFR.5; "
|
|
161
|
+
"approve() must receive a value from the proposal_approval_authority "
|
|
162
|
+
"closed set."
|
|
163
|
+
)
|
|
164
|
+
if approval_authority not in ALLOWED_APPROVAL_AUTHORITIES:
|
|
165
|
+
raise ValueError(
|
|
166
|
+
f"approval_authority {approval_authority!r} is not in the "
|
|
167
|
+
f"allowed set {sorted(ALLOWED_APPROVAL_AUTHORITIES)!r} "
|
|
168
|
+
"(per .intent/META/enums.json proposal_approval_authority)."
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
from shared.infrastructure.database.models.autonomous_proposals import (
|
|
172
|
+
AutonomousProposal,
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
stmt = (
|
|
176
|
+
update(AutonomousProposal)
|
|
177
|
+
.where(AutonomousProposal.proposal_id == proposal_id)
|
|
178
|
+
.values(
|
|
179
|
+
status=ProposalStatus.APPROVED.value,
|
|
180
|
+
approved_by=approved_by,
|
|
181
|
+
approved_at=datetime.now(UTC),
|
|
182
|
+
approval_authority=approval_authority,
|
|
183
|
+
)
|
|
184
|
+
)
|
|
185
|
+
result = await self._session.execute(stmt)
|
|
186
|
+
if result.rowcount == 0:
|
|
187
|
+
raise ProposalNotFoundError(
|
|
188
|
+
f"Proposal not found or not in an approvable state: {proposal_id!r}"
|
|
189
|
+
)
|
|
190
|
+
# Caller controls transactional scope (matches update_fields convention).
|
|
191
|
+
logger.info(
|
|
192
|
+
"Approved proposal: %s by %s under %s",
|
|
193
|
+
proposal_id,
|
|
194
|
+
approved_by,
|
|
195
|
+
approval_authority,
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
# ID: dbdfc785-73e1-47c5-a886-3a2435c8dc95
|
|
199
|
+
async def reject(self, proposal_id: str, reason: str) -> None:
|
|
200
|
+
"""Reject proposal with reason."""
|
|
201
|
+
from shared.infrastructure.database.models.autonomous_proposals import (
|
|
202
|
+
AutonomousProposal,
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
stmt = (
|
|
206
|
+
update(AutonomousProposal)
|
|
207
|
+
.where(AutonomousProposal.proposal_id == proposal_id)
|
|
208
|
+
.values(
|
|
209
|
+
status=ProposalStatus.REJECTED.value,
|
|
210
|
+
failure_reason=reason,
|
|
211
|
+
)
|
|
212
|
+
)
|
|
213
|
+
result = await self._session.execute(stmt)
|
|
214
|
+
if result.rowcount == 0:
|
|
215
|
+
raise ProposalNotFoundError(
|
|
216
|
+
f"Proposal not found or not in a rejectable state: {proposal_id!r}"
|
|
217
|
+
)
|
|
218
|
+
await self._session.commit()
|
|
219
|
+
logger.info("Rejected proposal: %s - %s", proposal_id, reason)
|
|
220
|
+
|
|
221
|
+
# -------------------------
|
|
222
|
+
# Context Manager for Session Lifecycle
|
|
223
|
+
# -------------------------
|
|
224
|
+
|
|
225
|
+
@classmethod
|
|
226
|
+
# ID: eafbc456-17aa-4b5c-b0e8-ee8a697d0925
|
|
227
|
+
async def with_session(cls, proposal_id: str) -> ProposalStateManager:
|
|
228
|
+
"""
|
|
229
|
+
Create state manager with shared session.
|
|
230
|
+
|
|
231
|
+
For use within existing repository context:
|
|
232
|
+
async with ProposalRepository.open() as repo:
|
|
233
|
+
manager = await ProposalStateManager.with_session(...)
|
|
234
|
+
"""
|
|
235
|
+
# This is intentionally simple - callers should use the service_registry
|
|
236
|
+
# pattern or wrap in their own context manager
|
|
237
|
+
raise NotImplementedError(
|
|
238
|
+
"Use ProposalStateManager(session) within an existing session context"
|
|
239
|
+
)
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
# src/will/deciders/governance_decider.py
|
|
2
|
+
"""
|
|
3
|
+
Governance Decider — DECIDE phase component.
|
|
4
|
+
|
|
5
|
+
The final gatekeeper that authorizes or blocks state-changing execution.
|
|
6
|
+
|
|
7
|
+
Constitutional change (Logic Conservation Gate promotion):
|
|
8
|
+
GovernanceDecider now recognises ComponentResults from
|
|
9
|
+
LogicConservationValidator specifically. A logic evaporation verdict
|
|
10
|
+
is treated as a CRITICAL blocker regardless of risk tier — it cannot
|
|
11
|
+
be overridden by confidence thresholds or tier relaxation.
|
|
12
|
+
|
|
13
|
+
This makes the Anti-Lobotomy gate constitutional rather than local
|
|
14
|
+
to ComplexityRemediationService. Any workflow that routes through
|
|
15
|
+
GovernanceDecider receives the protection automatically.
|
|
16
|
+
|
|
17
|
+
Constitutional alignment:
|
|
18
|
+
- Layer: will — decision-making, never execution
|
|
19
|
+
- Phase: RUNTIME — authorises or blocks before any state change
|
|
20
|
+
- Authority: constitution — logic conservation blocks at all tiers
|
|
21
|
+
- Boundary: no get_session, no file writes, no Body implementation
|
|
22
|
+
|
|
23
|
+
LAYER: will/deciders — RUNTIME phase decision component. Aggregates
|
|
24
|
+
evaluator evidence and produces a formal Go/No-Go authorisation token.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
from __future__ import annotations
|
|
28
|
+
|
|
29
|
+
import time
|
|
30
|
+
from typing import Any
|
|
31
|
+
|
|
32
|
+
from shared.component_primitive import ComponentResult
|
|
33
|
+
from shared.logger import getLogger
|
|
34
|
+
from will.orchestration.decision_tracer import DecisionTracer
|
|
35
|
+
from will.strategists.base_strategist import BaseStrategist
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
logger = getLogger(__name__)
|
|
39
|
+
|
|
40
|
+
# Component ID of the logic conservation gate — used to detect its results
|
|
41
|
+
# without creating a hard import dependency on the Body layer validator.
|
|
42
|
+
_LOGIC_CONSERVATION_COMPONENT_ID = "logic_conservation_validator"
|
|
43
|
+
|
|
44
|
+
# Verdict key written by LogicConservationValidator on evaporation
|
|
45
|
+
_EVAPORATION_VERDICT = "logic_evaporation"
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
# ID: 79a654be-b451-4932-93fe-d90b4a8f7a77
|
|
49
|
+
class GovernanceDecider(BaseStrategist):
|
|
50
|
+
"""
|
|
51
|
+
Evaluates cumulative evidence to authorise execution.
|
|
52
|
+
|
|
53
|
+
Responsibilities:
|
|
54
|
+
- Aggregate results from multiple Evaluators.
|
|
55
|
+
- Detect CRITICAL violations (logic evaporation, layer breaches).
|
|
56
|
+
- Check for any 'not ok' results from required Evaluators.
|
|
57
|
+
- Evaluate whether confidence meets the threshold for the Risk Tier.
|
|
58
|
+
- Produce a formal 'Authorization Token' or 'Halt' signal.
|
|
59
|
+
|
|
60
|
+
Logic Conservation Gate:
|
|
61
|
+
Results from LogicConservationValidator are treated as CRITICAL
|
|
62
|
+
blockers. A logic_evaporation verdict halts execution regardless
|
|
63
|
+
of risk tier, confidence level, or other passing evaluations.
|
|
64
|
+
This cannot be overridden at the Decider level — it requires an
|
|
65
|
+
explicit deletions_authorized=True flag upstream in the workflow.
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
def __init__(self) -> None:
|
|
69
|
+
self.tracer = DecisionTracer()
|
|
70
|
+
|
|
71
|
+
# ID: c2aeb827-6b0d-4036-8fca-a01fc2244524
|
|
72
|
+
async def execute(
|
|
73
|
+
self,
|
|
74
|
+
evaluation_results: list[ComponentResult],
|
|
75
|
+
risk_tier: str = "STANDARD",
|
|
76
|
+
**kwargs: Any,
|
|
77
|
+
) -> ComponentResult:
|
|
78
|
+
"""
|
|
79
|
+
Make a final Go/No-Go decision.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
evaluation_results: Ordered list of ComponentResults from evaluators.
|
|
83
|
+
Must include LogicConservationValidator result
|
|
84
|
+
for any workflow that modifies source files.
|
|
85
|
+
risk_tier: ROUTINE | STANDARD | ELEVATED | CRITICAL.
|
|
86
|
+
Higher tiers require higher average confidence.
|
|
87
|
+
|
|
88
|
+
Returns:
|
|
89
|
+
ComponentResult where:
|
|
90
|
+
data["can_proceed"] = True → execution is authorised
|
|
91
|
+
data["can_proceed"] = False → execution is blocked
|
|
92
|
+
data["blockers"] → list of reasons for halt
|
|
93
|
+
data["authorization_token"] → opaque token if authorised
|
|
94
|
+
"""
|
|
95
|
+
start_time = time.time()
|
|
96
|
+
|
|
97
|
+
violations: list[str] = []
|
|
98
|
+
warnings: list[str] = []
|
|
99
|
+
critical_blocks: list[str] = []
|
|
100
|
+
total_confidence = 0.0
|
|
101
|
+
|
|
102
|
+
# ── 1. Aggregate Evidence ─────────────────────────────────────────────
|
|
103
|
+
for res in evaluation_results:
|
|
104
|
+
# CRITICAL path: Logic Conservation Gate.
|
|
105
|
+
# A logic_evaporation verdict is a hard constitutional block.
|
|
106
|
+
# It bypasses the normal violation aggregation and fires immediately.
|
|
107
|
+
if res.component_id == _LOGIC_CONSERVATION_COMPONENT_ID:
|
|
108
|
+
if not res.ok and res.data.get("verdict") == _EVAPORATION_VERDICT:
|
|
109
|
+
msg = (
|
|
110
|
+
f"CRITICAL — Logic evaporation detected by "
|
|
111
|
+
f"{_LOGIC_CONSERVATION_COMPONENT_ID}: "
|
|
112
|
+
f"{res.data.get('message', 'proposed code below mass threshold')}"
|
|
113
|
+
)
|
|
114
|
+
critical_blocks.append(msg)
|
|
115
|
+
logger.error("GovernanceDecider: %s", msg)
|
|
116
|
+
# Whether ok or not, still accumulate confidence normally.
|
|
117
|
+
|
|
118
|
+
# Standard violation path: any not-ok evaluator blocks execution.
|
|
119
|
+
if not res.ok:
|
|
120
|
+
violations.append(
|
|
121
|
+
f"{res.component_id}: {res.data.get('error', res.data.get('message', 'Unknown failure'))}"
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
# Collect warnings from evaluator metadata.
|
|
125
|
+
violation_count = res.metadata.get("violation_count", 0)
|
|
126
|
+
if violation_count > 0:
|
|
127
|
+
warnings.append(
|
|
128
|
+
f"{res.component_id} reported {violation_count} issue(s)."
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
total_confidence += res.confidence
|
|
132
|
+
|
|
133
|
+
avg_confidence = (
|
|
134
|
+
total_confidence / len(evaluation_results) if evaluation_results else 1.0
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
# ── 2. Decision Logic (The Law) ───────────────────────────────────────
|
|
138
|
+
|
|
139
|
+
# Rule A: Critical constitutional blocks always halt — no tier override.
|
|
140
|
+
if critical_blocks:
|
|
141
|
+
can_proceed = False
|
|
142
|
+
all_blockers = critical_blocks + violations
|
|
143
|
+
decision = "HALT"
|
|
144
|
+
logger.warning(
|
|
145
|
+
"GovernanceDecider: HALT — %d critical block(s), %d violation(s).",
|
|
146
|
+
len(critical_blocks),
|
|
147
|
+
len(violations),
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
else:
|
|
151
|
+
# Rule B: Any not-ok result from a required evaluator blocks execution.
|
|
152
|
+
can_proceed = len(violations) == 0
|
|
153
|
+
|
|
154
|
+
# Rule C: High-risk tiers require higher average confidence.
|
|
155
|
+
confidence_threshold = 0.8 if risk_tier in ("ELEVATED", "CRITICAL") else 0.5
|
|
156
|
+
if avg_confidence < confidence_threshold:
|
|
157
|
+
can_proceed = False
|
|
158
|
+
violations.append(
|
|
159
|
+
f"Confidence {avg_confidence:.2f} below threshold "
|
|
160
|
+
f"{confidence_threshold} for {risk_tier} tier."
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
all_blockers = violations
|
|
164
|
+
decision = "PROCEED" if can_proceed else "HALT"
|
|
165
|
+
|
|
166
|
+
# ── 3. Mandatory Decision Tracing ─────────────────────────────────────
|
|
167
|
+
self.tracer.record(
|
|
168
|
+
agent=self.component_id,
|
|
169
|
+
decision_type="final_authorization",
|
|
170
|
+
rationale=(
|
|
171
|
+
f"Decision {decision} based on {len(evaluation_results)} evaluation(s) "
|
|
172
|
+
f"at {risk_tier} tier. "
|
|
173
|
+
f"Critical blocks: {len(critical_blocks)}. "
|
|
174
|
+
f"Violations: {len(violations)}. "
|
|
175
|
+
f"Avg confidence: {avg_confidence:.2f}."
|
|
176
|
+
),
|
|
177
|
+
chosen_action=decision,
|
|
178
|
+
context={
|
|
179
|
+
"critical_blocks": critical_blocks,
|
|
180
|
+
"violations": all_blockers,
|
|
181
|
+
"warnings": warnings,
|
|
182
|
+
"avg_confidence": avg_confidence,
|
|
183
|
+
"risk_tier": risk_tier,
|
|
184
|
+
},
|
|
185
|
+
confidence=avg_confidence,
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
duration = time.time() - start_time
|
|
189
|
+
|
|
190
|
+
return ComponentResult(
|
|
191
|
+
component_id=self.component_id,
|
|
192
|
+
ok=True, # The Decider itself succeeded in producing a decision.
|
|
193
|
+
data={
|
|
194
|
+
"decision": decision,
|
|
195
|
+
"can_proceed": can_proceed,
|
|
196
|
+
"authorization_token": (
|
|
197
|
+
f"auth_{int(time.time())}" if can_proceed else None
|
|
198
|
+
),
|
|
199
|
+
"blockers": all_blockers,
|
|
200
|
+
"critical_blocks": critical_blocks,
|
|
201
|
+
"warnings": warnings,
|
|
202
|
+
},
|
|
203
|
+
phase=self.phase,
|
|
204
|
+
confidence=1.0,
|
|
205
|
+
metadata={"verdict": decision, "risk_tier": risk_tier},
|
|
206
|
+
duration_sec=duration,
|
|
207
|
+
)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# src/will/governance/__init__.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Will-layer governance facades.
|
|
5
|
+
|
|
6
|
+
This package exposes thin facades the API layer can import without
|
|
7
|
+
reaching into mind.* or shared.infrastructure.* directly. ADR-054
|
|
8
|
+
Phase 1 introduces the first such facade: run_and_persist_audit,
|
|
9
|
+
which wraps mind.enforcement.audit.run_audit_workflow with persistence
|
|
10
|
+
into core.audit_runs.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# src/will/governance/audit_remediation_runner.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Audit-remediation runner facade — Will-layer entry point for
|
|
5
|
+
POST /audit/remediations (ADR-057 D4).
|
|
6
|
+
|
|
7
|
+
The /audit/remediations surface was deferred from ADR-055 Phase 2 because
|
|
8
|
+
its resource model belongs alongside audit_runs, not fix_runs. It runs the
|
|
9
|
+
AuditRemediationService against findings produced by a prior audit_runs
|
|
10
|
+
row, persisting the cycle on core.audit_remediation_runs.
|
|
11
|
+
|
|
12
|
+
Single entry point:
|
|
13
|
+
|
|
14
|
+
* `run_and_persist_audit_remediation` — fire-and-forget runner. The
|
|
15
|
+
route handler INSERTs a pending row with status='pending', mode, and
|
|
16
|
+
audit_run_id; this function transitions it through executing →
|
|
17
|
+
completed | failed and writes the RemediationResult summary into the
|
|
18
|
+
result jsonb.
|
|
19
|
+
|
|
20
|
+
The remediation path is guarded by the circuit breaker (ADR-038) at the
|
|
21
|
+
service layer — this facade does not re-implement that check.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
from __future__ import annotations
|
|
25
|
+
|
|
26
|
+
import json
|
|
27
|
+
from typing import Any
|
|
28
|
+
from uuid import UUID
|
|
29
|
+
|
|
30
|
+
from sqlalchemy import text
|
|
31
|
+
|
|
32
|
+
from body.self_healing.remediation_models import RemediationMode
|
|
33
|
+
from shared.context import CoreContext
|
|
34
|
+
from shared.logger import getLogger
|
|
35
|
+
from will.self_healing.audit_remediation_service import AuditRemediationService
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
__all__ = [
|
|
39
|
+
"MODE_ALIASES",
|
|
40
|
+
"resolve_mode",
|
|
41
|
+
"run_and_persist_audit_remediation",
|
|
42
|
+
]
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
logger = getLogger(__name__)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
# The ADR-057 D4 wire vocabulary ('safe' | 'medium' | 'all') maps onto
|
|
49
|
+
# the internal RemediationMode enum. Strict alias table — unknown values
|
|
50
|
+
# raise at the route layer with a 422.
|
|
51
|
+
MODE_ALIASES: dict[str, RemediationMode] = {
|
|
52
|
+
"safe": RemediationMode.SAFE_ONLY,
|
|
53
|
+
"medium": RemediationMode.MEDIUM_RISK,
|
|
54
|
+
"all": RemediationMode.ALL_DETERMINISTIC,
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
# ID: 9c14e8b3-2a47-4e9d-bef1-8c3d70a52f64
|
|
59
|
+
def resolve_mode(mode: str) -> RemediationMode:
|
|
60
|
+
"""Translate the ADR-057 D4 wire-format mode to RemediationMode.
|
|
61
|
+
|
|
62
|
+
Raises ValueError on unknown input; the route handler converts that
|
|
63
|
+
to a 422.
|
|
64
|
+
"""
|
|
65
|
+
try:
|
|
66
|
+
return MODE_ALIASES[mode]
|
|
67
|
+
except KeyError as exc:
|
|
68
|
+
raise ValueError(
|
|
69
|
+
f"Unknown remediation mode: {mode!r}. "
|
|
70
|
+
f"Allowed: {sorted(MODE_ALIASES.keys())}"
|
|
71
|
+
) from exc
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
# ID: 5d2a90fc-7b8e-49c1-a3b0-9c8a4e1f6d72
|
|
75
|
+
async def _update_remediation_run_status(
|
|
76
|
+
session: Any,
|
|
77
|
+
run_id: UUID,
|
|
78
|
+
status: str,
|
|
79
|
+
*,
|
|
80
|
+
started: bool = False,
|
|
81
|
+
finished: bool = False,
|
|
82
|
+
error: str | None = None,
|
|
83
|
+
result: dict | None = None,
|
|
84
|
+
) -> None:
|
|
85
|
+
"""Update an audit_remediation_runs row's lifecycle state.
|
|
86
|
+
|
|
87
|
+
Mirrors fix_runner._update_fix_run_status. Each call commits.
|
|
88
|
+
"""
|
|
89
|
+
sets = ["status = :status"]
|
|
90
|
+
params: dict[str, Any] = {"status": status, "rid": run_id}
|
|
91
|
+
|
|
92
|
+
if started:
|
|
93
|
+
sets.append("started_at = now()")
|
|
94
|
+
if finished:
|
|
95
|
+
sets.append("finished_at = now()")
|
|
96
|
+
if error is not None:
|
|
97
|
+
sets.append("error = :err")
|
|
98
|
+
params["err"] = error
|
|
99
|
+
if result is not None:
|
|
100
|
+
sets.append("result = cast(:result as jsonb)")
|
|
101
|
+
params["result"] = json.dumps(result, default=str)
|
|
102
|
+
|
|
103
|
+
await session.execute(
|
|
104
|
+
text(
|
|
105
|
+
f"UPDATE core.audit_remediation_runs SET {', '.join(sets)} WHERE id = :rid"
|
|
106
|
+
),
|
|
107
|
+
params,
|
|
108
|
+
)
|
|
109
|
+
await session.commit()
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
# ID: 1f93b6e4-4c10-4e51-a72d-6e8e5c4f9013
|
|
113
|
+
async def run_and_persist_audit_remediation(
|
|
114
|
+
context: CoreContext,
|
|
115
|
+
session: Any,
|
|
116
|
+
*,
|
|
117
|
+
run_id: UUID,
|
|
118
|
+
mode: str,
|
|
119
|
+
write: bool,
|
|
120
|
+
) -> None:
|
|
121
|
+
"""Execute autonomous audit remediation and persist on the run row.
|
|
122
|
+
|
|
123
|
+
The row has already been INSERTed by the route handler with
|
|
124
|
+
status='pending'. This function transitions it through executing →
|
|
125
|
+
completed | failed.
|
|
126
|
+
|
|
127
|
+
`mode` is the ADR-057 wire vocabulary ('safe' | 'medium' | 'all');
|
|
128
|
+
`write` honours the ADR-014 dev-phase dry-run-first discipline.
|
|
129
|
+
|
|
130
|
+
Errors are caught and recorded on the row; this function never
|
|
131
|
+
raises into the background-task scheduler.
|
|
132
|
+
"""
|
|
133
|
+
await _update_remediation_run_status(session, run_id, "executing", started=True)
|
|
134
|
+
|
|
135
|
+
try:
|
|
136
|
+
resolved_mode = resolve_mode(mode)
|
|
137
|
+
except ValueError as exc:
|
|
138
|
+
await _update_remediation_run_status(
|
|
139
|
+
session,
|
|
140
|
+
run_id,
|
|
141
|
+
"failed",
|
|
142
|
+
finished=True,
|
|
143
|
+
error=str(exc),
|
|
144
|
+
)
|
|
145
|
+
return
|
|
146
|
+
|
|
147
|
+
try:
|
|
148
|
+
service = AuditRemediationService(
|
|
149
|
+
file_handler=context.file_handler,
|
|
150
|
+
auditor_context=context.auditor_context,
|
|
151
|
+
repo_root=context.git_service.repo_path,
|
|
152
|
+
)
|
|
153
|
+
result = await service.remediate(
|
|
154
|
+
mode=resolved_mode,
|
|
155
|
+
write=write,
|
|
156
|
+
)
|
|
157
|
+
except Exception as exc:
|
|
158
|
+
logger.exception("audit_remediation_runner: remediation raised for %s", run_id)
|
|
159
|
+
await _update_remediation_run_status(
|
|
160
|
+
session,
|
|
161
|
+
run_id,
|
|
162
|
+
"failed",
|
|
163
|
+
finished=True,
|
|
164
|
+
error=f"{type(exc).__name__}: {exc}",
|
|
165
|
+
)
|
|
166
|
+
return
|
|
167
|
+
|
|
168
|
+
summary = {
|
|
169
|
+
"total_findings": result.total_findings,
|
|
170
|
+
"fixes_attempted": result.fixes_attempted,
|
|
171
|
+
"fixes_succeeded": result.fixes_succeeded,
|
|
172
|
+
"improvement_delta": result.improvement_delta,
|
|
173
|
+
"validation_passed": result.validation_passed,
|
|
174
|
+
"findings_before": result.findings_before,
|
|
175
|
+
"findings_after": result.findings_after,
|
|
176
|
+
"duration_sec": result.duration_sec,
|
|
177
|
+
"audit_input_path": result.audit_input_path,
|
|
178
|
+
"remediation_output_path": result.remediation_output_path,
|
|
179
|
+
"validation_audit_path": result.validation_audit_path,
|
|
180
|
+
}
|
|
181
|
+
ok = result.fixes_succeeded > 0 or result.fixes_attempted == 0
|
|
182
|
+
await _update_remediation_run_status(
|
|
183
|
+
session,
|
|
184
|
+
run_id,
|
|
185
|
+
"completed" if ok else "failed",
|
|
186
|
+
finished=True,
|
|
187
|
+
error=None if ok else "No fixes succeeded",
|
|
188
|
+
result=summary,
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
logger.info(
|
|
192
|
+
"audit_remediation_runner: %s completed mode=%s succeeded=%d/%d",
|
|
193
|
+
run_id,
|
|
194
|
+
mode,
|
|
195
|
+
result.fixes_succeeded,
|
|
196
|
+
result.fixes_attempted,
|
|
197
|
+
)
|