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,470 @@
|
|
|
1
|
+
# src/shared/infrastructure/intent/operational_capabilities.py
|
|
2
|
+
"""
|
|
3
|
+
Operational-capability taxonomy loader.
|
|
4
|
+
|
|
5
|
+
Sole sanctioned reader of ``.intent/taxonomies/operational_capabilities.yaml``
|
|
6
|
+
— the canonical declaration of operational capabilities and their filesystem
|
|
7
|
+
authorization profiles per ADR-078 (schema) and the foundational paper
|
|
8
|
+
CORE-Capability-Scoped-Filesystem-Authority.md.
|
|
9
|
+
|
|
10
|
+
Fail-closed by design per ADR-068 pattern: any structural deviation raises
|
|
11
|
+
``OperationalCapabilityTaxonomyError``. The loader never returns an empty
|
|
12
|
+
set and never falls back to a permissive default — silent pass-all would
|
|
13
|
+
defeat capability-scoped authorization entirely. Callers that cannot honour
|
|
14
|
+
a fail-closed contract must not call this function.
|
|
15
|
+
|
|
16
|
+
The loader cross-references two sibling .intent/ artifacts on every load:
|
|
17
|
+
|
|
18
|
+
- ``.intent/META/enums.json`` resolves ``fs_operation_class`` (the
|
|
19
|
+
fs_profile key vocabulary) and ``operational_mode`` (the accepted modes
|
|
20
|
+
vocabulary). Both are sourced from enums.json at load time, not
|
|
21
|
+
hardcoded — adding a fifth op-class is a coordinated enums.json + YAML
|
|
22
|
+
edit, not a Python change.
|
|
23
|
+
- ``.intent/enforcement/config/action_risk.yaml`` is the single source
|
|
24
|
+
of truth for risk classification. Each capability's ``risk`` field
|
|
25
|
+
must be present in action_risk.yaml for that capability_id AND the
|
|
26
|
+
risk values must agree; drift between the two surfaces is a load-time
|
|
27
|
+
failure.
|
|
28
|
+
|
|
29
|
+
Three-way load-order coupling: ``enums.json`` and ``action_risk.yaml`` must
|
|
30
|
+
both be readable and structurally valid before
|
|
31
|
+
``operational_capabilities.yaml`` is loadable.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
from __future__ import annotations
|
|
35
|
+
|
|
36
|
+
import json
|
|
37
|
+
import re
|
|
38
|
+
from collections.abc import Mapping
|
|
39
|
+
from dataclasses import dataclass
|
|
40
|
+
from pathlib import Path
|
|
41
|
+
from typing import Any
|
|
42
|
+
|
|
43
|
+
import yaml
|
|
44
|
+
|
|
45
|
+
from shared.infrastructure.intent.errors import GovernanceError
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
OPERATIONAL_CAPABILITIES_REL = ".intent/taxonomies/operational_capabilities.yaml"
|
|
49
|
+
ENUMS_REL = ".intent/META/enums.json"
|
|
50
|
+
ACTION_RISK_REL = ".intent/enforcement/config/action_risk.yaml"
|
|
51
|
+
|
|
52
|
+
# src/shared/infrastructure/intent/operational_capabilities.py
|
|
53
|
+
# parents[0] = intent
|
|
54
|
+
# parents[1] = infrastructure
|
|
55
|
+
# parents[2] = shared
|
|
56
|
+
# parents[3] = src
|
|
57
|
+
# parents[4] = repo root
|
|
58
|
+
_REPO_ROOT_DEFAULT = Path(__file__).resolve().parents[4]
|
|
59
|
+
|
|
60
|
+
# ADR-078 D6: capability-id grammar regex. Exactly one dot; both halves
|
|
61
|
+
# lowercase + underscore. The loader fails closed on any violation.
|
|
62
|
+
_CAPABILITY_ID_REGEX = re.compile(r"^[a-z][a-z_]*\.[a-z][a-z_]+$")
|
|
63
|
+
|
|
64
|
+
# ADR-078 D8: chokepoint primitives are not capabilities. Their ids are
|
|
65
|
+
# structurally excluded from this taxonomy.
|
|
66
|
+
_CHOKEPOINT_PRIMITIVE_PREFIX = "file."
|
|
67
|
+
|
|
68
|
+
# Closed risk vocabulary per ADR-078 D3 (mirrors action_risk.yaml header).
|
|
69
|
+
_VALID_RISKS = frozenset({"safe", "moderate", "dangerous"})
|
|
70
|
+
|
|
71
|
+
# Required-field discipline.
|
|
72
|
+
_REQUIRED_CAPABILITY_FIELDS = frozenset({"description", "risk", "fs_profile"})
|
|
73
|
+
_REQUIRED_PATTERN_ENTRY_FIELDS = frozenset({"path_pattern", "modes"})
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
# ID: 5157d532-9bb2-4176-92c2-c071a8eecc37
|
|
77
|
+
class OperationalCapabilityTaxonomyError(GovernanceError):
|
|
78
|
+
"""Raised when the operational-capability taxonomy cannot be loaded fail-closed."""
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
@dataclass(frozen=True)
|
|
82
|
+
# ID: a1376303-989f-4335-8b09-71f59975e32d
|
|
83
|
+
class FsPatternEntry:
|
|
84
|
+
"""A single filesystem pattern entry within an fs_profile operation-class list."""
|
|
85
|
+
|
|
86
|
+
path_pattern: str
|
|
87
|
+
modes: tuple[str, ...]
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
@dataclass(frozen=True)
|
|
91
|
+
# ID: fa5f8ab9-8cf0-43b6-999f-b74d69363787
|
|
92
|
+
class OperationalCapability:
|
|
93
|
+
"""
|
|
94
|
+
A single operational capability with its filesystem authorization profile.
|
|
95
|
+
|
|
96
|
+
``fs_profile`` is stored as a hashable tuple-of-pairs
|
|
97
|
+
``(op_class, pattern_entries)`` ordered by ``fs_operation_class``
|
|
98
|
+
values. Mapping access is exposed via the ``as_mapping`` property.
|
|
99
|
+
The tuple-of-pairs shape — rather than a fixed dataclass with one
|
|
100
|
+
field per op-class — keeps the key set sourced from enums.json at load
|
|
101
|
+
time (ADR-078 D10).
|
|
102
|
+
"""
|
|
103
|
+
|
|
104
|
+
id: str
|
|
105
|
+
description: str
|
|
106
|
+
risk: str
|
|
107
|
+
fs_profile: tuple[tuple[str, tuple[FsPatternEntry, ...]], ...]
|
|
108
|
+
|
|
109
|
+
@property
|
|
110
|
+
# ID: bd74eb57-912d-409c-9d19-76e154f07aed
|
|
111
|
+
def as_mapping(self) -> Mapping[str, tuple[FsPatternEntry, ...]]:
|
|
112
|
+
"""Return fs_profile as a mapping view for ergonomic key access."""
|
|
113
|
+
return dict(self.fs_profile)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
# ID: 86d27090-969b-4736-83f1-bbe20dec2aa4
|
|
117
|
+
def load_operational_capabilities(
|
|
118
|
+
repo_root: Path | None = None,
|
|
119
|
+
) -> frozenset[OperationalCapability]:
|
|
120
|
+
"""
|
|
121
|
+
Return the declared operational-capability set as a frozenset of immutable records.
|
|
122
|
+
|
|
123
|
+
Reads ``.intent/taxonomies/operational_capabilities.yaml`` and validates
|
|
124
|
+
every entry against ADR-078 D3/D4/D6/D8/D10. Cross-references the
|
|
125
|
+
sibling ``.intent/META/enums.json`` for fs_profile key and mode
|
|
126
|
+
vocabularies, and ``.intent/enforcement/config/action_risk.yaml`` for
|
|
127
|
+
risk classification agreement. Raises
|
|
128
|
+
``OperationalCapabilityTaxonomyError`` on any structural deviation.
|
|
129
|
+
"""
|
|
130
|
+
root = (repo_root or _REPO_ROOT_DEFAULT).resolve()
|
|
131
|
+
|
|
132
|
+
fs_op_classes, valid_modes = _load_enums(root)
|
|
133
|
+
action_risk_map = _load_action_risk(root)
|
|
134
|
+
document = _load_document(root)
|
|
135
|
+
|
|
136
|
+
capabilities_block = document.get("capabilities")
|
|
137
|
+
if not isinstance(capabilities_block, dict):
|
|
138
|
+
raise OperationalCapabilityTaxonomyError(
|
|
139
|
+
f"{OPERATIONAL_CAPABILITIES_REL}: missing or non-mapping 'capabilities:' block."
|
|
140
|
+
)
|
|
141
|
+
if not capabilities_block:
|
|
142
|
+
raise OperationalCapabilityTaxonomyError(
|
|
143
|
+
f"{OPERATIONAL_CAPABILITIES_REL}: 'capabilities:' block declares no capabilities."
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
capabilities: set[OperationalCapability] = set()
|
|
147
|
+
for cap_id, entry in capabilities_block.items():
|
|
148
|
+
capabilities.add(
|
|
149
|
+
_build_capability(
|
|
150
|
+
cap_id=str(cap_id),
|
|
151
|
+
entry=entry,
|
|
152
|
+
fs_op_classes=fs_op_classes,
|
|
153
|
+
valid_modes=valid_modes,
|
|
154
|
+
action_risk_map=action_risk_map,
|
|
155
|
+
)
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
return frozenset(capabilities)
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def _load_document(root: Path) -> dict[str, Any]:
|
|
162
|
+
"""Load and minimally validate the top-level taxonomy YAML document."""
|
|
163
|
+
path = root / OPERATIONAL_CAPABILITIES_REL
|
|
164
|
+
if not path.is_file():
|
|
165
|
+
raise OperationalCapabilityTaxonomyError(
|
|
166
|
+
f"operational-capability taxonomy missing: {OPERATIONAL_CAPABILITIES_REL}"
|
|
167
|
+
)
|
|
168
|
+
try:
|
|
169
|
+
text = path.read_text(encoding="utf-8")
|
|
170
|
+
except OSError as exc:
|
|
171
|
+
raise OperationalCapabilityTaxonomyError(
|
|
172
|
+
f"cannot read {OPERATIONAL_CAPABILITIES_REL}: {exc}"
|
|
173
|
+
) from exc
|
|
174
|
+
try:
|
|
175
|
+
document = yaml.safe_load(text)
|
|
176
|
+
except yaml.YAMLError as exc:
|
|
177
|
+
raise OperationalCapabilityTaxonomyError(
|
|
178
|
+
f"malformed YAML in {OPERATIONAL_CAPABILITIES_REL}: {exc}"
|
|
179
|
+
) from exc
|
|
180
|
+
if not isinstance(document, dict):
|
|
181
|
+
raise OperationalCapabilityTaxonomyError(
|
|
182
|
+
f"{OPERATIONAL_CAPABILITIES_REL}: top-level document must be a mapping."
|
|
183
|
+
)
|
|
184
|
+
return document
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def _load_enums(root: Path) -> tuple[tuple[str, ...], frozenset[str]]:
|
|
188
|
+
"""
|
|
189
|
+
Resolve fs_operation_class.enum and operational_mode.enum from .intent/META/enums.json.
|
|
190
|
+
|
|
191
|
+
Returns (fs_op_classes ordered tuple, valid_modes frozenset). The order
|
|
192
|
+
of fs_op_classes is preserved as declared in enums.json — it determines
|
|
193
|
+
the canonical ordering of fs_profile pairs in OperationalCapability.
|
|
194
|
+
"""
|
|
195
|
+
path = root / ENUMS_REL
|
|
196
|
+
if not path.is_file():
|
|
197
|
+
raise OperationalCapabilityTaxonomyError(
|
|
198
|
+
f"required enum file missing: {ENUMS_REL}"
|
|
199
|
+
)
|
|
200
|
+
try:
|
|
201
|
+
text = path.read_text(encoding="utf-8")
|
|
202
|
+
except OSError as exc:
|
|
203
|
+
raise OperationalCapabilityTaxonomyError(
|
|
204
|
+
f"cannot read {ENUMS_REL}: {exc}"
|
|
205
|
+
) from exc
|
|
206
|
+
try:
|
|
207
|
+
document = json.loads(text)
|
|
208
|
+
except json.JSONDecodeError as exc:
|
|
209
|
+
raise OperationalCapabilityTaxonomyError(
|
|
210
|
+
f"malformed JSON in {ENUMS_REL}: {exc}"
|
|
211
|
+
) from exc
|
|
212
|
+
|
|
213
|
+
definitions = document.get("definitions") if isinstance(document, dict) else None
|
|
214
|
+
if not isinstance(definitions, dict):
|
|
215
|
+
raise OperationalCapabilityTaxonomyError(
|
|
216
|
+
f"{ENUMS_REL}: missing or non-mapping 'definitions' block."
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
fs_op_def = definitions.get("fs_operation_class")
|
|
220
|
+
if not isinstance(fs_op_def, dict) or not isinstance(fs_op_def.get("enum"), list):
|
|
221
|
+
raise OperationalCapabilityTaxonomyError(
|
|
222
|
+
f"{ENUMS_REL}: missing or malformed 'fs_operation_class' enum."
|
|
223
|
+
)
|
|
224
|
+
fs_op_classes = tuple(str(v) for v in fs_op_def["enum"])
|
|
225
|
+
if not fs_op_classes:
|
|
226
|
+
raise OperationalCapabilityTaxonomyError(
|
|
227
|
+
f"{ENUMS_REL}: 'fs_operation_class' enum is empty."
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
op_mode_def = definitions.get("operational_mode")
|
|
231
|
+
if not isinstance(op_mode_def, dict) or not isinstance(
|
|
232
|
+
op_mode_def.get("enum"), list
|
|
233
|
+
):
|
|
234
|
+
raise OperationalCapabilityTaxonomyError(
|
|
235
|
+
f"{ENUMS_REL}: missing or malformed 'operational_mode' enum."
|
|
236
|
+
)
|
|
237
|
+
valid_modes = frozenset(str(v) for v in op_mode_def["enum"])
|
|
238
|
+
if not valid_modes:
|
|
239
|
+
raise OperationalCapabilityTaxonomyError(
|
|
240
|
+
f"{ENUMS_REL}: 'operational_mode' enum is empty."
|
|
241
|
+
)
|
|
242
|
+
|
|
243
|
+
return fs_op_classes, valid_modes
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
def _load_action_risk(root: Path) -> Mapping[str, str]:
|
|
247
|
+
"""
|
|
248
|
+
Load .intent/enforcement/config/action_risk.yaml and return the action_id → risk mapping.
|
|
249
|
+
|
|
250
|
+
Per ADR-078 D3, every capability's risk field must (a) be present as a
|
|
251
|
+
key in this mapping, and (b) carry a value that matches this mapping's
|
|
252
|
+
value for that capability_id. Both checks are enforced in
|
|
253
|
+
_build_capability.
|
|
254
|
+
"""
|
|
255
|
+
path = root / ACTION_RISK_REL
|
|
256
|
+
if not path.is_file():
|
|
257
|
+
raise OperationalCapabilityTaxonomyError(
|
|
258
|
+
f"required risk file missing: {ACTION_RISK_REL}"
|
|
259
|
+
)
|
|
260
|
+
try:
|
|
261
|
+
text = path.read_text(encoding="utf-8")
|
|
262
|
+
except OSError as exc:
|
|
263
|
+
raise OperationalCapabilityTaxonomyError(
|
|
264
|
+
f"cannot read {ACTION_RISK_REL}: {exc}"
|
|
265
|
+
) from exc
|
|
266
|
+
try:
|
|
267
|
+
document = yaml.safe_load(text)
|
|
268
|
+
except yaml.YAMLError as exc:
|
|
269
|
+
raise OperationalCapabilityTaxonomyError(
|
|
270
|
+
f"malformed YAML in {ACTION_RISK_REL}: {exc}"
|
|
271
|
+
) from exc
|
|
272
|
+
|
|
273
|
+
actions_block = document.get("actions") if isinstance(document, dict) else None
|
|
274
|
+
if not isinstance(actions_block, dict):
|
|
275
|
+
raise OperationalCapabilityTaxonomyError(
|
|
276
|
+
f"{ACTION_RISK_REL}: missing or non-mapping 'actions:' block."
|
|
277
|
+
)
|
|
278
|
+
if not actions_block:
|
|
279
|
+
raise OperationalCapabilityTaxonomyError(
|
|
280
|
+
f"{ACTION_RISK_REL}: 'actions:' block declares no entries."
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
return {str(k): str(v) for k, v in actions_block.items()}
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
def _build_capability(
|
|
287
|
+
*,
|
|
288
|
+
cap_id: str,
|
|
289
|
+
entry: Any,
|
|
290
|
+
fs_op_classes: tuple[str, ...],
|
|
291
|
+
valid_modes: frozenset[str],
|
|
292
|
+
action_risk_map: Mapping[str, str],
|
|
293
|
+
) -> OperationalCapability:
|
|
294
|
+
"""Assemble and validate one OperationalCapability from a YAML entry."""
|
|
295
|
+
if not _CAPABILITY_ID_REGEX.match(cap_id):
|
|
296
|
+
raise OperationalCapabilityTaxonomyError(
|
|
297
|
+
f"capability id '{cap_id}' violates D6 grammar "
|
|
298
|
+
f"(^[a-z][a-z_]*\\.[a-z][a-z_]+$); rename in the change-set that lands it."
|
|
299
|
+
)
|
|
300
|
+
if cap_id.startswith(_CHOKEPOINT_PRIMITIVE_PREFIX):
|
|
301
|
+
raise OperationalCapabilityTaxonomyError(
|
|
302
|
+
f"capability id '{cap_id}' is a chokepoint primitive (D8) and "
|
|
303
|
+
f"must not appear in {OPERATIONAL_CAPABILITIES_REL}."
|
|
304
|
+
)
|
|
305
|
+
if not isinstance(entry, dict):
|
|
306
|
+
raise OperationalCapabilityTaxonomyError(
|
|
307
|
+
f"capability '{cap_id}': entry must be a mapping, got {type(entry).__name__}."
|
|
308
|
+
)
|
|
309
|
+
|
|
310
|
+
actual_fields = frozenset(entry.keys())
|
|
311
|
+
missing = _REQUIRED_CAPABILITY_FIELDS - actual_fields
|
|
312
|
+
if missing:
|
|
313
|
+
raise OperationalCapabilityTaxonomyError(
|
|
314
|
+
f"capability '{cap_id}': missing required field(s): {sorted(missing)}."
|
|
315
|
+
)
|
|
316
|
+
extra = actual_fields - _REQUIRED_CAPABILITY_FIELDS
|
|
317
|
+
if extra:
|
|
318
|
+
raise OperationalCapabilityTaxonomyError(
|
|
319
|
+
f"capability '{cap_id}': unknown field(s): {sorted(extra)}."
|
|
320
|
+
)
|
|
321
|
+
|
|
322
|
+
description = entry["description"]
|
|
323
|
+
if not isinstance(description, str) or not description.strip():
|
|
324
|
+
raise OperationalCapabilityTaxonomyError(
|
|
325
|
+
f"capability '{cap_id}': 'description' must be a non-empty string."
|
|
326
|
+
)
|
|
327
|
+
|
|
328
|
+
risk = entry["risk"]
|
|
329
|
+
if not isinstance(risk, str):
|
|
330
|
+
raise OperationalCapabilityTaxonomyError(
|
|
331
|
+
f"capability '{cap_id}': 'risk' must be a string, got {type(risk).__name__}."
|
|
332
|
+
)
|
|
333
|
+
if risk not in _VALID_RISKS:
|
|
334
|
+
raise OperationalCapabilityTaxonomyError(
|
|
335
|
+
f"capability '{cap_id}': risk '{risk}' is not in "
|
|
336
|
+
f"{{safe, moderate, dangerous}} (ADR-078 D3)."
|
|
337
|
+
)
|
|
338
|
+
declared_risk = action_risk_map.get(cap_id)
|
|
339
|
+
if declared_risk is None:
|
|
340
|
+
raise OperationalCapabilityTaxonomyError(
|
|
341
|
+
f"capability '{cap_id}': not declared in {ACTION_RISK_REL}; "
|
|
342
|
+
f"every capability must have a corresponding action_risk.yaml entry (ADR-078 D3)."
|
|
343
|
+
)
|
|
344
|
+
if declared_risk != risk:
|
|
345
|
+
raise OperationalCapabilityTaxonomyError(
|
|
346
|
+
f"capability '{cap_id}': risk '{risk}' disagrees with "
|
|
347
|
+
f"{ACTION_RISK_REL} value '{declared_risk}'; one of the two must be corrected (ADR-078 D3)."
|
|
348
|
+
)
|
|
349
|
+
|
|
350
|
+
fs_profile = _parse_fs_profile(
|
|
351
|
+
cap_id=cap_id,
|
|
352
|
+
raw=entry["fs_profile"],
|
|
353
|
+
fs_op_classes=fs_op_classes,
|
|
354
|
+
valid_modes=valid_modes,
|
|
355
|
+
)
|
|
356
|
+
|
|
357
|
+
return OperationalCapability(
|
|
358
|
+
id=cap_id,
|
|
359
|
+
description=description,
|
|
360
|
+
risk=risk,
|
|
361
|
+
fs_profile=fs_profile,
|
|
362
|
+
)
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
def _parse_fs_profile(
|
|
366
|
+
*,
|
|
367
|
+
cap_id: str,
|
|
368
|
+
raw: Any,
|
|
369
|
+
fs_op_classes: tuple[str, ...],
|
|
370
|
+
valid_modes: frozenset[str],
|
|
371
|
+
) -> tuple[tuple[str, tuple[FsPatternEntry, ...]], ...]:
|
|
372
|
+
"""
|
|
373
|
+
Validate fs_profile shape and assemble the hashable tuple-of-pairs.
|
|
374
|
+
|
|
375
|
+
Pairs are emitted in the order declared by fs_operation_class.enum so
|
|
376
|
+
that two OperationalCapability instances with the same content hash
|
|
377
|
+
identically regardless of the source YAML's key order.
|
|
378
|
+
"""
|
|
379
|
+
if not isinstance(raw, dict):
|
|
380
|
+
raise OperationalCapabilityTaxonomyError(
|
|
381
|
+
f"capability '{cap_id}': 'fs_profile' must be a mapping, "
|
|
382
|
+
f"got {type(raw).__name__}."
|
|
383
|
+
)
|
|
384
|
+
expected_keys = frozenset(fs_op_classes)
|
|
385
|
+
actual_keys = frozenset(raw.keys())
|
|
386
|
+
missing = expected_keys - actual_keys
|
|
387
|
+
if missing:
|
|
388
|
+
raise OperationalCapabilityTaxonomyError(
|
|
389
|
+
f"capability '{cap_id}': fs_profile missing required op-class key(s): "
|
|
390
|
+
f"{sorted(missing)} (must match fs_operation_class.enum exactly per ADR-078 D4)."
|
|
391
|
+
)
|
|
392
|
+
extra = actual_keys - expected_keys
|
|
393
|
+
if extra:
|
|
394
|
+
raise OperationalCapabilityTaxonomyError(
|
|
395
|
+
f"capability '{cap_id}': fs_profile has unknown key(s): {sorted(extra)} "
|
|
396
|
+
f"(must match fs_operation_class.enum exactly per ADR-078 D4)."
|
|
397
|
+
)
|
|
398
|
+
|
|
399
|
+
pairs: list[tuple[str, tuple[FsPatternEntry, ...]]] = []
|
|
400
|
+
for op_class in fs_op_classes:
|
|
401
|
+
entries = raw[op_class]
|
|
402
|
+
if not isinstance(entries, list):
|
|
403
|
+
raise OperationalCapabilityTaxonomyError(
|
|
404
|
+
f"capability '{cap_id}': fs_profile.{op_class} must be a list, "
|
|
405
|
+
f"got {type(entries).__name__}."
|
|
406
|
+
)
|
|
407
|
+
parsed = tuple(
|
|
408
|
+
_parse_pattern_entry(
|
|
409
|
+
cap_id=cap_id,
|
|
410
|
+
op_class=op_class,
|
|
411
|
+
raw=item,
|
|
412
|
+
valid_modes=valid_modes,
|
|
413
|
+
)
|
|
414
|
+
for item in entries
|
|
415
|
+
)
|
|
416
|
+
pairs.append((op_class, parsed))
|
|
417
|
+
return tuple(pairs)
|
|
418
|
+
|
|
419
|
+
|
|
420
|
+
def _parse_pattern_entry(
|
|
421
|
+
*,
|
|
422
|
+
cap_id: str,
|
|
423
|
+
op_class: str,
|
|
424
|
+
raw: Any,
|
|
425
|
+
valid_modes: frozenset[str],
|
|
426
|
+
) -> FsPatternEntry:
|
|
427
|
+
"""Validate a single path_pattern/modes entry and return the frozen record."""
|
|
428
|
+
if not isinstance(raw, dict):
|
|
429
|
+
raise OperationalCapabilityTaxonomyError(
|
|
430
|
+
f"capability '{cap_id}': fs_profile.{op_class} entry must be a mapping, "
|
|
431
|
+
f"got {type(raw).__name__}."
|
|
432
|
+
)
|
|
433
|
+
actual_keys = frozenset(raw.keys())
|
|
434
|
+
missing = _REQUIRED_PATTERN_ENTRY_FIELDS - actual_keys
|
|
435
|
+
if missing:
|
|
436
|
+
raise OperationalCapabilityTaxonomyError(
|
|
437
|
+
f"capability '{cap_id}': fs_profile.{op_class} entry missing field(s): "
|
|
438
|
+
f"{sorted(missing)}."
|
|
439
|
+
)
|
|
440
|
+
extra = actual_keys - _REQUIRED_PATTERN_ENTRY_FIELDS
|
|
441
|
+
if extra:
|
|
442
|
+
raise OperationalCapabilityTaxonomyError(
|
|
443
|
+
f"capability '{cap_id}': fs_profile.{op_class} entry has unknown field(s): "
|
|
444
|
+
f"{sorted(extra)}."
|
|
445
|
+
)
|
|
446
|
+
path_pattern = raw["path_pattern"]
|
|
447
|
+
if not isinstance(path_pattern, str) or not path_pattern.strip():
|
|
448
|
+
raise OperationalCapabilityTaxonomyError(
|
|
449
|
+
f"capability '{cap_id}': fs_profile.{op_class} entry 'path_pattern' "
|
|
450
|
+
f"must be a non-empty string."
|
|
451
|
+
)
|
|
452
|
+
modes_raw = raw["modes"]
|
|
453
|
+
if not isinstance(modes_raw, list):
|
|
454
|
+
raise OperationalCapabilityTaxonomyError(
|
|
455
|
+
f"capability '{cap_id}': fs_profile.{op_class} entry 'modes' must be a list, "
|
|
456
|
+
f"got {type(modes_raw).__name__}."
|
|
457
|
+
)
|
|
458
|
+
if not modes_raw:
|
|
459
|
+
raise OperationalCapabilityTaxonomyError(
|
|
460
|
+
f"capability '{cap_id}': fs_profile.{op_class} entry 'modes' is empty; "
|
|
461
|
+
f"omit the entry to deny in all modes (ADR-078 D4)."
|
|
462
|
+
)
|
|
463
|
+
modes_tuple = tuple(str(m) for m in modes_raw)
|
|
464
|
+
unknown_modes = {m for m in modes_tuple if m not in valid_modes}
|
|
465
|
+
if unknown_modes:
|
|
466
|
+
raise OperationalCapabilityTaxonomyError(
|
|
467
|
+
f"capability '{cap_id}': fs_profile.{op_class} entry has mode(s) "
|
|
468
|
+
f"outside operational_mode.enum: {sorted(unknown_modes)}."
|
|
469
|
+
)
|
|
470
|
+
return FsPatternEntry(path_pattern=path_pattern, modes=modes_tuple)
|