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,343 @@
|
|
|
1
|
+
# src/body/autonomy/audit_analyzer.py
|
|
2
|
+
"""
|
|
3
|
+
Audit Analyzer - Identifies auto-fixable violations from audit findings.
|
|
4
|
+
|
|
5
|
+
Bridges audit detection and autonomous remediation by reading the
|
|
6
|
+
constitutional remediation map from .intent/ and matching audit findings
|
|
7
|
+
against it.
|
|
8
|
+
|
|
9
|
+
Constitutional alignment:
|
|
10
|
+
- Remediation mappings live in .intent/enforcement/mappings/remediation/
|
|
11
|
+
- No action mappings are hardcoded in this file
|
|
12
|
+
- Adding/removing a mapping is a constitutional act (.intent/ edit only)
|
|
13
|
+
- No mutations - pure analysis only
|
|
14
|
+
|
|
15
|
+
V2.7 FIX:
|
|
16
|
+
- Removed hardcoded REMEDIATION_MAP_PATH constant.
|
|
17
|
+
- Removed hardcoded MIN_CONFIDENCE constant.
|
|
18
|
+
- Both are now loaded via PathResolver from:
|
|
19
|
+
.intent/enforcement/config/governance_paths.yaml
|
|
20
|
+
- AuditAnalyzer.findings_path now uses PathResolver.audit_findings_path.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
from __future__ import annotations
|
|
24
|
+
|
|
25
|
+
import json
|
|
26
|
+
from pathlib import Path
|
|
27
|
+
from typing import Any
|
|
28
|
+
|
|
29
|
+
import yaml
|
|
30
|
+
|
|
31
|
+
from shared.logger import getLogger
|
|
32
|
+
from shared.path_resolver import PathResolver
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
logger = getLogger(__name__)
|
|
36
|
+
|
|
37
|
+
# Fallback used only when governance_paths.yaml cannot be loaded.
|
|
38
|
+
# This constant must NOT be used in logic — it is a last-resort default only.
|
|
39
|
+
_FALLBACK_MIN_CONFIDENCE: float = 0.80
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
# ID: e1f2a3b4-c5d6-7890-efab-cd0000000001
|
|
43
|
+
def _load_governance_config(path_resolver: PathResolver) -> dict[str, Any]:
|
|
44
|
+
"""
|
|
45
|
+
Load governance paths & thresholds from .intent/enforcement/config/governance_paths.yaml.
|
|
46
|
+
|
|
47
|
+
Returns empty dict on failure so callers can apply fallbacks gracefully.
|
|
48
|
+
"""
|
|
49
|
+
config_path = path_resolver.governance_config_path
|
|
50
|
+
if not config_path.exists():
|
|
51
|
+
logger.warning(
|
|
52
|
+
"Governance config not found at %s — using fallback defaults. "
|
|
53
|
+
"Create .intent/enforcement/config/governance_paths.yaml to configure.",
|
|
54
|
+
config_path,
|
|
55
|
+
)
|
|
56
|
+
return {}
|
|
57
|
+
try:
|
|
58
|
+
raw = yaml.safe_load(config_path.read_text(encoding="utf-8"))
|
|
59
|
+
return raw if isinstance(raw, dict) else {}
|
|
60
|
+
except Exception as e:
|
|
61
|
+
logger.error("Failed to load governance config from %s: %s", config_path, e)
|
|
62
|
+
return {}
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
# ID: dc64f3c1-b122-4032-ac7c-acf00f43f6d6
|
|
66
|
+
def _load_remediation_map(path_resolver: PathResolver) -> dict[str, dict[str, Any]]:
|
|
67
|
+
"""
|
|
68
|
+
Load the remediation map via PathResolver.
|
|
69
|
+
|
|
70
|
+
Path is resolved from PathResolver.remediation_map_path — never hardcoded.
|
|
71
|
+
Each entry must declare exactly one of 'action' (AtomicAction id) or
|
|
72
|
+
'flow' (Flow id). The validated dict carries both 'ref_id' and 'ref_kind'
|
|
73
|
+
so callers can construct the appropriate ProposalAction without
|
|
74
|
+
re-discriminating.
|
|
75
|
+
Returns a dict of
|
|
76
|
+
{check_id: {action, flow, ref_id, ref_kind, confidence, risk, description, status}}.
|
|
77
|
+
Fails gracefully — returns empty dict if file missing or malformed.
|
|
78
|
+
"""
|
|
79
|
+
map_path = path_resolver.remediation_map_path
|
|
80
|
+
|
|
81
|
+
if not map_path.exists():
|
|
82
|
+
logger.warning(
|
|
83
|
+
"Remediation map not found: %s — no autonomous proposals will be generated. "
|
|
84
|
+
"Populate .intent/enforcement/mappings/remediation/auto_remediation.yaml to enable.",
|
|
85
|
+
map_path,
|
|
86
|
+
)
|
|
87
|
+
return {}
|
|
88
|
+
|
|
89
|
+
try:
|
|
90
|
+
raw = yaml.safe_load(map_path.read_text(encoding="utf-8"))
|
|
91
|
+
except Exception as e:
|
|
92
|
+
logger.error("Failed to load remediation map from %s: %s", map_path, e)
|
|
93
|
+
return {}
|
|
94
|
+
|
|
95
|
+
mappings = raw.get("mappings", {})
|
|
96
|
+
if not isinstance(mappings, dict):
|
|
97
|
+
logger.error(
|
|
98
|
+
"Remediation map has unexpected format (expected dict under 'mappings')"
|
|
99
|
+
)
|
|
100
|
+
return {}
|
|
101
|
+
|
|
102
|
+
validated: dict[str, dict[str, Any]] = {}
|
|
103
|
+
for check_id, entry in mappings.items():
|
|
104
|
+
if not isinstance(entry, dict):
|
|
105
|
+
logger.warning(
|
|
106
|
+
"Remediation map: skipping malformed entry for '%s'", check_id
|
|
107
|
+
)
|
|
108
|
+
continue
|
|
109
|
+
|
|
110
|
+
has_action = entry.get("action") is not None
|
|
111
|
+
has_flow = entry.get("flow") is not None
|
|
112
|
+
if has_action and has_flow:
|
|
113
|
+
logger.warning(
|
|
114
|
+
"Remediation map: entry '%s' declares both 'action' and 'flow' — "
|
|
115
|
+
"skipped (must declare exactly one)",
|
|
116
|
+
check_id,
|
|
117
|
+
)
|
|
118
|
+
continue
|
|
119
|
+
if not has_action and not has_flow:
|
|
120
|
+
logger.warning(
|
|
121
|
+
"Remediation map: entry '%s' missing both 'action' and 'flow' — "
|
|
122
|
+
"skipped (must declare exactly one)",
|
|
123
|
+
check_id,
|
|
124
|
+
)
|
|
125
|
+
continue
|
|
126
|
+
# Skip PENDING entries explicitly (status field in auto_remediation.yaml)
|
|
127
|
+
if entry.get("status") == "PENDING":
|
|
128
|
+
logger.debug("Remediation map: skipping PENDING entry '%s'", check_id)
|
|
129
|
+
continue
|
|
130
|
+
|
|
131
|
+
ref_id = entry["action"] if has_action else entry["flow"]
|
|
132
|
+
ref_kind = "action" if has_action else "flow"
|
|
133
|
+
|
|
134
|
+
validated[check_id] = {
|
|
135
|
+
"action": entry.get("action"),
|
|
136
|
+
"flow": entry.get("flow"),
|
|
137
|
+
"ref_id": ref_id,
|
|
138
|
+
"ref_kind": ref_kind,
|
|
139
|
+
"confidence": float(entry.get("confidence", 0.0)),
|
|
140
|
+
"risk": entry.get("risk", "medium"),
|
|
141
|
+
"description": entry.get("description", ""),
|
|
142
|
+
"status": entry.get("status", "ACTIVE"),
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
logger.debug(
|
|
146
|
+
"Remediation map loaded: %d active mappings from %s", len(validated), map_path
|
|
147
|
+
)
|
|
148
|
+
return validated
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
# ID: b2c3d4e5-f6a7-8901-bcde-f12345678901
|
|
152
|
+
class AuditAnalyzer:
|
|
153
|
+
"""
|
|
154
|
+
Analyzes audit findings to identify auto-fixable violations.
|
|
155
|
+
|
|
156
|
+
Autonomous loop: audit findings -> fixable list -> proposals -> execution.
|
|
157
|
+
|
|
158
|
+
The mapping from check_id to action is loaded from:
|
|
159
|
+
.intent/enforcement/mappings/remediation/auto_remediation.yaml
|
|
160
|
+
|
|
161
|
+
The min_confidence threshold is loaded from:
|
|
162
|
+
.intent/enforcement/config/governance_paths.yaml
|
|
163
|
+
|
|
164
|
+
No paths or thresholds are hardcoded in this file.
|
|
165
|
+
Adding a new remediable rule = editing .intent/ only.
|
|
166
|
+
"""
|
|
167
|
+
|
|
168
|
+
def __init__(self, repo_root: Path) -> None:
|
|
169
|
+
"""
|
|
170
|
+
Initialize analyzer.
|
|
171
|
+
|
|
172
|
+
Args:
|
|
173
|
+
repo_root: Repository root path. Used to construct PathResolver.
|
|
174
|
+
Kept as a Path argument for backward compatibility with
|
|
175
|
+
all existing callers.
|
|
176
|
+
"""
|
|
177
|
+
self._path_resolver = PathResolver(repo_root)
|
|
178
|
+
|
|
179
|
+
# Derive findings path from PathResolver — never hardcoded.
|
|
180
|
+
self.findings_path = self._path_resolver.audit_findings_path
|
|
181
|
+
|
|
182
|
+
# Load min_confidence from constitutional governance config.
|
|
183
|
+
gov_config = _load_governance_config(self._path_resolver)
|
|
184
|
+
self._min_confidence: float = float(
|
|
185
|
+
gov_config.get("remediation", {}).get(
|
|
186
|
+
"min_confidence", _FALLBACK_MIN_CONFIDENCE
|
|
187
|
+
)
|
|
188
|
+
)
|
|
189
|
+
logger.debug(
|
|
190
|
+
"AuditAnalyzer: min_confidence=%.2f (source: %s)",
|
|
191
|
+
self._min_confidence,
|
|
192
|
+
"governance_paths.yaml" if gov_config else "fallback default",
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
self._remediation_map: dict[str, dict[str, Any]] | None = None
|
|
196
|
+
|
|
197
|
+
def _get_remediation_map(self) -> dict[str, dict[str, Any]]:
|
|
198
|
+
"""Lazy-load the remediation map (cached per instance)."""
|
|
199
|
+
if self._remediation_map is None:
|
|
200
|
+
self._remediation_map = _load_remediation_map(self._path_resolver)
|
|
201
|
+
return self._remediation_map
|
|
202
|
+
|
|
203
|
+
# ID: c3d4e5f6-a7b8-9012-cdef-123456789012
|
|
204
|
+
def analyze_findings(self, findings_path: Path | None = None) -> dict[str, Any]:
|
|
205
|
+
"""
|
|
206
|
+
Analyze audit findings to identify auto-fixable violations.
|
|
207
|
+
|
|
208
|
+
Loads the remediation map from .intent/, reads audit findings,
|
|
209
|
+
matches each finding's check_id against the map, and groups
|
|
210
|
+
fixable findings by action. Only entries with confidence >=
|
|
211
|
+
min_confidence (from governance_paths.yaml) are included.
|
|
212
|
+
|
|
213
|
+
Args:
|
|
214
|
+
findings_path: Override path to audit findings JSON.
|
|
215
|
+
|
|
216
|
+
Returns:
|
|
217
|
+
Dict with keys: status, total_findings, auto_fixable_count,
|
|
218
|
+
fixable_by_action, not_fixable, summary_by_action.
|
|
219
|
+
"""
|
|
220
|
+
remediation_map = self._get_remediation_map()
|
|
221
|
+
|
|
222
|
+
if not remediation_map:
|
|
223
|
+
return {
|
|
224
|
+
"status": "no_remediation_map",
|
|
225
|
+
"message": (
|
|
226
|
+
"No remediation mappings found. "
|
|
227
|
+
"Populate .intent/enforcement/mappings/remediation/auto_remediation.yaml."
|
|
228
|
+
),
|
|
229
|
+
"auto_fixable_count": 0,
|
|
230
|
+
"fixable_by_action": {},
|
|
231
|
+
"summary_by_action": [],
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
path = findings_path or self.findings_path
|
|
235
|
+
|
|
236
|
+
if not path.exists():
|
|
237
|
+
logger.warning("Audit findings not found: %s", path)
|
|
238
|
+
return {
|
|
239
|
+
"status": "no_findings",
|
|
240
|
+
"message": f"No audit findings found at {path}",
|
|
241
|
+
"auto_fixable_count": 0,
|
|
242
|
+
"fixable_by_action": {},
|
|
243
|
+
"summary_by_action": [],
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
try:
|
|
247
|
+
with open(path, encoding="utf-8") as f:
|
|
248
|
+
findings = json.load(f)
|
|
249
|
+
except json.JSONDecodeError as e:
|
|
250
|
+
logger.error("Failed to parse audit findings: %s", e)
|
|
251
|
+
return {
|
|
252
|
+
"status": "parse_error",
|
|
253
|
+
"message": f"Failed to parse JSON: {e}",
|
|
254
|
+
"auto_fixable_count": 0,
|
|
255
|
+
"fixable_by_action": {},
|
|
256
|
+
"summary_by_action": [],
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
if not isinstance(findings, list):
|
|
260
|
+
logger.error(
|
|
261
|
+
"Unexpected findings format: expected list, got %s",
|
|
262
|
+
type(findings),
|
|
263
|
+
)
|
|
264
|
+
return {
|
|
265
|
+
"status": "format_error",
|
|
266
|
+
"message": "Audit findings not in expected format",
|
|
267
|
+
"auto_fixable_count": 0,
|
|
268
|
+
"fixable_by_action": {},
|
|
269
|
+
"summary_by_action": [],
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
logger.info(
|
|
273
|
+
"Analyzing %d audit findings against %d remediation mappings "
|
|
274
|
+
"(min_confidence=%.2f)",
|
|
275
|
+
len(findings),
|
|
276
|
+
len(remediation_map),
|
|
277
|
+
self._min_confidence,
|
|
278
|
+
)
|
|
279
|
+
|
|
280
|
+
fixable_by_action: dict[str, list[dict[str, Any]]] = {}
|
|
281
|
+
not_fixable: list[dict[str, Any]] = []
|
|
282
|
+
|
|
283
|
+
for finding in findings:
|
|
284
|
+
check_id = finding.get("check_id", "") or finding.get("rule_id", "")
|
|
285
|
+
if not check_id:
|
|
286
|
+
continue
|
|
287
|
+
|
|
288
|
+
entry = remediation_map.get(check_id)
|
|
289
|
+
|
|
290
|
+
if entry and entry["confidence"] >= self._min_confidence:
|
|
291
|
+
action = entry["action"]
|
|
292
|
+
fixable_by_action.setdefault(action, [])
|
|
293
|
+
fixable_by_action[action].append(
|
|
294
|
+
{
|
|
295
|
+
**finding,
|
|
296
|
+
"fix_action": action,
|
|
297
|
+
"fix_confidence": entry["confidence"],
|
|
298
|
+
"fix_risk": entry["risk"],
|
|
299
|
+
"fix_description": entry["description"],
|
|
300
|
+
}
|
|
301
|
+
)
|
|
302
|
+
else:
|
|
303
|
+
not_fixable.append(finding)
|
|
304
|
+
|
|
305
|
+
total_fixable = sum(len(v) for v in fixable_by_action.values())
|
|
306
|
+
|
|
307
|
+
logger.info(
|
|
308
|
+
"Analysis complete: %d auto-fixable (%.1f%%), %d not auto-fixable",
|
|
309
|
+
total_fixable,
|
|
310
|
+
(total_fixable / len(findings) * 100) if findings else 0,
|
|
311
|
+
len(not_fixable),
|
|
312
|
+
)
|
|
313
|
+
|
|
314
|
+
return {
|
|
315
|
+
"status": "success",
|
|
316
|
+
"total_findings": len(findings),
|
|
317
|
+
"auto_fixable_count": total_fixable,
|
|
318
|
+
"not_fixable_count": len(not_fixable),
|
|
319
|
+
"fixable_by_action": fixable_by_action,
|
|
320
|
+
"not_fixable": not_fixable[:20],
|
|
321
|
+
"summary_by_action": self._summarize_by_action(fixable_by_action),
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
# ID: e5f6a7b8-c9d0-1234-ef12-345678901234
|
|
325
|
+
def _summarize_by_action(
|
|
326
|
+
self, fixable_by_action: dict[str, list[dict[str, Any]]]
|
|
327
|
+
) -> list[dict[str, Any]]:
|
|
328
|
+
"""Summarise fixable findings grouped by action."""
|
|
329
|
+
return [
|
|
330
|
+
{
|
|
331
|
+
"action": action,
|
|
332
|
+
"count": len(findings),
|
|
333
|
+
"files": list({f.get("file_path", "unknown") for f in findings})[:10],
|
|
334
|
+
"avg_confidence": (
|
|
335
|
+
sum(f["fix_confidence"] for f in findings) / len(findings)
|
|
336
|
+
if findings
|
|
337
|
+
else 0.0
|
|
338
|
+
),
|
|
339
|
+
}
|
|
340
|
+
for action, findings in sorted(
|
|
341
|
+
fixable_by_action.items(), key=lambda kv: len(kv[1]), reverse=True
|
|
342
|
+
)
|
|
343
|
+
]
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
# src/body/autonomy/micro_proposal_executor.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Service for validating and applying micro-proposals to enable safe, autonomous
|
|
5
|
+
changes to the CORE codebase, adhering to the micro_proposal_policy and
|
|
6
|
+
enforcing safe_by_default and reason_with_purpose principles.
|
|
7
|
+
|
|
8
|
+
Architectural rule:
|
|
9
|
+
- No direct filesystem mutations (write_text/unlink/mkdir/etc.) in this service.
|
|
10
|
+
- All mutations must go through FileHandler (IntentGuard enforced).
|
|
11
|
+
|
|
12
|
+
CONSTITUTIONAL COMPLIANCE:
|
|
13
|
+
- Searches for micro_proposal_policy in new .intent/ structure
|
|
14
|
+
- Uses FileHandler for all mutations (IntentGuard enforced)
|
|
15
|
+
- No direct .intent/ filesystem access
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import uuid
|
|
21
|
+
from dataclasses import dataclass
|
|
22
|
+
from pathlib import Path
|
|
23
|
+
|
|
24
|
+
from shared.infrastructure.storage.file_handler import FileHandler
|
|
25
|
+
from shared.logger import getLogger
|
|
26
|
+
from shared.models import CheckResult
|
|
27
|
+
from shared.path_utils import get_repo_root
|
|
28
|
+
from shared.processors.yaml_processor import strict_yaml_processor
|
|
29
|
+
from shared.utils.glob_match import matches_any_glob
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
logger = getLogger(__name__)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@dataclass
|
|
36
|
+
# ID: 5a5fabd4-5e30-48c6-ad4d-5702abbb22e8
|
|
37
|
+
class MicroProposal:
|
|
38
|
+
"""Internal data structure for a micro-proposal with target file, action, and content."""
|
|
39
|
+
|
|
40
|
+
file_path: str
|
|
41
|
+
action: str
|
|
42
|
+
content: str
|
|
43
|
+
validation_report_id: str | None = None
|
|
44
|
+
intent_bundle_id: str | None = None # Added for constitutional audit traceability
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
# ID: 91fbe5a7-9add-46b5-9443-c9759e49fa28
|
|
48
|
+
class MicroProposalExecutor:
|
|
49
|
+
"""
|
|
50
|
+
Validates and applies micro-proposals for safe, autonomous changes as defined
|
|
51
|
+
by micro_proposal_policy, ensuring compliance with safe_by_default and
|
|
52
|
+
reason_with_purpose principles.
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
def __init__(self, repo_root: Path | None = None) -> None:
|
|
56
|
+
"""
|
|
57
|
+
Initialize the executor with the repository root and load the policy.
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
repo_root: Path to the repository root, defaults to detected root.
|
|
61
|
+
"""
|
|
62
|
+
self.repo_root = (repo_root or get_repo_root()).resolve()
|
|
63
|
+
|
|
64
|
+
# FIXED: Search for policy in new .intent/ structure
|
|
65
|
+
# Try multiple possible locations
|
|
66
|
+
possible_paths = [
|
|
67
|
+
self.repo_root / ".intent/phases/micro_proposal_policy.yaml",
|
|
68
|
+
self.repo_root / ".intent/workflows/micro_proposal_policy.yaml",
|
|
69
|
+
self.repo_root / ".intent/rules/will/micro_proposal_policy.json",
|
|
70
|
+
self.repo_root
|
|
71
|
+
/ ".intent/rules/will/autonomy.json", # May be embedded in autonomy rules
|
|
72
|
+
]
|
|
73
|
+
|
|
74
|
+
self.policy_path = None
|
|
75
|
+
for path in possible_paths:
|
|
76
|
+
if path.exists():
|
|
77
|
+
self.policy_path = path
|
|
78
|
+
logger.debug("Found micro_proposal_policy at: %s", path)
|
|
79
|
+
break
|
|
80
|
+
|
|
81
|
+
if not self.policy_path:
|
|
82
|
+
logger.warning(
|
|
83
|
+
"micro_proposal_policy not found in any expected location, using empty policy"
|
|
84
|
+
)
|
|
85
|
+
self.policy = {"policy_id": "micro_proposal_policy", "rules": []}
|
|
86
|
+
else:
|
|
87
|
+
self.policy = self._load_policy()
|
|
88
|
+
|
|
89
|
+
# Mutation surface (IntentGuard enforced inside)
|
|
90
|
+
self.fs = FileHandler(str(self.repo_root))
|
|
91
|
+
|
|
92
|
+
logger.debug("MicroProposalExecutor initialized (repo_root=%s)", self.repo_root)
|
|
93
|
+
|
|
94
|
+
def _load_policy(self) -> dict:
|
|
95
|
+
"""
|
|
96
|
+
Load and validate the micro_proposal_policy.
|
|
97
|
+
|
|
98
|
+
Returns:
|
|
99
|
+
Dict: The parsed policy content.
|
|
100
|
+
|
|
101
|
+
Raises:
|
|
102
|
+
ValueError: If the policy file is missing or invalid.
|
|
103
|
+
"""
|
|
104
|
+
if not self.policy_path:
|
|
105
|
+
return {"policy_id": "micro_proposal_policy", "rules": []}
|
|
106
|
+
|
|
107
|
+
try:
|
|
108
|
+
policy = strict_yaml_processor.load_strict(self.policy_path)
|
|
109
|
+
if not policy:
|
|
110
|
+
raise ValueError("Micro-proposal policy is empty or invalid")
|
|
111
|
+
return policy
|
|
112
|
+
except ValueError as e:
|
|
113
|
+
logger.error("Failed to load micro-proposal policy: %s", e)
|
|
114
|
+
raise
|
|
115
|
+
|
|
116
|
+
def _check_safe_actions(self, action: str) -> CheckResult:
|
|
117
|
+
"""
|
|
118
|
+
Verify if the action is in the allowed_actions list.
|
|
119
|
+
"""
|
|
120
|
+
safe_actions_rule = next(
|
|
121
|
+
(
|
|
122
|
+
rule
|
|
123
|
+
for rule in self.policy.get("rules", [])
|
|
124
|
+
if rule.get("id") == "safe_actions"
|
|
125
|
+
),
|
|
126
|
+
None,
|
|
127
|
+
)
|
|
128
|
+
allowed = (safe_actions_rule or {}).get("allowed_actions", []) or []
|
|
129
|
+
if action not in allowed:
|
|
130
|
+
return CheckResult(
|
|
131
|
+
policy_id=self.policy.get("policy_id", "micro_proposal_policy"),
|
|
132
|
+
rule_id="safe_actions",
|
|
133
|
+
severity="error",
|
|
134
|
+
message=f"Action '{action}' is not in allowed actions",
|
|
135
|
+
path=None,
|
|
136
|
+
)
|
|
137
|
+
return CheckResult(
|
|
138
|
+
policy_id=self.policy.get("policy_id", "micro_proposal_policy"),
|
|
139
|
+
rule_id="safe_actions",
|
|
140
|
+
severity="pass",
|
|
141
|
+
message=f"Action '{action}' is allowed",
|
|
142
|
+
path=None,
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
def _check_safe_paths(self, file_path: str) -> CheckResult:
|
|
146
|
+
"""
|
|
147
|
+
Verify if the file_path matches allowed patterns and does not match forbidden patterns.
|
|
148
|
+
"""
|
|
149
|
+
# This module historically validated paths via policy rules, but the repo also
|
|
150
|
+
# enforces a second gate at mutation-time (IntentGuard inside FileHandler).
|
|
151
|
+
safe_paths_rule = next(
|
|
152
|
+
(
|
|
153
|
+
rule
|
|
154
|
+
for rule in self.policy.get("rules", [])
|
|
155
|
+
if rule.get("id") == "safe_paths"
|
|
156
|
+
),
|
|
157
|
+
None,
|
|
158
|
+
)
|
|
159
|
+
allowed_patterns = (safe_paths_rule or {}).get("allowed_paths", []) or []
|
|
160
|
+
forbidden_patterns = (safe_paths_rule or {}).get("forbidden_paths", []) or []
|
|
161
|
+
|
|
162
|
+
# Normalize to repo-relative for evaluation
|
|
163
|
+
rel = self._normalize_to_repo_rel(file_path)
|
|
164
|
+
|
|
165
|
+
# Glob matching uses gitignore semantics via shared helper (ADR-012)
|
|
166
|
+
if forbidden_patterns and matches_any_glob(rel, forbidden_patterns):
|
|
167
|
+
return CheckResult(
|
|
168
|
+
policy_id=self.policy.get("policy_id", "micro_proposal_policy"),
|
|
169
|
+
rule_id="safe_paths",
|
|
170
|
+
severity="error",
|
|
171
|
+
message=f"File path '{rel}' matches a forbidden pattern",
|
|
172
|
+
path=rel,
|
|
173
|
+
)
|
|
174
|
+
if allowed_patterns and not matches_any_glob(rel, allowed_patterns):
|
|
175
|
+
return CheckResult(
|
|
176
|
+
policy_id=self.policy.get("policy_id", "micro_proposal_policy"),
|
|
177
|
+
rule_id="safe_paths",
|
|
178
|
+
severity="error",
|
|
179
|
+
message=f"File path '{rel}' does not match any allowed pattern",
|
|
180
|
+
path=rel,
|
|
181
|
+
)
|
|
182
|
+
return CheckResult(
|
|
183
|
+
policy_id=self.policy.get("policy_id", "micro_proposal_policy"),
|
|
184
|
+
rule_id="safe_paths",
|
|
185
|
+
severity="pass",
|
|
186
|
+
message=f"File path '{rel}' is allowed",
|
|
187
|
+
path=rel,
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
def _check_validation_report(self, report_id: str | None) -> CheckResult:
|
|
191
|
+
"""
|
|
192
|
+
Verify if a validation report ID is provided and valid (placeholder).
|
|
193
|
+
"""
|
|
194
|
+
if not report_id:
|
|
195
|
+
return CheckResult(
|
|
196
|
+
policy_id=self.policy.get("policy_id", "micro_proposal_policy"),
|
|
197
|
+
rule_id="require_validation",
|
|
198
|
+
severity="error",
|
|
199
|
+
message="No validation report ID provided",
|
|
200
|
+
path=None,
|
|
201
|
+
)
|
|
202
|
+
return CheckResult(
|
|
203
|
+
policy_id=self.policy.get("policy_id", "micro_proposal_policy"),
|
|
204
|
+
rule_id="require_validation",
|
|
205
|
+
severity="pass",
|
|
206
|
+
message=f"Validation report '{report_id}' accepted (placeholder)",
|
|
207
|
+
path=None,
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
# ID: 8e521e21-2ee8-4890-8e1a-be92893f4d61
|
|
211
|
+
def validate_proposal(self, proposal: MicroProposal) -> list[CheckResult]:
|
|
212
|
+
"""
|
|
213
|
+
Validate a micro-proposal against safe_actions, safe_paths, and
|
|
214
|
+
require_validation rules from micro_proposal_policy.
|
|
215
|
+
"""
|
|
216
|
+
results: list[CheckResult] = []
|
|
217
|
+
logger.debug(
|
|
218
|
+
"Validating micro-proposal for action '%s' on '%s'",
|
|
219
|
+
proposal.action,
|
|
220
|
+
proposal.file_path,
|
|
221
|
+
)
|
|
222
|
+
results.append(self._check_safe_actions(proposal.action))
|
|
223
|
+
results.append(self._check_safe_paths(proposal.file_path))
|
|
224
|
+
results.append(self._check_validation_report(proposal.validation_report_id))
|
|
225
|
+
|
|
226
|
+
errors = [r for r in results if r.severity == "error"]
|
|
227
|
+
if errors:
|
|
228
|
+
logger.error(
|
|
229
|
+
"Micro-proposal validation failed: %s",
|
|
230
|
+
[(r.rule_id, r.message) for r in errors],
|
|
231
|
+
)
|
|
232
|
+
else:
|
|
233
|
+
logger.info("Micro-proposal passed all validation checks")
|
|
234
|
+
return results
|
|
235
|
+
|
|
236
|
+
def _normalize_to_repo_rel(self, file_path: str) -> str:
|
|
237
|
+
"""
|
|
238
|
+
Convert file_path into a repo-relative path (string), rejecting escapes.
|
|
239
|
+
Supports:
|
|
240
|
+
- repo-relative paths like 'src/x.py'
|
|
241
|
+
- absolute paths under repo_root like '/opt/dev/CORE/src/x.py'
|
|
242
|
+
"""
|
|
243
|
+
raw = str(file_path).strip()
|
|
244
|
+
|
|
245
|
+
# Treat empty as invalid early (prevents writing to repo root by mistake)
|
|
246
|
+
if not raw:
|
|
247
|
+
raise ValueError("Proposal file_path is empty")
|
|
248
|
+
|
|
249
|
+
p = Path(raw)
|
|
250
|
+
|
|
251
|
+
if p.is_absolute():
|
|
252
|
+
try:
|
|
253
|
+
rel = p.resolve().relative_to(self.repo_root)
|
|
254
|
+
except ValueError as e:
|
|
255
|
+
raise ValueError(f"Absolute path is outside repo_root: {p}") from e
|
|
256
|
+
return str(rel).lstrip("./")
|
|
257
|
+
|
|
258
|
+
# Relative: normalize and ensure it stays within repo_root when resolved
|
|
259
|
+
candidate = (self.repo_root / p).resolve()
|
|
260
|
+
try:
|
|
261
|
+
rel = candidate.relative_to(self.repo_root)
|
|
262
|
+
except ValueError as e:
|
|
263
|
+
raise ValueError(f"Relative path escapes repo_root: {raw}") from e
|
|
264
|
+
|
|
265
|
+
return str(rel).lstrip("./")
|
|
266
|
+
|
|
267
|
+
# ID: d9dcf58e-224a-4971-bab0-750913c3c3e8
|
|
268
|
+
async def apply_proposal(self, proposal: MicroProposal) -> bool:
|
|
269
|
+
"""
|
|
270
|
+
Apply a validated micro-proposal by executing the specified action.
|
|
271
|
+
|
|
272
|
+
Policy:
|
|
273
|
+
- Validation first
|
|
274
|
+
- Log intent_bundle_id
|
|
275
|
+
- Write only via FileHandler (IntentGuard enforced)
|
|
276
|
+
"""
|
|
277
|
+
validation_results = self.validate_proposal(proposal)
|
|
278
|
+
if any(result.severity == "error" for result in validation_results):
|
|
279
|
+
logger.error("Cannot apply proposal due to validation errors")
|
|
280
|
+
return False
|
|
281
|
+
|
|
282
|
+
# Constitutional requirement: Generate and log IntentBundle ID before write operations
|
|
283
|
+
if not proposal.intent_bundle_id:
|
|
284
|
+
proposal.intent_bundle_id = str(uuid.uuid4())
|
|
285
|
+
|
|
286
|
+
logger.info(
|
|
287
|
+
"Applying micro-proposal with intent_bundle_id: %s",
|
|
288
|
+
proposal.intent_bundle_id,
|
|
289
|
+
)
|
|
290
|
+
|
|
291
|
+
try:
|
|
292
|
+
rel_target = self._normalize_to_repo_rel(proposal.file_path)
|
|
293
|
+
|
|
294
|
+
if proposal.action in {
|
|
295
|
+
"autonomy.self_healing.format_code",
|
|
296
|
+
"autonomy.self_healing.fix_docstrings",
|
|
297
|
+
"autonomy.self_healing.fix_headers",
|
|
298
|
+
}:
|
|
299
|
+
logger.info(
|
|
300
|
+
"Writing changes for intent_bundle_id: %s to %s",
|
|
301
|
+
proposal.intent_bundle_id,
|
|
302
|
+
rel_target,
|
|
303
|
+
)
|
|
304
|
+
|
|
305
|
+
# IMPORTANT: mutation via governed surface (IntentGuard blocks .intent/**)
|
|
306
|
+
self.fs.write_runtime_text(rel_target, proposal.content)
|
|
307
|
+
|
|
308
|
+
logger.info("Applied %s to %s", proposal.action, rel_target)
|
|
309
|
+
return True
|
|
310
|
+
|
|
311
|
+
logger.error("Unsupported action: %s", proposal.action)
|
|
312
|
+
return False
|
|
313
|
+
|
|
314
|
+
except Exception as e:
|
|
315
|
+
logger.error("Failed to apply micro-proposal: %s", e)
|
|
316
|
+
return False
|