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,210 @@
|
|
|
1
|
+
# src/shared/workers/loop_hold_telemetry.py
|
|
2
|
+
"""
|
|
3
|
+
ADR-081 Step 3a-telemetry — structured sink for asyncio slow-callback warnings.
|
|
4
|
+
|
|
5
|
+
When the daemon enables `loop.set_debug(True)` (ADR-081 Step 0), the asyncio
|
|
6
|
+
event loop emits a `logger.warning` on the "asyncio" logger every time a
|
|
7
|
+
single handle executes for longer than `slow_callback_duration`. The
|
|
8
|
+
warning's repr carries the running task's `name='<stem>_worker'` attribute,
|
|
9
|
+
which the daemon assigns at task-creation time.
|
|
10
|
+
|
|
11
|
+
This module restructures that emission stream into machine-readable
|
|
12
|
+
`loop_hold.sample::<stem>` blackboard entries — the data source the
|
|
13
|
+
Step 3b drift detector consumes.
|
|
14
|
+
|
|
15
|
+
Two collaborators:
|
|
16
|
+
|
|
17
|
+
- `SlowCallbackBlackboardHandler` — a `logging.Handler` subclass installed
|
|
18
|
+
on the "asyncio" logger. `emit()` runs synchronously on the asyncio hot
|
|
19
|
+
path, so it MUST NOT block and MUST NOT raise. It parses the slow-callback
|
|
20
|
+
message into a structured sample and pushes it (non-blocking) onto an
|
|
21
|
+
asyncio queue.
|
|
22
|
+
|
|
23
|
+
- `drain_loop_hold_samples()` — a long-running coroutine spawned as a
|
|
24
|
+
daemon task. It awaits samples from the queue and posts each to the
|
|
25
|
+
blackboard via the matching worker's `post_observation()`. Decoupling
|
|
26
|
+
the post from `emit()` keeps the measurement channel from blocking the
|
|
27
|
+
loop it measures.
|
|
28
|
+
|
|
29
|
+
The queue is bounded — backpressure manifests as silent sample drops in
|
|
30
|
+
`emit()` rather than back-pressuring the loop. Acceptable: slow-callback
|
|
31
|
+
warnings are sparse compared to general loop activity, and a missed
|
|
32
|
+
sample is cheaper than a measurement-induced perf regression.
|
|
33
|
+
|
|
34
|
+
LAYER: shared.workers — telemetry infrastructure. No file writes, no
|
|
35
|
+
direct DB access — posts via Worker.post_observation which routes
|
|
36
|
+
through the standard blackboard path. Imported by cli.commands.daemon.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
from __future__ import annotations
|
|
40
|
+
|
|
41
|
+
import asyncio
|
|
42
|
+
import logging
|
|
43
|
+
import re
|
|
44
|
+
from datetime import UTC, datetime
|
|
45
|
+
from typing import TYPE_CHECKING, Any
|
|
46
|
+
|
|
47
|
+
from shared.logger import getLogger
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
if TYPE_CHECKING:
|
|
51
|
+
from shared.workers.base import Worker
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
logger = getLogger(__name__)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
# The slow-callback warning's handle repr embeds `name='<task name>'` for
|
|
58
|
+
# task-wrapping handles. Workers are named `<stem>_worker` by the daemon at
|
|
59
|
+
# create_task time (see cli.commands.daemon._run_daemon_locked), so the
|
|
60
|
+
# captured group gives us the task name; the `_worker` suffix is stripped
|
|
61
|
+
# downstream to recover the YAML stem.
|
|
62
|
+
_TASK_NAME_RE = re.compile(r"name='([^']+)'")
|
|
63
|
+
|
|
64
|
+
# Queue cap — drop samples beyond this rather than blocking emit(). The
|
|
65
|
+
# heaviest realistic flux is ~1 slow callback per cycle * ~10 workers per
|
|
66
|
+
# process * 1 cycle/second worst case = ~10/s. 1024 buys ~2 minutes of
|
|
67
|
+
# headroom before drop; the drain coroutine empties it as fast as the
|
|
68
|
+
# blackboard accepts inserts.
|
|
69
|
+
_QUEUE_MAXSIZE = 1024
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
# ID: 5e5f1c2a-3b4d-4c5e-9f8a-0b1c2d3e4f50
|
|
73
|
+
class SlowCallbackBlackboardHandler(logging.Handler):
|
|
74
|
+
"""Subscribes asyncio slow-callback warnings to a queued blackboard sink.
|
|
75
|
+
|
|
76
|
+
Installed on the ``asyncio`` logger by the daemon at startup when
|
|
77
|
+
``loop.set_debug(True)`` is enabled (per ADR-081 Step 0). ``emit()`` is
|
|
78
|
+
on the asyncio hot path — it MUST NOT block and MUST NOT raise.
|
|
79
|
+
|
|
80
|
+
The handler parses each warning record into a structured sample and
|
|
81
|
+
pushes it (non-blocking) onto the queue. A separate drain coroutine
|
|
82
|
+
posts samples to the blackboard. If the queue is full, samples are
|
|
83
|
+
dropped silently — preferable to blocking the loop with backpressure
|
|
84
|
+
from the measurement channel.
|
|
85
|
+
"""
|
|
86
|
+
|
|
87
|
+
# ID: 8c2d4f6a-9e1b-4a3c-bf5d-2e7f0a1b3c4d
|
|
88
|
+
def __init__(self, sample_queue: asyncio.Queue[dict[str, Any]]) -> None:
|
|
89
|
+
super().__init__()
|
|
90
|
+
self._queue = sample_queue
|
|
91
|
+
|
|
92
|
+
# ID: a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d
|
|
93
|
+
def emit(self, record: logging.LogRecord) -> None:
|
|
94
|
+
try:
|
|
95
|
+
# The slow-callback warning logs with `record.args = (handle, duration)`
|
|
96
|
+
# via `logger.warning("Executing %s took %.3f seconds", handle, dur)`
|
|
97
|
+
# (CPython asyncio/base_events.py). Anything else on the asyncio
|
|
98
|
+
# logger gets ignored.
|
|
99
|
+
args = record.args
|
|
100
|
+
if not args or not isinstance(args, tuple) or len(args) < 2:
|
|
101
|
+
return
|
|
102
|
+
try:
|
|
103
|
+
duration_sec = float(args[1])
|
|
104
|
+
except (TypeError, ValueError):
|
|
105
|
+
return
|
|
106
|
+
handle_repr = str(args[0])
|
|
107
|
+
m = _TASK_NAME_RE.search(handle_repr)
|
|
108
|
+
if not m:
|
|
109
|
+
# Slow callback wasn't a named task — could be an internal
|
|
110
|
+
# asyncio handle (e.g. a timer). Skip silently; this is not
|
|
111
|
+
# a worker-attributable sample.
|
|
112
|
+
return
|
|
113
|
+
task_name = m.group(1)
|
|
114
|
+
stem = task_name.removesuffix("_worker")
|
|
115
|
+
sample = {
|
|
116
|
+
"stem": stem,
|
|
117
|
+
"duration_sec": duration_sec,
|
|
118
|
+
"handle_repr": handle_repr,
|
|
119
|
+
"ts": datetime.now(UTC).isoformat(),
|
|
120
|
+
}
|
|
121
|
+
try:
|
|
122
|
+
self._queue.put_nowait(sample)
|
|
123
|
+
except asyncio.QueueFull:
|
|
124
|
+
# Drop the sample silently. The drain coroutine will catch
|
|
125
|
+
# up on the next free slot; we never block emit() on the
|
|
126
|
+
# hot path waiting for blackboard capacity.
|
|
127
|
+
pass
|
|
128
|
+
except Exception:
|
|
129
|
+
# Last-ditch safety net. A logging handler exception on the
|
|
130
|
+
# asyncio hot path would inject latency back into the loop it's
|
|
131
|
+
# measuring — never propagate.
|
|
132
|
+
pass
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
# ID: c0d1e2f3-a4b5-c6d7-e8f9-0a1b2c3d4e5f
|
|
136
|
+
def make_sample_queue() -> asyncio.Queue[dict[str, Any]]:
|
|
137
|
+
"""Construct the bounded queue the handler pushes into.
|
|
138
|
+
|
|
139
|
+
Kept as a factory so the daemon can construct it in the same coroutine
|
|
140
|
+
that owns the drain task — `asyncio.Queue` binds to the current event
|
|
141
|
+
loop at construction time.
|
|
142
|
+
"""
|
|
143
|
+
return asyncio.Queue(maxsize=_QUEUE_MAXSIZE)
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
# ID: d1e2f3a4-b5c6-d7e8-f9a0-b1c2d3e4f5a6
|
|
147
|
+
async def drain_loop_hold_samples(
|
|
148
|
+
sample_queue: asyncio.Queue[dict[str, Any]],
|
|
149
|
+
workers_by_stem: dict[str, Worker],
|
|
150
|
+
) -> None:
|
|
151
|
+
"""Drain the slow-callback sample queue to the blackboard.
|
|
152
|
+
|
|
153
|
+
Posts each sample as a ``loop_hold.sample::<stem>`` observability entry
|
|
154
|
+
under the matching worker's UUID, status ``abandoned`` — the terminal
|
|
155
|
+
status the Worker.post_observation contract reserves for per-event
|
|
156
|
+
records that recur on the next detection (the same shape the
|
|
157
|
+
``*.yield.receipt`` pattern uses; ADR-069 / observability-TTL recon).
|
|
158
|
+
|
|
159
|
+
Cancellation-safe: an outer ``asyncio.CancelledError`` exits the loop
|
|
160
|
+
cleanly without losing buffered samples. Per-sample errors are logged
|
|
161
|
+
but never propagate — telemetry failure must not bring down the daemon.
|
|
162
|
+
"""
|
|
163
|
+
logger.info(
|
|
164
|
+
"loop_hold telemetry: drain coroutine started "
|
|
165
|
+
"(%d worker(s) registered for attribution)",
|
|
166
|
+
len(workers_by_stem),
|
|
167
|
+
)
|
|
168
|
+
posted = 0
|
|
169
|
+
skipped_unknown_stem = 0
|
|
170
|
+
while True:
|
|
171
|
+
try:
|
|
172
|
+
sample = await sample_queue.get()
|
|
173
|
+
except asyncio.CancelledError:
|
|
174
|
+
logger.info(
|
|
175
|
+
"loop_hold telemetry: drain coroutine cancelled "
|
|
176
|
+
"(posted=%d, skipped_unknown_stem=%d)",
|
|
177
|
+
posted,
|
|
178
|
+
skipped_unknown_stem,
|
|
179
|
+
)
|
|
180
|
+
raise
|
|
181
|
+
stem = sample["stem"]
|
|
182
|
+
worker = workers_by_stem.get(stem)
|
|
183
|
+
if worker is None:
|
|
184
|
+
# Task name didn't map to a registered worker. Could be the
|
|
185
|
+
# _run_one_shot_loop wrapper task (its name carries the stem
|
|
186
|
+
# but the wrapper itself isn't the Worker instance), or an
|
|
187
|
+
# internal asyncio task. Either way, no UUID to attribute to —
|
|
188
|
+
# drop the sample.
|
|
189
|
+
skipped_unknown_stem += 1
|
|
190
|
+
continue
|
|
191
|
+
try:
|
|
192
|
+
await worker.post_observation(
|
|
193
|
+
subject=f"loop_hold.sample::{stem}",
|
|
194
|
+
payload={
|
|
195
|
+
"duration_sec": sample["duration_sec"],
|
|
196
|
+
"handle_repr": sample["handle_repr"],
|
|
197
|
+
"ts": sample["ts"],
|
|
198
|
+
},
|
|
199
|
+
status="abandoned",
|
|
200
|
+
)
|
|
201
|
+
posted += 1
|
|
202
|
+
except Exception as e:
|
|
203
|
+
# Telemetry post failure must not bring down the daemon or the
|
|
204
|
+
# drain loop. Log and continue — the next sample is more
|
|
205
|
+
# important than this one's persistence.
|
|
206
|
+
logger.warning(
|
|
207
|
+
"loop_hold telemetry: post failed for stem=%s: %s",
|
|
208
|
+
stem,
|
|
209
|
+
e,
|
|
210
|
+
)
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# src/shared/workers/schedule.py
|
|
2
|
+
"""
|
|
3
|
+
WorkerScheduleState - single source of per-worker liveness inputs.
|
|
4
|
+
|
|
5
|
+
Per ADR-041 D4: the YAML-scanning logic that produces
|
|
6
|
+
``(thresholds, active_uuids)`` is centralised here so all readers
|
|
7
|
+
(WorkerShopManager, dashboard runtime health, health_log_service)
|
|
8
|
+
consume the same construction. This prevents drift at the YAML-reading
|
|
9
|
+
layer between the supervisor and downstream readers.
|
|
10
|
+
|
|
11
|
+
LAYER: shared/workers — pure function over .intent/workers/*.yaml,
|
|
12
|
+
routed through IntentRepository (the canonical gateway for .intent/).
|
|
13
|
+
No DB access, no file writes, no Worker dependency. Safe to import
|
|
14
|
+
from CLI, body services, and will/workers alike.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
from dataclasses import dataclass
|
|
20
|
+
|
|
21
|
+
from shared.infrastructure.intent.intent_repository import (
|
|
22
|
+
IntentRepository,
|
|
23
|
+
get_intent_repository,
|
|
24
|
+
)
|
|
25
|
+
from shared.infrastructure.intent.operational_config import load_operational_config
|
|
26
|
+
from shared.logger import getLogger
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
logger = getLogger(__name__)
|
|
30
|
+
|
|
31
|
+
_CFG = load_operational_config().workers.worker_shop
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@dataclass(frozen=True)
|
|
35
|
+
# ID: f406d128-ea33-49d4-8095-9639089c6201
|
|
36
|
+
class WorkerScheduleState:
|
|
37
|
+
"""Per-worker liveness inputs derived from .intent/workers/*.yaml.
|
|
38
|
+
|
|
39
|
+
thresholds: maps worker_uuid (string form) → max_interval + glide_off
|
|
40
|
+
in seconds. Workers without a declared ``schedule`` block
|
|
41
|
+
do not appear here; callers apply *fallback_sec* instead.
|
|
42
|
+
|
|
43
|
+
active_uuids: the set of worker_uuids declared with ``status: active``.
|
|
44
|
+
Workers with any other status (paused, missing) are
|
|
45
|
+
absent. Callers use this for orphan-skip: registry rows
|
|
46
|
+
whose UUID is not in this set are excluded from
|
|
47
|
+
liveness reads (ADR-041 D3).
|
|
48
|
+
|
|
49
|
+
fallback_sec: canonical liveness threshold for active workers that
|
|
50
|
+
declare no ``schedule`` block. Sourced from
|
|
51
|
+
``operational_config.workers.worker_shop.fallback_threshold_sec``
|
|
52
|
+
so the producer (WorkerShopManager) and all readers
|
|
53
|
+
(dashboard, health_log_service) apply the same fallback.
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
thresholds: dict[str, int]
|
|
57
|
+
active_uuids: frozenset[str]
|
|
58
|
+
fallback_sec: int
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
# ID: f2d9b5b3-4a8e-4c7f-9d0a-2b3c4d5e6f7a
|
|
62
|
+
def load_worker_schedule_state(
|
|
63
|
+
intent_repo: IntentRepository | None = None,
|
|
64
|
+
) -> WorkerScheduleState:
|
|
65
|
+
"""Read every declared worker via IntentRepository and return per-worker
|
|
66
|
+
liveness inputs.
|
|
67
|
+
|
|
68
|
+
Only YAMLs with ``metadata.status: active`` contribute. Workers with
|
|
69
|
+
``status: paused`` (or any other non-active status) yield neither
|
|
70
|
+
a threshold nor an active-uuid entry — their registry rows, if
|
|
71
|
+
present, are orphans by D3 and excluded from liveness reads.
|
|
72
|
+
|
|
73
|
+
Failures reading individual worker declarations are logged and
|
|
74
|
+
skipped; the function never raises on per-worker errors. A missing
|
|
75
|
+
.intent/workers/ directory yields an empty state rather than an
|
|
76
|
+
error.
|
|
77
|
+
|
|
78
|
+
Per-worker threshold formula matches WorkerShopManager's pre-ADR-041
|
|
79
|
+
computation: ``max_interval + glide_off`` from the worker's
|
|
80
|
+
``mandate.schedule`` block, with ``glide_off`` defaulting to
|
|
81
|
+
``max(max_interval * glide_off_multiplier, 10)`` from
|
|
82
|
+
operational_config.
|
|
83
|
+
|
|
84
|
+
The ``intent_repo`` parameter exists so callers on the hot path
|
|
85
|
+
(WorkerShopManager runs this every cycle) and tests can pass a
|
|
86
|
+
pre-constructed gateway and avoid repeating ``validate_intent_tree``.
|
|
87
|
+
When omitted, the process-wide singleton from
|
|
88
|
+
``get_intent_repository()`` is used.
|
|
89
|
+
"""
|
|
90
|
+
repo = intent_repo if intent_repo is not None else get_intent_repository()
|
|
91
|
+
|
|
92
|
+
thresholds: dict[str, int] = {}
|
|
93
|
+
active_uuids: set[str] = set()
|
|
94
|
+
|
|
95
|
+
for worker_id in repo.list_workers():
|
|
96
|
+
try:
|
|
97
|
+
data = repo.load_worker(worker_id)
|
|
98
|
+
if data.get("metadata", {}).get("status") != "active":
|
|
99
|
+
continue
|
|
100
|
+
uuid = (data.get("identity") or {}).get("uuid", "")
|
|
101
|
+
if not uuid:
|
|
102
|
+
continue
|
|
103
|
+
active_uuids.add(uuid)
|
|
104
|
+
schedule = data.get("mandate", {}).get("schedule")
|
|
105
|
+
if schedule:
|
|
106
|
+
max_interval = schedule.get("max_interval", _CFG.fallback_threshold_sec)
|
|
107
|
+
glide_off = schedule.get(
|
|
108
|
+
"glide_off",
|
|
109
|
+
max(int(max_interval * _CFG.glide_off_multiplier), 10),
|
|
110
|
+
)
|
|
111
|
+
thresholds[uuid] = max_interval + glide_off
|
|
112
|
+
except Exception as exc:
|
|
113
|
+
logger.warning(
|
|
114
|
+
"load_worker_schedule_state: could not read %s: %s",
|
|
115
|
+
worker_id,
|
|
116
|
+
exc,
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
return WorkerScheduleState(
|
|
120
|
+
thresholds=thresholds,
|
|
121
|
+
active_uuids=frozenset(active_uuids),
|
|
122
|
+
fallback_sec=_CFG.fallback_threshold_sec,
|
|
123
|
+
)
|
will/__init__.py
ADDED
will/agents/__init__.py
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# src/will/agents/base_planner.py
|
|
2
|
+
"""
|
|
3
|
+
Base planning utilities - Strategic Action Filter.
|
|
4
|
+
|
|
5
|
+
CONSTITUTIONAL ENHANCEMENT (V2.3):
|
|
6
|
+
- Enforces planning.mutation_only: plans must not contain Read/Analyze steps.
|
|
7
|
+
- Validates that ExecutionTask.params.code is None.
|
|
8
|
+
- Enforces valid file_path formats.
|
|
9
|
+
- Ensures separation between PLANNING and CODE_GENERATION phases.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
from pydantic import ValidationError
|
|
15
|
+
|
|
16
|
+
from shared.logger import getLogger
|
|
17
|
+
from shared.models import ExecutionTask, PlanExecutionError
|
|
18
|
+
from shared.path_resolver import PathResolver
|
|
19
|
+
from shared.utils.parsing import extract_json_from_response
|
|
20
|
+
from will.orchestration.prompt_pipeline import PromptPipeline
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
logger = getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
# ID: c2df9e04-5177-44a0-bbcc-abbe0e1f7dde
|
|
27
|
+
def build_planning_prompt(
|
|
28
|
+
path_resolver: PathResolver,
|
|
29
|
+
goal: str,
|
|
30
|
+
action_descriptions_str: str,
|
|
31
|
+
reconnaissance_report: str,
|
|
32
|
+
prompt_template: str,
|
|
33
|
+
) -> str:
|
|
34
|
+
"""
|
|
35
|
+
Builds the final planning prompt with explicit Mutation-Only instructions.
|
|
36
|
+
"""
|
|
37
|
+
if not isinstance(path_resolver, PathResolver):
|
|
38
|
+
raise TypeError("path_resolver must be a PathResolver instance")
|
|
39
|
+
|
|
40
|
+
prompt_pipeline = PromptPipeline(path_resolver.repo_root)
|
|
41
|
+
|
|
42
|
+
# Pillar III: Explicitly instruct the Planner to be action-oriented.
|
|
43
|
+
directive = """
|
|
44
|
+
STRATEGIC DIRECTIVE: MUTATION-ONLY PLANNING
|
|
45
|
+
|
|
46
|
+
Your execution plan MUST only contain MUTATING ACTIONS
|
|
47
|
+
(Create, Edit, Delete, Sync).
|
|
48
|
+
|
|
49
|
+
DO NOT include 'Read', 'Analyze', 'Inspect', or 'Understand' steps.
|
|
50
|
+
The CoderAgent has its own sensation layer and will read files automatically.
|
|
51
|
+
|
|
52
|
+
Keep the plan lean. Focus exclusively on the final state of the code.
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
base_prompt = prompt_template.format(
|
|
56
|
+
goal=goal,
|
|
57
|
+
action_descriptions=action_descriptions_str,
|
|
58
|
+
reconnaissance_report=reconnaissance_report,
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
final_prompt = base_prompt + directive
|
|
62
|
+
return prompt_pipeline.process(final_prompt)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
# ID: 53af1563-669b-4cd0-b636-671bdd46570d
|
|
66
|
+
def parse_and_validate_plan(response_text: str) -> list[ExecutionTask]:
|
|
67
|
+
"""
|
|
68
|
+
Parses and validates the execution plan against the Mutation-Only Law.
|
|
69
|
+
"""
|
|
70
|
+
try:
|
|
71
|
+
parsed_json = extract_json_from_response(response_text)
|
|
72
|
+
if not isinstance(parsed_json, list):
|
|
73
|
+
raise ValueError("LLM did not return a valid JSON list for the plan.")
|
|
74
|
+
|
|
75
|
+
validated_plan: list[ExecutionTask] = []
|
|
76
|
+
|
|
77
|
+
# Forbidden actions in an Execution Plan (belong to Reconnaissance)
|
|
78
|
+
forbidden_actions = {"file.read", "inspect", "analyze", "check.audit"}
|
|
79
|
+
|
|
80
|
+
for i, task_dict in enumerate(parsed_json, 1):
|
|
81
|
+
if not isinstance(task_dict, dict):
|
|
82
|
+
continue
|
|
83
|
+
|
|
84
|
+
action = str(task_dict.get("action", "")).lower()
|
|
85
|
+
step_desc = str(task_dict.get("step", "")).lower()
|
|
86
|
+
|
|
87
|
+
# Constitutional check: mutation only
|
|
88
|
+
if action in forbidden_actions or "read " in step_desc:
|
|
89
|
+
logger.warning(
|
|
90
|
+
"Planner attempted to include Read/Analyze step (filtered)."
|
|
91
|
+
)
|
|
92
|
+
continue
|
|
93
|
+
|
|
94
|
+
# Constitutional check: no code generation during planning
|
|
95
|
+
params = task_dict.get("params") or {}
|
|
96
|
+
if isinstance(params, dict) and "code" in params:
|
|
97
|
+
if params.get("code"):
|
|
98
|
+
raise PlanExecutionError(
|
|
99
|
+
f"Step {i} violates planning.no_code_generation. "
|
|
100
|
+
"Code belongs in the Code Generation phase."
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
# Constitutional check: valid file_path format
|
|
104
|
+
if isinstance(params, dict) and "file_path" in params:
|
|
105
|
+
file_path = params.get("file_path")
|
|
106
|
+
if file_path and ("/ " in file_path or chr(92) in file_path):
|
|
107
|
+
raise PlanExecutionError(
|
|
108
|
+
f"Step {i} has invalid file_path format: {file_path}"
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
# Validate via Pydantic model
|
|
112
|
+
try:
|
|
113
|
+
validated_plan.append(ExecutionTask(**task_dict))
|
|
114
|
+
except ValidationError as e:
|
|
115
|
+
logger.debug("Step %d failed Pydantic validation: %s", i, e)
|
|
116
|
+
continue
|
|
117
|
+
|
|
118
|
+
if not validated_plan:
|
|
119
|
+
raise PlanExecutionError(
|
|
120
|
+
"Planner failed to produce any valid mutation steps."
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
logger.info(
|
|
124
|
+
"PlannerAgent formed action-oriented plan with %d mutations.",
|
|
125
|
+
len(validated_plan),
|
|
126
|
+
)
|
|
127
|
+
return validated_plan
|
|
128
|
+
|
|
129
|
+
except Exception as e:
|
|
130
|
+
if isinstance(e, PlanExecutionError):
|
|
131
|
+
raise
|
|
132
|
+
logger.warning("Plan parsing failed: %s", e)
|
|
133
|
+
raise PlanExecutionError("Failed to create a valid mutation-only plan.") from e
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# src/will/agents/code_generation/__init__.py
|
|
2
|
+
"""Code generation subsystem for CoderAgent."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
from .code_generator import CodeGenerator
|
|
7
|
+
from .correction_engine import CorrectionEngine
|
|
8
|
+
from .pattern_validator import PatternValidator
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
__all__ = [
|
|
12
|
+
"CodeGenerator",
|
|
13
|
+
"CorrectionEngine",
|
|
14
|
+
"PatternValidator",
|
|
15
|
+
]
|