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,144 @@
|
|
|
1
|
+
# src/body/crate_processing/canary_executor.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Canary Policy Enforcement.
|
|
5
|
+
|
|
6
|
+
This module enforces the canary deployment rules defined in
|
|
7
|
+
.intent/phases/canary_validation.yaml or .intent/workflows/ configuration.
|
|
8
|
+
|
|
9
|
+
It acts as a bridge between raw runtime signals (AuditFindings, Test Results)
|
|
10
|
+
and the constitutional thresholds defined in the Mind layer.
|
|
11
|
+
|
|
12
|
+
CONSTITUTIONAL COMPLIANCE:
|
|
13
|
+
- Stateless validator pattern (no filesystem access)
|
|
14
|
+
- Receives configuration via dependency injection
|
|
15
|
+
- Pure enforcement logic (Mind/Body separation)
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
from dataclasses import dataclass, field
|
|
21
|
+
from typing import Any
|
|
22
|
+
|
|
23
|
+
from shared.logger import getLogger
|
|
24
|
+
from shared.models import AuditFinding, AuditSeverity
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
logger = getLogger(__name__)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@dataclass
|
|
31
|
+
# ID: 180cc1c7-60c1-4c69-bce8-3fc77ce12cc9
|
|
32
|
+
class CanaryResult:
|
|
33
|
+
"""The outcome of a canary check."""
|
|
34
|
+
|
|
35
|
+
passed: bool
|
|
36
|
+
violations: list[str] = field(default_factory=list)
|
|
37
|
+
metrics: dict[str, float] = field(default_factory=dict)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# ID: 227aa1c0-77d7-4171-adac-58b6a47959b1
|
|
41
|
+
class CanaryExecutor:
|
|
42
|
+
"""
|
|
43
|
+
Enforces Canary Policy thresholds.
|
|
44
|
+
|
|
45
|
+
Pattern: Stateless Transformer / Validator
|
|
46
|
+
Input: Configuration dict (from phase configuration)
|
|
47
|
+
Output: CanaryResult
|
|
48
|
+
|
|
49
|
+
CONSTITUTIONAL COMPLIANCE:
|
|
50
|
+
- Receives policy via dependency injection (no direct .intent/ access)
|
|
51
|
+
- Stateless execution (Body layer capability)
|
|
52
|
+
- No filesystem operations
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
def __init__(self, canary_config: dict[str, Any]):
|
|
56
|
+
"""
|
|
57
|
+
Initialize with the 'canary' section of phase configuration.
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
canary_config: Dict containing 'enabled', 'metrics', 'abort_conditions'.
|
|
61
|
+
"""
|
|
62
|
+
self.config = canary_config
|
|
63
|
+
self.enabled = self.config.get("enabled", True)
|
|
64
|
+
|
|
65
|
+
# ID: 5281cdc8-9cd5-4f32-ba3d-8bd3b2eed8a0
|
|
66
|
+
def derive_metrics_from_audit(
|
|
67
|
+
self, findings: list[AuditFinding]
|
|
68
|
+
) -> dict[str, float]:
|
|
69
|
+
"""
|
|
70
|
+
Convert a list of AuditFindings into quantitative metrics for policy checking.
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
findings: List of audit findings to analyze
|
|
74
|
+
|
|
75
|
+
Returns:
|
|
76
|
+
Dictionary of metric names to values
|
|
77
|
+
"""
|
|
78
|
+
error_count = sum(1 for f in findings if f.severity == AuditSeverity.BLOCK)
|
|
79
|
+
warning_count = sum(1 for f in findings if f.severity == AuditSeverity.HIGH)
|
|
80
|
+
return {
|
|
81
|
+
"audit.errors": float(error_count),
|
|
82
|
+
"audit.warnings": float(warning_count),
|
|
83
|
+
"audit.findings": float(len(findings)),
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
# ID: 2a89880e-9157-4a36-8b47-e1e13a54becd
|
|
87
|
+
def enforce(self, runtime_metrics: dict[str, float]) -> CanaryResult:
|
|
88
|
+
"""
|
|
89
|
+
Compare runtime metrics against policy thresholds.
|
|
90
|
+
|
|
91
|
+
Args:
|
|
92
|
+
runtime_metrics: Dictionary of metric_name -> value
|
|
93
|
+
(e.g., {"audit.errors": 0, "tests.failed": 0})
|
|
94
|
+
|
|
95
|
+
Returns:
|
|
96
|
+
CanaryResult: Pass/Fail status with details.
|
|
97
|
+
"""
|
|
98
|
+
if not self.enabled:
|
|
99
|
+
logger.info("Canary checks disabled in policy.")
|
|
100
|
+
return CanaryResult(True, [], runtime_metrics)
|
|
101
|
+
|
|
102
|
+
violations = []
|
|
103
|
+
policy_metrics = self.config.get("metrics", [])
|
|
104
|
+
|
|
105
|
+
for rule in policy_metrics:
|
|
106
|
+
metric_name = rule["name"]
|
|
107
|
+
threshold = float(rule["threshold"])
|
|
108
|
+
direction = rule.get("direction", "less")
|
|
109
|
+
actual_value = runtime_metrics.get(metric_name)
|
|
110
|
+
|
|
111
|
+
if actual_value is None:
|
|
112
|
+
logger.debug(
|
|
113
|
+
"Canary metric '%s' not present in runtime report.", metric_name
|
|
114
|
+
)
|
|
115
|
+
continue
|
|
116
|
+
|
|
117
|
+
if direction == "less":
|
|
118
|
+
if actual_value > threshold:
|
|
119
|
+
violations.append(
|
|
120
|
+
f"Metric '{metric_name}' failed: {actual_value} > {threshold}"
|
|
121
|
+
)
|
|
122
|
+
elif direction == "greater":
|
|
123
|
+
if actual_value < threshold:
|
|
124
|
+
violations.append(
|
|
125
|
+
f"Metric '{metric_name}' failed: {actual_value} < {threshold}"
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
abort_conditions = self.config.get("abort_conditions", [])
|
|
129
|
+
for condition in abort_conditions:
|
|
130
|
+
if condition == "audit:level=error":
|
|
131
|
+
if runtime_metrics.get("audit.errors", 0) > 0:
|
|
132
|
+
violations.append("Abort condition triggered: audit:level=error")
|
|
133
|
+
elif condition == "tests:failed>0":
|
|
134
|
+
if runtime_metrics.get("tests.failed", 0) > 0:
|
|
135
|
+
violations.append("Abort condition triggered: tests:failed>0")
|
|
136
|
+
|
|
137
|
+
passed = len(violations) == 0
|
|
138
|
+
|
|
139
|
+
if not passed:
|
|
140
|
+
logger.warning("Canary checks failed: %s", violations)
|
|
141
|
+
else:
|
|
142
|
+
logger.info("Canary checks passed.")
|
|
143
|
+
|
|
144
|
+
return CanaryResult(passed, violations, runtime_metrics)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# src/body/evaluators/__init__.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Body Evaluators - AUDIT Phase Components.
|
|
5
|
+
Organized for High-Fidelity precision.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from .atomic_actions_evaluator import AtomicActionsEvaluator
|
|
11
|
+
from .base_evaluator import BaseEvaluator
|
|
12
|
+
from .clarity_evaluator import ClarityEvaluator
|
|
13
|
+
from .constitutional_evaluator import ConstitutionalEvaluator
|
|
14
|
+
from .failure_evaluator import FailureEvaluator
|
|
15
|
+
from .performance_evaluator import PerformanceEvaluator
|
|
16
|
+
from .security_evaluator import SecurityEvaluator
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
__all__ = [
|
|
20
|
+
"AtomicActionsEvaluator",
|
|
21
|
+
"BaseEvaluator",
|
|
22
|
+
"ClarityEvaluator",
|
|
23
|
+
"ConstitutionalEvaluator",
|
|
24
|
+
"FailureEvaluator",
|
|
25
|
+
"PerformanceEvaluator",
|
|
26
|
+
"SecurityEvaluator",
|
|
27
|
+
]
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# src/body/evaluators/atomic_actions_evaluator.py
|
|
2
|
+
"""Atomic Actions Evaluator - AUDIT Phase Component.
|
|
3
|
+
|
|
4
|
+
Validates code compliance with the atomic actions pattern.
|
|
5
|
+
|
|
6
|
+
Constitutional Alignment:
|
|
7
|
+
- Phase: AUDIT (Quality assessment and pattern detection)
|
|
8
|
+
- Authority: POLICY (Enforces constitutional atomic actions pattern)
|
|
9
|
+
- Purpose: Validate atomic action compliance across codebase
|
|
10
|
+
- Self-contained: No external checker dependencies
|
|
11
|
+
|
|
12
|
+
PURIFIED (V2.3.0)
|
|
13
|
+
- Removed Will-layer 'DecisionTracer' to satisfy architecture.layers.no_body_to_will.
|
|
14
|
+
- Preserves 100% of original AST analysis and validation logic.
|
|
15
|
+
- Rationale is now returned in metadata for Will-layer consumption.
|
|
16
|
+
|
|
17
|
+
This module is the audit orchestration shell. The contract definition
|
|
18
|
+
(AtomicActionViolation dataclass, AST predicates, validator functions)
|
|
19
|
+
lives in atomic_actions_rules.py. The CLI-facing formatter lives in
|
|
20
|
+
atomic_actions_format.py.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
from __future__ import annotations
|
|
24
|
+
|
|
25
|
+
import ast
|
|
26
|
+
import time
|
|
27
|
+
from pathlib import Path
|
|
28
|
+
from typing import Any
|
|
29
|
+
|
|
30
|
+
from shared.component_primitive import ComponentResult
|
|
31
|
+
from shared.logger import getLogger
|
|
32
|
+
|
|
33
|
+
from .atomic_actions_rules import (
|
|
34
|
+
AtomicActionViolation,
|
|
35
|
+
is_atomic_action_candidate,
|
|
36
|
+
validate_atomic_action,
|
|
37
|
+
)
|
|
38
|
+
from .base_evaluator import BaseEvaluator
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
logger = getLogger(__name__)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
# ID: 54c63404-6a42-4ec3-9b88-8a039d52d7ec
|
|
45
|
+
class AtomicActionsEvaluator(BaseEvaluator):
|
|
46
|
+
"""Evaluate codebase for atomic action pattern compliance.
|
|
47
|
+
|
|
48
|
+
This is a fully self-contained V2 component with no external dependencies.
|
|
49
|
+
All AST analysis and validation logic is internal to this component
|
|
50
|
+
(split across atomic_actions_rules.py for the contract definition).
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
# ID: a9bd8873-8696-4f14-a055-a32ba0ecd956
|
|
54
|
+
async def execute(self, repo_root: Path, **kwargs: Any) -> ComponentResult:
|
|
55
|
+
"""Execute the atomic actions compliance audit."""
|
|
56
|
+
start_time = time.time()
|
|
57
|
+
src_dir = repo_root / "src"
|
|
58
|
+
|
|
59
|
+
violations: list[AtomicActionViolation] = []
|
|
60
|
+
total_actions = 0
|
|
61
|
+
|
|
62
|
+
if not src_dir.exists():
|
|
63
|
+
logger.warning("Source directory not found: %s", src_dir)
|
|
64
|
+
return await self._create_result(
|
|
65
|
+
ok=True,
|
|
66
|
+
data={
|
|
67
|
+
"total_actions": 0,
|
|
68
|
+
"compliant_actions": 0,
|
|
69
|
+
"compliance_rate": 100.0,
|
|
70
|
+
"violations": [],
|
|
71
|
+
},
|
|
72
|
+
confidence=1.0,
|
|
73
|
+
duration=0.0,
|
|
74
|
+
rationale="Source directory missing; no actions audited.",
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
# 1) Sensation: scan all Python files in src/
|
|
78
|
+
for py_file in src_dir.rglob("*.py"):
|
|
79
|
+
# Skip private modules (except __init__.py) and test files
|
|
80
|
+
if py_file.name.startswith("_") and py_file.name != "__init__.py":
|
|
81
|
+
continue
|
|
82
|
+
if "test" in str(py_file):
|
|
83
|
+
continue
|
|
84
|
+
|
|
85
|
+
file_violations, file_actions = self._check_file(py_file)
|
|
86
|
+
violations.extend(file_violations)
|
|
87
|
+
total_actions += file_actions
|
|
88
|
+
|
|
89
|
+
# 2) Analysis: calculate metrics
|
|
90
|
+
compliant_actions = total_actions - len(
|
|
91
|
+
[v for v in violations if v.severity == "error"]
|
|
92
|
+
)
|
|
93
|
+
compliance_rate = (
|
|
94
|
+
(compliant_actions / total_actions * 100.0) if total_actions > 0 else 100.0
|
|
95
|
+
)
|
|
96
|
+
has_errors = any(v.severity == "error" for v in violations)
|
|
97
|
+
|
|
98
|
+
# 3) Decision tracing: preserved logic, moved to metadata
|
|
99
|
+
rationale = (
|
|
100
|
+
f"Audited {total_actions} actions. Compliance: {compliance_rate:.1f}%"
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
violation_dicts = [
|
|
104
|
+
{
|
|
105
|
+
"file": str(
|
|
106
|
+
v.file_path.relative_to(repo_root)
|
|
107
|
+
if v.file_path.is_absolute()
|
|
108
|
+
else v.file_path
|
|
109
|
+
),
|
|
110
|
+
"function": v.function_name,
|
|
111
|
+
"rule": v.rule_id,
|
|
112
|
+
"message": v.message,
|
|
113
|
+
"severity": v.severity,
|
|
114
|
+
"line": v.line_number,
|
|
115
|
+
"suggested_fix": v.suggested_fix,
|
|
116
|
+
}
|
|
117
|
+
for v in violations
|
|
118
|
+
]
|
|
119
|
+
|
|
120
|
+
return await self._create_result(
|
|
121
|
+
ok=not has_errors,
|
|
122
|
+
data={
|
|
123
|
+
"total_actions": total_actions,
|
|
124
|
+
"compliant_actions": compliant_actions,
|
|
125
|
+
"compliance_rate": compliance_rate,
|
|
126
|
+
"violations": violation_dicts,
|
|
127
|
+
},
|
|
128
|
+
confidence=1.0,
|
|
129
|
+
duration=time.time() - start_time,
|
|
130
|
+
rationale=rationale,
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
def _check_file(self, file_path: Path) -> tuple[list[AtomicActionViolation], int]:
|
|
134
|
+
"""Check a single file for atomic action pattern compliance."""
|
|
135
|
+
violations: list[AtomicActionViolation] = []
|
|
136
|
+
action_count = 0
|
|
137
|
+
|
|
138
|
+
try:
|
|
139
|
+
source = file_path.read_text(encoding="utf-8")
|
|
140
|
+
tree = ast.parse(source)
|
|
141
|
+
|
|
142
|
+
for node in ast.walk(tree):
|
|
143
|
+
if isinstance(
|
|
144
|
+
node, ast.AsyncFunctionDef
|
|
145
|
+
) and is_atomic_action_candidate(node):
|
|
146
|
+
action_count += 1
|
|
147
|
+
violations.extend(validate_atomic_action(file_path, node, source))
|
|
148
|
+
|
|
149
|
+
except SyntaxError as e:
|
|
150
|
+
violations.append(
|
|
151
|
+
AtomicActionViolation(
|
|
152
|
+
file_path=file_path,
|
|
153
|
+
function_name="<parse_error>",
|
|
154
|
+
rule_id="syntax_error",
|
|
155
|
+
message=f"Syntax error: {e}",
|
|
156
|
+
severity="error",
|
|
157
|
+
)
|
|
158
|
+
)
|
|
159
|
+
except Exception as e:
|
|
160
|
+
logger.error("Error checking %s: %s", file_path, e, exc_info=True)
|
|
161
|
+
|
|
162
|
+
return (violations, action_count)
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# src/body/evaluators/atomic_actions_format.py
|
|
2
|
+
"""Human-readable formatter for AtomicActionViolation lists.
|
|
3
|
+
|
|
4
|
+
Pure transformation: consumes a list of violations and returns a string
|
|
5
|
+
for CLI/log display. No scan logic, no rule logic, no AST awareness.
|
|
6
|
+
|
|
7
|
+
LAYER: body/evaluators — rendering helper. No side effects beyond
|
|
8
|
+
constructing a string.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
|
|
15
|
+
from body.evaluators.atomic_actions_rules import AtomicActionViolation
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
# ID: 2f8a6d5c-3e3f-4f3a-b881-e454ca73d5a4
|
|
19
|
+
def format_atomic_action_violations(
|
|
20
|
+
violations: list[AtomicActionViolation],
|
|
21
|
+
verbose: bool = False,
|
|
22
|
+
) -> str:
|
|
23
|
+
"""Format atomic action violations for display."""
|
|
24
|
+
if not violations:
|
|
25
|
+
return "✅ All atomic actions follow constitutional pattern!"
|
|
26
|
+
|
|
27
|
+
output: list[str] = ["\n❌ Found Atomic Action Violations:\n"]
|
|
28
|
+
|
|
29
|
+
by_file: dict[Path, list[AtomicActionViolation]] = {}
|
|
30
|
+
for v in violations:
|
|
31
|
+
by_file.setdefault(v.file_path, []).append(v)
|
|
32
|
+
|
|
33
|
+
for file_path, file_violations in sorted(by_file.items(), key=lambda x: str(x[0])):
|
|
34
|
+
output.append(f"\n📄 {file_path}")
|
|
35
|
+
for v in file_violations:
|
|
36
|
+
severity_marker = "🔴" if v.severity == "error" else "🟡"
|
|
37
|
+
output.append(
|
|
38
|
+
f" {severity_marker} {v.function_name} (line {v.line_number or '?'})"
|
|
39
|
+
)
|
|
40
|
+
output.append(f" Rule: {v.rule_id}")
|
|
41
|
+
output.append(f" {v.message}")
|
|
42
|
+
if verbose and v.suggested_fix:
|
|
43
|
+
output.append(f" 💡 Fix: {v.suggested_fix}")
|
|
44
|
+
|
|
45
|
+
return "\n".join(output)
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
# src/body/evaluators/atomic_actions_rules.py
|
|
2
|
+
"""Atomic action contract — data shape, AST predicates, and validation rules.
|
|
3
|
+
|
|
4
|
+
This module answers: "what does it mean to be a well-formed atomic action?"
|
|
5
|
+
|
|
6
|
+
It owns:
|
|
7
|
+
- AtomicActionViolation — the violation record produced by rule functions
|
|
8
|
+
and consumed by both the orchestrator (AtomicActionsEvaluator) and the
|
|
9
|
+
formatter (atomic_actions_format.format_atomic_action_violations).
|
|
10
|
+
- AST predicates — pure inspection functions that identify whether an
|
|
11
|
+
AsyncFunctionDef looks like an atomic action.
|
|
12
|
+
- Rule functions — produce violations when the @atomic_action decorator
|
|
13
|
+
or the returned ActionResult is malformed.
|
|
14
|
+
|
|
15
|
+
LAYER: body/evaluators — read-only AST inspection only. No filesystem
|
|
16
|
+
writes, no DB access, no Will-layer imports. Functions are module-level
|
|
17
|
+
and take all inputs explicitly; no instance state.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
import ast
|
|
23
|
+
from dataclasses import dataclass
|
|
24
|
+
from pathlib import Path
|
|
25
|
+
from typing import Any
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@dataclass
|
|
29
|
+
# ID: 6f296fc1-4fc3-4da3-b38d-b712ab452667
|
|
30
|
+
class AtomicActionViolation:
|
|
31
|
+
"""Violation of atomic action pattern contract."""
|
|
32
|
+
|
|
33
|
+
file_path: Path
|
|
34
|
+
function_name: str
|
|
35
|
+
rule_id: str
|
|
36
|
+
message: str
|
|
37
|
+
line_number: int | None = None
|
|
38
|
+
severity: str = "error"
|
|
39
|
+
suggested_fix: str | None = None
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
# ID: c61f81e9-5e68-47f7-af7f-8899ab5c6045
|
|
43
|
+
def is_atomic_action_candidate(node: ast.AsyncFunctionDef) -> bool:
|
|
44
|
+
"""Return True if the function looks like it intends to be an atomic action.
|
|
45
|
+
|
|
46
|
+
A candidate is any async function whose name ends with '_internal',
|
|
47
|
+
or that carries an @atomic_action decorator (bare or called), or
|
|
48
|
+
whose return type annotation is ActionResult.
|
|
49
|
+
"""
|
|
50
|
+
if node.name.endswith("_internal"):
|
|
51
|
+
return True
|
|
52
|
+
if _has_atomic_action_decorator(node):
|
|
53
|
+
return True
|
|
54
|
+
if _returns_action_result(node):
|
|
55
|
+
return True
|
|
56
|
+
return False
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def _has_atomic_action_decorator(node: ast.AsyncFunctionDef) -> bool:
|
|
60
|
+
for decorator in node.decorator_list:
|
|
61
|
+
if isinstance(decorator, ast.Name) and decorator.id == "atomic_action":
|
|
62
|
+
return True
|
|
63
|
+
if isinstance(decorator, ast.Call) and isinstance(decorator.func, ast.Name):
|
|
64
|
+
if decorator.func.id == "atomic_action":
|
|
65
|
+
return True
|
|
66
|
+
return False
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _returns_action_result(node: ast.AsyncFunctionDef) -> bool:
|
|
70
|
+
if not node.returns:
|
|
71
|
+
return False
|
|
72
|
+
if isinstance(node.returns, ast.Name):
|
|
73
|
+
return node.returns.id == "ActionResult"
|
|
74
|
+
if isinstance(node.returns, ast.Subscript) and isinstance(
|
|
75
|
+
node.returns.value, ast.Name
|
|
76
|
+
):
|
|
77
|
+
return node.returns.value.id == "ActionResult"
|
|
78
|
+
return False
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
# ID: 0266bc9f-720b-402d-baac-637bc425543a
|
|
82
|
+
def validate_atomic_action(
|
|
83
|
+
file_path: Path,
|
|
84
|
+
node: ast.AsyncFunctionDef,
|
|
85
|
+
source: str,
|
|
86
|
+
) -> list[AtomicActionViolation]:
|
|
87
|
+
"""Run all contract checks on a single atomic-action candidate.
|
|
88
|
+
|
|
89
|
+
Returns the combined list of violations across three sub-checks:
|
|
90
|
+
1. @atomic_action decorator presence + required metadata fields.
|
|
91
|
+
2. ActionResult return-type annotation presence.
|
|
92
|
+
3. Each `return ActionResult(...)` statement carries required fields
|
|
93
|
+
and uses a dict literal for `data`.
|
|
94
|
+
"""
|
|
95
|
+
violations: list[AtomicActionViolation] = []
|
|
96
|
+
|
|
97
|
+
if not _has_atomic_action_decorator(node):
|
|
98
|
+
violations.append(
|
|
99
|
+
AtomicActionViolation(
|
|
100
|
+
file_path=file_path,
|
|
101
|
+
function_name=node.name,
|
|
102
|
+
rule_id="action_must_have_decorator",
|
|
103
|
+
message=f"Atomic action '{node.name}' missing @atomic_action decorator",
|
|
104
|
+
line_number=node.lineno,
|
|
105
|
+
severity="error",
|
|
106
|
+
suggested_fix=(
|
|
107
|
+
"Add @atomic_action decorator with action_id, intent, impact, and policies"
|
|
108
|
+
),
|
|
109
|
+
)
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
if not _returns_action_result(node):
|
|
113
|
+
violations.append(
|
|
114
|
+
AtomicActionViolation(
|
|
115
|
+
file_path=file_path,
|
|
116
|
+
function_name=node.name,
|
|
117
|
+
rule_id="action_must_return_result",
|
|
118
|
+
message=f"Atomic action '{node.name}' must return ActionResult",
|
|
119
|
+
line_number=node.lineno,
|
|
120
|
+
severity="error",
|
|
121
|
+
suggested_fix="Add '-> ActionResult' return type annotation",
|
|
122
|
+
)
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
if _has_atomic_action_decorator(node):
|
|
126
|
+
violations.extend(_validate_decorator_metadata(file_path, node, source))
|
|
127
|
+
|
|
128
|
+
violations.extend(_validate_return_statements(file_path, node))
|
|
129
|
+
return violations
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def _validate_decorator_metadata(
|
|
133
|
+
file_path: Path,
|
|
134
|
+
node: ast.AsyncFunctionDef,
|
|
135
|
+
source: str,
|
|
136
|
+
) -> list[AtomicActionViolation]:
|
|
137
|
+
violations: list[AtomicActionViolation] = []
|
|
138
|
+
decorator: ast.Call | None = None
|
|
139
|
+
|
|
140
|
+
for dec in node.decorator_list:
|
|
141
|
+
if (
|
|
142
|
+
isinstance(dec, ast.Call)
|
|
143
|
+
and isinstance(dec.func, ast.Name)
|
|
144
|
+
and dec.func.id == "atomic_action"
|
|
145
|
+
):
|
|
146
|
+
decorator = dec
|
|
147
|
+
break
|
|
148
|
+
|
|
149
|
+
if not decorator:
|
|
150
|
+
return violations
|
|
151
|
+
|
|
152
|
+
decorator_args: dict[str, Any] = {}
|
|
153
|
+
|
|
154
|
+
for keyword in decorator.keywords:
|
|
155
|
+
if isinstance(keyword.value, ast.Constant):
|
|
156
|
+
decorator_args[keyword.arg] = keyword.value.value
|
|
157
|
+
elif isinstance(keyword.value, ast.Attribute):
|
|
158
|
+
# Example: ActionImpact.LOW
|
|
159
|
+
base = keyword.value.value
|
|
160
|
+
if isinstance(base, ast.Name):
|
|
161
|
+
decorator_args[keyword.arg] = f"{base.id}.{keyword.value.attr}"
|
|
162
|
+
elif isinstance(keyword.value, ast.List):
|
|
163
|
+
decorator_args[keyword.arg] = [
|
|
164
|
+
elt.value for elt in keyword.value.elts if isinstance(elt, ast.Constant)
|
|
165
|
+
]
|
|
166
|
+
|
|
167
|
+
required_fields = {
|
|
168
|
+
"action_id": "Unique identifier for this action",
|
|
169
|
+
"intent": "Clear statement of purpose",
|
|
170
|
+
"impact": "ActionImpact classification",
|
|
171
|
+
"policies": "List of constitutional policies validated",
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
for field, description in required_fields.items():
|
|
175
|
+
if field not in decorator_args:
|
|
176
|
+
violations.append(
|
|
177
|
+
AtomicActionViolation(
|
|
178
|
+
file_path=file_path,
|
|
179
|
+
function_name=node.name,
|
|
180
|
+
rule_id="decorator_missing_required_field",
|
|
181
|
+
message=(
|
|
182
|
+
f"@atomic_action missing required field '{field}': {description}"
|
|
183
|
+
),
|
|
184
|
+
line_number=node.lineno,
|
|
185
|
+
severity="error",
|
|
186
|
+
suggested_fix=f"Add {field}=... to @atomic_action decorator",
|
|
187
|
+
)
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
if "action_id" in decorator_args:
|
|
191
|
+
action_id = decorator_args["action_id"]
|
|
192
|
+
if not isinstance(action_id, str) or "." not in action_id:
|
|
193
|
+
violations.append(
|
|
194
|
+
AtomicActionViolation(
|
|
195
|
+
file_path=file_path,
|
|
196
|
+
function_name=node.name,
|
|
197
|
+
rule_id="invalid_action_id_format",
|
|
198
|
+
message=f"action_id '{action_id}' must use dot notation",
|
|
199
|
+
line_number=node.lineno,
|
|
200
|
+
severity="warning",
|
|
201
|
+
suggested_fix="Use category.name format for action_id",
|
|
202
|
+
)
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
return violations
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def _validate_return_statements(
|
|
209
|
+
file_path: Path,
|
|
210
|
+
node: ast.AsyncFunctionDef,
|
|
211
|
+
) -> list[AtomicActionViolation]:
|
|
212
|
+
violations: list[AtomicActionViolation] = []
|
|
213
|
+
|
|
214
|
+
for child in ast.walk(node):
|
|
215
|
+
if (
|
|
216
|
+
isinstance(child, ast.Return)
|
|
217
|
+
and child.value
|
|
218
|
+
and isinstance(child.value, ast.Call)
|
|
219
|
+
):
|
|
220
|
+
call = child.value
|
|
221
|
+
if isinstance(call.func, ast.Name) and call.func.id == "ActionResult":
|
|
222
|
+
violations.extend(
|
|
223
|
+
_validate_action_result_call(
|
|
224
|
+
file_path,
|
|
225
|
+
node.name,
|
|
226
|
+
child,
|
|
227
|
+
child.lineno,
|
|
228
|
+
)
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
return violations
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
def _validate_action_result_call(
|
|
235
|
+
file_path: Path,
|
|
236
|
+
function_name: str,
|
|
237
|
+
return_node: ast.Return,
|
|
238
|
+
line_number: int,
|
|
239
|
+
) -> list[AtomicActionViolation]:
|
|
240
|
+
violations: list[AtomicActionViolation] = []
|
|
241
|
+
|
|
242
|
+
call = return_node.value
|
|
243
|
+
if not isinstance(call, ast.Call):
|
|
244
|
+
return violations
|
|
245
|
+
|
|
246
|
+
result_args: dict[str, ast.AST] = {k.arg: k.value for k in call.keywords if k.arg}
|
|
247
|
+
|
|
248
|
+
required_fields = ["action_id", "ok", "data"]
|
|
249
|
+
for field in required_fields:
|
|
250
|
+
if field not in result_args:
|
|
251
|
+
violations.append(
|
|
252
|
+
AtomicActionViolation(
|
|
253
|
+
file_path=file_path,
|
|
254
|
+
function_name=function_name,
|
|
255
|
+
rule_id="result_missing_required_field",
|
|
256
|
+
message=f"ActionResult missing required field '{field}'",
|
|
257
|
+
line_number=line_number,
|
|
258
|
+
severity="error",
|
|
259
|
+
suggested_fix=f"Add {field}=... to ActionResult constructor",
|
|
260
|
+
)
|
|
261
|
+
)
|
|
262
|
+
|
|
263
|
+
if "data" in result_args:
|
|
264
|
+
data_value = result_args["data"]
|
|
265
|
+
if not isinstance(data_value, ast.Dict):
|
|
266
|
+
violations.append(
|
|
267
|
+
AtomicActionViolation(
|
|
268
|
+
file_path=file_path,
|
|
269
|
+
function_name=function_name,
|
|
270
|
+
rule_id="result_must_be_structured",
|
|
271
|
+
message="ActionResult.data must be a dictionary literal",
|
|
272
|
+
line_number=line_number,
|
|
273
|
+
severity="warning",
|
|
274
|
+
suggested_fix="Use data={...} with explicit key-value pairs",
|
|
275
|
+
)
|
|
276
|
+
)
|
|
277
|
+
|
|
278
|
+
return violations
|