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,263 @@
|
|
|
1
|
+
# src/body/governance/remediation_service.py
|
|
2
|
+
"""
|
|
3
|
+
Remediation Service - Body Layer
|
|
4
|
+
|
|
5
|
+
CONSTITUTIONAL FIX: Execution logic for constitutional remediation
|
|
6
|
+
|
|
7
|
+
This service performs remediation operations (fixing violations).
|
|
8
|
+
It was split from ConstitutionalMonitor which violated separation by doing
|
|
9
|
+
both orchestration (Will) and execution (Body).
|
|
10
|
+
|
|
11
|
+
Constitutional Role:
|
|
12
|
+
- Body layer: Pure execution
|
|
13
|
+
- Receives explicit instructions on what to fix
|
|
14
|
+
- No decision-making about when/whether to remediate
|
|
15
|
+
- That's Will layer's responsibility
|
|
16
|
+
|
|
17
|
+
Migration:
|
|
18
|
+
- OLD: ConstitutionalMonitor (Mind layer) - orchestration + execution (VIOLATION)
|
|
19
|
+
- NEW: RemediationService (Body layer) - execution only (COMPLIANT)
|
|
20
|
+
- NEW: RemediationOrchestrator (Will layer) - orchestration only (COMPLIANT)
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
from __future__ import annotations
|
|
24
|
+
|
|
25
|
+
from dataclasses import dataclass
|
|
26
|
+
from pathlib import Path
|
|
27
|
+
|
|
28
|
+
from shared.infrastructure.storage.file_handler import FileHandler
|
|
29
|
+
from shared.logger import getLogger
|
|
30
|
+
from shared.utils.header_tools import _HeaderTools
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
logger = getLogger(__name__)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@dataclass
|
|
37
|
+
# ID: da9e01ed-6964-489d-b516-91d068e5c73e
|
|
38
|
+
class RemediationResult:
|
|
39
|
+
"""Results of a remediation operation."""
|
|
40
|
+
|
|
41
|
+
success: bool
|
|
42
|
+
fixed_count: int
|
|
43
|
+
failed_count: int
|
|
44
|
+
error: str | None = None
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
@dataclass
|
|
48
|
+
# ID: 9da005f9-65db-4d26-acf3-2e8b79f5c39f
|
|
49
|
+
class Violation:
|
|
50
|
+
"""Represents a single constitutional violation to be remediated."""
|
|
51
|
+
|
|
52
|
+
file_path: str
|
|
53
|
+
policy_id: str
|
|
54
|
+
description: str
|
|
55
|
+
severity: str
|
|
56
|
+
remediation_handler: str | None = None
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
# ID: 8bd6675e-f4e3-4581-90ac-74cdc2caf8a1
|
|
60
|
+
class RemediationService:
|
|
61
|
+
"""
|
|
62
|
+
Body layer service for constitutional remediation execution.
|
|
63
|
+
|
|
64
|
+
CONSTITUTIONAL COMPLIANCE:
|
|
65
|
+
- Body layer: Executes remediation operations
|
|
66
|
+
- NO orchestration logic (that's Will's job)
|
|
67
|
+
- NO decision-making about what/when to fix
|
|
68
|
+
- Receives explicit instructions and executes them
|
|
69
|
+
|
|
70
|
+
This service is given violations and fixes them.
|
|
71
|
+
It does NOT decide which violations to fix.
|
|
72
|
+
"""
|
|
73
|
+
|
|
74
|
+
def __init__(self, repo_path: Path | str):
|
|
75
|
+
"""
|
|
76
|
+
Initialize remediation service.
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
repo_path: Root path of the repository
|
|
80
|
+
"""
|
|
81
|
+
self.repo_path = Path(repo_path)
|
|
82
|
+
self.file_handler = FileHandler(str(self.repo_path))
|
|
83
|
+
logger.info("RemediationService initialized for %s", self.repo_path)
|
|
84
|
+
|
|
85
|
+
# ID: f86104cc-4740-4d74-889f-6f622e1d24dc
|
|
86
|
+
async def remediate_missing_headers(
|
|
87
|
+
self, violations: list[Violation]
|
|
88
|
+
) -> RemediationResult:
|
|
89
|
+
"""
|
|
90
|
+
Execute remediation for missing header violations.
|
|
91
|
+
|
|
92
|
+
BODY LAYER EXECUTION:
|
|
93
|
+
- Receives list of violations to fix
|
|
94
|
+
- Does NOT decide which ones to fix (already decided by Will)
|
|
95
|
+
- Executes the fixes using FileHandler
|
|
96
|
+
- Reports results
|
|
97
|
+
|
|
98
|
+
Args:
|
|
99
|
+
violations: List of header violations to remediate
|
|
100
|
+
|
|
101
|
+
Returns:
|
|
102
|
+
RemediationResult with counts and status
|
|
103
|
+
"""
|
|
104
|
+
logger.info("Executing header remediation for %d violations", len(violations))
|
|
105
|
+
|
|
106
|
+
fixed_count = 0
|
|
107
|
+
failed_count = 0
|
|
108
|
+
error_messages = []
|
|
109
|
+
|
|
110
|
+
for violation in violations:
|
|
111
|
+
try:
|
|
112
|
+
file_path = Path(violation.file_path)
|
|
113
|
+
|
|
114
|
+
# Execute: Read current file
|
|
115
|
+
if not file_path.exists():
|
|
116
|
+
logger.warning("File not found: %s", file_path)
|
|
117
|
+
failed_count += 1
|
|
118
|
+
continue
|
|
119
|
+
|
|
120
|
+
current_content = file_path.read_text(encoding="utf-8")
|
|
121
|
+
|
|
122
|
+
# Execute: Add header using HeaderTools
|
|
123
|
+
updated_content = _HeaderTools.add_header_if_missing(current_content)
|
|
124
|
+
|
|
125
|
+
# Execute: Write updated file via FileHandler (constitutional)
|
|
126
|
+
if updated_content != current_content:
|
|
127
|
+
write_result = self.file_handler.write_file(
|
|
128
|
+
str(file_path), updated_content
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
if write_result.status == "success":
|
|
132
|
+
logger.info("Fixed header in: %s", file_path)
|
|
133
|
+
fixed_count += 1
|
|
134
|
+
else:
|
|
135
|
+
logger.error(
|
|
136
|
+
"Failed to write %s: %s", file_path, write_result.message
|
|
137
|
+
)
|
|
138
|
+
failed_count += 1
|
|
139
|
+
error_messages.append(f"{file_path}: {write_result.message}")
|
|
140
|
+
else:
|
|
141
|
+
# Header already present, nothing to fix
|
|
142
|
+
logger.debug("Header already present in: %s", file_path)
|
|
143
|
+
|
|
144
|
+
except Exception as e:
|
|
145
|
+
logger.error("Error remediating %s: %s", violation.file_path, e)
|
|
146
|
+
failed_count += 1
|
|
147
|
+
error_messages.append(f"{violation.file_path}: {e!s}")
|
|
148
|
+
|
|
149
|
+
# Report results (no decision-making)
|
|
150
|
+
success = failed_count == 0
|
|
151
|
+
error = "; ".join(error_messages) if error_messages else None
|
|
152
|
+
|
|
153
|
+
logger.info(
|
|
154
|
+
"Remediation complete: %d fixed, %d failed", fixed_count, failed_count
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
return RemediationResult(
|
|
158
|
+
success=success,
|
|
159
|
+
fixed_count=fixed_count,
|
|
160
|
+
failed_count=failed_count,
|
|
161
|
+
error=error,
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
# ID: 7d18bb42-18a0-4834-8334-be92a27f36a8
|
|
165
|
+
async def remediate_single_file(self, file_path: str) -> bool:
|
|
166
|
+
"""
|
|
167
|
+
Execute remediation for a single file.
|
|
168
|
+
|
|
169
|
+
BODY LAYER EXECUTION:
|
|
170
|
+
- Receives explicit file path to fix
|
|
171
|
+
- Does NOT decide whether to fix it (already decided)
|
|
172
|
+
- Executes the fix
|
|
173
|
+
- Reports success/failure
|
|
174
|
+
|
|
175
|
+
Args:
|
|
176
|
+
file_path: Path to file that needs remediation
|
|
177
|
+
|
|
178
|
+
Returns:
|
|
179
|
+
True if remediation succeeded, False otherwise
|
|
180
|
+
"""
|
|
181
|
+
try:
|
|
182
|
+
path = Path(file_path)
|
|
183
|
+
|
|
184
|
+
if not path.exists():
|
|
185
|
+
logger.warning("File not found: %s", file_path)
|
|
186
|
+
return False
|
|
187
|
+
|
|
188
|
+
# Execute: Read file
|
|
189
|
+
current_content = path.read_text(encoding="utf-8")
|
|
190
|
+
|
|
191
|
+
# Execute: Add header
|
|
192
|
+
updated_content = _HeaderTools.add_header_if_missing(current_content)
|
|
193
|
+
|
|
194
|
+
# Execute: Write if changed
|
|
195
|
+
if updated_content != current_content:
|
|
196
|
+
write_result = self.file_handler.write_file(file_path, updated_content)
|
|
197
|
+
|
|
198
|
+
if write_result.status == "success":
|
|
199
|
+
logger.info("Fixed header in: %s", file_path)
|
|
200
|
+
return True
|
|
201
|
+
else:
|
|
202
|
+
logger.error(
|
|
203
|
+
"Failed to write %s: %s", file_path, write_result.message
|
|
204
|
+
)
|
|
205
|
+
return False
|
|
206
|
+
else:
|
|
207
|
+
# Already has header
|
|
208
|
+
logger.debug("Header already present in: %s", file_path)
|
|
209
|
+
return True
|
|
210
|
+
|
|
211
|
+
except Exception as e:
|
|
212
|
+
logger.error("Error remediating %s: %s", file_path, e)
|
|
213
|
+
return False
|
|
214
|
+
|
|
215
|
+
# ID: 0a08a917-26cb-41ea-9711-3e1335e07ed3
|
|
216
|
+
def validate_remediation(self, file_path: str) -> bool:
|
|
217
|
+
"""
|
|
218
|
+
Validate that remediation was successful for a file.
|
|
219
|
+
|
|
220
|
+
BODY LAYER EXECUTION:
|
|
221
|
+
- Checks if file now has proper header
|
|
222
|
+
- Pure verification, no decision-making
|
|
223
|
+
|
|
224
|
+
Args:
|
|
225
|
+
file_path: Path to file to validate
|
|
226
|
+
|
|
227
|
+
Returns:
|
|
228
|
+
True if file has proper header, False otherwise
|
|
229
|
+
"""
|
|
230
|
+
try:
|
|
231
|
+
path = Path(file_path)
|
|
232
|
+
|
|
233
|
+
if not path.exists():
|
|
234
|
+
return False
|
|
235
|
+
|
|
236
|
+
content = path.read_text(encoding="utf-8")
|
|
237
|
+
return _HeaderTools.has_valid_header(content)
|
|
238
|
+
|
|
239
|
+
except Exception as e:
|
|
240
|
+
logger.error("Error validating %s: %s", file_path, e)
|
|
241
|
+
return False
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
# ID: aa015db1-8ed4-4017-86d9-19f1be437214
|
|
245
|
+
def get_remediation_service(repo_path: Path | str | None = None) -> RemediationService:
|
|
246
|
+
"""
|
|
247
|
+
Factory function for remediation service.
|
|
248
|
+
|
|
249
|
+
Args:
|
|
250
|
+
repo_path: Optional repository path (defaults to current directory)
|
|
251
|
+
|
|
252
|
+
Returns:
|
|
253
|
+
RemediationService instance
|
|
254
|
+
|
|
255
|
+
Usage:
|
|
256
|
+
# Body layer: Execute remediation
|
|
257
|
+
service = get_remediation_service()
|
|
258
|
+
result = await service.remediate_missing_headers(violations)
|
|
259
|
+
"""
|
|
260
|
+
if repo_path is None:
|
|
261
|
+
repo_path = Path.cwd()
|
|
262
|
+
|
|
263
|
+
return RemediationService(repo_path)
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# src/body/governance/runtime_validator.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Runtime Validator - Body Layer Execution Service.
|
|
5
|
+
|
|
6
|
+
Provides the "Canary Sandbox" capability to run the project's test suite
|
|
7
|
+
against proposed code changes in a safe, isolated environment.
|
|
8
|
+
|
|
9
|
+
CONSTITUTIONAL ALIGNMENT (V2.3.0):
|
|
10
|
+
- Relocated: Moved from Mind to Body to resolve architecture.mind.no_body_invocation.
|
|
11
|
+
- Responsibility: Execution of sandboxed tests (Body capability).
|
|
12
|
+
- The Airlock: Subprocesses run with a SANITIZED environment to prevent
|
|
13
|
+
leakage or corruption of production infrastructure.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import asyncio
|
|
19
|
+
import os
|
|
20
|
+
import tempfile
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
|
|
23
|
+
from body.services.file_service import FileService
|
|
24
|
+
from shared.infrastructure.intent.operational_config import load_operational_config
|
|
25
|
+
from shared.logger import getLogger
|
|
26
|
+
from shared.path_resolver import PathResolver
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
logger = getLogger(__name__)
|
|
30
|
+
|
|
31
|
+
_CFG = load_operational_config().testing
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
# ID: 282dad34-9366-49a0-91dd-c889a7d6f8da
|
|
35
|
+
class RuntimeValidatorService:
|
|
36
|
+
"""
|
|
37
|
+
A service to test code changes in an isolated environment (Canary).
|
|
38
|
+
|
|
39
|
+
CONSTITUTIONAL COMPLIANCE:
|
|
40
|
+
- Resides in Body layer (Execution).
|
|
41
|
+
- Uses FileService for all file operations.
|
|
42
|
+
- Enforces Environment Isolation (The Airlock).
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
def __init__(
|
|
46
|
+
self,
|
|
47
|
+
path_resolver: PathResolver,
|
|
48
|
+
test_timeout: int = _CFG.runtime_validator_timeout_sec,
|
|
49
|
+
):
|
|
50
|
+
self._paths = path_resolver
|
|
51
|
+
self.repo_root = self._paths.repo_root
|
|
52
|
+
self.test_timeout = test_timeout
|
|
53
|
+
|
|
54
|
+
# ID: 3615c13a-c101-4bca-9a10-7bb72604e13b
|
|
55
|
+
async def run_tests_in_canary(
|
|
56
|
+
self, file_path_str: str, new_code_content: str
|
|
57
|
+
) -> tuple[bool, str]:
|
|
58
|
+
"""
|
|
59
|
+
Creates a temporary copy of the project, applies the new code, and runs pytest.
|
|
60
|
+
Uses a SANITIZED environment to prevent side effects on the host system.
|
|
61
|
+
|
|
62
|
+
Returns:
|
|
63
|
+
A tuple of (passed: bool, details: str).
|
|
64
|
+
"""
|
|
65
|
+
# Use a tmpdir for isolation.
|
|
66
|
+
# CLAUDE.md /tmp/ prohibition: temp dir must resolve inside the repo under var/tmp/.
|
|
67
|
+
with tempfile.TemporaryDirectory(
|
|
68
|
+
prefix="core_canary_", dir=str(self.repo_root / "var" / "tmp")
|
|
69
|
+
) as tmpdir:
|
|
70
|
+
canary_path = Path(tmpdir) / "canary_repo"
|
|
71
|
+
logger.info("Creating canary test environment at %s...", canary_path)
|
|
72
|
+
|
|
73
|
+
try:
|
|
74
|
+
# 1. Initialize FileService rooted at the canary repo
|
|
75
|
+
fs = FileService(canary_path)
|
|
76
|
+
|
|
77
|
+
# 2. Replicate the Body (Code)
|
|
78
|
+
fs.ensure_dir(".")
|
|
79
|
+
_copy_repo_tree(
|
|
80
|
+
src_root=self.repo_root,
|
|
81
|
+
file_service=fs,
|
|
82
|
+
ignore_names={
|
|
83
|
+
".git",
|
|
84
|
+
self._paths.intent_root.name, # Don't copy .intent/
|
|
85
|
+
".venv",
|
|
86
|
+
"venv",
|
|
87
|
+
"__pycache__",
|
|
88
|
+
".pytest_cache",
|
|
89
|
+
".ruff_cache",
|
|
90
|
+
"work",
|
|
91
|
+
".env", # DANGER: Do not copy .env
|
|
92
|
+
".env.test", # DANGER: Do not copy .env.test
|
|
93
|
+
},
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
# 3. Apply the Candidate Code
|
|
97
|
+
rel_target = Path(file_path_str).as_posix().lstrip("./")
|
|
98
|
+
# Use get_file_handler() escape hatch to write the proposed code
|
|
99
|
+
file_handler = fs.get_file_handler()
|
|
100
|
+
file_handler.write_runtime_text(rel_target, new_code_content)
|
|
101
|
+
|
|
102
|
+
# 4. Construct "The Airlock" (Sanitized Environment)
|
|
103
|
+
safe_env = os.environ.copy()
|
|
104
|
+
|
|
105
|
+
# Nuke keys to prevent sandbox leakage
|
|
106
|
+
for unsafe in [
|
|
107
|
+
"DATABASE_URL",
|
|
108
|
+
"LLM_API_KEY",
|
|
109
|
+
"CORE_MASTER_KEY",
|
|
110
|
+
"QDRANT_URL",
|
|
111
|
+
"QDRANT_API_KEY",
|
|
112
|
+
]:
|
|
113
|
+
if unsafe in safe_env:
|
|
114
|
+
del safe_env[unsafe]
|
|
115
|
+
|
|
116
|
+
# Inject Safe Defaults (Force Unit Test Mode)
|
|
117
|
+
safe_env["DATABASE_URL"] = "sqlite+aiosqlite:///:memory:"
|
|
118
|
+
safe_env["CORE_ENV"] = "TEST"
|
|
119
|
+
safe_env["LLM_ENABLED"] = "false"
|
|
120
|
+
safe_env["PYTHONPATH"] = str(canary_path)
|
|
121
|
+
|
|
122
|
+
logger.info("Running test suite in AIRLOCKED canary environment...")
|
|
123
|
+
|
|
124
|
+
# 5. Execute
|
|
125
|
+
proc = await asyncio.create_subprocess_exec(
|
|
126
|
+
"poetry",
|
|
127
|
+
"run",
|
|
128
|
+
"pytest",
|
|
129
|
+
cwd=canary_path,
|
|
130
|
+
stdout=asyncio.subprocess.PIPE,
|
|
131
|
+
stderr=asyncio.subprocess.PIPE,
|
|
132
|
+
env=safe_env,
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
try:
|
|
136
|
+
stdout, stderr = await asyncio.wait_for(
|
|
137
|
+
proc.communicate(), timeout=self.test_timeout
|
|
138
|
+
)
|
|
139
|
+
except TimeoutError:
|
|
140
|
+
proc.kill()
|
|
141
|
+
logger.error("Canary tests timed out.")
|
|
142
|
+
return (
|
|
143
|
+
False,
|
|
144
|
+
f"Tests timed out after {self.test_timeout} seconds.",
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
if proc.returncode == 0:
|
|
148
|
+
logger.info("✅ Canary tests PASSED.")
|
|
149
|
+
return (True, "All tests passed in the isolated environment.")
|
|
150
|
+
|
|
151
|
+
logger.warning("❌ Canary tests FAILED.")
|
|
152
|
+
error_details = (
|
|
153
|
+
f"Pytest failed with exit code {proc.returncode}.\n\n"
|
|
154
|
+
f"STDOUT:\n{stdout.decode(errors='replace')}\n\n"
|
|
155
|
+
f"STDERR:\n{stderr.decode(errors='replace')}"
|
|
156
|
+
)
|
|
157
|
+
return (False, error_details)
|
|
158
|
+
|
|
159
|
+
except Exception as e:
|
|
160
|
+
logger.error("Error during canary test run: %s", e, exc_info=True)
|
|
161
|
+
return (False, f"An unexpected exception occurred: {e!s}")
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def _copy_repo_tree(
|
|
165
|
+
src_root: Path, file_service: FileService, ignore_names: set[str]
|
|
166
|
+
) -> None:
|
|
167
|
+
"""
|
|
168
|
+
Copy a repository tree via governed writes.
|
|
169
|
+
"""
|
|
170
|
+
src_root = Path(src_root).resolve()
|
|
171
|
+
# Walk the tree
|
|
172
|
+
for src_path in src_root.rglob("*"):
|
|
173
|
+
rel_parts = src_path.relative_to(src_root).parts
|
|
174
|
+
if any(part in ignore_names for part in rel_parts):
|
|
175
|
+
continue
|
|
176
|
+
|
|
177
|
+
rel = src_path.relative_to(src_root).as_posix()
|
|
178
|
+
|
|
179
|
+
if src_path.is_dir():
|
|
180
|
+
file_service.ensure_dir(rel)
|
|
181
|
+
continue
|
|
182
|
+
|
|
183
|
+
if src_path.is_file():
|
|
184
|
+
file_service.write_runtime_bytes(rel, src_path.read_bytes())
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# src/body/infrastructure/bootstrap.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
System Bootstrap - CoreContext Initialization
|
|
5
|
+
|
|
6
|
+
CONSTITUTIONAL EXEMPTION:
|
|
7
|
+
This module is the 'Ignition Point'. It IS the infrastructure layer.
|
|
8
|
+
It MUST import 'settings' directly to wire the Dependency Injection container.
|
|
9
|
+
Once CoreContext is created here, all other layers receive configuration
|
|
10
|
+
via DI, complying with the constitution.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
from body.atomic.executor import ActionExecutor
|
|
16
|
+
from shared.config import settings
|
|
17
|
+
from shared.context import CoreContext
|
|
18
|
+
from shared.infrastructure.context.service import ContextService
|
|
19
|
+
from shared.infrastructure.database.session_manager import get_session
|
|
20
|
+
from shared.infrastructure.git_service import GitService
|
|
21
|
+
from shared.infrastructure.knowledge.knowledge_service import KnowledgeService
|
|
22
|
+
from shared.infrastructure.storage.file_handler import FileHandler
|
|
23
|
+
from shared.models import PlannerConfig
|
|
24
|
+
from shared.path_resolver import PathResolver
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _build_context_service() -> ContextService:
|
|
28
|
+
"""
|
|
29
|
+
Factory for ContextService.
|
|
30
|
+
|
|
31
|
+
CONSTITUTIONAL FIX:
|
|
32
|
+
We no longer instantiate QdrantService or CognitiveService here.
|
|
33
|
+
Instead, we pass None, and the ContextService (updated in Step 9)
|
|
34
|
+
will pull the initialized versions from the registry JIT.
|
|
35
|
+
"""
|
|
36
|
+
from body.services.service_registry import service_registry
|
|
37
|
+
|
|
38
|
+
return ContextService(
|
|
39
|
+
project_root=str(settings.REPO_PATH),
|
|
40
|
+
session_factory=service_registry.session,
|
|
41
|
+
qdrant_client=None,
|
|
42
|
+
cognitive_service=None,
|
|
43
|
+
brain_services_provider=service_registry,
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _build_context_builder_factory(core_context: CoreContext):
|
|
48
|
+
"""
|
|
49
|
+
Factory-of-factories for ArchitecturalContextBuilder. ADR-025.
|
|
50
|
+
|
|
51
|
+
Returns a zero-arg closure that, when called by CoreContext.context_builder,
|
|
52
|
+
reads cognitive_service and qdrant_service from the supplied core_context
|
|
53
|
+
and assembles a fully-wired ArchitecturalContextBuilder. Both services
|
|
54
|
+
must be populated on core_context by the time the closure is invoked
|
|
55
|
+
(the daemon lifespan does this; CLI commands that need Priority 1 mode
|
|
56
|
+
must do the same). Missing deps surface as a non-RuntimeError exception
|
|
57
|
+
so action_build_tests' JIT-fallback can catch and proceed with None.
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
def _factory():
|
|
61
|
+
from will.tools.architectural_context_builder import (
|
|
62
|
+
ArchitecturalContextBuilder,
|
|
63
|
+
)
|
|
64
|
+
from will.tools.module_anchor_generator import ModuleAnchorGenerator
|
|
65
|
+
from will.tools.policy_vectorizer import PolicyVectorizer
|
|
66
|
+
|
|
67
|
+
cognitive = core_context.cognitive_service
|
|
68
|
+
qdrant = core_context.qdrant_service
|
|
69
|
+
if cognitive is None or qdrant is None:
|
|
70
|
+
raise ValueError(
|
|
71
|
+
"context_builder factory requires cognitive_service and "
|
|
72
|
+
"qdrant_service to be populated on CoreContext; got "
|
|
73
|
+
f"cognitive_service={cognitive!r}, qdrant_service={qdrant!r}",
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
repo_root = settings.REPO_PATH
|
|
77
|
+
builder_path_resolver = PathResolver.from_repo(
|
|
78
|
+
repo_root=repo_root,
|
|
79
|
+
intent_root=settings.MIND,
|
|
80
|
+
)
|
|
81
|
+
return ArchitecturalContextBuilder(
|
|
82
|
+
policy_vectorizer=PolicyVectorizer(repo_root, cognitive, qdrant),
|
|
83
|
+
anchor_generator=ModuleAnchorGenerator(repo_root, cognitive, qdrant),
|
|
84
|
+
path_resolver=builder_path_resolver,
|
|
85
|
+
session_factory=core_context.registry.session,
|
|
86
|
+
cognitive_service=cognitive,
|
|
87
|
+
qdrant_service=qdrant,
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
return _factory
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
# ID: 140caea1-4d7b-4b80-ad31-80d0d2dc2a90
|
|
94
|
+
def create_core_context(service_registry) -> CoreContext:
|
|
95
|
+
"""
|
|
96
|
+
Bootstrap CoreContext and prime the ServiceRegistry.
|
|
97
|
+
"""
|
|
98
|
+
# 1. Prime the registry with the database primitive
|
|
99
|
+
service_registry.prime(get_session)
|
|
100
|
+
|
|
101
|
+
# 2. Configure infrastructure connections
|
|
102
|
+
service_registry.configure(
|
|
103
|
+
repo_path=settings.REPO_PATH,
|
|
104
|
+
qdrant_url=settings.QDRANT_URL,
|
|
105
|
+
qdrant_collection_name=settings.QDRANT_COLLECTION_NAME,
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
repo_path = settings.REPO_PATH
|
|
109
|
+
|
|
110
|
+
# 3. Create PathResolver (The Map)
|
|
111
|
+
path_resolver = PathResolver.from_repo(
|
|
112
|
+
repo_root=repo_path,
|
|
113
|
+
intent_root=settings.MIND,
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
# 4. Build the Context object
|
|
117
|
+
core_context = CoreContext(
|
|
118
|
+
registry=service_registry,
|
|
119
|
+
settings=settings,
|
|
120
|
+
git_service=GitService(repo_path),
|
|
121
|
+
file_handler=FileHandler(str(repo_path)),
|
|
122
|
+
planner_config=PlannerConfig(),
|
|
123
|
+
knowledge_service=KnowledgeService(repo_path),
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
# 5. Attach Resolver and Executor
|
|
127
|
+
core_context.path_resolver = path_resolver
|
|
128
|
+
core_context.action_executor = ActionExecutor(core_context)
|
|
129
|
+
|
|
130
|
+
# 6. Attach the factories
|
|
131
|
+
core_context.context_service_factory = _build_context_service
|
|
132
|
+
# ADR-025
|
|
133
|
+
core_context.context_builder_factory = _build_context_builder_factory(core_context)
|
|
134
|
+
|
|
135
|
+
return core_context
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# src/body/infrastructure/lifespan.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
System Lifespan - Infrastructure Ignition Sequence.
|
|
5
|
+
|
|
6
|
+
CONSTITUTIONAL FIX (P2.3):
|
|
7
|
+
Moved from shared.infrastructure to body.infrastructure to prevent
|
|
8
|
+
the shared layer from importing higher-level Body/Mind components.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import os
|
|
14
|
+
from contextlib import asynccontextmanager
|
|
15
|
+
from typing import TYPE_CHECKING
|
|
16
|
+
|
|
17
|
+
from body.infrastructure.bootstrap import create_core_context
|
|
18
|
+
from body.services.service_registry import service_registry
|
|
19
|
+
from shared.config import settings
|
|
20
|
+
from shared.infrastructure.config_service import ConfigService
|
|
21
|
+
from shared.infrastructure.diagnostic_service import DiagnosticService
|
|
22
|
+
from shared.logger import getLogger, reconfigure_log_level
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
if TYPE_CHECKING:
|
|
26
|
+
from fastapi import FastAPI
|
|
27
|
+
|
|
28
|
+
logger = getLogger(__name__)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@asynccontextmanager
|
|
32
|
+
# ID: 174c23d1-ad9d-4785-bbde-0f1bf408f180
|
|
33
|
+
async def core_lifespan(app: FastAPI):
|
|
34
|
+
"""
|
|
35
|
+
Constitutional ignition and shutdown sequence for the CORE system.
|
|
36
|
+
"""
|
|
37
|
+
logger.info("🚀 Starting CORE system...")
|
|
38
|
+
|
|
39
|
+
# 1. CONSTITUTIONAL BOOTSTRAP
|
|
40
|
+
core_context = create_core_context(service_registry)
|
|
41
|
+
app.state.core_context = core_context
|
|
42
|
+
|
|
43
|
+
if os.getenv("PYTEST_CURRENT_TEST"):
|
|
44
|
+
core_context._is_test_mode = True
|
|
45
|
+
|
|
46
|
+
try:
|
|
47
|
+
if not getattr(core_context, "_is_test_mode", False):
|
|
48
|
+
# 2. PRE-IGNITION SENSATION (Health Gate)
|
|
49
|
+
diagnostic = DiagnosticService(settings.REPO_PATH)
|
|
50
|
+
health = await diagnostic.check_connectivity()
|
|
51
|
+
|
|
52
|
+
unhealthy_components = [
|
|
53
|
+
name for name, res in health.items() if not res["ok"]
|
|
54
|
+
]
|
|
55
|
+
|
|
56
|
+
if unhealthy_components:
|
|
57
|
+
msg = f"Degraded Infrastructure Detected: {', '.join(unhealthy_components)}"
|
|
58
|
+
if settings.CORE_STRICT_MODE:
|
|
59
|
+
logger.critical("❌ STRICT MODE: Aborting startup. %s", msg)
|
|
60
|
+
raise RuntimeError(f"Constitutional Ignition Failure: {msg}")
|
|
61
|
+
else:
|
|
62
|
+
logger.warning("⚠️ ADVISORY MODE: Continuing despite %s", msg)
|
|
63
|
+
|
|
64
|
+
# 3. WARM UP HEAVY SERVICES
|
|
65
|
+
cognitive = await service_registry.get_cognitive_service()
|
|
66
|
+
auditor = await service_registry.get_auditor_context()
|
|
67
|
+
qdrant = await service_registry.get_qdrant_service()
|
|
68
|
+
|
|
69
|
+
core_context.cognitive_service = cognitive
|
|
70
|
+
core_context.auditor_context = auditor
|
|
71
|
+
core_context.qdrant_service = qdrant
|
|
72
|
+
|
|
73
|
+
# 4. DATABASE & CONFIG INITIALIZATION
|
|
74
|
+
async with service_registry.session() as session:
|
|
75
|
+
config = await ConfigService.create(session)
|
|
76
|
+
log_level_from_db = await config.get("LOG_LEVEL", "INFO")
|
|
77
|
+
reconfigure_log_level(log_level_from_db)
|
|
78
|
+
await cognitive.initialize(session)
|
|
79
|
+
|
|
80
|
+
# 5. LOAD KNOWLEDGE GRAPH
|
|
81
|
+
await auditor.load_knowledge_graph()
|
|
82
|
+
|
|
83
|
+
yield
|
|
84
|
+
finally:
|
|
85
|
+
logger.info("🛑 CORE system shutting down.")
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# src/body/infrastructure/repositories/__init__.py
|