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,602 @@
|
|
|
1
|
+
# src/body/services/blackboard_service/blackboard_service.py
|
|
2
|
+
# blackboard_service.py
|
|
3
|
+
"""State-transition write methods — UPDATE to terminal and non-terminal statuses."""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from sqlalchemy import text
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
# ID: a3842b9b-9285-49d3-bd7e-4fb8f8cbf6b7
|
|
11
|
+
class BlackboardService:
|
|
12
|
+
# ID: 1b4d6e9f-2c7a-4f08-9b53-8a6d2e4c1f3b
|
|
13
|
+
async def resolve_stale_alerts_for_terminal_targets(self) -> int:
|
|
14
|
+
"""
|
|
15
|
+
Resolve open ``blackboard.entry_stale::*`` findings whose target entry
|
|
16
|
+
has reached a terminal status (or no longer exists).
|
|
17
|
+
|
|
18
|
+
The stale-entry sensor (BlackboardShopManager) posts an alert when an
|
|
19
|
+
entry exceeds its SLA tier. The alert is then itself a finding that
|
|
20
|
+
stays open until something resolves it. Without this sweep, alerts
|
|
21
|
+
accumulate forever once their target reaches a terminal state — they
|
|
22
|
+
become meta-noise that the dashboard's open-findings count surfaces
|
|
23
|
+
as growing backlog.
|
|
24
|
+
|
|
25
|
+
Terminal target statuses mirror ``fetch_stale_entries`` (the inverse
|
|
26
|
+
relation): resolved, abandoned, suppressed, dry_run_complete,
|
|
27
|
+
deferred_to_proposal, indeterminate. A target row that no longer
|
|
28
|
+
exists is also treated as terminal — there is nothing left to act on.
|
|
29
|
+
|
|
30
|
+
Returns the count of stale-alert rows resolved.
|
|
31
|
+
"""
|
|
32
|
+
from body.services.service_registry import ServiceRegistry
|
|
33
|
+
|
|
34
|
+
async with ServiceRegistry.session() as session:
|
|
35
|
+
async with session.begin():
|
|
36
|
+
result = await session.execute(
|
|
37
|
+
text(
|
|
38
|
+
"""
|
|
39
|
+
UPDATE core.blackboard_entries AS alert
|
|
40
|
+
SET status = 'resolved',
|
|
41
|
+
resolved_at = now(),
|
|
42
|
+
updated_at = now()
|
|
43
|
+
WHERE alert.entry_type = 'finding'
|
|
44
|
+
AND alert.status = 'open'
|
|
45
|
+
AND alert.subject LIKE 'blackboard.entry_stale::%'
|
|
46
|
+
AND NOT EXISTS (
|
|
47
|
+
SELECT 1
|
|
48
|
+
FROM core.blackboard_entries AS target
|
|
49
|
+
WHERE target.id::text = alert.payload->>'entry_id'
|
|
50
|
+
AND target.status NOT IN (
|
|
51
|
+
'resolved',
|
|
52
|
+
'abandoned',
|
|
53
|
+
'suppressed',
|
|
54
|
+
'dry_run_complete',
|
|
55
|
+
'deferred_to_proposal',
|
|
56
|
+
'indeterminate'
|
|
57
|
+
)
|
|
58
|
+
)
|
|
59
|
+
"""
|
|
60
|
+
)
|
|
61
|
+
)
|
|
62
|
+
return result.rowcount or 0
|
|
63
|
+
|
|
64
|
+
# ID: 6d2f0c8a-9e3b-4a51-b7c8-14e5d6f2a0b9
|
|
65
|
+
async def resolve_dry_run_entries_for_namespace(self, namespace_prefix: str) -> int:
|
|
66
|
+
"""
|
|
67
|
+
Resolve all open audit.remediation.dry_run entries whose subject
|
|
68
|
+
matches the given namespace prefix.
|
|
69
|
+
|
|
70
|
+
Called by AuditViolationSensor when it completes a cycle with zero
|
|
71
|
+
violations — confirming that any dry-run entries for this namespace
|
|
72
|
+
describe violations that no longer exist.
|
|
73
|
+
|
|
74
|
+
Only resolves entries in 'open' status. Returns count of rows updated.
|
|
75
|
+
|
|
76
|
+
Subject pattern matched: 'audit.remediation.dry_run::<namespace_prefix>%'
|
|
77
|
+
"""
|
|
78
|
+
from body.services.service_registry import ServiceRegistry
|
|
79
|
+
|
|
80
|
+
async with ServiceRegistry.session() as session:
|
|
81
|
+
async with session.begin():
|
|
82
|
+
result = await session.execute(
|
|
83
|
+
text(
|
|
84
|
+
"""
|
|
85
|
+
UPDATE core.blackboard_entries
|
|
86
|
+
SET status = 'resolved',
|
|
87
|
+
resolved_at = now(),
|
|
88
|
+
updated_at = now()
|
|
89
|
+
WHERE entry_type = 'finding'
|
|
90
|
+
AND subject LIKE 'audit.remediation.dry_run::'
|
|
91
|
+
|| :namespace_prefix || '%'
|
|
92
|
+
AND status = 'open'
|
|
93
|
+
"""
|
|
94
|
+
),
|
|
95
|
+
{"namespace_prefix": namespace_prefix},
|
|
96
|
+
)
|
|
97
|
+
return result.rowcount or 0
|
|
98
|
+
|
|
99
|
+
# ID: 3d4e5f6a-7b8c-9d0e-1f2a-3b4c5d6e7f8a
|
|
100
|
+
async def resolve_entries(self, entry_ids: list[str]) -> int:
|
|
101
|
+
"""
|
|
102
|
+
Mark each entry in *entry_ids* as resolved, provided it is still in
|
|
103
|
+
a non-terminal status ('open' or 'claimed').
|
|
104
|
+
|
|
105
|
+
Historically the WHERE clause filtered status = 'open' only, which
|
|
106
|
+
silently no-op'd the claim→resolve path used by workers that claim
|
|
107
|
+
findings before acting on them. This left every such caller leaking
|
|
108
|
+
claims — the entries_resolved counters in their reports were always
|
|
109
|
+
zero because the UPDATE never matched.
|
|
110
|
+
|
|
111
|
+
The predicate now accepts either 'open' or 'claimed' so the caller
|
|
112
|
+
pattern is:
|
|
113
|
+
- fetch_open_findings → resolve_entries (TestRunnerSensor)
|
|
114
|
+
|
|
115
|
+
All updates run inside a single transaction. Returns the count of
|
|
116
|
+
rows actually updated (entries already terminalized or missing are
|
|
117
|
+
not counted).
|
|
118
|
+
|
|
119
|
+
Scope note: as of ADR-015 D4, neither ViolationRemediatorWorker
|
|
120
|
+
path calls this method. The happy path uses defer_entries_to_proposal
|
|
121
|
+
so the §7/§7a CORE-Finding.md Finding→Proposal linkage is
|
|
122
|
+
preserved; the dedup-subsume path uses resolve_entries_for_proposal
|
|
123
|
+
so the subsuming proposal_id is recorded in payload (URS Q1.F).
|
|
124
|
+
This bare-resolve method remains in use by TestRunnerSensor —
|
|
125
|
+
a caller that legitimately has no proposal_id to record.
|
|
126
|
+
|
|
127
|
+
Covers:
|
|
128
|
+
- TestRunnerSensor (direct)
|
|
129
|
+
"""
|
|
130
|
+
from body.services.service_registry import ServiceRegistry
|
|
131
|
+
|
|
132
|
+
resolved_count = 0
|
|
133
|
+
async with ServiceRegistry.session() as session:
|
|
134
|
+
async with session.begin():
|
|
135
|
+
for entry_id in entry_ids:
|
|
136
|
+
result = await session.execute(
|
|
137
|
+
text(
|
|
138
|
+
"""
|
|
139
|
+
UPDATE core.blackboard_entries
|
|
140
|
+
SET status = 'resolved',
|
|
141
|
+
resolved_at = now(),
|
|
142
|
+
updated_at = now()
|
|
143
|
+
WHERE id = cast(:entry_id as uuid)
|
|
144
|
+
AND status IN ('open', 'claimed')
|
|
145
|
+
"""
|
|
146
|
+
),
|
|
147
|
+
{"entry_id": entry_id},
|
|
148
|
+
)
|
|
149
|
+
resolved_count += result.rowcount
|
|
150
|
+
return resolved_count
|
|
151
|
+
|
|
152
|
+
# ID: a7b2c8d3-e4f5-6789-abcd-ef0123456789
|
|
153
|
+
async def release_claimed_entries(self, entry_ids: list[str]) -> int:
|
|
154
|
+
"""
|
|
155
|
+
Reset claimed entries back to open status and clear claimed_by.
|
|
156
|
+
|
|
157
|
+
Used when a worker claims findings but cannot act on them (e.g.
|
|
158
|
+
unmappable violations with no registered remediation action).
|
|
159
|
+
Releasing prevents them from staying claimed forever.
|
|
160
|
+
|
|
161
|
+
Only updates entries currently in 'claimed' status.
|
|
162
|
+
Returns the count of rows actually updated.
|
|
163
|
+
"""
|
|
164
|
+
if not entry_ids:
|
|
165
|
+
return 0
|
|
166
|
+
|
|
167
|
+
from body.services.service_registry import ServiceRegistry
|
|
168
|
+
|
|
169
|
+
released = 0
|
|
170
|
+
async with ServiceRegistry.session() as session:
|
|
171
|
+
async with session.begin():
|
|
172
|
+
for entry_id in entry_ids:
|
|
173
|
+
result = await session.execute(
|
|
174
|
+
text(
|
|
175
|
+
"""
|
|
176
|
+
UPDATE core.blackboard_entries
|
|
177
|
+
SET status = 'open',
|
|
178
|
+
claimed_by = NULL,
|
|
179
|
+
updated_at = now()
|
|
180
|
+
WHERE id = cast(:entry_id as uuid)
|
|
181
|
+
AND status = 'claimed'
|
|
182
|
+
"""
|
|
183
|
+
),
|
|
184
|
+
{"entry_id": entry_id},
|
|
185
|
+
)
|
|
186
|
+
released += result.rowcount
|
|
187
|
+
return released
|
|
188
|
+
|
|
189
|
+
# ID: 4c7a9e2f-b518-4d63-a0e1-d6f3b82c5a10
|
|
190
|
+
async def abandon_entries(self, entry_ids: list[str]) -> int:
|
|
191
|
+
"""
|
|
192
|
+
Mark entries as abandoned. Terminal state — no worker reclaims them.
|
|
193
|
+
Only updates entries currently in 'claimed' status.
|
|
194
|
+
Returns the count of rows actually updated.
|
|
195
|
+
"""
|
|
196
|
+
if not entry_ids:
|
|
197
|
+
return 0
|
|
198
|
+
|
|
199
|
+
from body.services.service_registry import ServiceRegistry
|
|
200
|
+
|
|
201
|
+
abandoned = 0
|
|
202
|
+
async with ServiceRegistry.session() as session:
|
|
203
|
+
async with session.begin():
|
|
204
|
+
for entry_id in entry_ids:
|
|
205
|
+
result = await session.execute(
|
|
206
|
+
text(
|
|
207
|
+
"""
|
|
208
|
+
UPDATE core.blackboard_entries
|
|
209
|
+
SET status = 'abandoned',
|
|
210
|
+
resolved_at = now(),
|
|
211
|
+
updated_at = now()
|
|
212
|
+
WHERE id = cast(:entry_id as uuid)
|
|
213
|
+
AND status = 'claimed'
|
|
214
|
+
"""
|
|
215
|
+
),
|
|
216
|
+
{"entry_id": entry_id},
|
|
217
|
+
)
|
|
218
|
+
abandoned += result.rowcount
|
|
219
|
+
return abandoned
|
|
220
|
+
|
|
221
|
+
# ID: d3a1f7b2-8c4e-4a9d-b6e5-1f0c3d7a2e89
|
|
222
|
+
async def mark_indeterminate(self, entry_ids: list[str]) -> int:
|
|
223
|
+
"""
|
|
224
|
+
Mark claimed entries as indeterminate.
|
|
225
|
+
|
|
226
|
+
Used when a worker claims findings but reaches an inconclusive
|
|
227
|
+
outcome — the entry is neither resolved nor releasable back to
|
|
228
|
+
open. Only updates entries currently in 'claimed' status.
|
|
229
|
+
Returns the count of rows actually updated.
|
|
230
|
+
"""
|
|
231
|
+
if not entry_ids:
|
|
232
|
+
return 0
|
|
233
|
+
|
|
234
|
+
from body.services.service_registry import ServiceRegistry
|
|
235
|
+
|
|
236
|
+
updated = 0
|
|
237
|
+
async with ServiceRegistry.session() as session:
|
|
238
|
+
async with session.begin():
|
|
239
|
+
for entry_id in entry_ids:
|
|
240
|
+
result = await session.execute(
|
|
241
|
+
text(
|
|
242
|
+
"""
|
|
243
|
+
UPDATE core.blackboard_entries
|
|
244
|
+
SET status = 'indeterminate',
|
|
245
|
+
resolved_at = now(),
|
|
246
|
+
updated_at = now()
|
|
247
|
+
WHERE id = cast(:entry_id as uuid)
|
|
248
|
+
AND status = 'claimed'
|
|
249
|
+
"""
|
|
250
|
+
),
|
|
251
|
+
{"entry_id": entry_id},
|
|
252
|
+
)
|
|
253
|
+
updated += result.rowcount
|
|
254
|
+
return updated
|
|
255
|
+
|
|
256
|
+
# ID: 8d586156-b04f-4d7a-a7b9-5a52b099b9b1
|
|
257
|
+
async def resolve_indeterminate_entry(
|
|
258
|
+
self,
|
|
259
|
+
entry_id: str,
|
|
260
|
+
reason: str,
|
|
261
|
+
resolved_by: str = "cli_admin",
|
|
262
|
+
resolution_authority: str = "human.cli_operator",
|
|
263
|
+
) -> int:
|
|
264
|
+
"""
|
|
265
|
+
Close a single indeterminate finding with an operator-provided reason.
|
|
266
|
+
|
|
267
|
+
Indeterminate is terminal from the audit sensor's perspective — the
|
|
268
|
+
sensor delegates to a human and will not re-evaluate the row. Without
|
|
269
|
+
this method there is no path to close the finding once the underlying
|
|
270
|
+
condition is addressed out-of-band (manual refactor, threshold change
|
|
271
|
+
via ADR, or operator judgement that the finding is stale). The §7a
|
|
272
|
+
revival path covers the deferred_to_proposal branch but has no
|
|
273
|
+
symmetric counterpart for indeterminate.
|
|
274
|
+
|
|
275
|
+
Mirrors the operator-attribution shape of reject_proposal: reason,
|
|
276
|
+
resolved_by, and resolution_authority are stamped into payload under
|
|
277
|
+
a 'resolution' key so the audit trail survives. Only acts on rows
|
|
278
|
+
currently in 'indeterminate' status — returns 1 on success, 0 if the
|
|
279
|
+
row has already transitioned or does not exist.
|
|
280
|
+
"""
|
|
281
|
+
from body.services.service_registry import ServiceRegistry
|
|
282
|
+
|
|
283
|
+
async with ServiceRegistry.session() as session:
|
|
284
|
+
async with session.begin():
|
|
285
|
+
result = await session.execute(
|
|
286
|
+
text(
|
|
287
|
+
"""
|
|
288
|
+
UPDATE core.blackboard_entries
|
|
289
|
+
SET status = 'resolved',
|
|
290
|
+
resolved_at = now(),
|
|
291
|
+
updated_at = now(),
|
|
292
|
+
payload = jsonb_set(
|
|
293
|
+
payload,
|
|
294
|
+
'{resolution}',
|
|
295
|
+
jsonb_build_object(
|
|
296
|
+
'reason', cast(:reason as text),
|
|
297
|
+
'resolved_by', cast(:resolved_by as text),
|
|
298
|
+
'resolution_authority', cast(:authority as text),
|
|
299
|
+
'resolved_at', to_char(now() at time zone 'UTC',
|
|
300
|
+
'YYYY-MM-DD"T"HH24:MI:SS"Z"')
|
|
301
|
+
),
|
|
302
|
+
true
|
|
303
|
+
)
|
|
304
|
+
WHERE id = cast(:entry_id as uuid)
|
|
305
|
+
AND status = 'indeterminate'
|
|
306
|
+
"""
|
|
307
|
+
),
|
|
308
|
+
{
|
|
309
|
+
"entry_id": entry_id,
|
|
310
|
+
"reason": reason,
|
|
311
|
+
"resolved_by": resolved_by,
|
|
312
|
+
"authority": resolution_authority,
|
|
313
|
+
},
|
|
314
|
+
)
|
|
315
|
+
return result.rowcount or 0
|
|
316
|
+
|
|
317
|
+
# ID: 77d705b6-bafe-481b-9d73-3bbefdd85470
|
|
318
|
+
async def adjudicate_awaiting_reaudit_findings(
|
|
319
|
+
self,
|
|
320
|
+
subject_prefix: str,
|
|
321
|
+
current_violation_subjects: set[str],
|
|
322
|
+
resolved_by: str,
|
|
323
|
+
) -> dict[str, list[str]]:
|
|
324
|
+
"""
|
|
325
|
+
Drain the awaiting_reaudit queue for a subject prefix (ADR-045, ADR-072).
|
|
326
|
+
|
|
327
|
+
Implements the drainer release pass. For each finding currently in
|
|
328
|
+
'awaiting_reaudit' whose subject begins with ``subject_prefix``,
|
|
329
|
+
decide based on the caller's current-state evaluation:
|
|
330
|
+
|
|
331
|
+
- Subject present in *current_violation_subjects*: transition to
|
|
332
|
+
'open'. The condition still holds; the remediator should pick it
|
|
333
|
+
up on its next tick.
|
|
334
|
+
- Subject absent from *current_violation_subjects*: transition to
|
|
335
|
+
'resolved'. The drainer re-evaluated and the underlying condition
|
|
336
|
+
has cleared (including the deleted-source case per ADR-072).
|
|
337
|
+
payload.resolution is stamped with *resolved_by* attribution so
|
|
338
|
+
the audit trail records why this row closed without operator
|
|
339
|
+
action.
|
|
340
|
+
|
|
341
|
+
Per ADR-072, every quarantine-capable namespace must call this
|
|
342
|
+
method from a registered drainer worker. Caller passes the full
|
|
343
|
+
subject prefix (e.g. ``audit.violation::<rule_namespace>`` or
|
|
344
|
+
``test.missing``).
|
|
345
|
+
|
|
346
|
+
The two transitions run in one transaction. Returns lists of
|
|
347
|
+
released and resolved subjects for the drainer's release-pass
|
|
348
|
+
report.
|
|
349
|
+
"""
|
|
350
|
+
from body.services.service_registry import ServiceRegistry
|
|
351
|
+
|
|
352
|
+
released_subjects: list[str] = []
|
|
353
|
+
resolved_subjects: list[str] = []
|
|
354
|
+
|
|
355
|
+
async with ServiceRegistry.session() as session:
|
|
356
|
+
async with session.begin():
|
|
357
|
+
pending = await session.execute(
|
|
358
|
+
text(
|
|
359
|
+
"""
|
|
360
|
+
SELECT id, subject
|
|
361
|
+
FROM core.blackboard_entries
|
|
362
|
+
WHERE entry_type = 'finding'
|
|
363
|
+
AND status = 'awaiting_reaudit'
|
|
364
|
+
AND (subject = :prefix
|
|
365
|
+
OR subject LIKE :prefix || '.%'
|
|
366
|
+
OR subject LIKE :prefix || '::%')
|
|
367
|
+
FOR UPDATE
|
|
368
|
+
"""
|
|
369
|
+
),
|
|
370
|
+
{"prefix": subject_prefix},
|
|
371
|
+
)
|
|
372
|
+
rows = pending.fetchall()
|
|
373
|
+
|
|
374
|
+
release_ids: list[str] = []
|
|
375
|
+
resolve_ids: list[str] = []
|
|
376
|
+
for row in rows:
|
|
377
|
+
entry_id = str(row[0])
|
|
378
|
+
subject = str(row[1])
|
|
379
|
+
if subject in current_violation_subjects:
|
|
380
|
+
release_ids.append(entry_id)
|
|
381
|
+
released_subjects.append(subject)
|
|
382
|
+
else:
|
|
383
|
+
resolve_ids.append(entry_id)
|
|
384
|
+
resolved_subjects.append(subject)
|
|
385
|
+
|
|
386
|
+
if release_ids:
|
|
387
|
+
await session.execute(
|
|
388
|
+
text(
|
|
389
|
+
"""
|
|
390
|
+
UPDATE core.blackboard_entries
|
|
391
|
+
SET status = 'open',
|
|
392
|
+
updated_at = now()
|
|
393
|
+
WHERE id = ANY(cast(:ids as uuid[]))
|
|
394
|
+
AND status = 'awaiting_reaudit'
|
|
395
|
+
"""
|
|
396
|
+
),
|
|
397
|
+
{"ids": release_ids},
|
|
398
|
+
)
|
|
399
|
+
|
|
400
|
+
if resolve_ids:
|
|
401
|
+
await session.execute(
|
|
402
|
+
text(
|
|
403
|
+
"""
|
|
404
|
+
UPDATE core.blackboard_entries
|
|
405
|
+
SET status = 'resolved',
|
|
406
|
+
resolved_at = now(),
|
|
407
|
+
updated_at = now(),
|
|
408
|
+
payload = jsonb_set(
|
|
409
|
+
payload,
|
|
410
|
+
'{resolution}',
|
|
411
|
+
jsonb_build_object(
|
|
412
|
+
'reason', 'audit re-evaluation: condition no longer present',
|
|
413
|
+
'resolved_by', cast(:resolved_by as text),
|
|
414
|
+
'resolution_authority', 'system.audit',
|
|
415
|
+
'resolved_at', to_char(now() at time zone 'UTC',
|
|
416
|
+
'YYYY-MM-DD"T"HH24:MI:SS"Z"')
|
|
417
|
+
),
|
|
418
|
+
true
|
|
419
|
+
)
|
|
420
|
+
WHERE id = ANY(cast(:ids as uuid[]))
|
|
421
|
+
AND status = 'awaiting_reaudit'
|
|
422
|
+
"""
|
|
423
|
+
),
|
|
424
|
+
{"ids": resolve_ids, "resolved_by": resolved_by},
|
|
425
|
+
)
|
|
426
|
+
|
|
427
|
+
return {
|
|
428
|
+
"released_subjects": released_subjects,
|
|
429
|
+
"resolved_subjects": resolved_subjects,
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
# ID: 0c2f1a8d-3e6b-4c9f-a7d4-5b8e2f1c4a7d
|
|
433
|
+
async def sweep_terminal_telemetry(
|
|
434
|
+
self,
|
|
435
|
+
subject_prefixes: tuple[str, ...],
|
|
436
|
+
ttl_days: int,
|
|
437
|
+
batch_max: int,
|
|
438
|
+
) -> int:
|
|
439
|
+
"""
|
|
440
|
+
ADR-082 Mechanism 1 — hard DELETE for terminal telemetry past TTL.
|
|
441
|
+
|
|
442
|
+
Removes ``core.blackboard_entries`` rows whose subject starts with any
|
|
443
|
+
prefix in *subject_prefixes*, whose status is already terminal
|
|
444
|
+
('resolved' or 'abandoned'), and whose created_at is older than
|
|
445
|
+
*ttl_days*. Mirrors ADR-044's ``llm_gate_verdicts`` cache sweep shape.
|
|
446
|
+
|
|
447
|
+
The row cap (*batch_max*) is a constitutional rail per
|
|
448
|
+
``feedback_destructive_autonomous_needs_rails_first``: even with the
|
|
449
|
+
TTL filter, a misconfigured prefix list could otherwise scan and
|
|
450
|
+
delete millions of rows in one transaction. DELETEs select via a
|
|
451
|
+
bounded subquery so PostgreSQL's lack of DELETE…LIMIT is sidestepped
|
|
452
|
+
cleanly.
|
|
453
|
+
|
|
454
|
+
Returns the count of rows actually deleted. Empty *subject_prefixes*
|
|
455
|
+
is a no-op (returns 0) — the empty allowlist is fail-closed, not
|
|
456
|
+
fail-open.
|
|
457
|
+
"""
|
|
458
|
+
if not subject_prefixes:
|
|
459
|
+
return 0
|
|
460
|
+
|
|
461
|
+
from body.services.service_registry import ServiceRegistry
|
|
462
|
+
|
|
463
|
+
async with ServiceRegistry.session() as session:
|
|
464
|
+
async with session.begin():
|
|
465
|
+
result = await session.execute(
|
|
466
|
+
text(
|
|
467
|
+
"""
|
|
468
|
+
DELETE FROM core.blackboard_entries
|
|
469
|
+
WHERE id IN (
|
|
470
|
+
SELECT id FROM core.blackboard_entries
|
|
471
|
+
WHERE status IN ('resolved', 'abandoned')
|
|
472
|
+
AND subject LIKE ANY(
|
|
473
|
+
ARRAY(
|
|
474
|
+
SELECT p || '%%'
|
|
475
|
+
FROM unnest(cast(:prefixes as text[])) AS p
|
|
476
|
+
)
|
|
477
|
+
)
|
|
478
|
+
AND created_at < now() - make_interval(days => :days)
|
|
479
|
+
LIMIT :batch_max
|
|
480
|
+
)
|
|
481
|
+
"""
|
|
482
|
+
),
|
|
483
|
+
{
|
|
484
|
+
"prefixes": list(subject_prefixes),
|
|
485
|
+
"days": int(ttl_days),
|
|
486
|
+
"batch_max": int(batch_max),
|
|
487
|
+
},
|
|
488
|
+
)
|
|
489
|
+
return result.rowcount or 0
|
|
490
|
+
|
|
491
|
+
# ID: 8a5f3d6c-2b9e-4f17-c0d8-9e4a1b6f3c8e
|
|
492
|
+
async def sweep_delegate_open_findings(
|
|
493
|
+
self,
|
|
494
|
+
subjects: tuple[str, ...],
|
|
495
|
+
ttl_days: int,
|
|
496
|
+
batch_max: int,
|
|
497
|
+
) -> int:
|
|
498
|
+
"""
|
|
499
|
+
ADR-082 Mechanism 2 — status transition open → resolved for stale
|
|
500
|
+
DELEGATE-class findings.
|
|
501
|
+
|
|
502
|
+
Updates ``core.blackboard_entries`` rows whose subject equals one of
|
|
503
|
+
*subjects*, whose status is 'open', and whose created_at is older than
|
|
504
|
+
*ttl_days*. Sets status='resolved', resolved_at=now(), updated_at=now(),
|
|
505
|
+
and stamps payload.resolution with an attribution block so the audit
|
|
506
|
+
trail records why the row closed without operator action.
|
|
507
|
+
|
|
508
|
+
Preserves the row (no DELETE) per the audit-trail principle: the
|
|
509
|
+
writer-as-sensor's matching run.complete report already carries the
|
|
510
|
+
original event payload, so the OPEN finding's content is recoverable
|
|
511
|
+
even after auto-resolution. Status transition is the cheaper
|
|
512
|
+
rollback path than DELETE if the TTL turns out to be misconfigured.
|
|
513
|
+
|
|
514
|
+
Row cap (*batch_max*) is the rail per
|
|
515
|
+
``feedback_destructive_autonomous_needs_rails_first``. Empty
|
|
516
|
+
*subjects* is a no-op — fail-closed allowlist.
|
|
517
|
+
|
|
518
|
+
Returns the count of rows updated.
|
|
519
|
+
"""
|
|
520
|
+
if not subjects:
|
|
521
|
+
return 0
|
|
522
|
+
|
|
523
|
+
from body.services.service_registry import ServiceRegistry
|
|
524
|
+
|
|
525
|
+
async with ServiceRegistry.session() as session:
|
|
526
|
+
async with session.begin():
|
|
527
|
+
result = await session.execute(
|
|
528
|
+
text(
|
|
529
|
+
"""
|
|
530
|
+
UPDATE core.blackboard_entries
|
|
531
|
+
SET status = 'resolved',
|
|
532
|
+
resolved_at = now(),
|
|
533
|
+
updated_at = now(),
|
|
534
|
+
payload = jsonb_set(
|
|
535
|
+
payload,
|
|
536
|
+
'{resolution}',
|
|
537
|
+
jsonb_build_object(
|
|
538
|
+
'reason', 'ADR-082 TTL sweep: governor inattention exceeded retention window',
|
|
539
|
+
'resolved_by', 'blackboard_shop_manager',
|
|
540
|
+
'resolution_authority', 'system.ttl_sweep',
|
|
541
|
+
'resolved_at', to_char(now() at time zone 'UTC',
|
|
542
|
+
'YYYY-MM-DD"T"HH24:MI:SS"Z"')
|
|
543
|
+
),
|
|
544
|
+
true
|
|
545
|
+
)
|
|
546
|
+
WHERE id IN (
|
|
547
|
+
SELECT id FROM core.blackboard_entries
|
|
548
|
+
WHERE entry_type = 'finding'
|
|
549
|
+
AND status = 'open'
|
|
550
|
+
AND subject = ANY(cast(:subjects as text[]))
|
|
551
|
+
AND created_at < now() - make_interval(days => :days)
|
|
552
|
+
LIMIT :batch_max
|
|
553
|
+
)
|
|
554
|
+
"""
|
|
555
|
+
),
|
|
556
|
+
{
|
|
557
|
+
"subjects": list(subjects),
|
|
558
|
+
"days": int(ttl_days),
|
|
559
|
+
"batch_max": int(batch_max),
|
|
560
|
+
},
|
|
561
|
+
)
|
|
562
|
+
return result.rowcount or 0
|
|
563
|
+
|
|
564
|
+
# ID: 54c114b0-4c6d-484f-8b20-d9ff5fa24caf
|
|
565
|
+
async def update_entry_status(self, entry_id: str, status: str) -> None:
|
|
566
|
+
"""
|
|
567
|
+
Update the status of a single blackboard entry by ID.
|
|
568
|
+
|
|
569
|
+
Covers:
|
|
570
|
+
- PromptExtractorWorker._mark_finding
|
|
571
|
+
|
|
572
|
+
Sets resolved_at on transition to a terminal status (resolved, abandoned,
|
|
573
|
+
indeterminate, suppressed), matching the hygiene rule established by
|
|
574
|
+
commit 59ff25be and the pattern used by the direct-SQL _mark_findings /
|
|
575
|
+
_mark_finding paths. Without this clause, callers routing through this
|
|
576
|
+
method (ProposalConsumerWorker._mark_finding,
|
|
577
|
+
ViolationRemediator._mark_finding) produced terminal rows with NULL
|
|
578
|
+
resolved_at, distorting any query that uses resolved_at as a temporal
|
|
579
|
+
filter. Discovered 2026-04-27 during Band B verification sweep: 26/26
|
|
580
|
+
abandoned rows post-59ff25be carried NULL resolved_at, all attributable
|
|
581
|
+
to this path. 'suppressed' joined the terminal set per #263.
|
|
582
|
+
"""
|
|
583
|
+
from body.services.service_registry import ServiceRegistry
|
|
584
|
+
|
|
585
|
+
async with ServiceRegistry.session() as session:
|
|
586
|
+
await session.execute(
|
|
587
|
+
text(
|
|
588
|
+
"""
|
|
589
|
+
UPDATE core.blackboard_entries
|
|
590
|
+
SET status = :status,
|
|
591
|
+
resolved_at = CASE
|
|
592
|
+
WHEN :status IN ('resolved', 'abandoned', 'indeterminate', 'suppressed')
|
|
593
|
+
THEN now()
|
|
594
|
+
ELSE resolved_at
|
|
595
|
+
END,
|
|
596
|
+
updated_at = now()
|
|
597
|
+
WHERE id = :id
|
|
598
|
+
"""
|
|
599
|
+
),
|
|
600
|
+
{"status": status, "id": entry_id},
|
|
601
|
+
)
|
|
602
|
+
await session.commit()
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# src/body/services/capabilities.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Orchestrates the system's self-analysis cycle by executing introspection tools as governed subprocesses.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import sys
|
|
10
|
+
|
|
11
|
+
from dotenv import load_dotenv
|
|
12
|
+
|
|
13
|
+
from shared.logger import getLogger
|
|
14
|
+
from shared.utils.subprocess_utils import run_poetry_command
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
logger = getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
# ID: 49402dba-c978-4325-a509-c3a20c1a1957
|
|
21
|
+
def introspection():
|
|
22
|
+
"""
|
|
23
|
+
Runs a full self-analysis cycle to inspect system structure and health.
|
|
24
|
+
This orchestrates the execution of the system's own introspection tools
|
|
25
|
+
as separate, governed processes.
|
|
26
|
+
"""
|
|
27
|
+
logger.info("🔍 Starting introspection cycle...")
|
|
28
|
+
tools_to_run = [
|
|
29
|
+
("Knowledge Graph Builder", ["python", "-m", "system.tools.codegraph_builder"]),
|
|
30
|
+
(
|
|
31
|
+
"Constitutional Auditor",
|
|
32
|
+
["python", "-m", "system.governance.constitutional_auditor"],
|
|
33
|
+
),
|
|
34
|
+
]
|
|
35
|
+
all_passed = True
|
|
36
|
+
for name, command in tools_to_run:
|
|
37
|
+
try:
|
|
38
|
+
run_poetry_command(f"Running {name}...", command)
|
|
39
|
+
logger.info("✅ %s completed successfully.", name)
|
|
40
|
+
except Exception:
|
|
41
|
+
logger.error("❌ %s failed.", name)
|
|
42
|
+
all_passed = False
|
|
43
|
+
logger.info("🧠 Introspection cycle completed.")
|
|
44
|
+
return all_passed
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
if __name__ == "__main__":
|
|
48
|
+
load_dotenv()
|
|
49
|
+
if not introspection():
|
|
50
|
+
sys.exit(1)
|
|
51
|
+
sys.exit(0)
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# src/body/services/cim/__init__.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Constitutional Inspection Mode (CIM) services.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from .baselines import BaselineManager
|
|
8
|
+
from .census_service import CensusService
|
|
9
|
+
from .diff import DiffEngine
|
|
10
|
+
from .history import CensusHistory
|
|
11
|
+
from .models import RepoCensus
|
|
12
|
+
from .policy import PolicyEvaluator
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
__all__ = [
|
|
16
|
+
"BaselineManager",
|
|
17
|
+
"CensusHistory",
|
|
18
|
+
"CensusService",
|
|
19
|
+
"DiffEngine",
|
|
20
|
+
"PolicyEvaluator",
|
|
21
|
+
"RepoCensus",
|
|
22
|
+
]
|