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,421 @@
|
|
|
1
|
+
# src/will/self_healing/remediation_interpretation/responsibility_extractor.py
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from will.self_healing.remediation_interpretation.models import ResponsibilityCluster
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
# ID: 2d31dc4e-c957-4cb6-b7c8-8d23d79dc0b4
|
|
11
|
+
class ResponsibilityExtractor:
|
|
12
|
+
"""
|
|
13
|
+
Deterministically infer responsibility clusters from assembled file context.
|
|
14
|
+
|
|
15
|
+
This service does not attempt semantic understanding in the LLM sense.
|
|
16
|
+
It groups visible structural signals into bounded responsibility areas
|
|
17
|
+
that can support strategy selection for remediation.
|
|
18
|
+
|
|
19
|
+
Input:
|
|
20
|
+
file_context produced by FileContextAssembler
|
|
21
|
+
|
|
22
|
+
Output:
|
|
23
|
+
list[ResponsibilityCluster]
|
|
24
|
+
|
|
25
|
+
Design constraints:
|
|
26
|
+
- deterministic only
|
|
27
|
+
- no file access
|
|
28
|
+
- no repo traversal
|
|
29
|
+
- no LLM
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
# ID: 7a7bf625-f32b-470b-9c40-95d1b0af8ce7
|
|
33
|
+
def extract(self, file_context: dict[str, Any]) -> list[ResponsibilityCluster]:
|
|
34
|
+
"""
|
|
35
|
+
Extract responsibility clusters from the bounded file context.
|
|
36
|
+
"""
|
|
37
|
+
symbols = file_context.get("top_level_symbols", [])
|
|
38
|
+
imports = file_context.get("imports", [])
|
|
39
|
+
file_role = file_context.get("file_role", {})
|
|
40
|
+
metrics = file_context.get("file_metrics", {})
|
|
41
|
+
violation_summary = file_context.get("violation_summary", {})
|
|
42
|
+
|
|
43
|
+
clusters: list[ResponsibilityCluster] = []
|
|
44
|
+
|
|
45
|
+
role_cluster = self._build_role_cluster(file_role, metrics, violation_summary)
|
|
46
|
+
if role_cluster is not None:
|
|
47
|
+
clusters.append(role_cluster)
|
|
48
|
+
|
|
49
|
+
import_cluster = self._build_import_cluster(imports)
|
|
50
|
+
if import_cluster is not None:
|
|
51
|
+
clusters.append(import_cluster)
|
|
52
|
+
|
|
53
|
+
symbol_clusters = self._build_symbol_clusters(symbols)
|
|
54
|
+
clusters.extend(symbol_clusters)
|
|
55
|
+
|
|
56
|
+
violation_cluster = self._build_violation_pressure_cluster(
|
|
57
|
+
metrics=metrics,
|
|
58
|
+
violation_summary=violation_summary,
|
|
59
|
+
)
|
|
60
|
+
if violation_cluster is not None:
|
|
61
|
+
clusters.append(violation_cluster)
|
|
62
|
+
|
|
63
|
+
clusters = self._merge_compatible_clusters(clusters)
|
|
64
|
+
clusters.sort(key=self._sort_key)
|
|
65
|
+
return clusters
|
|
66
|
+
|
|
67
|
+
# ------------------------------------------------------------------
|
|
68
|
+
# Cluster builders
|
|
69
|
+
# ------------------------------------------------------------------
|
|
70
|
+
|
|
71
|
+
# ID: 25188d39-2e4f-41a1-b455-bfdfba53ee98
|
|
72
|
+
def _build_role_cluster(
|
|
73
|
+
self,
|
|
74
|
+
file_role: dict[str, Any],
|
|
75
|
+
metrics: dict[str, Any],
|
|
76
|
+
violation_summary: dict[str, Any],
|
|
77
|
+
) -> ResponsibilityCluster | None:
|
|
78
|
+
"""
|
|
79
|
+
Build a primary cluster from the detected architectural role.
|
|
80
|
+
"""
|
|
81
|
+
role_id = str(file_role.get("role_id") or "unknown")
|
|
82
|
+
layer = str(file_role.get("layer") or "unknown")
|
|
83
|
+
evidence = list(file_role.get("evidence") or [])
|
|
84
|
+
|
|
85
|
+
if role_id == "unknown" and layer == "unknown":
|
|
86
|
+
return None
|
|
87
|
+
|
|
88
|
+
summary = (
|
|
89
|
+
f"Primary architectural role appears to be '{role_id}' "
|
|
90
|
+
f"within layer '{layer}'."
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
if metrics.get("finding_count", 0) > 0:
|
|
94
|
+
summary += (
|
|
95
|
+
f" Current remediation scope covers {metrics.get('finding_count', 0)} "
|
|
96
|
+
"finding(s)."
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
rules = violation_summary.get("rules", {})
|
|
100
|
+
if rules:
|
|
101
|
+
summary += f" Violations are concentrated in {len(rules)} rule group(s)."
|
|
102
|
+
|
|
103
|
+
return ResponsibilityCluster(
|
|
104
|
+
name="architectural_role",
|
|
105
|
+
summary=summary,
|
|
106
|
+
evidence=evidence,
|
|
107
|
+
symbols=[],
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
# ID: 3c9b4bd7-8a3e-4eb8-ac3f-17c6729e7c0b
|
|
111
|
+
def _build_import_cluster(
|
|
112
|
+
self,
|
|
113
|
+
imports: list[dict[str, Any]],
|
|
114
|
+
) -> ResponsibilityCluster | None:
|
|
115
|
+
"""
|
|
116
|
+
Build a cluster that captures dependency surface / import spread.
|
|
117
|
+
"""
|
|
118
|
+
if not imports:
|
|
119
|
+
return None
|
|
120
|
+
|
|
121
|
+
module_names = sorted(
|
|
122
|
+
{
|
|
123
|
+
str(item.get("module") or item.get("name") or "").strip()
|
|
124
|
+
for item in imports
|
|
125
|
+
if str(item.get("module") or item.get("name") or "").strip()
|
|
126
|
+
}
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
if not module_names:
|
|
130
|
+
return None
|
|
131
|
+
|
|
132
|
+
evidence: list[str] = []
|
|
133
|
+
|
|
134
|
+
if len(module_names) >= 8:
|
|
135
|
+
evidence.append("High import spread suggests broad dependency surface.")
|
|
136
|
+
elif len(module_names) >= 4:
|
|
137
|
+
evidence.append(
|
|
138
|
+
"Moderate import spread suggests multiple collaboration points."
|
|
139
|
+
)
|
|
140
|
+
else:
|
|
141
|
+
evidence.append("Limited import spread suggests narrow dependency surface.")
|
|
142
|
+
|
|
143
|
+
shared_imports = [name for name in module_names if name.startswith("shared.")]
|
|
144
|
+
will_imports = [name for name in module_names if name.startswith("will.")]
|
|
145
|
+
body_imports = [name for name in module_names if name.startswith("body.")]
|
|
146
|
+
mind_imports = [name for name in module_names if name.startswith("mind.")]
|
|
147
|
+
|
|
148
|
+
if shared_imports:
|
|
149
|
+
evidence.append(
|
|
150
|
+
f"Imports shared layer dependencies ({len(shared_imports)})."
|
|
151
|
+
)
|
|
152
|
+
if will_imports:
|
|
153
|
+
evidence.append(f"Imports will layer dependencies ({len(will_imports)}).")
|
|
154
|
+
if body_imports:
|
|
155
|
+
evidence.append(f"Imports body layer dependencies ({len(body_imports)}).")
|
|
156
|
+
if mind_imports:
|
|
157
|
+
evidence.append(f"Imports mind layer dependencies ({len(mind_imports)}).")
|
|
158
|
+
|
|
159
|
+
summary = (
|
|
160
|
+
"Dependency surface inferred from imports may represent a distinct "
|
|
161
|
+
"responsibility area or collaboration burden."
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
return ResponsibilityCluster(
|
|
165
|
+
name="dependency_surface",
|
|
166
|
+
summary=summary,
|
|
167
|
+
evidence=evidence,
|
|
168
|
+
symbols=[],
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
# ID: 622d5f6d-dc5a-42c1-b646-6b8b900ac13e
|
|
172
|
+
def _build_symbol_clusters(
|
|
173
|
+
self,
|
|
174
|
+
symbols: list[dict[str, Any]],
|
|
175
|
+
) -> list[ResponsibilityCluster]:
|
|
176
|
+
"""
|
|
177
|
+
Build responsibility clusters from top-level symbol families.
|
|
178
|
+
|
|
179
|
+
This is intentionally simple:
|
|
180
|
+
- worker/service/repository-like classes
|
|
181
|
+
- helper or orchestration function groups
|
|
182
|
+
- mixed class/function surfaces
|
|
183
|
+
"""
|
|
184
|
+
if not symbols:
|
|
185
|
+
return []
|
|
186
|
+
|
|
187
|
+
classes = [item for item in symbols if item.get("symbol_type") == "class"]
|
|
188
|
+
functions = [
|
|
189
|
+
item
|
|
190
|
+
for item in symbols
|
|
191
|
+
if item.get("symbol_type") in {"function", "async_function"}
|
|
192
|
+
]
|
|
193
|
+
|
|
194
|
+
clusters: list[ResponsibilityCluster] = []
|
|
195
|
+
|
|
196
|
+
if classes:
|
|
197
|
+
class_names = [
|
|
198
|
+
str(item.get("name") or "") for item in classes if item.get("name")
|
|
199
|
+
]
|
|
200
|
+
class_evidence: list[str] = []
|
|
201
|
+
|
|
202
|
+
if len(class_names) > 1:
|
|
203
|
+
class_evidence.append(
|
|
204
|
+
"Multiple top-level classes indicate possible split responsibilities."
|
|
205
|
+
)
|
|
206
|
+
else:
|
|
207
|
+
class_evidence.append(
|
|
208
|
+
"Single top-level class appears to anchor module behavior."
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
class_bases = sorted(
|
|
212
|
+
{
|
|
213
|
+
base
|
|
214
|
+
for item in classes
|
|
215
|
+
for base in list(item.get("bases") or [])
|
|
216
|
+
if isinstance(base, str) and base
|
|
217
|
+
}
|
|
218
|
+
)
|
|
219
|
+
if class_bases:
|
|
220
|
+
class_evidence.append(
|
|
221
|
+
"Class inheritance surface detected: " + ", ".join(class_bases[:5])
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
clusters.append(
|
|
225
|
+
ResponsibilityCluster(
|
|
226
|
+
name="class_surface",
|
|
227
|
+
summary="Top-level classes appear to define a distinct responsibility surface.",
|
|
228
|
+
evidence=class_evidence,
|
|
229
|
+
symbols=class_names,
|
|
230
|
+
)
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
if functions:
|
|
234
|
+
function_names = [
|
|
235
|
+
str(item.get("name") or "") for item in functions if item.get("name")
|
|
236
|
+
]
|
|
237
|
+
function_evidence: list[str] = []
|
|
238
|
+
|
|
239
|
+
async_count = sum(1 for item in functions if item.get("is_async"))
|
|
240
|
+
if async_count:
|
|
241
|
+
function_evidence.append(
|
|
242
|
+
f"Module contains {async_count} async top-level function(s)."
|
|
243
|
+
)
|
|
244
|
+
|
|
245
|
+
if len(function_names) >= 5:
|
|
246
|
+
function_evidence.append(
|
|
247
|
+
"Large top-level function surface suggests multiple operational concerns."
|
|
248
|
+
)
|
|
249
|
+
else:
|
|
250
|
+
function_evidence.append(
|
|
251
|
+
"Top-level functions represent a bounded operational surface."
|
|
252
|
+
)
|
|
253
|
+
|
|
254
|
+
clusters.append(
|
|
255
|
+
ResponsibilityCluster(
|
|
256
|
+
name="function_surface",
|
|
257
|
+
summary=(
|
|
258
|
+
"Top-level functions appear to define a distinct operational "
|
|
259
|
+
"or helper-oriented responsibility surface."
|
|
260
|
+
),
|
|
261
|
+
evidence=function_evidence,
|
|
262
|
+
symbols=function_names,
|
|
263
|
+
)
|
|
264
|
+
)
|
|
265
|
+
|
|
266
|
+
if classes and functions:
|
|
267
|
+
mixed_symbols = [
|
|
268
|
+
*(str(item.get("name") or "") for item in classes if item.get("name")),
|
|
269
|
+
*(
|
|
270
|
+
str(item.get("name") or "")
|
|
271
|
+
for item in functions
|
|
272
|
+
if item.get("name")
|
|
273
|
+
),
|
|
274
|
+
]
|
|
275
|
+
clusters.append(
|
|
276
|
+
ResponsibilityCluster(
|
|
277
|
+
name="mixed_surface",
|
|
278
|
+
summary=(
|
|
279
|
+
"The module mixes top-level classes and top-level functions, "
|
|
280
|
+
"which may indicate multiple co-located responsibilities."
|
|
281
|
+
),
|
|
282
|
+
evidence=[
|
|
283
|
+
"Mixed symbol surface detected.",
|
|
284
|
+
"Potential split point may exist between declarative structure and operational helpers.",
|
|
285
|
+
],
|
|
286
|
+
symbols=mixed_symbols,
|
|
287
|
+
)
|
|
288
|
+
)
|
|
289
|
+
|
|
290
|
+
return clusters
|
|
291
|
+
|
|
292
|
+
# ID: 7749190d-873f-48cc-95c7-d6b20e6f5021
|
|
293
|
+
def _build_violation_pressure_cluster(
|
|
294
|
+
self,
|
|
295
|
+
metrics: dict[str, Any],
|
|
296
|
+
violation_summary: dict[str, Any],
|
|
297
|
+
) -> ResponsibilityCluster | None:
|
|
298
|
+
"""
|
|
299
|
+
Build a cluster representing remediation pressure created by findings.
|
|
300
|
+
|
|
301
|
+
This is useful for rules such as max_file_size, modularity, coupling,
|
|
302
|
+
or mixed concerns where the violation pattern itself is informative.
|
|
303
|
+
"""
|
|
304
|
+
finding_count = int(metrics.get("finding_count", 0) or 0)
|
|
305
|
+
distinct_rule_count = int(metrics.get("distinct_rule_count", 0) or 0)
|
|
306
|
+
rules = dict(violation_summary.get("rules") or {})
|
|
307
|
+
|
|
308
|
+
if finding_count == 0:
|
|
309
|
+
return None
|
|
310
|
+
|
|
311
|
+
evidence: list[str] = [
|
|
312
|
+
f"Remediation scope includes {finding_count} finding(s)."
|
|
313
|
+
]
|
|
314
|
+
|
|
315
|
+
if distinct_rule_count > 1:
|
|
316
|
+
evidence.append(
|
|
317
|
+
f"Findings span {distinct_rule_count} distinct rules, suggesting broader structural pressure."
|
|
318
|
+
)
|
|
319
|
+
else:
|
|
320
|
+
evidence.append("Findings are concentrated in a single rule family.")
|
|
321
|
+
|
|
322
|
+
max_rule = None
|
|
323
|
+
max_count = 0
|
|
324
|
+
for rule_id, count in rules.items():
|
|
325
|
+
if int(count) > max_count:
|
|
326
|
+
max_rule = rule_id
|
|
327
|
+
max_count = int(count)
|
|
328
|
+
|
|
329
|
+
if max_rule:
|
|
330
|
+
evidence.append(
|
|
331
|
+
f"Dominant violation rule is '{max_rule}' with {max_count} finding(s)."
|
|
332
|
+
)
|
|
333
|
+
|
|
334
|
+
return ResponsibilityCluster(
|
|
335
|
+
name="violation_pressure",
|
|
336
|
+
summary=(
|
|
337
|
+
"Violation pattern itself forms a planning-relevant responsibility "
|
|
338
|
+
"cluster for remediation strategy selection."
|
|
339
|
+
),
|
|
340
|
+
evidence=evidence,
|
|
341
|
+
symbols=[],
|
|
342
|
+
)
|
|
343
|
+
|
|
344
|
+
# ------------------------------------------------------------------
|
|
345
|
+
# Cluster merge
|
|
346
|
+
# ------------------------------------------------------------------
|
|
347
|
+
|
|
348
|
+
# ID: 80b169f9-1099-46fa-9bc8-843999b9e099
|
|
349
|
+
def _merge_compatible_clusters(
|
|
350
|
+
self,
|
|
351
|
+
clusters: list[ResponsibilityCluster],
|
|
352
|
+
) -> list[ResponsibilityCluster]:
|
|
353
|
+
"""
|
|
354
|
+
Merge very close clusters conservatively.
|
|
355
|
+
|
|
356
|
+
We avoid aggressive merging because later strategy selection benefits
|
|
357
|
+
from seeing distinct candidate responsibility areas.
|
|
358
|
+
"""
|
|
359
|
+
output: list[ResponsibilityCluster] = []
|
|
360
|
+
|
|
361
|
+
for cluster in clusters:
|
|
362
|
+
existing = self._find_merge_target(output, cluster)
|
|
363
|
+
if existing is None:
|
|
364
|
+
output.append(cluster)
|
|
365
|
+
continue
|
|
366
|
+
|
|
367
|
+
existing.evidence = self._dedupe_preserve_order(
|
|
368
|
+
[*existing.evidence, *cluster.evidence]
|
|
369
|
+
)
|
|
370
|
+
existing.symbols = self._dedupe_preserve_order(
|
|
371
|
+
[*existing.symbols, *cluster.symbols]
|
|
372
|
+
)
|
|
373
|
+
|
|
374
|
+
if cluster.summary and cluster.summary not in existing.summary:
|
|
375
|
+
existing.summary = f"{existing.summary} {cluster.summary}"
|
|
376
|
+
|
|
377
|
+
return output
|
|
378
|
+
|
|
379
|
+
# ID: 8c4d526d-43d6-4f91-a083-1f37fcb3efcb
|
|
380
|
+
def _find_merge_target(
|
|
381
|
+
self,
|
|
382
|
+
current: list[ResponsibilityCluster],
|
|
383
|
+
candidate: ResponsibilityCluster,
|
|
384
|
+
) -> ResponsibilityCluster | None:
|
|
385
|
+
"""Find a compatible existing cluster for conservative merging."""
|
|
386
|
+
for item in current:
|
|
387
|
+
if item.name == candidate.name:
|
|
388
|
+
return item
|
|
389
|
+
|
|
390
|
+
compatible = {
|
|
391
|
+
("class_surface", "mixed_surface"),
|
|
392
|
+
("function_surface", "mixed_surface"),
|
|
393
|
+
("mixed_surface", "class_surface"),
|
|
394
|
+
("mixed_surface", "function_surface"),
|
|
395
|
+
}
|
|
396
|
+
if (item.name, candidate.name) in compatible:
|
|
397
|
+
return item
|
|
398
|
+
|
|
399
|
+
return None
|
|
400
|
+
|
|
401
|
+
# ------------------------------------------------------------------
|
|
402
|
+
# Utilities
|
|
403
|
+
# ------------------------------------------------------------------
|
|
404
|
+
|
|
405
|
+
# ID: 7f7e3787-9b82-48e8-94e5-e9af0d71f2cb
|
|
406
|
+
def _sort_key(self, cluster: ResponsibilityCluster) -> tuple[str, str]:
|
|
407
|
+
"""Deterministic sort key for output clusters."""
|
|
408
|
+
return (cluster.name, cluster.summary)
|
|
409
|
+
|
|
410
|
+
# ID: 77d7c865-e495-422e-8d72-d38d517edc6f
|
|
411
|
+
def _dedupe_preserve_order(self, items: list[str]) -> list[str]:
|
|
412
|
+
"""Deduplicate strings while preserving original order."""
|
|
413
|
+
seen: set[str] = set()
|
|
414
|
+
output: list[str] = []
|
|
415
|
+
|
|
416
|
+
for item in items:
|
|
417
|
+
if item not in seen:
|
|
418
|
+
seen.add(item)
|
|
419
|
+
output.append(item)
|
|
420
|
+
|
|
421
|
+
return output
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
# src/will/self_healing/remediation_interpretation/service.py
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from will.self_healing.remediation_interpretation.file_context_assembler import (
|
|
8
|
+
FileContextAssembler,
|
|
9
|
+
)
|
|
10
|
+
from will.self_healing.remediation_interpretation.file_role_detector import (
|
|
11
|
+
FileRoleDetector,
|
|
12
|
+
)
|
|
13
|
+
from will.self_healing.remediation_interpretation.finding_normalizer import (
|
|
14
|
+
FindingNormalizer,
|
|
15
|
+
)
|
|
16
|
+
from will.self_healing.remediation_interpretation.models import ReasoningBrief
|
|
17
|
+
from will.self_healing.remediation_interpretation.reasoning_brief_builder import (
|
|
18
|
+
ReasoningBriefBuilder,
|
|
19
|
+
)
|
|
20
|
+
from will.self_healing.remediation_interpretation.responsibility_extractor import (
|
|
21
|
+
ResponsibilityExtractor,
|
|
22
|
+
)
|
|
23
|
+
from will.self_healing.remediation_interpretation.strategy_catalog import (
|
|
24
|
+
StrategyCatalog,
|
|
25
|
+
)
|
|
26
|
+
from will.self_healing.remediation_interpretation.strategy_selector import (
|
|
27
|
+
StrategySelector,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
# ID: bd0d2b1f-692d-4693-801e-aba8a4c5f514
|
|
32
|
+
class RemediationInterpretationError(Exception):
|
|
33
|
+
"""
|
|
34
|
+
Raised when the interpretation pipeline cannot produce a valid brief.
|
|
35
|
+
|
|
36
|
+
Callers MUST treat this as an indeterminate outcome and halt any
|
|
37
|
+
execution-phase actions. Do not catch and continue with a fallback —
|
|
38
|
+
CORE-Evidence-as-Input §6: indeterminate outcomes block progression.
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
# ID: 5d3c9f29-5d7a-43b7-92a2-5d3f2fd0f6a1
|
|
43
|
+
class RemediationInterpretationService:
|
|
44
|
+
"""
|
|
45
|
+
Deterministic-first remediation architectural context builder.
|
|
46
|
+
|
|
47
|
+
This service wires the bounded interpretation steps into a single
|
|
48
|
+
entrypoint that the remediator calls during the RUNTIME planning phase,
|
|
49
|
+
before any execution-phase actions occur.
|
|
50
|
+
|
|
51
|
+
Output is evidence: a deterministic description of the file's detected
|
|
52
|
+
role, responsibility clusters, and candidate strategies. This is NOT
|
|
53
|
+
authority. It does not define what must be done. It informs planning.
|
|
54
|
+
|
|
55
|
+
Flow:
|
|
56
|
+
1. normalize findings
|
|
57
|
+
2. detect file role
|
|
58
|
+
3. assemble file context
|
|
59
|
+
4. extract responsibility clusters
|
|
60
|
+
5. rank strategies
|
|
61
|
+
6. choose recommended strategy (may be None if confidence is low)
|
|
62
|
+
7. build ReasoningBrief
|
|
63
|
+
|
|
64
|
+
Design constraints:
|
|
65
|
+
- deterministic only
|
|
66
|
+
- no LLM
|
|
67
|
+
- no file I/O beyond the already-provided source_code input
|
|
68
|
+
- no blackboard/database access
|
|
69
|
+
- no repo traversal
|
|
70
|
+
|
|
71
|
+
Failure contract:
|
|
72
|
+
- Raises RemediationInterpretationError on any internal failure.
|
|
73
|
+
- Never silently degrades or returns partial output.
|
|
74
|
+
- Callers are responsible for handling indeterminate outcomes.
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
def __init__(
|
|
78
|
+
self,
|
|
79
|
+
finding_normalizer: FindingNormalizer | None = None,
|
|
80
|
+
file_role_detector: FileRoleDetector | None = None,
|
|
81
|
+
file_context_assembler: FileContextAssembler | None = None,
|
|
82
|
+
responsibility_extractor: ResponsibilityExtractor | None = None,
|
|
83
|
+
strategy_catalog: StrategyCatalog | None = None,
|
|
84
|
+
strategy_selector: StrategySelector | None = None,
|
|
85
|
+
reasoning_brief_builder: ReasoningBriefBuilder | None = None,
|
|
86
|
+
) -> None:
|
|
87
|
+
self._finding_normalizer = finding_normalizer or FindingNormalizer()
|
|
88
|
+
self._file_role_detector = file_role_detector or FileRoleDetector()
|
|
89
|
+
self._file_context_assembler = file_context_assembler or FileContextAssembler()
|
|
90
|
+
self._responsibility_extractor = (
|
|
91
|
+
responsibility_extractor or ResponsibilityExtractor()
|
|
92
|
+
)
|
|
93
|
+
self._strategy_catalog = strategy_catalog or StrategyCatalog()
|
|
94
|
+
self._strategy_selector = strategy_selector or StrategySelector(
|
|
95
|
+
strategy_catalog=self._strategy_catalog
|
|
96
|
+
)
|
|
97
|
+
self._reasoning_brief_builder = (
|
|
98
|
+
reasoning_brief_builder or ReasoningBriefBuilder()
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
# ID: 2b4a7e90-7b0a-40db-a4e4-6f8eb78d5b9c
|
|
102
|
+
def build_reasoning_brief(
|
|
103
|
+
self,
|
|
104
|
+
file_path: str,
|
|
105
|
+
source_code: str,
|
|
106
|
+
findings: list[dict[str, Any]],
|
|
107
|
+
) -> ReasoningBrief:
|
|
108
|
+
"""
|
|
109
|
+
Build a complete ReasoningBrief from claimed blackboard findings and
|
|
110
|
+
current source code for one file.
|
|
111
|
+
|
|
112
|
+
Raises:
|
|
113
|
+
RemediationInterpretationError: if any pipeline step fails.
|
|
114
|
+
The caller must treat this as an indeterminate outcome.
|
|
115
|
+
"""
|
|
116
|
+
try:
|
|
117
|
+
normalized_findings = self._finding_normalizer.normalize(findings)
|
|
118
|
+
except Exception as exc:
|
|
119
|
+
raise RemediationInterpretationError(
|
|
120
|
+
f"FindingNormalizer failed for '{file_path}': {exc}"
|
|
121
|
+
) from exc
|
|
122
|
+
|
|
123
|
+
try:
|
|
124
|
+
file_role = self._file_role_detector.detect(
|
|
125
|
+
file_path=file_path,
|
|
126
|
+
source_code=source_code,
|
|
127
|
+
findings=normalized_findings,
|
|
128
|
+
)
|
|
129
|
+
except Exception as exc:
|
|
130
|
+
raise RemediationInterpretationError(
|
|
131
|
+
f"FileRoleDetector failed for '{file_path}': {exc}"
|
|
132
|
+
) from exc
|
|
133
|
+
|
|
134
|
+
try:
|
|
135
|
+
file_context = self._file_context_assembler.assemble(
|
|
136
|
+
file_path=file_path,
|
|
137
|
+
source_code=source_code,
|
|
138
|
+
findings=normalized_findings,
|
|
139
|
+
file_role=file_role,
|
|
140
|
+
)
|
|
141
|
+
except Exception as exc:
|
|
142
|
+
raise RemediationInterpretationError(
|
|
143
|
+
f"FileContextAssembler failed for '{file_path}': {exc}"
|
|
144
|
+
) from exc
|
|
145
|
+
|
|
146
|
+
try:
|
|
147
|
+
responsibility_clusters = self._responsibility_extractor.extract(
|
|
148
|
+
file_context
|
|
149
|
+
)
|
|
150
|
+
except Exception as exc:
|
|
151
|
+
raise RemediationInterpretationError(
|
|
152
|
+
f"ResponsibilityExtractor failed for '{file_path}': {exc}"
|
|
153
|
+
) from exc
|
|
154
|
+
|
|
155
|
+
try:
|
|
156
|
+
candidate_strategies = self._strategy_selector.select(
|
|
157
|
+
file_role=file_role,
|
|
158
|
+
file_context=file_context,
|
|
159
|
+
responsibility_clusters=responsibility_clusters,
|
|
160
|
+
)
|
|
161
|
+
recommended_strategy = self._strategy_selector.choose_recommended(
|
|
162
|
+
candidate_strategies
|
|
163
|
+
)
|
|
164
|
+
except Exception as exc:
|
|
165
|
+
raise RemediationInterpretationError(
|
|
166
|
+
f"StrategySelector failed for '{file_path}': {exc}"
|
|
167
|
+
) from exc
|
|
168
|
+
|
|
169
|
+
try:
|
|
170
|
+
return self._reasoning_brief_builder.build(
|
|
171
|
+
file_path=file_path,
|
|
172
|
+
file_role=file_role,
|
|
173
|
+
normalized_findings=normalized_findings,
|
|
174
|
+
file_context=file_context,
|
|
175
|
+
responsibility_clusters=responsibility_clusters,
|
|
176
|
+
candidate_strategies=candidate_strategies,
|
|
177
|
+
recommended_strategy=recommended_strategy,
|
|
178
|
+
)
|
|
179
|
+
except Exception as exc:
|
|
180
|
+
raise RemediationInterpretationError(
|
|
181
|
+
f"ReasoningBriefBuilder failed for '{file_path}': {exc}"
|
|
182
|
+
) from exc
|
|
183
|
+
|
|
184
|
+
# ID: 7aa9cfde-e8ac-4e14-bd33-e6df31d5b2d1
|
|
185
|
+
def build_reasoning_brief_dict(
|
|
186
|
+
self,
|
|
187
|
+
file_path: str,
|
|
188
|
+
source_code: str,
|
|
189
|
+
findings: list[dict[str, Any]],
|
|
190
|
+
) -> dict[str, Any]:
|
|
191
|
+
"""
|
|
192
|
+
Convenience wrapper returning a JSON-serializable brief.
|
|
193
|
+
|
|
194
|
+
Raises:
|
|
195
|
+
RemediationInterpretationError: propagated from build_reasoning_brief.
|
|
196
|
+
"""
|
|
197
|
+
brief = self.build_reasoning_brief(
|
|
198
|
+
file_path=file_path,
|
|
199
|
+
source_code=source_code,
|
|
200
|
+
findings=findings,
|
|
201
|
+
)
|
|
202
|
+
return brief.to_dict()
|