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,66 @@
|
|
|
1
|
+
# src/shared/infrastructure/intent/operational_mode.py
|
|
2
|
+
"""
|
|
3
|
+
Operational-mode accessor (ADR-079 D4 placeholder).
|
|
4
|
+
|
|
5
|
+
The chokepoint reads ``current_mode()`` once per ``check_transaction``
|
|
6
|
+
call to decide whether mode-conditional capability entries authorize
|
|
7
|
+
a write. The interface this module declares is stable; the implementation
|
|
8
|
+
in this file is the **placeholder** ADR-079 D4 documents — env-var
|
|
9
|
+
sourced, default-on-uncertainty=`live`.
|
|
10
|
+
|
|
11
|
+
Issue #492 will replace the body with provenance-guaranteed source
|
|
12
|
+
resolution (signed manifest, bootstrap config, conflict-resolution rules).
|
|
13
|
+
Consumers depend on the *interface*, not the *implementation* — the
|
|
14
|
+
accessor's signature does not change when #492 lands.
|
|
15
|
+
|
|
16
|
+
Paper §6's "default on uncertainty is *live*" semantics fail closed: a
|
|
17
|
+
forged dev signal requires successfully setting ``CORE_OPERATIONAL_MODE``
|
|
18
|
+
to the exact string ``"dev"``, not merely being in the absence of
|
|
19
|
+
provenance. Any other value — missing, empty, mistyped, mixed-case —
|
|
20
|
+
collapses to ``"live"``.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
from __future__ import annotations
|
|
24
|
+
|
|
25
|
+
import os
|
|
26
|
+
from typing import Literal
|
|
27
|
+
|
|
28
|
+
from shared.logger import getLogger
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
logger = getLogger(__name__)
|
|
32
|
+
|
|
33
|
+
_MODE_ENV_VAR = "CORE_OPERATIONAL_MODE"
|
|
34
|
+
_VALID_MODES: frozenset[str] = frozenset({"dev", "live"})
|
|
35
|
+
|
|
36
|
+
_first_call_logged = False
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
# ID: 50389c43-7c80-4e9a-a8cc-01b27535ca8a
|
|
40
|
+
def current_mode() -> Literal["dev", "live"]:
|
|
41
|
+
"""
|
|
42
|
+
Return the current operational mode.
|
|
43
|
+
|
|
44
|
+
Reads ``CORE_OPERATIONAL_MODE``. Returns ``"dev"`` only when the env
|
|
45
|
+
var holds the exact string ``"dev"``; returns ``"live"`` for the
|
|
46
|
+
exact string ``"live"`` and for every other case (missing, empty,
|
|
47
|
+
mistyped) per paper §6.
|
|
48
|
+
|
|
49
|
+
Logs at INFO on first call only — the resolved value and the source
|
|
50
|
+
consulted — so the operational signal is observable without
|
|
51
|
+
per-call noise.
|
|
52
|
+
"""
|
|
53
|
+
global _first_call_logged
|
|
54
|
+
raw = os.environ.get(_MODE_ENV_VAR)
|
|
55
|
+
if raw in _VALID_MODES:
|
|
56
|
+
resolved: Literal["dev", "live"] = "dev" if raw == "dev" else "live"
|
|
57
|
+
source = _MODE_ENV_VAR
|
|
58
|
+
else:
|
|
59
|
+
resolved = "live"
|
|
60
|
+
source = "default" if raw is None else f"{_MODE_ENV_VAR}=<rejected:{raw!r}>"
|
|
61
|
+
|
|
62
|
+
if not _first_call_logged:
|
|
63
|
+
logger.info("Operational mode resolved: %s (source: %s).", resolved, source)
|
|
64
|
+
_first_call_logged = True
|
|
65
|
+
|
|
66
|
+
return resolved
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
# src/shared/infrastructure/intent/task_type_phases.py
|
|
2
|
+
"""
|
|
3
|
+
Task-type to governance-phase mapping helper.
|
|
4
|
+
|
|
5
|
+
Single source of truth for the ExecutionTask.task_type vocabulary and
|
|
6
|
+
its mapping to the governance PhaseType. Both the mapping and the
|
|
7
|
+
closed vocabulary are owned by
|
|
8
|
+
.intent/enforcement/config/task_type_phases.yaml.
|
|
9
|
+
|
|
10
|
+
Authority: policy. The governing document is
|
|
11
|
+
.intent/enforcement/config/task_type_phases.yaml, accessed exclusively
|
|
12
|
+
via IntentRepository. No other module may hardcode the task_type ->
|
|
13
|
+
phase mapping — all call sites route through this helper. See ADR-004.
|
|
14
|
+
|
|
15
|
+
The _FALLBACK_* constants below are last-resort graceful degradation
|
|
16
|
+
for the narrow case where the policy document cannot be loaded (e.g.
|
|
17
|
+
bootstrap races, corrupt YAML). They MUST NOT be treated as
|
|
18
|
+
defaults-in-logic — when the policy loads successfully, it always wins.
|
|
19
|
+
|
|
20
|
+
LAYER: shared/infrastructure/intent — pure helper. No imports from
|
|
21
|
+
will/, body/, or cli/.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
from __future__ import annotations
|
|
25
|
+
|
|
26
|
+
from typing import TYPE_CHECKING, Any
|
|
27
|
+
|
|
28
|
+
from shared.infrastructure.intent.errors import GovernanceError
|
|
29
|
+
from shared.logger import getLogger
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
if TYPE_CHECKING:
|
|
33
|
+
from shared.infrastructure.context.models import PhaseType
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
logger = getLogger(__name__)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
_FALLBACK_DEFAULT_PHASE = "execution"
|
|
40
|
+
_FALLBACK_MAPPING: dict[str, str] = {
|
|
41
|
+
"code_generation": "execution",
|
|
42
|
+
"code_modification": "execution",
|
|
43
|
+
"test_generation": "audit",
|
|
44
|
+
"test.generate": "audit",
|
|
45
|
+
"conversational": "runtime",
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _valid_phases() -> frozenset[str]:
|
|
50
|
+
"""Canonical `component_phase` membership from .intent/META/enums.json.
|
|
51
|
+
|
|
52
|
+
Sourced from the canonical enum store rather than inlined here so the
|
|
53
|
+
Python and JSON schema sides cannot drift (closed-enum discipline,
|
|
54
|
+
issue #460). Lazy so callers reaching this module at import time of
|
|
55
|
+
other modules do not force IntentRepository construction.
|
|
56
|
+
"""
|
|
57
|
+
from shared.infrastructure.intent.canonical_enums import get_enum_members
|
|
58
|
+
|
|
59
|
+
return get_enum_members("component_phase")
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _validate_config(config: dict[str, Any]) -> None:
|
|
63
|
+
"""
|
|
64
|
+
Validate at load time that every phase value in the config is a
|
|
65
|
+
member of the canonical `component_phase` enum. Raises ValueError
|
|
66
|
+
with a clear message on the first offending key/value encountered.
|
|
67
|
+
"""
|
|
68
|
+
valid = _valid_phases()
|
|
69
|
+
default_phase = config.get("default_phase")
|
|
70
|
+
if default_phase is None or default_phase not in valid:
|
|
71
|
+
raise ValueError(
|
|
72
|
+
f"task_type_phases: default_phase {default_phase!r} is not a "
|
|
73
|
+
f"valid PhaseType; allowed values are {sorted(valid)}"
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
mapping = config.get("mapping")
|
|
77
|
+
if not isinstance(mapping, dict):
|
|
78
|
+
raise ValueError(
|
|
79
|
+
"task_type_phases: 'mapping' must be a dict of task_type -> phase"
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
for task_type, phase in mapping.items():
|
|
83
|
+
if phase not in valid:
|
|
84
|
+
raise ValueError(
|
|
85
|
+
f"task_type_phases: mapping[{task_type!r}] = {phase!r} is not "
|
|
86
|
+
f"a valid PhaseType; allowed values are {sorted(valid)}"
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
# ID: c1d2e3f4-a5b6-4708-9c1d-2e3f4a5b6c7d
|
|
91
|
+
def load_task_type_phases() -> dict[str, Any]:
|
|
92
|
+
"""
|
|
93
|
+
Load .intent/enforcement/config/task_type_phases.yaml via IntentRepository.
|
|
94
|
+
|
|
95
|
+
Returns the parsed policy dict on success. On any failure — missing
|
|
96
|
+
file, parse error, unexpected top-level type — returns fallback
|
|
97
|
+
defaults and logs a warning so callers degrade gracefully rather
|
|
98
|
+
than halting.
|
|
99
|
+
|
|
100
|
+
The loader validates every phase value against the canonical
|
|
101
|
+
`component_phase` enum (sourced from `.intent/META/enums.json`)
|
|
102
|
+
before returning. A YAML that maps a task_type to a phase outside
|
|
103
|
+
that enum raises ValueError at load time, not at the call site.
|
|
104
|
+
If the canonical enum is unreachable or empty, GovernanceError
|
|
105
|
+
propagates (no silent fallback — closed-enum discipline, #460).
|
|
106
|
+
"""
|
|
107
|
+
try:
|
|
108
|
+
from shared.infrastructure.intent.intent_repository import (
|
|
109
|
+
get_intent_repository,
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
repo = get_intent_repository()
|
|
113
|
+
config_path = repo.resolve_rel("enforcement/config/task_type_phases.yaml")
|
|
114
|
+
config = repo.load_document(config_path)
|
|
115
|
+
if isinstance(config, dict):
|
|
116
|
+
_validate_config(config)
|
|
117
|
+
return config
|
|
118
|
+
logger.warning(
|
|
119
|
+
"task_type_phases: task_type_phases.yaml did not parse as a dict "
|
|
120
|
+
"— using fallback defaults."
|
|
121
|
+
)
|
|
122
|
+
except ValueError:
|
|
123
|
+
raise
|
|
124
|
+
except GovernanceError:
|
|
125
|
+
# Canonical enum store unreachable or empty — propagate per
|
|
126
|
+
# closed-enum discipline (issue #460). Falling back here would
|
|
127
|
+
# silently mask a META authoring failure.
|
|
128
|
+
raise
|
|
129
|
+
except Exception as exc:
|
|
130
|
+
logger.warning(
|
|
131
|
+
"task_type_phases: could not load .intent/enforcement/config/"
|
|
132
|
+
"task_type_phases.yaml (%s) — using fallback defaults.",
|
|
133
|
+
exc,
|
|
134
|
+
)
|
|
135
|
+
return {
|
|
136
|
+
"default_phase": _FALLBACK_DEFAULT_PHASE,
|
|
137
|
+
"mapping": dict(_FALLBACK_MAPPING),
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
# ID: d2e3f4a5-b6c7-4819-ad2e-3f4a5b6c7d8e
|
|
142
|
+
def resolve_phase(
|
|
143
|
+
task_type: str,
|
|
144
|
+
config: dict[str, Any] | None = None,
|
|
145
|
+
) -> PhaseType:
|
|
146
|
+
"""
|
|
147
|
+
Return the governance phase for a task_type.
|
|
148
|
+
|
|
149
|
+
Falls back to config['default_phase'] when task_type is not in the
|
|
150
|
+
mapping. If config is None, load_task_type_phases() is called.
|
|
151
|
+
|
|
152
|
+
The returned value is typed as PhaseType: the loader has already
|
|
153
|
+
validated that every phase value is a member of the PhaseType
|
|
154
|
+
Literal set, so callers may pass the result directly to
|
|
155
|
+
ContextBuildRequest(phase=...) without a type: ignore.
|
|
156
|
+
"""
|
|
157
|
+
if config is None:
|
|
158
|
+
config = load_task_type_phases()
|
|
159
|
+
|
|
160
|
+
mapping = config.get("mapping", {})
|
|
161
|
+
default_phase: str = config.get("default_phase", _FALLBACK_DEFAULT_PHASE)
|
|
162
|
+
phase: str = mapping.get(task_type, default_phase)
|
|
163
|
+
return phase # type: ignore[return-value]
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
# ID: e3f4a5b6-c7d8-491a-be3f-4a5b6c7d8e9f
|
|
167
|
+
def allowed_task_types(
|
|
168
|
+
config: dict[str, Any] | None = None,
|
|
169
|
+
) -> frozenset[str]:
|
|
170
|
+
"""
|
|
171
|
+
Return the closed vocabulary — the keys of config['mapping'].
|
|
172
|
+
|
|
173
|
+
Used by shared.models.execution_models at import time to populate
|
|
174
|
+
the ExecutionTask.task_type field_validator's allowed set. If
|
|
175
|
+
config is None, load_task_type_phases() is called.
|
|
176
|
+
"""
|
|
177
|
+
if config is None:
|
|
178
|
+
config = load_task_type_phases()
|
|
179
|
+
mapping = config.get("mapping", {})
|
|
180
|
+
return frozenset(mapping.keys())
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
# src/shared/infrastructure/intent/test_coverage_paths.py
|
|
2
|
+
"""
|
|
3
|
+
Source-to-test path mapping helper.
|
|
4
|
+
|
|
5
|
+
Single source of truth for mapping repo-relative source paths to their
|
|
6
|
+
governed repo-relative test paths. Both the mapping rule and the
|
|
7
|
+
filename conventions are owned by
|
|
8
|
+
.intent/enforcement/config/test_coverage.yaml.
|
|
9
|
+
|
|
10
|
+
Authority: policy. The governing document is
|
|
11
|
+
.intent/enforcement/config/test_coverage.yaml, accessed exclusively via
|
|
12
|
+
IntentRepository. No other module may hardcode the source->test
|
|
13
|
+
mapping — all call sites route through this helper.
|
|
14
|
+
|
|
15
|
+
The _FALLBACK_* constants below are last-resort graceful degradation
|
|
16
|
+
for the narrow case where the policy document cannot be loaded (e.g.
|
|
17
|
+
bootstrap races, corrupt YAML). They MUST NOT be treated as
|
|
18
|
+
defaults-in-logic — when the policy loads successfully, it always wins.
|
|
19
|
+
|
|
20
|
+
LAYER: shared/infrastructure/intent — pure helper. No imports from
|
|
21
|
+
will/, body/, or cli/.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
from __future__ import annotations
|
|
25
|
+
|
|
26
|
+
from pathlib import Path
|
|
27
|
+
from typing import Any
|
|
28
|
+
|
|
29
|
+
from shared.logger import getLogger
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
logger = getLogger(__name__)
|
|
33
|
+
|
|
34
|
+
_FALLBACK_SOURCE_ROOT = "src"
|
|
35
|
+
_FALLBACK_TEST_ROOT = "tests"
|
|
36
|
+
_FALLBACK_TEST_FILE_SUFFIX = "/test_generated.py"
|
|
37
|
+
_FALLBACK_EXCLUDED_FILENAMES: list[str] = ["__init__.py"]
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# ID: 6d7e2c9a-4b5f-4801-9e13-a2b3c4d5e6f7
|
|
41
|
+
def load_test_coverage_config() -> dict[str, Any]:
|
|
42
|
+
"""
|
|
43
|
+
Load .intent/enforcement/config/test_coverage.yaml via IntentRepository.
|
|
44
|
+
|
|
45
|
+
Returns the parsed policy dict on success. On any failure — missing
|
|
46
|
+
file, parse error, unexpected top-level type — returns fallback
|
|
47
|
+
defaults and logs a warning so callers degrade gracefully rather
|
|
48
|
+
than halting.
|
|
49
|
+
"""
|
|
50
|
+
try:
|
|
51
|
+
from shared.infrastructure.intent.intent_repository import (
|
|
52
|
+
get_intent_repository,
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
repo = get_intent_repository()
|
|
56
|
+
config_path = repo.resolve_rel("enforcement/config/test_coverage.yaml")
|
|
57
|
+
config = repo.load_document(config_path)
|
|
58
|
+
if isinstance(config, dict):
|
|
59
|
+
return config
|
|
60
|
+
logger.warning(
|
|
61
|
+
"test_coverage_paths: test_coverage.yaml did not parse as a dict "
|
|
62
|
+
"— using fallback defaults."
|
|
63
|
+
)
|
|
64
|
+
except Exception as exc:
|
|
65
|
+
logger.warning(
|
|
66
|
+
"test_coverage_paths: could not load .intent/enforcement/config/"
|
|
67
|
+
"test_coverage.yaml (%s) — using fallback defaults.",
|
|
68
|
+
exc,
|
|
69
|
+
)
|
|
70
|
+
return {
|
|
71
|
+
"source_root": _FALLBACK_SOURCE_ROOT,
|
|
72
|
+
"test_root": _FALLBACK_TEST_ROOT,
|
|
73
|
+
"test_file_suffix": _FALLBACK_TEST_FILE_SUFFIX,
|
|
74
|
+
"excluded_filenames": list(_FALLBACK_EXCLUDED_FILENAMES),
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
# ID: 7e8f3d0b-5c6a-4912-af24-b3c4d5e6f708
|
|
79
|
+
def source_to_test_path(
|
|
80
|
+
source_file: str,
|
|
81
|
+
config: dict[str, Any] | None = None,
|
|
82
|
+
) -> str:
|
|
83
|
+
"""
|
|
84
|
+
Map a repo-relative source path to its governed repo-relative test path.
|
|
85
|
+
|
|
86
|
+
Mapping:
|
|
87
|
+
{source_root}/foo/bar.py
|
|
88
|
+
-> {test_root}/foo/bar{test_file_suffix}
|
|
89
|
+
|
|
90
|
+
Args:
|
|
91
|
+
source_file: repo-relative path to a Python source file, e.g.
|
|
92
|
+
"src/foo/bar.py". Callers must pass repo-relative paths.
|
|
93
|
+
config: optional pre-loaded policy dict. If None,
|
|
94
|
+
load_test_coverage_config() is invoked.
|
|
95
|
+
|
|
96
|
+
Returns:
|
|
97
|
+
Repo-relative path to the governed test file, e.g.
|
|
98
|
+
"tests/foo/bar/test_generated.py".
|
|
99
|
+
|
|
100
|
+
Raises:
|
|
101
|
+
ValueError: if source_file does not start with "{source_root}/".
|
|
102
|
+
"""
|
|
103
|
+
if config is None:
|
|
104
|
+
config = load_test_coverage_config()
|
|
105
|
+
|
|
106
|
+
source_root: str = config.get("source_root", _FALLBACK_SOURCE_ROOT)
|
|
107
|
+
test_root: str = config.get("test_root", _FALLBACK_TEST_ROOT)
|
|
108
|
+
test_file_suffix: str = config.get("test_file_suffix", _FALLBACK_TEST_FILE_SUFFIX)
|
|
109
|
+
|
|
110
|
+
prefix = f"{source_root}/"
|
|
111
|
+
if not source_file.startswith(prefix):
|
|
112
|
+
raise ValueError(
|
|
113
|
+
f"source_file {source_file!r} does not start with configured "
|
|
114
|
+
f"source_root prefix {prefix!r}"
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
return (
|
|
118
|
+
source_file.replace(prefix, f"{test_root}/", 1).removesuffix(".py")
|
|
119
|
+
+ test_file_suffix
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
# ID: 8f9a4e1c-6d7b-4a23-be35-c4d5e6f7a819
|
|
124
|
+
def uncovered_source_files(
|
|
125
|
+
repo_root: Path,
|
|
126
|
+
config: dict[str, Any] | None = None,
|
|
127
|
+
) -> list[str]:
|
|
128
|
+
"""
|
|
129
|
+
Walk source_root and return repo-relative paths for in-scope Python
|
|
130
|
+
source files that have no corresponding test file.
|
|
131
|
+
|
|
132
|
+
Shared between TestCoverageSensor (which posts test.run_required for
|
|
133
|
+
these sources) and TestRunnerSensor (which uses the same set as
|
|
134
|
+
current_subjects for the test.missing quarantine drain — ADR-072 D5).
|
|
135
|
+
|
|
136
|
+
The mapping and scoping rules are entirely owned by
|
|
137
|
+
.intent/enforcement/config/test_coverage.yaml:
|
|
138
|
+
- source_root, test_root, test_file_suffix
|
|
139
|
+
- excluded_filenames (skip-list)
|
|
140
|
+
- include_files (scope limiter; if non-empty, only these are scanned)
|
|
141
|
+
"""
|
|
142
|
+
if config is None:
|
|
143
|
+
config = load_test_coverage_config()
|
|
144
|
+
|
|
145
|
+
source_root_rel: str = config.get("source_root", _FALLBACK_SOURCE_ROOT)
|
|
146
|
+
excluded: frozenset[str] = frozenset(
|
|
147
|
+
config.get("excluded_filenames", _FALLBACK_EXCLUDED_FILENAMES)
|
|
148
|
+
)
|
|
149
|
+
include_files: frozenset[str] = frozenset(config.get("include_files") or [])
|
|
150
|
+
|
|
151
|
+
src_root = repo_root / source_root_rel
|
|
152
|
+
if not src_root.exists():
|
|
153
|
+
logger.warning(
|
|
154
|
+
"test_coverage_paths.uncovered_source_files: source root not found at %s",
|
|
155
|
+
src_root,
|
|
156
|
+
)
|
|
157
|
+
return []
|
|
158
|
+
|
|
159
|
+
uncovered: list[str] = []
|
|
160
|
+
|
|
161
|
+
for py_file in src_root.rglob("*.py"):
|
|
162
|
+
if py_file.name in excluded:
|
|
163
|
+
continue
|
|
164
|
+
|
|
165
|
+
rel = py_file.relative_to(repo_root)
|
|
166
|
+
source_file = str(rel)
|
|
167
|
+
|
|
168
|
+
if include_files and source_file not in include_files:
|
|
169
|
+
continue
|
|
170
|
+
|
|
171
|
+
try:
|
|
172
|
+
test_rel = source_to_test_path(source_file, config)
|
|
173
|
+
except ValueError:
|
|
174
|
+
continue
|
|
175
|
+
|
|
176
|
+
test_path = repo_root / test_rel
|
|
177
|
+
|
|
178
|
+
if not test_path.exists():
|
|
179
|
+
uncovered.append(source_file)
|
|
180
|
+
|
|
181
|
+
return uncovered
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
# src/shared/infrastructure/intent/vocabulary_projection.py
|
|
2
|
+
"""
|
|
3
|
+
Vocabulary projection loader (ADR-023 D4).
|
|
4
|
+
|
|
5
|
+
Sole sanctioned reader of .intent/META/vocabulary.json. Returns one of:
|
|
6
|
+
|
|
7
|
+
- VocabularyProjection(state="healthy")
|
|
8
|
+
- VocabularyProjection(state="drift", drift_detected=True)
|
|
9
|
+
- VocabularyProjectionError(state="broken", reason=...)
|
|
10
|
+
|
|
11
|
+
The loader does not fall back to defaults on broken state — that is
|
|
12
|
+
instrument failure and callers must enter governance-DEGRADED mode.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import hashlib
|
|
18
|
+
import json
|
|
19
|
+
import warnings
|
|
20
|
+
from dataclasses import dataclass
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
from typing import Literal
|
|
23
|
+
|
|
24
|
+
import jsonschema
|
|
25
|
+
from jsonschema import RefResolver
|
|
26
|
+
|
|
27
|
+
from shared.logger import getLogger
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
logger = getLogger(__name__)
|
|
31
|
+
|
|
32
|
+
CANONICAL_HEADING = "## Canonical Vocabulary (Machine Section)"
|
|
33
|
+
VOCABULARY_PAPER_REL = ".specs/papers/CORE-Vocabulary.md"
|
|
34
|
+
VOCABULARY_JSON_REL = ".intent/META/vocabulary.json"
|
|
35
|
+
VOCABULARY_SCHEMA_REL = ".intent/META/vocabulary.schema.json"
|
|
36
|
+
|
|
37
|
+
# src/shared/infrastructure/intent/vocabulary_projection.py
|
|
38
|
+
# parents[0] = intent
|
|
39
|
+
# parents[1] = infrastructure
|
|
40
|
+
# parents[2] = shared
|
|
41
|
+
# parents[3] = src
|
|
42
|
+
# parents[4] = repo root
|
|
43
|
+
_REPO_ROOT_DEFAULT = Path(__file__).resolve().parents[4]
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@dataclass(frozen=True)
|
|
47
|
+
# ID: 4d8c2e7a-9b3f-4a1c-b6d2-7e8f3c1a5b06
|
|
48
|
+
class VocabularyTerm:
|
|
49
|
+
"""A single vocabulary entry, projection-shape (frozen)."""
|
|
50
|
+
|
|
51
|
+
term: str
|
|
52
|
+
definition: str
|
|
53
|
+
not_: str
|
|
54
|
+
authoritative_paper: str
|
|
55
|
+
aliases: tuple[str, ...] = ()
|
|
56
|
+
see_also: tuple[str, ...] = ()
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
@dataclass(frozen=True)
|
|
60
|
+
# ID: 6c1f3a8e-2d7b-4f9c-a4e1-8b9c2d5f1e07
|
|
61
|
+
class VocabularyProjection:
|
|
62
|
+
"""A successfully loaded projection. state is 'healthy' or 'drift'."""
|
|
63
|
+
|
|
64
|
+
terms: tuple[VocabularyTerm, ...]
|
|
65
|
+
drift_detected: bool
|
|
66
|
+
state: Literal["healthy", "drift"]
|
|
67
|
+
source_hash: str
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
@dataclass(frozen=True)
|
|
71
|
+
# ID: 8a4d2e6c-1f9b-4c3d-b8e2-5d7f1a4c9e08
|
|
72
|
+
class VocabularyProjectionError:
|
|
73
|
+
"""A broken projection. Sentinel — not an exception."""
|
|
74
|
+
|
|
75
|
+
state: Literal["broken"]
|
|
76
|
+
reason: str
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
# ID: fcc64fd7-f36e-41b8-be7a-2b1062946287
|
|
80
|
+
def normalize_vocabulary_cell(value: str) -> str:
|
|
81
|
+
"""
|
|
82
|
+
Produce the identity form of a canonical-vocabulary-table cell.
|
|
83
|
+
|
|
84
|
+
The canonical section in CORE-Vocabulary.md is a markdown table; cells
|
|
85
|
+
routinely carry presentation decoration that is not part of the value's
|
|
86
|
+
identity. Today the only such decoration is a surrounding pair of
|
|
87
|
+
backticks (markdown inline-code formatting) around path-shaped cells, plus
|
|
88
|
+
leading/trailing whitespace. Both the sync writer (producing
|
|
89
|
+
vocabulary.json) and the audit gate (validating canonical paths) must
|
|
90
|
+
parse the same identity, so this normalization is the single shared
|
|
91
|
+
contract.
|
|
92
|
+
|
|
93
|
+
Behavior: strip leading/trailing whitespace; if the trimmed value is
|
|
94
|
+
wrapped in a single pair of backticks, drop them and strip again.
|
|
95
|
+
"""
|
|
96
|
+
v = value.strip()
|
|
97
|
+
if v.startswith("`") and v.endswith("`") and len(v) >= 2:
|
|
98
|
+
return v[1:-1].strip()
|
|
99
|
+
return v
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
# ID: 3f8c1b4a-7d2e-4f9b-a6c1-9d3e2b5f8a09
|
|
103
|
+
def locate_canonical_section(text: str) -> tuple[int, int] | None:
|
|
104
|
+
"""
|
|
105
|
+
Return (start_idx, end_idx) of the canonical-section line range, or None.
|
|
106
|
+
|
|
107
|
+
The slice text.splitlines()[start_idx:end_idx] spans the heading line
|
|
108
|
+
through the last line before the terminating '---' separator or next
|
|
109
|
+
'## ' heading.
|
|
110
|
+
"""
|
|
111
|
+
lines = text.splitlines()
|
|
112
|
+
start = next(
|
|
113
|
+
(i for i, line in enumerate(lines) if line.rstrip() == CANONICAL_HEADING),
|
|
114
|
+
None,
|
|
115
|
+
)
|
|
116
|
+
if start is None:
|
|
117
|
+
return None
|
|
118
|
+
end = len(lines)
|
|
119
|
+
for i in range(start + 1, len(lines)):
|
|
120
|
+
if lines[i].strip() == "---" or lines[i].startswith("## "):
|
|
121
|
+
end = i
|
|
122
|
+
break
|
|
123
|
+
return start, end
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
# ID: 2c9e1f7b-4d8a-4e3c-b9f2-6a8c3e1d4b0a
|
|
127
|
+
def compute_canonical_section_hash(repo_root: Path) -> str | None:
|
|
128
|
+
"""
|
|
129
|
+
SHA-256 hex of the canonical section in CORE-Vocabulary.md.
|
|
130
|
+
|
|
131
|
+
Returns None if the paper is missing or the section heading cannot be
|
|
132
|
+
located. Bytes hashed are exactly text.splitlines()[start:end] joined
|
|
133
|
+
by '\\n', matching the regen command in sync_vocabulary.py.
|
|
134
|
+
"""
|
|
135
|
+
paper = repo_root / VOCABULARY_PAPER_REL
|
|
136
|
+
if not paper.is_file():
|
|
137
|
+
return None
|
|
138
|
+
try:
|
|
139
|
+
text = paper.read_text(encoding="utf-8")
|
|
140
|
+
except OSError:
|
|
141
|
+
return None
|
|
142
|
+
rng = locate_canonical_section(text)
|
|
143
|
+
if rng is None:
|
|
144
|
+
return None
|
|
145
|
+
start, end = rng
|
|
146
|
+
section = "\n".join(text.splitlines()[start:end])
|
|
147
|
+
return hashlib.sha256(section.encode("utf-8")).hexdigest()
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
# ID: 9d3a5c1e-7b2f-4a8d-b1c3-4e7f8a2d5c0b
|
|
151
|
+
def _validate_schema(instance: dict, schema_path: Path, schema: dict) -> str | None:
|
|
152
|
+
"""Validate instance against schema with $ref resolution. Returns error string or None."""
|
|
153
|
+
base_uri = schema_path.parent.as_uri() + "/"
|
|
154
|
+
with warnings.catch_warnings():
|
|
155
|
+
warnings.simplefilter("ignore", category=DeprecationWarning)
|
|
156
|
+
resolver = RefResolver(base_uri=base_uri, referrer=schema)
|
|
157
|
+
try:
|
|
158
|
+
jsonschema.validate(instance, schema, resolver=resolver)
|
|
159
|
+
except jsonschema.ValidationError as e:
|
|
160
|
+
path = "/".join(str(p) for p in e.absolute_path) or "<root>"
|
|
161
|
+
return f"schema validation failed at {path}: {e.message}"
|
|
162
|
+
return None
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
# ID: 1b8e4c2f-9a3d-4f7c-b2e8-6c1d4f9a3e0c
|
|
166
|
+
def load_vocabulary_projection(
|
|
167
|
+
repo_root: Path | None = None,
|
|
168
|
+
) -> VocabularyProjection | VocabularyProjectionError:
|
|
169
|
+
"""
|
|
170
|
+
Load and validate the vocabulary projection.
|
|
171
|
+
|
|
172
|
+
Returns VocabularyProjection on healthy/drift; VocabularyProjectionError
|
|
173
|
+
on broken (missing file, malformed JSON, schema validation failure, or
|
|
174
|
+
canonical source paper not parseable).
|
|
175
|
+
"""
|
|
176
|
+
root = (repo_root or _REPO_ROOT_DEFAULT).resolve()
|
|
177
|
+
json_path = root / VOCABULARY_JSON_REL
|
|
178
|
+
schema_path = root / VOCABULARY_SCHEMA_REL
|
|
179
|
+
|
|
180
|
+
if not json_path.is_file():
|
|
181
|
+
return VocabularyProjectionError(
|
|
182
|
+
state="broken", reason=f"projection missing: {VOCABULARY_JSON_REL}"
|
|
183
|
+
)
|
|
184
|
+
if not schema_path.is_file():
|
|
185
|
+
return VocabularyProjectionError(
|
|
186
|
+
state="broken", reason=f"schema missing: {VOCABULARY_SCHEMA_REL}"
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
try:
|
|
190
|
+
instance = json.loads(json_path.read_text(encoding="utf-8"))
|
|
191
|
+
except json.JSONDecodeError as e:
|
|
192
|
+
return VocabularyProjectionError(
|
|
193
|
+
state="broken", reason=f"malformed JSON in {VOCABULARY_JSON_REL}: {e.msg}"
|
|
194
|
+
)
|
|
195
|
+
except OSError as e:
|
|
196
|
+
return VocabularyProjectionError(
|
|
197
|
+
state="broken", reason=f"unreadable projection: {e}"
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
try:
|
|
201
|
+
schema = json.loads(schema_path.read_text(encoding="utf-8"))
|
|
202
|
+
except (json.JSONDecodeError, OSError) as e:
|
|
203
|
+
return VocabularyProjectionError(
|
|
204
|
+
state="broken", reason=f"unreadable schema: {e}"
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
schema_error = _validate_schema(instance, schema_path, schema)
|
|
208
|
+
if schema_error is not None:
|
|
209
|
+
return VocabularyProjectionError(state="broken", reason=schema_error)
|
|
210
|
+
|
|
211
|
+
recomputed_hash = compute_canonical_section_hash(root)
|
|
212
|
+
if recomputed_hash is None:
|
|
213
|
+
return VocabularyProjectionError(
|
|
214
|
+
state="broken",
|
|
215
|
+
reason=(
|
|
216
|
+
f"cannot recompute hash: canonical section not found in "
|
|
217
|
+
f"{VOCABULARY_PAPER_REL}"
|
|
218
|
+
),
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
stored_hash = instance["metadata"].get("source_hash", "")
|
|
222
|
+
drift = stored_hash != recomputed_hash
|
|
223
|
+
|
|
224
|
+
terms = tuple(
|
|
225
|
+
VocabularyTerm(
|
|
226
|
+
term=t["term"],
|
|
227
|
+
definition=t["definition"],
|
|
228
|
+
not_=t["not"],
|
|
229
|
+
authoritative_paper=t["authoritative_paper"],
|
|
230
|
+
aliases=tuple(t.get("aliases") or ()),
|
|
231
|
+
see_also=tuple(t.get("see_also") or ()),
|
|
232
|
+
)
|
|
233
|
+
for t in instance["terms"]
|
|
234
|
+
)
|
|
235
|
+
|
|
236
|
+
return VocabularyProjection(
|
|
237
|
+
terms=terms,
|
|
238
|
+
drift_detected=drift,
|
|
239
|
+
state="drift" if drift else "healthy",
|
|
240
|
+
source_hash=stored_hash,
|
|
241
|
+
)
|