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,136 @@
|
|
|
1
|
+
# src/will/agents/strategic_auditor/effects.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
StrategicAuditor — campaign side effects on the world.
|
|
5
|
+
|
|
6
|
+
Two operations, both gated by StrategicAuditor.run()'s write /
|
|
7
|
+
execute_autonomous flags and both taking a finished StrategicCampaign:
|
|
8
|
+
|
|
9
|
+
- persist_campaign: write a parent Task plus one child Task per
|
|
10
|
+
autonomous cluster and one escalation Task per amendment-required
|
|
11
|
+
cluster, via TaskRepository. Two session commits.
|
|
12
|
+
- execute_autonomous_tasks: iterate the campaign's autonomous clusters,
|
|
13
|
+
gate on confidence >= 0.7, dispatch each to develop_from_goal.
|
|
14
|
+
|
|
15
|
+
Both share one reason to change: how a finished campaign acts on the
|
|
16
|
+
system. Splitting them apart would fragment that single answer.
|
|
17
|
+
|
|
18
|
+
LAYER: will/agents — collaborator of StrategicAuditor. Sessions and
|
|
19
|
+
context flow in from the caller; no service-registry session
|
|
20
|
+
construction here.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
from __future__ import annotations
|
|
24
|
+
|
|
25
|
+
from typing import TYPE_CHECKING
|
|
26
|
+
|
|
27
|
+
from shared.infrastructure.repositories.task_repository import TaskRepository
|
|
28
|
+
from shared.logger import getLogger
|
|
29
|
+
from will.agents.strategic_auditor.models import StrategicCampaign
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
if TYPE_CHECKING:
|
|
33
|
+
from sqlalchemy.ext.asyncio import AsyncSession
|
|
34
|
+
|
|
35
|
+
from shared.context import CoreContext
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
logger = getLogger(__name__)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
# ID: f4d82377-ffce-4794-9bc3-754a48eed83d
|
|
42
|
+
async def persist_campaign(session: AsyncSession, campaign: StrategicCampaign) -> None:
|
|
43
|
+
"""Store campaign as parent Task + child Tasks in PostgreSQL."""
|
|
44
|
+
repo = TaskRepository(session)
|
|
45
|
+
|
|
46
|
+
parent = await repo.create(
|
|
47
|
+
intent=f"[StrategicCampaign:{campaign.campaign_id}] {campaign.system_summary[:200]}",
|
|
48
|
+
assigned_role="StrategicAuditor",
|
|
49
|
+
status="campaign_ready",
|
|
50
|
+
)
|
|
51
|
+
parent.context = {
|
|
52
|
+
"campaign_id": campaign.campaign_id,
|
|
53
|
+
"total_findings": campaign.total_findings,
|
|
54
|
+
"autonomous_tasks": campaign.autonomous_task_count,
|
|
55
|
+
"escalations": campaign.escalation_count,
|
|
56
|
+
"system_summary": campaign.system_summary,
|
|
57
|
+
}
|
|
58
|
+
await session.commit()
|
|
59
|
+
|
|
60
|
+
for cluster in campaign.clusters:
|
|
61
|
+
child = await repo.create(
|
|
62
|
+
intent=cluster.proposed_fix,
|
|
63
|
+
assigned_role="AutonomousDeveloper",
|
|
64
|
+
status="pending",
|
|
65
|
+
)
|
|
66
|
+
child.parent_task_id = parent.id
|
|
67
|
+
child.requires_approval = False
|
|
68
|
+
child.context = {
|
|
69
|
+
"cluster_id": cluster.cluster_id,
|
|
70
|
+
"root_cause": cluster.root_cause,
|
|
71
|
+
"affected_files": cluster.affected_files,
|
|
72
|
+
"finding_ids": cluster.finding_ids,
|
|
73
|
+
"confidence": cluster.confidence,
|
|
74
|
+
"estimated_impact": cluster.estimated_impact,
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
for cluster in campaign.escalations:
|
|
78
|
+
child = await repo.create(
|
|
79
|
+
intent=f"[ESCALATION] {cluster.proposed_fix}",
|
|
80
|
+
assigned_role="Human",
|
|
81
|
+
status="awaiting_approval",
|
|
82
|
+
)
|
|
83
|
+
child.parent_task_id = parent.id
|
|
84
|
+
child.requires_approval = True
|
|
85
|
+
child.context = {
|
|
86
|
+
"cluster_id": cluster.cluster_id,
|
|
87
|
+
"root_cause": cluster.root_cause,
|
|
88
|
+
"constitutional_amendment_needed": cluster.proposed_fix,
|
|
89
|
+
"affected_files": cluster.affected_files,
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
await session.commit()
|
|
93
|
+
logger.info(
|
|
94
|
+
"Campaign persisted: parent=%s, %d tasks, %d escalations",
|
|
95
|
+
parent.id,
|
|
96
|
+
campaign.autonomous_task_count,
|
|
97
|
+
campaign.escalation_count,
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
# ID: b63d2bae-56c3-4f98-80e3-f1c9cc170ca3
|
|
102
|
+
async def execute_autonomous_tasks(
|
|
103
|
+
ctx: CoreContext, session: AsyncSession, campaign: StrategicCampaign
|
|
104
|
+
) -> None:
|
|
105
|
+
"""Execute non-escalation clusters via develop_from_goal.
|
|
106
|
+
|
|
107
|
+
Clusters below the 0.7 confidence threshold are skipped — they remain
|
|
108
|
+
persisted as pending Tasks for a human to review rather than being
|
|
109
|
+
autonomously executed.
|
|
110
|
+
"""
|
|
111
|
+
from will.autonomy.autonomous_developer import develop_from_goal
|
|
112
|
+
|
|
113
|
+
logger.info("Executing %d autonomous tasks...", campaign.autonomous_task_count)
|
|
114
|
+
|
|
115
|
+
for i, cluster in enumerate(campaign.clusters, 1):
|
|
116
|
+
logger.info(
|
|
117
|
+
" [%d/%d] %s (impact=%s, confidence=%.2f)",
|
|
118
|
+
i,
|
|
119
|
+
campaign.autonomous_task_count,
|
|
120
|
+
cluster.root_cause[:80],
|
|
121
|
+
cluster.estimated_impact,
|
|
122
|
+
cluster.confidence,
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
if cluster.confidence < 0.7:
|
|
126
|
+
logger.info(" Skipping (confidence too low — staged for review)")
|
|
127
|
+
continue
|
|
128
|
+
|
|
129
|
+
success, message = await develop_from_goal(
|
|
130
|
+
context=ctx,
|
|
131
|
+
goal=cluster.proposed_fix,
|
|
132
|
+
workflow_type=cluster.workflow_type,
|
|
133
|
+
write=True,
|
|
134
|
+
session=session,
|
|
135
|
+
)
|
|
136
|
+
logger.info(" %s %s", "OK" if success else "FAIL", message)
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# src/will/agents/strategic_auditor/models.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Data structures for the StrategicAuditor campaign.
|
|
5
|
+
|
|
6
|
+
Pure data — no logic, no imports from CORE internals.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from dataclasses import dataclass, field
|
|
12
|
+
from datetime import datetime
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass
|
|
16
|
+
# ID: 2ebdd1a6-3c94-4b49-8d61-00f8ed2ba976
|
|
17
|
+
class RootCauseCluster:
|
|
18
|
+
"""
|
|
19
|
+
A group of audit findings that share a single root cause.
|
|
20
|
+
|
|
21
|
+
The LLM produces these — they are the core reasoning unit of the campaign.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
cluster_id: str
|
|
25
|
+
root_cause: str
|
|
26
|
+
"""Single sentence: why do all these findings exist?"""
|
|
27
|
+
|
|
28
|
+
affected_files: list[str]
|
|
29
|
+
finding_ids: list[str]
|
|
30
|
+
proposed_fix: str
|
|
31
|
+
"""Concrete, actionable description of what needs to change."""
|
|
32
|
+
|
|
33
|
+
requires_constitution_change: bool = False
|
|
34
|
+
"""True → escalate to human. False → CORE can fix autonomously."""
|
|
35
|
+
|
|
36
|
+
confidence: float = 0.8
|
|
37
|
+
estimated_impact: str = "medium"
|
|
38
|
+
"""low / medium / high — how much does fixing this improve CORE?"""
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@dataclass
|
|
42
|
+
# ID: 75de5708-f567-46e4-a350-bfadc21c6e19
|
|
43
|
+
class StrategicCampaign:
|
|
44
|
+
"""
|
|
45
|
+
The full output of a StrategicAuditor run.
|
|
46
|
+
|
|
47
|
+
Stored as a parent Task in PostgreSQL with child Tasks per cluster.
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
campaign_id: str
|
|
51
|
+
created_at: datetime
|
|
52
|
+
system_summary: str
|
|
53
|
+
"""LLM's one-paragraph assessment of CORE's current state."""
|
|
54
|
+
|
|
55
|
+
clusters: list[RootCauseCluster] = field(default_factory=list)
|
|
56
|
+
escalations: list[RootCauseCluster] = field(default_factory=list)
|
|
57
|
+
"""Clusters that require human (.intent/) amendment."""
|
|
58
|
+
|
|
59
|
+
total_findings: int = 0
|
|
60
|
+
autonomous_task_count: int = 0
|
|
61
|
+
escalation_count: int = 0
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# src/will/agents/strategic_auditor/reasoning.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
StrategicAuditor — campaign synthesis.
|
|
5
|
+
|
|
6
|
+
The LLM contract layer for StrategicAuditor. Takes a system_context dict
|
|
7
|
+
gathered by SystemContextGatherer and produces a StrategicCampaign by:
|
|
8
|
+
|
|
9
|
+
1. Compacting findings into a per-rule summary (token-budget aware).
|
|
10
|
+
2. Invoking the architect_threats_analysis_prompt PromptModel.
|
|
11
|
+
3. Parsing the JSON response (fenced-block tolerant).
|
|
12
|
+
4. Constructing RootCauseCluster instances and partitioning them into
|
|
13
|
+
autonomous-vs-escalation buckets per requires_constitution_change.
|
|
14
|
+
|
|
15
|
+
Fail-soft: on any LLM/parse error the function returns a campaign with an
|
|
16
|
+
empty cluster list and a diagnostic system_summary so the caller's
|
|
17
|
+
downstream effects (persist, execute, log) still have something coherent
|
|
18
|
+
to operate on.
|
|
19
|
+
|
|
20
|
+
LAYER: will/agents — collaborator of StrategicAuditor. No DB writes, no
|
|
21
|
+
file writes, no .intent/ access. The only side effect is the LLM call.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
from __future__ import annotations
|
|
25
|
+
|
|
26
|
+
import json
|
|
27
|
+
import uuid
|
|
28
|
+
from datetime import UTC, datetime
|
|
29
|
+
from typing import TYPE_CHECKING, Any
|
|
30
|
+
|
|
31
|
+
from shared.ai.prompt_model import PromptModel
|
|
32
|
+
from shared.infrastructure.intent.operational_config import load_operational_config
|
|
33
|
+
from shared.logger import getLogger
|
|
34
|
+
from will.agents.strategic_auditor.models import RootCauseCluster, StrategicCampaign
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
if TYPE_CHECKING:
|
|
38
|
+
from will.orchestration.cognitive_service import CognitiveService
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
logger = getLogger(__name__)
|
|
42
|
+
|
|
43
|
+
_CFG_SA = load_operational_config().strategic_auditor
|
|
44
|
+
|
|
45
|
+
_VALID_WORKFLOW_TYPES = frozenset(
|
|
46
|
+
{
|
|
47
|
+
"refactor_modularity",
|
|
48
|
+
"coverage_remediation",
|
|
49
|
+
"full_feature_development",
|
|
50
|
+
}
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def _resolve_workflow_type(value: str) -> str:
|
|
55
|
+
"""Return value if it is a known workflow type, else the safe default."""
|
|
56
|
+
if isinstance(value, str) and value.strip() in _VALID_WORKFLOW_TYPES:
|
|
57
|
+
return value.strip()
|
|
58
|
+
logger.warning(
|
|
59
|
+
"Unknown or missing workflow_type '%s' from LLM — "
|
|
60
|
+
"defaulting to full_feature_development",
|
|
61
|
+
value,
|
|
62
|
+
)
|
|
63
|
+
return "full_feature_development"
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
# ID: b1f24560-023b-4482-819a-169708c7130f
|
|
67
|
+
async def synthesize_campaign(
|
|
68
|
+
cognitive: CognitiveService,
|
|
69
|
+
system_context: dict[str, Any],
|
|
70
|
+
) -> StrategicCampaign:
|
|
71
|
+
"""Send system context to the LLM and parse the strategic campaign.
|
|
72
|
+
|
|
73
|
+
The prompt name (architect_threats_analysis_prompt) and the expected
|
|
74
|
+
response schema (clusters list with root_cause / proposed_fix /
|
|
75
|
+
requires_constitution_change / workflow_type / confidence / impact)
|
|
76
|
+
are the LLM contract this function owns.
|
|
77
|
+
"""
|
|
78
|
+
findings = system_context.get("audit_findings", [])
|
|
79
|
+
|
|
80
|
+
findings_by_rule: dict[str, list[str]] = {}
|
|
81
|
+
for f in findings:
|
|
82
|
+
rid = f.get("rule_id", "unknown")
|
|
83
|
+
ffile = f.get("file", "unknown")
|
|
84
|
+
findings_by_rule.setdefault(rid, []).append(ffile)
|
|
85
|
+
|
|
86
|
+
lines = []
|
|
87
|
+
for rid, files in sorted(findings_by_rule.items()):
|
|
88
|
+
unique = sorted(set(files))[:5]
|
|
89
|
+
suffix = f" (+{len(files) - 5} more)" if len(files) > 5 else ""
|
|
90
|
+
lines.append(
|
|
91
|
+
f" [{rid}] in {len(files)} locations: {', '.join(unique)}{suffix}"
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
def _compact(obj: Any, max_chars: int = _CFG_SA.compact_max_chars) -> str:
|
|
95
|
+
s = json.dumps(obj, indent=2, default=str)
|
|
96
|
+
return s[:max_chars] + "..." if len(s) > max_chars else s
|
|
97
|
+
|
|
98
|
+
logger.info("Reasoning about system state (LLM call)...")
|
|
99
|
+
|
|
100
|
+
try:
|
|
101
|
+
model = PromptModel.load("architect_threats_analysis_prompt")
|
|
102
|
+
client = await cognitive.aget_client_for_role(model.manifest.role)
|
|
103
|
+
response = await model.invoke(
|
|
104
|
+
context={
|
|
105
|
+
"finding_count": len(findings),
|
|
106
|
+
"audit_findings_summary": "\n".join(lines[:50]),
|
|
107
|
+
"semantic_landscape": _compact(
|
|
108
|
+
system_context.get("semantic_landscape", {})
|
|
109
|
+
),
|
|
110
|
+
"knowledge_gaps": _compact(system_context.get("knowledge_gaps", {})),
|
|
111
|
+
"structural_health": _compact(
|
|
112
|
+
system_context.get("structural_health", {})
|
|
113
|
+
),
|
|
114
|
+
"change_context": _compact(system_context.get("change_context", {})),
|
|
115
|
+
"intent_drift": _compact(system_context.get("intent_drift", {})),
|
|
116
|
+
"constitution_summary": _compact(
|
|
117
|
+
{
|
|
118
|
+
"policy_count": system_context.get(
|
|
119
|
+
"constitution_summary", {}
|
|
120
|
+
).get("policy_count", 0),
|
|
121
|
+
"policies": system_context.get("constitution_summary", {}).get(
|
|
122
|
+
"policy_ids", []
|
|
123
|
+
)[:15],
|
|
124
|
+
}
|
|
125
|
+
),
|
|
126
|
+
},
|
|
127
|
+
client=client,
|
|
128
|
+
user_id="StrategicAuditor",
|
|
129
|
+
)
|
|
130
|
+
raw = response.strip()
|
|
131
|
+
if raw.startswith("```"):
|
|
132
|
+
raw = raw.split("```")[1]
|
|
133
|
+
if raw.startswith("json"):
|
|
134
|
+
raw = raw[4:]
|
|
135
|
+
data = json.loads(raw.strip())
|
|
136
|
+
except Exception as e:
|
|
137
|
+
logger.error("LLM reasoning failed: %s", e)
|
|
138
|
+
data = {"system_summary": f"Strategic audit failed: {e}", "clusters": []}
|
|
139
|
+
|
|
140
|
+
campaign_id = str(uuid.uuid4())
|
|
141
|
+
clusters: list[RootCauseCluster] = []
|
|
142
|
+
escalations: list[RootCauseCluster] = []
|
|
143
|
+
|
|
144
|
+
for c in data.get("clusters", []):
|
|
145
|
+
cluster = RootCauseCluster(
|
|
146
|
+
cluster_id=c.get("cluster_id", str(uuid.uuid4())[:8]),
|
|
147
|
+
root_cause=c.get("root_cause", ""),
|
|
148
|
+
affected_files=c.get("affected_files", []),
|
|
149
|
+
finding_ids=c.get("finding_ids", []),
|
|
150
|
+
proposed_fix=c.get("proposed_fix", ""),
|
|
151
|
+
requires_constitution_change=c.get("requires_constitution_change", False),
|
|
152
|
+
confidence=float(c.get("confidence", 0.8)),
|
|
153
|
+
estimated_impact=c.get("estimated_impact", "medium"),
|
|
154
|
+
workflow_type=_resolve_workflow_type(c.get("workflow_type", "")),
|
|
155
|
+
)
|
|
156
|
+
(escalations if cluster.requires_constitution_change else clusters).append(
|
|
157
|
+
cluster
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
return StrategicCampaign(
|
|
161
|
+
campaign_id=campaign_id,
|
|
162
|
+
created_at=datetime.now(UTC),
|
|
163
|
+
system_summary=data.get("system_summary", ""),
|
|
164
|
+
clusters=clusters,
|
|
165
|
+
escalations=escalations,
|
|
166
|
+
total_findings=len(findings),
|
|
167
|
+
autonomous_task_count=len(clusters),
|
|
168
|
+
escalation_count=len(escalations),
|
|
169
|
+
)
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
# src/will/agents/tagger_agent.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Implements the CapabilityTaggerAgent, which finds unassigned capabilities
|
|
5
|
+
and uses an LLM to suggest constitutionally-valid names for them.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import json
|
|
11
|
+
import re
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import Any
|
|
14
|
+
|
|
15
|
+
from shared.ai.prompt_model import PromptModel
|
|
16
|
+
from shared.infrastructure.knowledge.knowledge_service import KnowledgeService
|
|
17
|
+
from shared.logger import getLogger
|
|
18
|
+
from shared.utils.parallel_processor import ThrottledParallelProcessor
|
|
19
|
+
from will.orchestration.cognitive_service import CognitiveService
|
|
20
|
+
from will.orchestration.decision_tracer import DecisionTracer
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
logger = getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
# ID: fa3e820c-ed8c-4785-b94d-4cb5a1ae23b8
|
|
27
|
+
class CapabilityTaggerAgent:
|
|
28
|
+
"""An agent that finds unassigned capabilities and suggests names."""
|
|
29
|
+
|
|
30
|
+
def __init__(
|
|
31
|
+
self,
|
|
32
|
+
cognitive_service: CognitiveService,
|
|
33
|
+
knowledge_service: KnowledgeService,
|
|
34
|
+
entry_point_patterns: list | None = None,
|
|
35
|
+
):
|
|
36
|
+
"""Initializes the agent with the tools it needs."""
|
|
37
|
+
self.cognitive_service = cognitive_service
|
|
38
|
+
self.knowledge_service = knowledge_service
|
|
39
|
+
self.tracer = DecisionTracer()
|
|
40
|
+
self.prompt_model = PromptModel.load("capability_definer")
|
|
41
|
+
self.tagger_client = None
|
|
42
|
+
self.entry_point_patterns = entry_point_patterns or []
|
|
43
|
+
|
|
44
|
+
def _is_entry_point(self, symbol_data: dict[str, Any]) -> bool:
|
|
45
|
+
"""
|
|
46
|
+
Checks if a symbol matches any of the defined entry point patterns.
|
|
47
|
+
Copied directly from OrphanedLogicCheck.
|
|
48
|
+
"""
|
|
49
|
+
for pattern in self.entry_point_patterns:
|
|
50
|
+
match_rules = pattern.get("match", {})
|
|
51
|
+
if not match_rules:
|
|
52
|
+
continue
|
|
53
|
+
is_a_match = all(
|
|
54
|
+
self._evaluate_match_rule(rule_key, rule_value, symbol_data)
|
|
55
|
+
for rule_key, rule_value in match_rules.items()
|
|
56
|
+
)
|
|
57
|
+
if is_a_match:
|
|
58
|
+
return True
|
|
59
|
+
return False
|
|
60
|
+
|
|
61
|
+
def _evaluate_match_rule(self, key: str, value: Any, data: dict) -> bool:
|
|
62
|
+
"""
|
|
63
|
+
Evaluates a single criterion for the entry point pattern matching.
|
|
64
|
+
Copied directly from OrphanedLogicCheck.
|
|
65
|
+
"""
|
|
66
|
+
if key == "type":
|
|
67
|
+
kind = data.get("type", "")
|
|
68
|
+
is_function_type = kind in ("function", "method")
|
|
69
|
+
return (value == "function" and is_function_type) or (value == kind)
|
|
70
|
+
if key == "name_regex":
|
|
71
|
+
return bool(re.search(value, data.get("name", "")))
|
|
72
|
+
if key == "module_path_contains":
|
|
73
|
+
file_path = data.get("file_path", "")
|
|
74
|
+
module_path = (
|
|
75
|
+
file_path.replace("src/", "").replace(".py", "").replace("/", ".")
|
|
76
|
+
)
|
|
77
|
+
return value in module_path
|
|
78
|
+
if key == "is_public_function":
|
|
79
|
+
return data.get("is_public", False) is value
|
|
80
|
+
if key == "has_capability_tag":
|
|
81
|
+
return (data.get("capability") is not None) == value
|
|
82
|
+
return data.get(key) == value
|
|
83
|
+
|
|
84
|
+
def _find_orphaned_symbols(self, all_symbols: list[dict]) -> list[dict]:
|
|
85
|
+
"""
|
|
86
|
+
Finds truly orphaned symbols using the exact same logic as OrphanedLogicCheck.
|
|
87
|
+
|
|
88
|
+
A symbol is orphaned if it is:
|
|
89
|
+
1. Public
|
|
90
|
+
2. Has no capability assigned (capability is None)
|
|
91
|
+
3. Is NOT an entry point
|
|
92
|
+
4. Is NOT called by any other code
|
|
93
|
+
"""
|
|
94
|
+
if not all_symbols:
|
|
95
|
+
return []
|
|
96
|
+
|
|
97
|
+
# Build call graph (same as OrphanedLogicCheck)
|
|
98
|
+
all_called_symbols = set()
|
|
99
|
+
for symbol_data in all_symbols:
|
|
100
|
+
called_list = symbol_data.get("calls") or []
|
|
101
|
+
for called_qualname in called_list:
|
|
102
|
+
all_called_symbols.add(called_qualname)
|
|
103
|
+
|
|
104
|
+
orphaned_symbols = []
|
|
105
|
+
for symbol_data in all_symbols:
|
|
106
|
+
is_public = symbol_data.get("is_public", False)
|
|
107
|
+
has_no_key = symbol_data.get("capability") is None
|
|
108
|
+
|
|
109
|
+
if not (is_public and has_no_key):
|
|
110
|
+
continue
|
|
111
|
+
|
|
112
|
+
if self._is_entry_point(symbol_data):
|
|
113
|
+
continue
|
|
114
|
+
|
|
115
|
+
qualname = symbol_data.get("name", "")
|
|
116
|
+
short_name = qualname.split(".")[-1]
|
|
117
|
+
is_called = (qualname in all_called_symbols) or (
|
|
118
|
+
short_name in all_called_symbols
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
if not is_called:
|
|
122
|
+
orphaned_symbols.append(symbol_data)
|
|
123
|
+
|
|
124
|
+
return orphaned_symbols
|
|
125
|
+
|
|
126
|
+
async def _get_existing_capabilities(self) -> list[str]:
|
|
127
|
+
"""Fetches existing capabilities asynchronously."""
|
|
128
|
+
return await self.knowledge_service.list_capabilities()
|
|
129
|
+
|
|
130
|
+
def _extract_symbol_info(self, symbol: dict[str, Any]) -> dict[str, Any]:
|
|
131
|
+
"""Extracts the relevant information for the prompt from a symbol entry."""
|
|
132
|
+
return {
|
|
133
|
+
"key": symbol.get("uuid"),
|
|
134
|
+
"name": symbol.get("name"),
|
|
135
|
+
"file": symbol.get("file_path"),
|
|
136
|
+
"domain": symbol.get("domain"),
|
|
137
|
+
"docstring": symbol.get("docstring"),
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
def _build_prompt_context(
|
|
141
|
+
self, symbol_info: dict[str, Any], existing_capabilities: list[str]
|
|
142
|
+
) -> dict[str, str]:
|
|
143
|
+
"""
|
|
144
|
+
Builds the PromptModel context dict for a single symbol invocation.
|
|
145
|
+
|
|
146
|
+
Returns a dict matching the input contract declared in model.yaml.
|
|
147
|
+
"""
|
|
148
|
+
similar_caps_text = "\n".join(
|
|
149
|
+
[f"- {cap}" for cap in existing_capabilities[:20]]
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
code_snippet = f"# {symbol_info.get('name', 'unknown')}\n"
|
|
153
|
+
if symbol_info.get("docstring"):
|
|
154
|
+
code_snippet += f'"""{symbol_info["docstring"]}"""\n'
|
|
155
|
+
code_snippet += f"# Domain: {symbol_info.get('domain', 'unknown')}\n"
|
|
156
|
+
code_snippet += f"# File: {symbol_info.get('file', 'unknown')}"
|
|
157
|
+
|
|
158
|
+
return {
|
|
159
|
+
"similar_capabilities": similar_caps_text,
|
|
160
|
+
"code": code_snippet,
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
@staticmethod
|
|
164
|
+
def _strip_markdown(response: str) -> str:
|
|
165
|
+
"""Strips markdown code fences from LLM response if present."""
|
|
166
|
+
clean = response.strip()
|
|
167
|
+
if clean.startswith("```"):
|
|
168
|
+
clean = re.sub(r"^```[a-z]*\n?", "", clean)
|
|
169
|
+
clean = re.sub(r"\n?```$", "", clean.strip())
|
|
170
|
+
return clean.strip()
|
|
171
|
+
|
|
172
|
+
async def _get_suggestion_for_symbol(
|
|
173
|
+
self, symbol: dict[str, Any], existing_capabilities: list[str]
|
|
174
|
+
) -> dict[str, str] | None:
|
|
175
|
+
"""
|
|
176
|
+
Async worker to get a single tag suggestion from the LLM via PromptModel.
|
|
177
|
+
"""
|
|
178
|
+
symbol_info = self._extract_symbol_info(symbol)
|
|
179
|
+
context = self._build_prompt_context(symbol_info, existing_capabilities)
|
|
180
|
+
|
|
181
|
+
try:
|
|
182
|
+
response = await self.prompt_model.invoke(
|
|
183
|
+
context,
|
|
184
|
+
client=self.tagger_client,
|
|
185
|
+
user_id="tagger_agent",
|
|
186
|
+
)
|
|
187
|
+
parsed = json.loads(self._strip_markdown(response))
|
|
188
|
+
suggestion = parsed.get("suggested_capability")
|
|
189
|
+
|
|
190
|
+
# DECISION TRACING: record the LLM-driven capability suggestion.
|
|
191
|
+
# Satisfies autonomy.tracing.mandatory by recording the agent's
|
|
192
|
+
# core decision — what capability name to suggest for an
|
|
193
|
+
# orphaned symbol — at the point the LLM response is parsed.
|
|
194
|
+
self.tracer.record(
|
|
195
|
+
agent="CapabilityTaggerAgent",
|
|
196
|
+
decision_type="capability_suggestion",
|
|
197
|
+
rationale=(
|
|
198
|
+
f"LLM produced suggestion for orphaned symbol "
|
|
199
|
+
f"{symbol.get('name')!r} in {symbol_info.get('file')!r}"
|
|
200
|
+
),
|
|
201
|
+
chosen_action=(
|
|
202
|
+
f"Suggest capability: {suggestion!r}"
|
|
203
|
+
if suggestion
|
|
204
|
+
else "Reject — LLM returned no suggestion"
|
|
205
|
+
),
|
|
206
|
+
alternatives=existing_capabilities[:5],
|
|
207
|
+
context={
|
|
208
|
+
"symbol_uuid": symbol.get("uuid"),
|
|
209
|
+
"symbol_name": symbol.get("name"),
|
|
210
|
+
"file": symbol_info.get("file"),
|
|
211
|
+
"domain": symbol_info.get("domain"),
|
|
212
|
+
},
|
|
213
|
+
confidence=0.8 if suggestion else 0.0,
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
if not suggestion:
|
|
217
|
+
return None
|
|
218
|
+
return {
|
|
219
|
+
"key": symbol.get("uuid"),
|
|
220
|
+
"name": symbol.get("name"),
|
|
221
|
+
"file": symbol_info.get("file"),
|
|
222
|
+
"line_number": symbol.get("line_number", 1),
|
|
223
|
+
"suggestion": suggestion,
|
|
224
|
+
}
|
|
225
|
+
except (json.JSONDecodeError, AttributeError, ValueError):
|
|
226
|
+
logger.warning("Could not parse suggestion for %s.", symbol.get("name"))
|
|
227
|
+
return None
|
|
228
|
+
|
|
229
|
+
# ID: 02466161-a46e-4fc2-8011-ddd05ada4d1c
|
|
230
|
+
async def suggest_and_apply_tags(
|
|
231
|
+
self,
|
|
232
|
+
file_path: Path | None = None,
|
|
233
|
+
limit: int = 0,
|
|
234
|
+
) -> dict[str, dict] | None:
|
|
235
|
+
"""
|
|
236
|
+
Finds truly orphaned public symbols (using OrphanedLogicCheck logic),
|
|
237
|
+
gets AI-powered suggestions via PromptModel, and returns them.
|
|
238
|
+
|
|
239
|
+
Args:
|
|
240
|
+
file_path: Optional path to filter symbols by file.
|
|
241
|
+
limit: Max number of symbols to process (0 = all).
|
|
242
|
+
|
|
243
|
+
Returns:
|
|
244
|
+
Dict mapping symbol keys to suggestion dicts, or None if no suggestions.
|
|
245
|
+
"""
|
|
246
|
+
if self.tagger_client is None:
|
|
247
|
+
self.tagger_client = await self.cognitive_service.aget_client_for_role(
|
|
248
|
+
self.prompt_model.manifest.role
|
|
249
|
+
)
|
|
250
|
+
|
|
251
|
+
logger.info("Searching for orphaned capabilities (using audit logic)...")
|
|
252
|
+
|
|
253
|
+
existing_capabilities = await self._get_existing_capabilities()
|
|
254
|
+
graph = await self.knowledge_service.get_graph()
|
|
255
|
+
all_symbols = list(graph.get("symbols", {}).values())
|
|
256
|
+
|
|
257
|
+
orphaned_symbols = self._find_orphaned_symbols(all_symbols)
|
|
258
|
+
|
|
259
|
+
if file_path:
|
|
260
|
+
orphaned_symbols = [
|
|
261
|
+
s
|
|
262
|
+
for s in orphaned_symbols
|
|
263
|
+
if s.get("file_path", "").endswith(str(file_path))
|
|
264
|
+
]
|
|
265
|
+
|
|
266
|
+
if limit > 0:
|
|
267
|
+
orphaned_symbols = orphaned_symbols[:limit]
|
|
268
|
+
|
|
269
|
+
logger.info(
|
|
270
|
+
"Found %d truly orphaned symbols (same as audit).", len(orphaned_symbols)
|
|
271
|
+
)
|
|
272
|
+
|
|
273
|
+
if not orphaned_symbols:
|
|
274
|
+
return None
|
|
275
|
+
|
|
276
|
+
logger.info(
|
|
277
|
+
"Analyzing %d orphaned symbols for capability suggestions...",
|
|
278
|
+
len(orphaned_symbols),
|
|
279
|
+
)
|
|
280
|
+
|
|
281
|
+
processor = ThrottledParallelProcessor(description="Tagging capabilities...")
|
|
282
|
+
|
|
283
|
+
# ID: 00304bca-a84a-499c-b6ce-124cf6c24ad9
|
|
284
|
+
async def worker_fn(symbol: dict) -> dict | None:
|
|
285
|
+
return await self._get_suggestion_for_symbol(symbol, existing_capabilities)
|
|
286
|
+
|
|
287
|
+
results = await processor.run_async(
|
|
288
|
+
items=orphaned_symbols,
|
|
289
|
+
worker_fn=worker_fn,
|
|
290
|
+
)
|
|
291
|
+
|
|
292
|
+
suggestions = {r["key"]: r for r in results if r is not None}
|
|
293
|
+
|
|
294
|
+
return suggestions or None
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# src/will/agents/traced_agent_mixin.py
|
|
2
|
+
"""TracedAgentMixin - Shared decision trace interface.
|
|
3
|
+
|
|
4
|
+
Eliminates AST duplication between ExecutionAgent and SpecificationAgent.
|
|
5
|
+
Both hold self.tracer = DecisionTracer() and expose identical get_decision_trace
|
|
6
|
+
and save_decision_trace methods.
|
|
7
|
+
|
|
8
|
+
Usage:
|
|
9
|
+
# ID: c9a742bb-eb84-4a3a-86a2-a5f1faeeaa38
|
|
10
|
+
class MyAgent(TracedAgentMixin):
|
|
11
|
+
def __init__(self):
|
|
12
|
+
self.tracer = DecisionTracer()
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
# ID: d2e3f4a5-b6c7-8901-defa-123456789012
|
|
19
|
+
class TracedAgentMixin:
|
|
20
|
+
"""Mixin for Will agents that own a DecisionTracer instance.
|
|
21
|
+
|
|
22
|
+
Requires subclass to set self.tracer = DecisionTracer() in __init__.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
# ID: e3f4a5b6-c7d8-9012-efab-234567890123
|
|
26
|
+
def get_decision_trace(self) -> str:
|
|
27
|
+
"""Return formatted decision trace from this agent's tracer."""
|
|
28
|
+
return self.tracer.format_trace()
|
|
29
|
+
|
|
30
|
+
# ID: f4a5b6c7-d8e9-0123-fabc-345678901234
|
|
31
|
+
async def save_decision_trace(self) -> None:
|
|
32
|
+
"""Persist the decision trace to disk via the tracer."""
|
|
33
|
+
await self.tracer.save_trace()
|