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
body/atomic/registry.py
ADDED
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
# src/body/atomic/registry.py
|
|
2
|
+
"""
|
|
3
|
+
Atomic Actions Registry - Constitutional Action Definitions
|
|
4
|
+
|
|
5
|
+
Every action in CORE is:
|
|
6
|
+
1. Independently executable
|
|
7
|
+
2. Constitutionally governed
|
|
8
|
+
3. Returns ActionResult
|
|
9
|
+
4. Composable into workflows
|
|
10
|
+
5. Auditable and traceable
|
|
11
|
+
|
|
12
|
+
UNIX Philosophy: Each action does ONE thing well.
|
|
13
|
+
|
|
14
|
+
CONSTITUTIONAL ENFORCEMENT:
|
|
15
|
+
This module enforces .intent/rules/architecture/atomic_actions.json at registration time.
|
|
16
|
+
Actions that violate constitutional rules CANNOT be registered.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
import inspect
|
|
22
|
+
from collections.abc import Awaitable, Callable
|
|
23
|
+
from dataclasses import dataclass, field
|
|
24
|
+
from enum import Enum
|
|
25
|
+
|
|
26
|
+
from shared.action_types import ActionResult
|
|
27
|
+
from shared.logger import getLogger
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
logger = getLogger(__name__)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
# ID: 9e2f7a1c-4b8d-4e6f-a3c2-1d5b8f0a4e9c
|
|
34
|
+
class ConstitutionalError(RuntimeError):
|
|
35
|
+
"""Raised when the action registry violates a constitutional invariant."""
|
|
36
|
+
|
|
37
|
+
pass
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# ID: 6166d4ed-db63-4363-95c3-504ef1b9a3e0
|
|
41
|
+
class ActionCategory(str, Enum):
|
|
42
|
+
"""Constitutional action categories."""
|
|
43
|
+
|
|
44
|
+
FIX = "fix" # Code remediation
|
|
45
|
+
SYNC = "sync" # State synchronization
|
|
46
|
+
CHECK = "check" # Validation/audit
|
|
47
|
+
BUILD = "build" # Construction
|
|
48
|
+
STATE = "state" # State machine transitions
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@dataclass
|
|
52
|
+
# ID: 89f5c3e2-1a47-4c8d-9e57-2c6e4a8f3b1d
|
|
53
|
+
class ActionDefinition:
|
|
54
|
+
"""
|
|
55
|
+
Constitutional metadata for an atomic action.
|
|
56
|
+
|
|
57
|
+
Every action must declare:
|
|
58
|
+
- What it does (description)
|
|
59
|
+
- What policies govern it (policies)
|
|
60
|
+
- What category it belongs to (category)
|
|
61
|
+
- What impact level it has (impact_level)
|
|
62
|
+
- Which audit check_ids it can remediate (remediates)
|
|
63
|
+
"""
|
|
64
|
+
|
|
65
|
+
action_id: str
|
|
66
|
+
"""Unique action identifier (e.g., 'fix.format', 'sync.db')"""
|
|
67
|
+
|
|
68
|
+
description: str
|
|
69
|
+
"""Human-readable description of what this action does"""
|
|
70
|
+
|
|
71
|
+
category: ActionCategory
|
|
72
|
+
"""Constitutional category"""
|
|
73
|
+
|
|
74
|
+
policies: list[str]
|
|
75
|
+
"""Policy IDs that govern this action"""
|
|
76
|
+
|
|
77
|
+
executor: Callable[..., Awaitable[ActionResult]]
|
|
78
|
+
"""Async function that executes the action"""
|
|
79
|
+
|
|
80
|
+
impact_level: str = ""
|
|
81
|
+
"""
|
|
82
|
+
Impact level: 'safe', 'moderate', 'dangerous'.
|
|
83
|
+
|
|
84
|
+
Defaults to "" — overlaid at executor init from
|
|
85
|
+
.intent/enforcement/config/action_risk.yaml via
|
|
86
|
+
ActionRegistry.apply_risk_config(). Never authored in code.
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
requires_db: bool = False
|
|
90
|
+
"""Whether this action requires database access"""
|
|
91
|
+
|
|
92
|
+
requires_vectors: bool = False
|
|
93
|
+
"""Whether this action requires vector store access"""
|
|
94
|
+
|
|
95
|
+
remediates: list[str] = field(default_factory=list)
|
|
96
|
+
"""
|
|
97
|
+
Audit check IDs this action can autonomously remediate.
|
|
98
|
+
|
|
99
|
+
ViolationRemediatorWorker uses this to map Blackboard findings
|
|
100
|
+
to actions without any static YAML mapping.
|
|
101
|
+
|
|
102
|
+
Example: ["purity.stable_id_anchor", "linkage.assign_ids"]
|
|
103
|
+
"""
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
# ID: 7f4b2c8e-9d3a-4e1f-8c7d-5a2b3c4d5e6f
|
|
107
|
+
class ActionRegistry:
|
|
108
|
+
"""
|
|
109
|
+
Global registry of all atomic actions in CORE.
|
|
110
|
+
|
|
111
|
+
Actions are registered at module load time and can be:
|
|
112
|
+
- Executed individually via CLI
|
|
113
|
+
- Composed into workflows
|
|
114
|
+
- Validated against constitutional policies
|
|
115
|
+
- Audited for compliance
|
|
116
|
+
- Looked up by the check_ids they remediate
|
|
117
|
+
"""
|
|
118
|
+
|
|
119
|
+
def __init__(self):
|
|
120
|
+
self._actions: dict[str, ActionDefinition] = {}
|
|
121
|
+
# Reverse index: check_id -> action_id for O(1) remediation lookup
|
|
122
|
+
self._remediates_index: dict[str, str] = {}
|
|
123
|
+
|
|
124
|
+
# ID: 2a3b4c5d-6e7f-8a9b-0c1d-2e3f4a5b6c7d
|
|
125
|
+
def register(self, definition: ActionDefinition) -> None:
|
|
126
|
+
"""Register an action definition."""
|
|
127
|
+
if definition.action_id in self._actions:
|
|
128
|
+
raise ValueError(f"Action already registered: {definition.action_id}")
|
|
129
|
+
self._actions[definition.action_id] = definition
|
|
130
|
+
|
|
131
|
+
# Build reverse index for remediation lookup
|
|
132
|
+
for check_id in definition.remediates:
|
|
133
|
+
if check_id in self._remediates_index:
|
|
134
|
+
logger.warning(
|
|
135
|
+
"check_id '%s' already claimed by action '%s', "
|
|
136
|
+
"skipping claim by '%s'",
|
|
137
|
+
check_id,
|
|
138
|
+
self._remediates_index[check_id],
|
|
139
|
+
definition.action_id,
|
|
140
|
+
)
|
|
141
|
+
else:
|
|
142
|
+
self._remediates_index[check_id] = definition.action_id
|
|
143
|
+
|
|
144
|
+
# ID: 3b4c5d6e-7f8a-9b0c-1d2e-3f4a5b6c7d8e
|
|
145
|
+
def get(self, action_id: str) -> ActionDefinition | None:
|
|
146
|
+
"""Get action definition by ID."""
|
|
147
|
+
return self._actions.get(action_id)
|
|
148
|
+
|
|
149
|
+
# ID: 8a9b0c1d-2e3f-4a5b-6c7d-8e9f0a1b2c3d
|
|
150
|
+
def get_by_check_id(self, check_id: str) -> ActionDefinition | None:
|
|
151
|
+
"""
|
|
152
|
+
Look up the action that remediates the given audit check_id.
|
|
153
|
+
|
|
154
|
+
Used by ViolationRemediatorWorker to map Blackboard findings
|
|
155
|
+
directly to executable actions — no static YAML required.
|
|
156
|
+
|
|
157
|
+
Returns None if no registered action claims this check_id.
|
|
158
|
+
"""
|
|
159
|
+
action_id = self._remediates_index.get(check_id)
|
|
160
|
+
if not action_id:
|
|
161
|
+
return None
|
|
162
|
+
return self._actions.get(action_id)
|
|
163
|
+
|
|
164
|
+
# ID: 4c5d6e7f-8a9b-0c1d-2e3f-4a5b6c7d8e9f
|
|
165
|
+
def get_by_category(self, category: ActionCategory) -> list[ActionDefinition]:
|
|
166
|
+
"""Get all actions in a category."""
|
|
167
|
+
return [a for a in self._actions.values() if a.category == category]
|
|
168
|
+
|
|
169
|
+
# ID: 5d6e7f8a-9b0c-1d2e-3f4a-5b6c7d8e9f0a
|
|
170
|
+
def list_all(self) -> list[ActionDefinition]:
|
|
171
|
+
"""List all registered actions."""
|
|
172
|
+
return list(self._actions.values())
|
|
173
|
+
|
|
174
|
+
# ID: 7f1e3a8c-2b9d-4f6e-a5c1-3b7e9d2f4a6b
|
|
175
|
+
def apply_risk_config(self, mapping: dict[str, str]) -> None:
|
|
176
|
+
"""
|
|
177
|
+
Overlay impact_level on every registered action from the policy
|
|
178
|
+
mapping loaded from .intent/enforcement/config/action_risk.yaml.
|
|
179
|
+
|
|
180
|
+
Raises ConstitutionalError if any registered action_id is absent
|
|
181
|
+
from the mapping — every action must have a governed
|
|
182
|
+
classification.
|
|
183
|
+
"""
|
|
184
|
+
missing: list[str] = [
|
|
185
|
+
action_id for action_id in self._actions if action_id not in mapping
|
|
186
|
+
]
|
|
187
|
+
if missing:
|
|
188
|
+
raise ConstitutionalError(
|
|
189
|
+
f"action_risk policy is missing impact_level for "
|
|
190
|
+
f"registered actions: {sorted(missing)}. "
|
|
191
|
+
f"Add them to .intent/enforcement/config/action_risk.yaml."
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
for action_id, definition in self._actions.items():
|
|
195
|
+
definition.impact_level = mapping[action_id]
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
# Global singleton registry
|
|
199
|
+
action_registry = ActionRegistry()
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
# ID: a516c041-becf-4f13-b970-b1a2e31631dc
|
|
203
|
+
def _validate_action_signature(func: Callable[..., Awaitable[ActionResult]]) -> None:
|
|
204
|
+
"""
|
|
205
|
+
Validate function signature against constitutional requirements.
|
|
206
|
+
|
|
207
|
+
Enforces .intent/rules/architecture/atomic_actions.json:
|
|
208
|
+
- atomic_actions.must_return_action_result
|
|
209
|
+
- atomic_actions.must_have_decorator
|
|
210
|
+
- atomic_actions.no_governance_bypass
|
|
211
|
+
|
|
212
|
+
Note: the **kwargs absorption invariant (issue #448) is enforced inside
|
|
213
|
+
the @atomic_action decorator itself, not here — since must_have_decorator
|
|
214
|
+
above guarantees @atomic_action has already run on every registered
|
|
215
|
+
function, the kwargs check has already fired by the time control
|
|
216
|
+
reaches this validator.
|
|
217
|
+
|
|
218
|
+
Raises:
|
|
219
|
+
TypeError: If function signature violates constitutional rules
|
|
220
|
+
"""
|
|
221
|
+
func_name = func.__name__
|
|
222
|
+
|
|
223
|
+
sig = inspect.signature(func)
|
|
224
|
+
return_annotation = sig.return_annotation
|
|
225
|
+
|
|
226
|
+
if return_annotation is inspect.Signature.empty:
|
|
227
|
+
raise TypeError(
|
|
228
|
+
f"Constitutional violation in '{func_name}': "
|
|
229
|
+
f"Missing return type annotation. "
|
|
230
|
+
f"Rule: atomic_actions.must_return_action_result. "
|
|
231
|
+
f"Required: '-> ActionResult'"
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
is_action_result = False
|
|
235
|
+
|
|
236
|
+
if return_annotation is ActionResult:
|
|
237
|
+
is_action_result = True
|
|
238
|
+
elif isinstance(return_annotation, str):
|
|
239
|
+
if return_annotation == "ActionResult":
|
|
240
|
+
is_action_result = True
|
|
241
|
+
elif hasattr(return_annotation, "__name__"):
|
|
242
|
+
if return_annotation.__name__ == "ActionResult":
|
|
243
|
+
is_action_result = True
|
|
244
|
+
|
|
245
|
+
if not is_action_result:
|
|
246
|
+
raise TypeError(
|
|
247
|
+
f"Constitutional violation in '{func_name}': "
|
|
248
|
+
f"Return type must be 'ActionResult', got '{return_annotation}'. "
|
|
249
|
+
f"Rule: atomic_actions.must_return_action_result. "
|
|
250
|
+
f"Tuple returns like (bool, str) are explicitly forbidden."
|
|
251
|
+
)
|
|
252
|
+
|
|
253
|
+
has_atomic_decorator = hasattr(func, "_atomic_action_metadata")
|
|
254
|
+
|
|
255
|
+
if not has_atomic_decorator:
|
|
256
|
+
raise TypeError(
|
|
257
|
+
f"Constitutional violation in '{func_name}': "
|
|
258
|
+
f"Missing @atomic_action decorator. "
|
|
259
|
+
f"Rule: atomic_actions.must_have_decorator. "
|
|
260
|
+
f"Required: @atomic_action(action_id=..., intent=..., impact=..., policies=[...])"
|
|
261
|
+
)
|
|
262
|
+
|
|
263
|
+
logger.debug(
|
|
264
|
+
"Constitutional validation passed for action '%s': "
|
|
265
|
+
"return type=ActionResult, has @atomic_action decorator",
|
|
266
|
+
func_name,
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
# ID: 6e7f8a9b-0c1d-2e3f-4a5b-6c7d8e9f0a1b
|
|
271
|
+
def register_action(
|
|
272
|
+
action_id: str,
|
|
273
|
+
description: str,
|
|
274
|
+
category: ActionCategory,
|
|
275
|
+
policies: list[str],
|
|
276
|
+
requires_db: bool = False,
|
|
277
|
+
requires_vectors: bool = False,
|
|
278
|
+
remediates: list[str] | None = None,
|
|
279
|
+
):
|
|
280
|
+
"""
|
|
281
|
+
Decorator to register an action with constitutional enforcement.
|
|
282
|
+
|
|
283
|
+
CONSTITUTIONAL ENFORCEMENT:
|
|
284
|
+
This decorator enforces .intent/rules/architecture/atomic_actions.json at
|
|
285
|
+
module import time. Functions that violate constitutional rules will cause
|
|
286
|
+
the module import to fail with a TypeError.
|
|
287
|
+
|
|
288
|
+
Impact level is NOT a parameter here. It is governed externally via
|
|
289
|
+
.intent/enforcement/config/action_risk.yaml and overlaid onto each
|
|
290
|
+
ActionDefinition at executor init by ActionRegistry.apply_risk_config().
|
|
291
|
+
See ADR-008.
|
|
292
|
+
|
|
293
|
+
Args:
|
|
294
|
+
remediates: List of audit check_ids this action can fix autonomously.
|
|
295
|
+
ViolationRemediatorWorker uses this to close the audit loop
|
|
296
|
+
without any static YAML mapping. Example:
|
|
297
|
+
remediates=["purity.stable_id_anchor", "linkage.assign_ids"]
|
|
298
|
+
"""
|
|
299
|
+
|
|
300
|
+
# ID: 5352e0e1-0d42-40e8-8ccb-7437a5c5fa18
|
|
301
|
+
def decorator(func: Callable[..., Awaitable[ActionResult]]):
|
|
302
|
+
try:
|
|
303
|
+
_validate_action_signature(func)
|
|
304
|
+
except TypeError as e:
|
|
305
|
+
raise TypeError(f"Cannot register action '{action_id}': {e}") from e
|
|
306
|
+
|
|
307
|
+
definition = ActionDefinition(
|
|
308
|
+
action_id=action_id,
|
|
309
|
+
description=description,
|
|
310
|
+
category=category,
|
|
311
|
+
policies=policies,
|
|
312
|
+
executor=func,
|
|
313
|
+
requires_db=requires_db,
|
|
314
|
+
requires_vectors=requires_vectors,
|
|
315
|
+
remediates=remediates or [],
|
|
316
|
+
)
|
|
317
|
+
action_registry.register(definition)
|
|
318
|
+
|
|
319
|
+
logger.info(
|
|
320
|
+
"Action '%s' registered successfully with constitutional compliance",
|
|
321
|
+
action_id,
|
|
322
|
+
)
|
|
323
|
+
|
|
324
|
+
return func
|
|
325
|
+
|
|
326
|
+
return decorator
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# src/body/atomic/remediate_cognitive_role.py
|
|
2
|
+
"""
|
|
3
|
+
Atomic action for remediating ai.cognitive_role.no_hardcoded_string violations.
|
|
4
|
+
|
|
5
|
+
This action bridges audit findings to the CallSiteRewriter worker by:
|
|
6
|
+
1. Taking audit.violation findings for cognitive role rules
|
|
7
|
+
2. Preparing prompt.artifact finding data for the calling Worker to post
|
|
8
|
+
via self.post_finding()
|
|
9
|
+
3. Triggering the rewriter to fix the hardcoded strings
|
|
10
|
+
|
|
11
|
+
The action does not write to the blackboard itself — ADR-011 requires
|
|
12
|
+
that all blackboard writes flow through Worker attribution. The calling
|
|
13
|
+
Worker (ProposalConsumerWorker) posts the finding described in
|
|
14
|
+
ActionResult.data["finding_to_post"].
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
from typing import Any
|
|
20
|
+
|
|
21
|
+
from body.atomic.registry import ActionCategory, register_action
|
|
22
|
+
from shared.action_types import ActionImpact, ActionResult
|
|
23
|
+
from shared.atomic_action import atomic_action
|
|
24
|
+
from shared.logger import getLogger
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
logger = getLogger(__name__)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@register_action(
|
|
31
|
+
action_id="remediate.cognitive_role",
|
|
32
|
+
description="Fix hardcoded cognitive role strings (Architect, Coder, etc.) in source files",
|
|
33
|
+
category=ActionCategory.FIX,
|
|
34
|
+
policies=[
|
|
35
|
+
"governance.dangerous_execution_primitives",
|
|
36
|
+
"autonomy.tracing.mandatory",
|
|
37
|
+
],
|
|
38
|
+
requires_db=False, # Action no longer touches the DB; caller posts the finding
|
|
39
|
+
requires_vectors=False,
|
|
40
|
+
remediates=[
|
|
41
|
+
"ai.cognitive_role.no_hardcoded_string",
|
|
42
|
+
# Add other related check_ids here if they exist
|
|
43
|
+
],
|
|
44
|
+
)
|
|
45
|
+
@atomic_action(
|
|
46
|
+
action_id="remediate.cognitive_role",
|
|
47
|
+
intent="Prepare prompt.artifact finding for hardcoded cognitive-role strings",
|
|
48
|
+
impact=ActionImpact.READ_ONLY,
|
|
49
|
+
policies=["atomic_actions"],
|
|
50
|
+
)
|
|
51
|
+
# ID: bf9420e3-f4ca-4cdf-aa11-7a9ecfa2a050
|
|
52
|
+
async def remediate_cognitive_role(
|
|
53
|
+
file_path: str | None = None,
|
|
54
|
+
line_number: int | None = None,
|
|
55
|
+
rule: str = "ai.cognitive_role.no_hardcoded_string",
|
|
56
|
+
prompt_text: str = "",
|
|
57
|
+
**kwargs: Any,
|
|
58
|
+
) -> ActionResult:
|
|
59
|
+
"""
|
|
60
|
+
Prepare prompt.artifact finding data for the calling Worker to post.
|
|
61
|
+
|
|
62
|
+
This action is called by the proposal system when violations are found.
|
|
63
|
+
It does NOT write to the blackboard itself — per ADR-011, all blackboard
|
|
64
|
+
writes must flow through Worker attribution. The action constructs the
|
|
65
|
+
finding shape (subject + payload) and returns it in
|
|
66
|
+
ActionResult.data["finding_to_post"]; ProposalConsumerWorker posts via
|
|
67
|
+
self.post_finding() as part of its post-execution handling.
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
file_path: Path to the file containing the violation
|
|
71
|
+
line_number: Line number where violation occurs (optional)
|
|
72
|
+
rule: The specific rule being violated
|
|
73
|
+
prompt_text: The hardcoded role string that was found
|
|
74
|
+
**kwargs: Additional parameters
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
ActionResult with finding_to_post in data for the caller to post.
|
|
78
|
+
"""
|
|
79
|
+
if not file_path:
|
|
80
|
+
return ActionResult.failure(
|
|
81
|
+
message="Missing required parameter: file_path", data={"rule": rule}
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
payload = {
|
|
85
|
+
"file_path": file_path,
|
|
86
|
+
"line_number": line_number,
|
|
87
|
+
"artifact_name": "cognitive_role_string",
|
|
88
|
+
"rule": rule,
|
|
89
|
+
"prompt_text": prompt_text,
|
|
90
|
+
"input_vars": [], # No input vars for this type
|
|
91
|
+
"severity": "error",
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return ActionResult.success(
|
|
95
|
+
message=f"Prepared prompt.artifact finding for {file_path}",
|
|
96
|
+
data={
|
|
97
|
+
"finding_to_post": {
|
|
98
|
+
"subject": f"prompt.artifact::{file_path}",
|
|
99
|
+
"payload": payload,
|
|
100
|
+
},
|
|
101
|
+
"file_path": file_path,
|
|
102
|
+
"rule": rule,
|
|
103
|
+
},
|
|
104
|
+
)
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
# src/body/atomic/sandbox_lifecycle.py
|
|
2
|
+
"""
|
|
3
|
+
SandboxLifecycle — ADR-071 D2.2 sandbox decision + copy-back subsystem.
|
|
4
|
+
|
|
5
|
+
Extracted from ActionExecutor (2026-06-01). The "decide whether to sandbox
|
|
6
|
+
this execution" logic and the "copy worktree mutations back to main tree"
|
|
7
|
+
logic are one cohesive subsystem — both gated on the same ADR-071 D2.2
|
|
8
|
+
conditions, both operating on the same `ScopedGitService` instance, both
|
|
9
|
+
sharing the same conflict/no-deletion safety contract.
|
|
10
|
+
|
|
11
|
+
Co-locating them here keeps ActionExecutor focused on its single
|
|
12
|
+
constitutional responsibility — orchestrating the policy/auth/exec/hooks/
|
|
13
|
+
audit pipeline — and gives the sandbox subsystem a name that matches what
|
|
14
|
+
it is. No behavioral change vs. the in-class implementation; ActionExecutor
|
|
15
|
+
constructs one SandboxLifecycle and delegates two call sites to it.
|
|
16
|
+
|
|
17
|
+
LAYER: body/atomic — execution-infrastructure helper. No LLM, no rule
|
|
18
|
+
evaluation. Reads from CoreContext (git_service, file_handler); writes
|
|
19
|
+
only through FileHandler.write_validated_bytes (ADR-021 commit_paths
|
|
20
|
+
boundary preserved).
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
from __future__ import annotations
|
|
24
|
+
|
|
25
|
+
import dataclasses
|
|
26
|
+
from typing import TYPE_CHECKING, Any
|
|
27
|
+
|
|
28
|
+
from body.atomic.registry import ActionDefinition
|
|
29
|
+
from shared.action_types import ActionImpact
|
|
30
|
+
from shared.logger import getLogger
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
if TYPE_CHECKING:
|
|
34
|
+
from shared.context import CoreContext
|
|
35
|
+
|
|
36
|
+
logger = getLogger(__name__)
|
|
37
|
+
|
|
38
|
+
# ADR-071 D2.2 Phase 2: action impacts that warrant hermetic worktree
|
|
39
|
+
# sandboxing. WRITE_DATA targets databases/external systems (not the
|
|
40
|
+
# source tree), so the worktree isolation does nothing for it.
|
|
41
|
+
_SANDBOXED_IMPACTS = frozenset({ActionImpact.WRITE_CODE, ActionImpact.WRITE_METADATA})
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
# ID: 8c112a60-ad77-431b-9825-dcdcc63afb55
|
|
45
|
+
class SandboxLifecycle:
|
|
46
|
+
"""
|
|
47
|
+
ADR-071 D2.2 sandbox decision + copy-back subsystem.
|
|
48
|
+
|
|
49
|
+
Two public methods, both operating on the same scoped-git instance:
|
|
50
|
+
|
|
51
|
+
- `build_execution_context` — decide whether to sandbox the about-to-run
|
|
52
|
+
action, and if so produce a scoped CoreContext with `git_service` and
|
|
53
|
+
`file_handler` repointed at a fresh ScopedGitService worktree.
|
|
54
|
+
|
|
55
|
+
- `propagate_changes` — after a successful sandboxed run, copy the
|
|
56
|
+
worktree's modified/untracked files back to the main tree through
|
|
57
|
+
`FileHandler.write_validated_bytes`, with a conflict check that
|
|
58
|
+
refuses to overwrite uncommitted main-tree changes (loud-failure
|
|
59
|
+
contract).
|
|
60
|
+
|
|
61
|
+
Both methods are pure delegations of subsystem state — they share no
|
|
62
|
+
in-flight state between calls. ActionExecutor holds the instance and
|
|
63
|
+
drives both call sites within a single `execute()` invocation, passing
|
|
64
|
+
the `scoped_git` handle between them.
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
def __init__(self, core_context: CoreContext):
|
|
68
|
+
"""
|
|
69
|
+
Initialize the sandbox subsystem against the main CoreContext.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
core_context: The main (unsandboxed) CoreContext. Used to
|
|
73
|
+
read `git_service` (worktree creation), `file_handler`
|
|
74
|
+
(copy-back target), and as the base for the scoped
|
|
75
|
+
context built per execution.
|
|
76
|
+
"""
|
|
77
|
+
self.core_context = core_context
|
|
78
|
+
|
|
79
|
+
# ID: a9b3e7c1-4d2f-4e85-9a17-6b8c3d5e7f12
|
|
80
|
+
def build_execution_context(
|
|
81
|
+
self,
|
|
82
|
+
definition: ActionDefinition,
|
|
83
|
+
write: bool,
|
|
84
|
+
pre_execution_sha: str | None,
|
|
85
|
+
) -> tuple[CoreContext, Any]:
|
|
86
|
+
"""Decide whether to sandbox this execution and build the context.
|
|
87
|
+
|
|
88
|
+
Returns (context_to_pass_to_action, scoped_git_or_None). When
|
|
89
|
+
sandboxing applies, the returned context is a shallow copy of
|
|
90
|
+
self.core_context with `git_service` and `file_handler` repointed
|
|
91
|
+
at a fresh ScopedGitService rooted at `pre_execution_sha`. The
|
|
92
|
+
caller MUST call `scoped_git.cleanup()` in a finally block.
|
|
93
|
+
|
|
94
|
+
Gate (all required):
|
|
95
|
+
- pre_execution_sha is not None (autonomous call path)
|
|
96
|
+
- write is True (dry-runs need no isolation)
|
|
97
|
+
- the action's @atomic_action metadata declares impact ∈
|
|
98
|
+
{WRITE_CODE, WRITE_METADATA}
|
|
99
|
+
|
|
100
|
+
Note on IntentGuard: the FileHandler constructor wires an
|
|
101
|
+
IntentGuard via get_intent_guard(), which is a process singleton
|
|
102
|
+
bound to the first repo_path it sees. A scoped FileHandler reuses
|
|
103
|
+
that singleton — paths are still validated against governance,
|
|
104
|
+
but using main-repo .intent/ state (the current governance frame)
|
|
105
|
+
rather than the worktree's snapshot. That's the correct default:
|
|
106
|
+
we want to honour governance as-of-now, not as-of-proposal.
|
|
107
|
+
"""
|
|
108
|
+
if (
|
|
109
|
+
pre_execution_sha is None
|
|
110
|
+
or not write
|
|
111
|
+
or self.core_context.git_service is None
|
|
112
|
+
):
|
|
113
|
+
return self.core_context, None
|
|
114
|
+
|
|
115
|
+
metadata = getattr(definition.executor, "_atomic_action_metadata", None)
|
|
116
|
+
if metadata is None or metadata.impact not in _SANDBOXED_IMPACTS:
|
|
117
|
+
return self.core_context, None
|
|
118
|
+
|
|
119
|
+
from shared.infrastructure.storage.file_handler import FileHandler
|
|
120
|
+
|
|
121
|
+
scoped_git = self.core_context.git_service.create_worktree(pre_execution_sha)
|
|
122
|
+
try:
|
|
123
|
+
scoped_file_handler = FileHandler(str(scoped_git.repo_path))
|
|
124
|
+
except Exception:
|
|
125
|
+
scoped_git.cleanup()
|
|
126
|
+
raise
|
|
127
|
+
|
|
128
|
+
scoped_context = dataclasses.replace(
|
|
129
|
+
self.core_context,
|
|
130
|
+
git_service=scoped_git,
|
|
131
|
+
file_handler=scoped_file_handler,
|
|
132
|
+
)
|
|
133
|
+
logger.info(
|
|
134
|
+
"SandboxLifecycle: %s sandboxed in %s at sha %s",
|
|
135
|
+
definition.action_id,
|
|
136
|
+
scoped_git.repo_path,
|
|
137
|
+
pre_execution_sha[:12],
|
|
138
|
+
)
|
|
139
|
+
return scoped_context, scoped_git
|
|
140
|
+
|
|
141
|
+
# ID: b1d2c5f9-3a48-4e67-8b91-2c5f8a3d6e90
|
|
142
|
+
def propagate_changes(self, scoped_git: Any) -> None:
|
|
143
|
+
"""Copy files modified inside the sandbox back to the main tree.
|
|
144
|
+
|
|
145
|
+
Walks `scoped_git.status_porcelain()` and for each modified or
|
|
146
|
+
untracked entry, copies the worktree-side bytes through the main
|
|
147
|
+
FileHandler's write_runtime_bytes surface (canonical write path,
|
|
148
|
+
no re-syntax-check, no auto-newline injection — byte-identical).
|
|
149
|
+
|
|
150
|
+
Before copying anything, checks the main tree for uncommitted
|
|
151
|
+
modifications in the sandbox's target paths. If any overlap, raises
|
|
152
|
+
— the exception bubbles into execute()'s outer try and turns the
|
|
153
|
+
action result into a loud failure, rather than silently overwriting
|
|
154
|
+
the governor's concurrent edits. This is the safety mechanism the
|
|
155
|
+
ADR-071 D2.2 plan describes as "loud failure rather than silent
|
|
156
|
+
contamination". The b11f4dba race shape is closed: worker either
|
|
157
|
+
propagates cleanly (no overlap) or refuses (overlap detected).
|
|
158
|
+
|
|
159
|
+
Deletions are not propagated: the no_direct_writes rule (#451)
|
|
160
|
+
forbids @atomic_action functions from invoking unlink/rmdir, so
|
|
161
|
+
a `D`-status entry here would itself be a constitutional
|
|
162
|
+
violation. We log and skip rather than silently deleting from
|
|
163
|
+
the main tree.
|
|
164
|
+
"""
|
|
165
|
+
sandbox_root = scoped_git.repo_path
|
|
166
|
+
file_handler = self.core_context.file_handler
|
|
167
|
+
|
|
168
|
+
try:
|
|
169
|
+
porcelain = scoped_git.status_porcelain()
|
|
170
|
+
except Exception as exc:
|
|
171
|
+
logger.error(
|
|
172
|
+
"SandboxLifecycle: sandbox status read failed (%s); "
|
|
173
|
+
"main tree NOT updated to avoid partial propagation",
|
|
174
|
+
exc,
|
|
175
|
+
)
|
|
176
|
+
return
|
|
177
|
+
|
|
178
|
+
if not porcelain:
|
|
179
|
+
logger.debug(
|
|
180
|
+
"SandboxLifecycle: sandbox produced no changes for %s", sandbox_root
|
|
181
|
+
)
|
|
182
|
+
return
|
|
183
|
+
|
|
184
|
+
# Collect intended target paths. Porcelain v1 format is "XY path"
|
|
185
|
+
# but GitService.status_porcelain strips the wrapping stdout, which
|
|
186
|
+
# eats the leading space of the first line when X (staged) is
|
|
187
|
+
# unmodified — so " M foo" arrives as "M foo". Split on first
|
|
188
|
+
# whitespace to recover {status_token, path} regardless.
|
|
189
|
+
target_paths: set[str] = set()
|
|
190
|
+
for line in porcelain.splitlines():
|
|
191
|
+
parts = line.split(None, 1)
|
|
192
|
+
if len(parts) != 2:
|
|
193
|
+
continue
|
|
194
|
+
status_token, rel = parts[0], parts[1].strip().strip('"')
|
|
195
|
+
if "D" in status_token:
|
|
196
|
+
logger.warning(
|
|
197
|
+
"SandboxLifecycle: sandbox reports deletion of %s — "
|
|
198
|
+
"atomic actions cannot delete files (#451); skipping",
|
|
199
|
+
rel,
|
|
200
|
+
)
|
|
201
|
+
continue
|
|
202
|
+
target_paths.add(rel)
|
|
203
|
+
|
|
204
|
+
if not target_paths:
|
|
205
|
+
return
|
|
206
|
+
|
|
207
|
+
# Conflict check: is the main tree dirty on any target path?
|
|
208
|
+
try:
|
|
209
|
+
main_porcelain = self.core_context.git_service.status_porcelain()
|
|
210
|
+
except Exception as exc:
|
|
211
|
+
logger.error(
|
|
212
|
+
"SandboxLifecycle: main tree status read failed (%s); "
|
|
213
|
+
"refusing to propagate without a conflict check",
|
|
214
|
+
exc,
|
|
215
|
+
)
|
|
216
|
+
raise RuntimeError(
|
|
217
|
+
f"ADR-071 D2.2: cannot verify main tree cleanliness ({exc}); "
|
|
218
|
+
"refusing to propagate sandbox changes"
|
|
219
|
+
) from exc
|
|
220
|
+
|
|
221
|
+
main_dirty: set[str] = set()
|
|
222
|
+
for line in main_porcelain.splitlines():
|
|
223
|
+
parts = line.split(None, 1)
|
|
224
|
+
if len(parts) == 2:
|
|
225
|
+
main_dirty.add(parts[1].strip().strip('"'))
|
|
226
|
+
|
|
227
|
+
conflict = sorted(target_paths & main_dirty)
|
|
228
|
+
if conflict:
|
|
229
|
+
raise RuntimeError(
|
|
230
|
+
"ADR-071 D2.2: refusing to propagate sandbox changes — "
|
|
231
|
+
f"main tree has uncommitted changes in {len(conflict)} "
|
|
232
|
+
f"sandbox target file(s): {conflict[:5]}"
|
|
233
|
+
f"{' ...' if len(conflict) > 5 else ''}. "
|
|
234
|
+
"Commit or revert those changes, then re-run."
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
copied = 0
|
|
238
|
+
for rel in sorted(target_paths):
|
|
239
|
+
src = sandbox_root / rel
|
|
240
|
+
if not src.exists():
|
|
241
|
+
logger.warning(
|
|
242
|
+
"SandboxLifecycle: sandbox entry %s missing on disk; skipping",
|
|
243
|
+
rel,
|
|
244
|
+
)
|
|
245
|
+
continue
|
|
246
|
+
file_handler.write_validated_bytes(rel, src.read_bytes())
|
|
247
|
+
copied += 1
|
|
248
|
+
|
|
249
|
+
logger.info(
|
|
250
|
+
"SandboxLifecycle: propagated %d file(s) from sandbox to main tree",
|
|
251
|
+
copied,
|
|
252
|
+
)
|