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,592 @@
|
|
|
1
|
+
# src/body/governance/intent_guard.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
Constitutional Intent Guard - Main Orchestrator.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import ast
|
|
10
|
+
from collections.abc import Mapping
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
from body.governance.intent_pattern_validators import PatternValidators
|
|
14
|
+
from mind.governance.enforcement_loader import EnforcementMappingLoader
|
|
15
|
+
from mind.governance.policy_rule import PolicyRule
|
|
16
|
+
from mind.governance.rule_extractor import extract_executable_rules
|
|
17
|
+
from mind.governance.violation_report import ViolationReport
|
|
18
|
+
from shared.infrastructure.intent.intent_repository import get_intent_repository
|
|
19
|
+
from shared.infrastructure.intent.operational_capabilities import (
|
|
20
|
+
OperationalCapability,
|
|
21
|
+
OperationalCapabilityTaxonomyError,
|
|
22
|
+
load_operational_capabilities,
|
|
23
|
+
)
|
|
24
|
+
from shared.infrastructure.intent.vocabulary_projection import (
|
|
25
|
+
VocabularyProjectionError,
|
|
26
|
+
load_vocabulary_projection,
|
|
27
|
+
)
|
|
28
|
+
from shared.logger import getLogger
|
|
29
|
+
from shared.models.constitutional_validation import ConstitutionalValidationResult
|
|
30
|
+
from shared.path_resolver import PathResolver
|
|
31
|
+
from shared.utils.glob_match import matches_glob
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
logger = getLogger(__name__)
|
|
35
|
+
|
|
36
|
+
# Engine types that MUST NOT be evaluated by check_transaction at write time.
|
|
37
|
+
#
|
|
38
|
+
# Two distinct categories share this property:
|
|
39
|
+
#
|
|
40
|
+
# 1. Content-analysis engines (need file content, only available at audit phase):
|
|
41
|
+
# ast_gate, glob_gate, knowledge_gate, llm_gate, regex_gate
|
|
42
|
+
#
|
|
43
|
+
# 2. Passive-marker engines (no write-time check exists; enforcement happens
|
|
44
|
+
# elsewhere — at runtime, at parse time, at decoration, or by code review):
|
|
45
|
+
# runtime_check → enforced by cli_gate at audit/self-check time
|
|
46
|
+
# python_runtime → enforced by Python at module import
|
|
47
|
+
# dataclass_validation → enforced by Pydantic __post_init__
|
|
48
|
+
# type_system → enforced by Python enum type-checking
|
|
49
|
+
# advisory → enforced by code review (by design)
|
|
50
|
+
# runtime_metric → tracked, not enforced
|
|
51
|
+
#
|
|
52
|
+
# Evaluating either category here produces false positives: the rule has no
|
|
53
|
+
# applicable check, and check_transaction would emit the rule's statement as
|
|
54
|
+
# a block reason. See issue #142 — fix.placeholders failures (128/129 of all
|
|
55
|
+
# autonomous failures, 2026-04-22 → 2026-04-23) traced to runtime_check rules
|
|
56
|
+
# being treated as write-time gates.
|
|
57
|
+
_AUDIT_ENGINES = frozenset(
|
|
58
|
+
{
|
|
59
|
+
"ast_gate",
|
|
60
|
+
"glob_gate",
|
|
61
|
+
"knowledge_gate",
|
|
62
|
+
"llm_gate",
|
|
63
|
+
"regex_gate",
|
|
64
|
+
"runtime_check",
|
|
65
|
+
"python_runtime",
|
|
66
|
+
"dataclass_validation",
|
|
67
|
+
"type_system",
|
|
68
|
+
"advisory",
|
|
69
|
+
"runtime_metric",
|
|
70
|
+
"taxonomy_gate",
|
|
71
|
+
}
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
# Severity value assigned to constitutional-authority violations.
|
|
75
|
+
# Using a dedicated string (rather than reusing "error") lets check_transaction
|
|
76
|
+
# distinguish "always block" from "block only in strict_mode" without touching
|
|
77
|
+
# any shared models.
|
|
78
|
+
_CONSTITUTIONAL_SEVERITY = "constitutional"
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
# ID: 085acfeb-4ce6-4cfb-91eb-544e686a97fb
|
|
82
|
+
class IntentGuard:
|
|
83
|
+
"""
|
|
84
|
+
Constitutional enforcement orchestrator.
|
|
85
|
+
|
|
86
|
+
Responsibilities:
|
|
87
|
+
- Load and prioritize constitutional rules from the Mind.
|
|
88
|
+
- Validate file operations against policies.
|
|
89
|
+
- Enforce hard invariants (no .intent writes).
|
|
90
|
+
|
|
91
|
+
Enforcement tiers
|
|
92
|
+
-----------------
|
|
93
|
+
1. Hard invariant (.intent/ writes)
|
|
94
|
+
Unconditional block. No configuration can disable this.
|
|
95
|
+
|
|
96
|
+
2. Constitutional rules (authority="constitution" in the .intent/ file)
|
|
97
|
+
Always block, regardless of strict_mode.
|
|
98
|
+
These are the "sacred" rules that define the system's identity.
|
|
99
|
+
|
|
100
|
+
3. Policy rules (authority="policy")
|
|
101
|
+
Advisory by default (strict_mode=False): violations are reported
|
|
102
|
+
but do NOT block execution, preserving development momentum.
|
|
103
|
+
Set strict_mode=True to make policy violations blocking too.
|
|
104
|
+
|
|
105
|
+
Why this split matters
|
|
106
|
+
----------------------
|
|
107
|
+
Calling strict_mode=False "advisory" is now honest: constitutional rules
|
|
108
|
+
still provide hard enforcement even in the default mode. The README
|
|
109
|
+
claim "constitutional governance blocks violations" is literally true
|
|
110
|
+
because tier-2 always blocks. Tier-3 (policy) being advisory during
|
|
111
|
+
development is a deliberate design choice, not a hidden weakness.
|
|
112
|
+
"""
|
|
113
|
+
|
|
114
|
+
# Sovereign ID from .intent/rules/architecture/governance_basics.json
|
|
115
|
+
_READ_ONLY_RULE_ID = "governance.constitution.read_only"
|
|
116
|
+
|
|
117
|
+
def __init__(
|
|
118
|
+
self,
|
|
119
|
+
repo_path: Path,
|
|
120
|
+
path_resolver: PathResolver | None = None,
|
|
121
|
+
strict_mode: bool = False,
|
|
122
|
+
):
|
|
123
|
+
"""
|
|
124
|
+
Initialise IntentGuard.
|
|
125
|
+
|
|
126
|
+
Args:
|
|
127
|
+
repo_path: Absolute path to the repository root.
|
|
128
|
+
path_resolver: Optional PathResolver; falls back to repo_path/.intent.
|
|
129
|
+
strict_mode: When True, policy-authority violations (tier-3) also
|
|
130
|
+
block execution. Constitutional violations (tier-2)
|
|
131
|
+
and the .intent/ hard invariant (tier-1) always block
|
|
132
|
+
regardless of this flag.
|
|
133
|
+
"""
|
|
134
|
+
self.repo_path = Path(repo_path).resolve()
|
|
135
|
+
self.strict_mode = strict_mode
|
|
136
|
+
|
|
137
|
+
if path_resolver is not None:
|
|
138
|
+
self.intent_root = path_resolver.intent_root
|
|
139
|
+
else:
|
|
140
|
+
self.intent_root = self.repo_path / ".intent"
|
|
141
|
+
|
|
142
|
+
# 1. Initialize Mind Repository
|
|
143
|
+
repo = get_intent_repository()
|
|
144
|
+
repo.initialize()
|
|
145
|
+
|
|
146
|
+
# 2. Initialize Enforcement Mappings
|
|
147
|
+
mapping_loader = EnforcementMappingLoader(self.intent_root)
|
|
148
|
+
|
|
149
|
+
# 3. Extract All Policies from Mind
|
|
150
|
+
policies = {
|
|
151
|
+
pref.policy_id: repo.load_policy(pref.policy_id)
|
|
152
|
+
for pref in repo.list_policies()
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
# 4. Resolve Executable Rules
|
|
156
|
+
executable_rules = extract_executable_rules(policies, mapping_loader)
|
|
157
|
+
|
|
158
|
+
# 5. Transform to internal PolicyRule objects (authority is now threaded through)
|
|
159
|
+
self.rules: list[PolicyRule] = []
|
|
160
|
+
for er in executable_rules:
|
|
161
|
+
for pattern in er.scope:
|
|
162
|
+
if not pattern or not str(pattern).strip():
|
|
163
|
+
continue
|
|
164
|
+
|
|
165
|
+
self.rules.append(
|
|
166
|
+
PolicyRule(
|
|
167
|
+
name=er.rule_id,
|
|
168
|
+
pattern=str(pattern),
|
|
169
|
+
action=er.engine or "deny",
|
|
170
|
+
description=er.statement,
|
|
171
|
+
severity=er.enforcement,
|
|
172
|
+
source_policy=er.policy_id,
|
|
173
|
+
engine=er.engine,
|
|
174
|
+
params=er.params,
|
|
175
|
+
authority=er.authority, # threaded from .intent/ canonical field
|
|
176
|
+
)
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
# 6. Apply precedence
|
|
180
|
+
self.precedence_map = repo.get_precedence_map()
|
|
181
|
+
self.rules.sort(key=lambda r: self.precedence_map.get(r.source_policy, 999))
|
|
182
|
+
|
|
183
|
+
constitutional_count = sum(
|
|
184
|
+
1 for r in self.rules if r.authority == "constitution"
|
|
185
|
+
)
|
|
186
|
+
policy_count = len(self.rules) - constitutional_count
|
|
187
|
+
|
|
188
|
+
logger.info(
|
|
189
|
+
"IntentGuard initialised: %d constitutional rules (always-block) + "
|
|
190
|
+
"%d policy rules (%s). Strict mode: %s.",
|
|
191
|
+
constitutional_count,
|
|
192
|
+
policy_count,
|
|
193
|
+
"blocking" if strict_mode else "advisory",
|
|
194
|
+
strict_mode,
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
# ADR-079 D2/D5: capability taxonomy index for chokepoint authorization.
|
|
198
|
+
# Stage 1 is advisory — a load failure logs and disables the tier rather
|
|
199
|
+
# than failing startup. Stage 4+ promotion will tighten this to fail-closed.
|
|
200
|
+
self._capabilities: Mapping[str, OperationalCapability] | None
|
|
201
|
+
try:
|
|
202
|
+
caps = load_operational_capabilities(self.repo_path)
|
|
203
|
+
self._capabilities = {c.id: c for c in caps}
|
|
204
|
+
logger.info(
|
|
205
|
+
"Capability taxonomy loaded: %d entries (chokepoint tier: advisory).",
|
|
206
|
+
len(self._capabilities),
|
|
207
|
+
)
|
|
208
|
+
except OperationalCapabilityTaxonomyError as exc:
|
|
209
|
+
self._capabilities = None
|
|
210
|
+
logger.warning(
|
|
211
|
+
"Capability taxonomy not loaded; chokepoint tier will no-op. Reason: %s",
|
|
212
|
+
exc,
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
# ID: 0955918c-8ada-4631-bd8b-8b186d43203e
|
|
216
|
+
def check_transaction(
|
|
217
|
+
self,
|
|
218
|
+
proposed_paths: list[str],
|
|
219
|
+
impact: str | None = None,
|
|
220
|
+
op_classes: Mapping[str, str] | None = None,
|
|
221
|
+
calling_capability: str | None = None,
|
|
222
|
+
current_mode: str | None = None,
|
|
223
|
+
) -> ConstitutionalValidationResult:
|
|
224
|
+
"""
|
|
225
|
+
Validate a set of proposed file operations.
|
|
226
|
+
|
|
227
|
+
Blocking decision matrix:
|
|
228
|
+
┌──────────────────────────────┬────────────────────────┐
|
|
229
|
+
│ Violation type │ Blocks? │
|
|
230
|
+
├──────────────────────────────┼────────────────────────┤
|
|
231
|
+
│ .intent/ write (hard inv.) │ Always │
|
|
232
|
+
│ authority="constitution" │ Always │
|
|
233
|
+
│ authority="policy", error │ Only when strict_mode │
|
|
234
|
+
│ authority="policy", warning │ Never │
|
|
235
|
+
│ capability tier (ADR-079) │ Never — advisory only │
|
|
236
|
+
└──────────────────────────────┴────────────────────────┘
|
|
237
|
+
|
|
238
|
+
DEGRADED pre-check (ADR-023 D4): if the vocabulary projection is
|
|
239
|
+
BROKEN, governance evaluation cannot run — block all writes and
|
|
240
|
+
return a single instrument-degraded violation. This preserves the
|
|
241
|
+
invariant that governance evaluation is only possible when the
|
|
242
|
+
governance instrument is healthy.
|
|
243
|
+
|
|
244
|
+
ADR-079 stage 1 (advisory): the capability tier evaluates D5
|
|
245
|
+
branches 3-8 and emits ``chokepoint.advisory.would-deny`` log
|
|
246
|
+
lines for paths that would be denied. The tier does NOT affect
|
|
247
|
+
``is_valid`` or the returned ``violations`` list in this stage —
|
|
248
|
+
log-only observability. Stage 3+ promotes the tier to blocking
|
|
249
|
+
per-capability per the D10 migration sequence.
|
|
250
|
+
"""
|
|
251
|
+
projection = load_vocabulary_projection(self.repo_path)
|
|
252
|
+
if isinstance(projection, VocabularyProjectionError):
|
|
253
|
+
logger.error(
|
|
254
|
+
"🛑 Governance DEGRADED: vocabulary projection broken — %s",
|
|
255
|
+
projection.reason,
|
|
256
|
+
)
|
|
257
|
+
return ConstitutionalValidationResult(
|
|
258
|
+
is_valid=False,
|
|
259
|
+
violations=[
|
|
260
|
+
ViolationReport(
|
|
261
|
+
rule_name="governance.instrument_degraded",
|
|
262
|
+
path=", ".join(proposed_paths) if proposed_paths else "<n/a>",
|
|
263
|
+
message=(
|
|
264
|
+
"Governance vocabulary projection is broken; "
|
|
265
|
+
f"writes are blocked until restored. Reason: {projection.reason}. "
|
|
266
|
+
"Run `core-admin intent sync vocabulary --write` to repair."
|
|
267
|
+
),
|
|
268
|
+
severity="error",
|
|
269
|
+
suggested_fix="Repair .intent/META/vocabulary.json via the regen command.",
|
|
270
|
+
source_policy="constitution",
|
|
271
|
+
)
|
|
272
|
+
],
|
|
273
|
+
source="IntentGuard",
|
|
274
|
+
)
|
|
275
|
+
|
|
276
|
+
violations: list[ViolationReport] = []
|
|
277
|
+
has_hard_invariant_violation = False
|
|
278
|
+
|
|
279
|
+
for path_str in proposed_paths:
|
|
280
|
+
abs_path = (self.repo_path / path_str).resolve()
|
|
281
|
+
|
|
282
|
+
# ADR-079 stage 1 (advisory). Capability tier runs alongside the
|
|
283
|
+
# existing tiers and emits log-only "would-deny" observations.
|
|
284
|
+
# Does not contribute to violations or is_valid in stage 1.
|
|
285
|
+
self._evaluate_capability_tier_advisory(
|
|
286
|
+
path_str=path_str,
|
|
287
|
+
op_class=(op_classes or {}).get(path_str),
|
|
288
|
+
capability=calling_capability,
|
|
289
|
+
mode=current_mode,
|
|
290
|
+
)
|
|
291
|
+
|
|
292
|
+
# 1. HARD INVARIANT: Absolute block on .intent writes
|
|
293
|
+
if self._is_under_intent(abs_path):
|
|
294
|
+
rule = next(
|
|
295
|
+
(r for r in self.rules if r.name == self._READ_ONLY_RULE_ID), None
|
|
296
|
+
)
|
|
297
|
+
|
|
298
|
+
violations.append(
|
|
299
|
+
ViolationReport(
|
|
300
|
+
rule_name=self._READ_ONLY_RULE_ID,
|
|
301
|
+
path=path_str,
|
|
302
|
+
message=(
|
|
303
|
+
rule.description
|
|
304
|
+
if rule
|
|
305
|
+
else "Writes to .intent/ are constitutionally prohibited."
|
|
306
|
+
),
|
|
307
|
+
severity="error",
|
|
308
|
+
suggested_fix="Modify files outside .intent/ only.",
|
|
309
|
+
source_policy="constitution",
|
|
310
|
+
)
|
|
311
|
+
)
|
|
312
|
+
has_hard_invariant_violation = True
|
|
313
|
+
continue
|
|
314
|
+
|
|
315
|
+
# 2. POLICY EVALUATION
|
|
316
|
+
violations.extend(self._check_against_rules(path_str, abs_path, impact))
|
|
317
|
+
|
|
318
|
+
# 3. DECISION LOGIC (The Teeth)
|
|
319
|
+
#
|
|
320
|
+
# Tier 1: .intent/ hard invariant — always blocks (handled above).
|
|
321
|
+
# Tier 2: constitutional authority — always blocks (new).
|
|
322
|
+
# Tier 3: policy authority errors — blocks only in strict_mode.
|
|
323
|
+
#
|
|
324
|
+
# Using _CONSTITUTIONAL_SEVERITY as a sentinel lets us distinguish
|
|
325
|
+
# tiers without modifying ViolationReport or ConstitutionalValidationResult.
|
|
326
|
+
has_constitutional_violations = any(
|
|
327
|
+
v.severity == _CONSTITUTIONAL_SEVERITY for v in violations
|
|
328
|
+
)
|
|
329
|
+
has_policy_errors = any(v.severity == "error" for v in violations)
|
|
330
|
+
|
|
331
|
+
is_valid = True
|
|
332
|
+
if has_hard_invariant_violation or has_constitutional_violations:
|
|
333
|
+
is_valid = False
|
|
334
|
+
logger.error(
|
|
335
|
+
"🛑 Constitutional Block: Halting transaction — "
|
|
336
|
+
"hard invariant or constitutional rule violated."
|
|
337
|
+
)
|
|
338
|
+
elif has_policy_errors and self.strict_mode:
|
|
339
|
+
is_valid = False
|
|
340
|
+
logger.error(
|
|
341
|
+
"🛑 Policy Block (strict_mode): Halting transaction — "
|
|
342
|
+
"policy rule violated."
|
|
343
|
+
)
|
|
344
|
+
elif has_policy_errors:
|
|
345
|
+
logger.warning(
|
|
346
|
+
"⚠️ Policy Advisory: violations detected but not blocking "
|
|
347
|
+
"(strict_mode=False). Run with strict_mode=True to enforce."
|
|
348
|
+
)
|
|
349
|
+
|
|
350
|
+
return ConstitutionalValidationResult(
|
|
351
|
+
is_valid=is_valid, violations=violations, source="IntentGuard"
|
|
352
|
+
)
|
|
353
|
+
|
|
354
|
+
# ID: a4679305-9d00-4a14-af38-32a729a33a20
|
|
355
|
+
def validate_generated_code(
|
|
356
|
+
self, code: str, pattern_id: str, component_type: str, target_path: str
|
|
357
|
+
) -> ConstitutionalValidationResult:
|
|
358
|
+
"""
|
|
359
|
+
Validate generated code against pattern requirements.
|
|
360
|
+
"""
|
|
361
|
+
# Start with a clean result
|
|
362
|
+
result = ConstitutionalValidationResult(is_valid=True, source="IntentGuard")
|
|
363
|
+
|
|
364
|
+
# 1. Path-level validation
|
|
365
|
+
path_res = self.check_transaction([target_path])
|
|
366
|
+
result.merge(path_res)
|
|
367
|
+
|
|
368
|
+
# 2. Syntax validation
|
|
369
|
+
try:
|
|
370
|
+
ast.parse(code)
|
|
371
|
+
except SyntaxError as e:
|
|
372
|
+
result.add_violation(
|
|
373
|
+
ViolationReport(
|
|
374
|
+
rule_name="valid_python_syntax",
|
|
375
|
+
path=target_path,
|
|
376
|
+
message=f"Generated code has syntax error: {e}",
|
|
377
|
+
severity="error",
|
|
378
|
+
suggested_fix="Fix syntax before writing to disk.",
|
|
379
|
+
source_policy="code_quality",
|
|
380
|
+
)
|
|
381
|
+
)
|
|
382
|
+
|
|
383
|
+
# 3. Pattern-specific validation (candidates for Strike 1 Phase 3).
|
|
384
|
+
# PatternValidators.validate dispatches by pattern_id and returns an
|
|
385
|
+
# empty list when no validator applies (issue #210). target_path is
|
|
386
|
+
# forwarded so dispatched per-pattern validators receive the path
|
|
387
|
+
# they expect.
|
|
388
|
+
pattern_violations = PatternValidators.validate(
|
|
389
|
+
code, pattern_id, component_type, target_path
|
|
390
|
+
)
|
|
391
|
+
for v in pattern_violations:
|
|
392
|
+
result.add_violation(v)
|
|
393
|
+
|
|
394
|
+
return result
|
|
395
|
+
|
|
396
|
+
def _is_under_intent(self, path: Path) -> bool:
|
|
397
|
+
"""Check if path is under .intent/ directory."""
|
|
398
|
+
try:
|
|
399
|
+
path.resolve().relative_to(self.intent_root)
|
|
400
|
+
return True
|
|
401
|
+
except ValueError:
|
|
402
|
+
return False
|
|
403
|
+
|
|
404
|
+
def _check_against_rules(
|
|
405
|
+
self, path_str: str, abs_path: Path, impact: str | None = None
|
|
406
|
+
) -> list[ViolationReport]:
|
|
407
|
+
"""
|
|
408
|
+
Evaluate path against constitutional rules.
|
|
409
|
+
|
|
410
|
+
Severity assigned per rule:
|
|
411
|
+
- authority="constitution" → _CONSTITUTIONAL_SEVERITY (always-block tier)
|
|
412
|
+
- authority="policy" + is_blocking → "error" (strict_mode tier)
|
|
413
|
+
- otherwise → "warning" (advisory)
|
|
414
|
+
"""
|
|
415
|
+
violations: list[ViolationReport] = []
|
|
416
|
+
|
|
417
|
+
for rule in self.rules:
|
|
418
|
+
if not rule.pattern:
|
|
419
|
+
continue
|
|
420
|
+
|
|
421
|
+
if not matches_glob(path_str, rule.pattern):
|
|
422
|
+
continue
|
|
423
|
+
|
|
424
|
+
# Skip engines that have no write-time check — either content-analysis
|
|
425
|
+
# engines (need file content) or passive-marker engines (enforced at
|
|
426
|
+
# runtime, parse time, decoration, or by code review). See _AUDIT_ENGINES.
|
|
427
|
+
if rule.engine in _audit_engines_set():
|
|
428
|
+
continue
|
|
429
|
+
|
|
430
|
+
is_blocking = rule.severity in ("blocking", "error")
|
|
431
|
+
|
|
432
|
+
if rule.authority == "constitution":
|
|
433
|
+
# Tier 2: constitutional rule — assign sentinel severity so
|
|
434
|
+
# check_transaction can always-block on it regardless of strict_mode.
|
|
435
|
+
severity = _CONSTITUTIONAL_SEVERITY
|
|
436
|
+
elif is_blocking:
|
|
437
|
+
# Tier 3: policy rule with blocking enforcement — standard error
|
|
438
|
+
# that strict_mode gates on.
|
|
439
|
+
severity = "error"
|
|
440
|
+
else:
|
|
441
|
+
# Advisory only.
|
|
442
|
+
severity = "warning"
|
|
443
|
+
|
|
444
|
+
violations.append(
|
|
445
|
+
ViolationReport(
|
|
446
|
+
rule_name=rule.name,
|
|
447
|
+
path=path_str,
|
|
448
|
+
message=rule.description
|
|
449
|
+
or f"Path matches restricted pattern: {rule.pattern}",
|
|
450
|
+
severity=severity,
|
|
451
|
+
source_policy=rule.source_policy,
|
|
452
|
+
)
|
|
453
|
+
)
|
|
454
|
+
|
|
455
|
+
return violations
|
|
456
|
+
|
|
457
|
+
def _evaluate_capability_tier_advisory(
|
|
458
|
+
self,
|
|
459
|
+
*,
|
|
460
|
+
path_str: str,
|
|
461
|
+
op_class: str | None,
|
|
462
|
+
capability: str | None,
|
|
463
|
+
mode: str | None,
|
|
464
|
+
) -> None:
|
|
465
|
+
"""Stage 1 capability-tier evaluation: emit advisory log lines only.
|
|
466
|
+
|
|
467
|
+
Implements ADR-079 D5 branches 3-8. Does NOT mutate violations or
|
|
468
|
+
is_valid. Logs at INFO with marker ``chokepoint.advisory.would-deny``
|
|
469
|
+
when a path would be denied; logs at DEBUG with marker
|
|
470
|
+
``chokepoint.advisory.would-permit`` on a permit.
|
|
471
|
+
|
|
472
|
+
No-ops if any input required to make a decision is absent — the
|
|
473
|
+
chokepoint reads context up-stack and stage-1 callers (FileHandler)
|
|
474
|
+
always supply all four; other callers (e.g. validate_generated_code's
|
|
475
|
+
target_path probe) pass none and the tier is skipped.
|
|
476
|
+
"""
|
|
477
|
+
if self._capabilities is None or op_class is None or mode is None:
|
|
478
|
+
return
|
|
479
|
+
|
|
480
|
+
# Branch 3: no capability in context (paper §7).
|
|
481
|
+
if capability is None:
|
|
482
|
+
logger.info(
|
|
483
|
+
"chokepoint.advisory.would-deny op_class=%s path=%s mode=%s "
|
|
484
|
+
"capability=<none> reason=no_capability_context",
|
|
485
|
+
op_class,
|
|
486
|
+
path_str,
|
|
487
|
+
mode,
|
|
488
|
+
)
|
|
489
|
+
return
|
|
490
|
+
|
|
491
|
+
# Branch 4: unknown capability.
|
|
492
|
+
cap = self._capabilities.get(capability)
|
|
493
|
+
if cap is None:
|
|
494
|
+
logger.info(
|
|
495
|
+
"chokepoint.advisory.would-deny op_class=%s path=%s mode=%s "
|
|
496
|
+
"capability=%s reason=unknown_capability",
|
|
497
|
+
op_class,
|
|
498
|
+
path_str,
|
|
499
|
+
mode,
|
|
500
|
+
capability,
|
|
501
|
+
)
|
|
502
|
+
return
|
|
503
|
+
|
|
504
|
+
fs_profile = cap.as_mapping
|
|
505
|
+
entries = fs_profile.get(op_class, ())
|
|
506
|
+
|
|
507
|
+
# Branch 5: op-class not declared (empty list for this op_class).
|
|
508
|
+
if not entries:
|
|
509
|
+
logger.info(
|
|
510
|
+
"chokepoint.advisory.would-deny op_class=%s path=%s mode=%s "
|
|
511
|
+
"capability=%s reason=operation_not_authorized",
|
|
512
|
+
op_class,
|
|
513
|
+
path_str,
|
|
514
|
+
mode,
|
|
515
|
+
capability,
|
|
516
|
+
)
|
|
517
|
+
return
|
|
518
|
+
|
|
519
|
+
# Branch 6: no matching path pattern.
|
|
520
|
+
matching = [e for e in entries if matches_glob(path_str, e.path_pattern)]
|
|
521
|
+
if not matching:
|
|
522
|
+
declared = [e.path_pattern for e in entries]
|
|
523
|
+
logger.info(
|
|
524
|
+
"chokepoint.advisory.would-deny op_class=%s path=%s mode=%s "
|
|
525
|
+
"capability=%s reason=path_not_authorized declared_patterns=%s",
|
|
526
|
+
op_class,
|
|
527
|
+
path_str,
|
|
528
|
+
mode,
|
|
529
|
+
capability,
|
|
530
|
+
declared,
|
|
531
|
+
)
|
|
532
|
+
return
|
|
533
|
+
|
|
534
|
+
# Branch 7: mode-excluded.
|
|
535
|
+
if not any(mode in e.modes for e in matching):
|
|
536
|
+
logger.info(
|
|
537
|
+
"chokepoint.advisory.would-deny op_class=%s path=%s mode=%s "
|
|
538
|
+
"capability=%s reason=mode_not_authorized",
|
|
539
|
+
op_class,
|
|
540
|
+
path_str,
|
|
541
|
+
mode,
|
|
542
|
+
capability,
|
|
543
|
+
)
|
|
544
|
+
return
|
|
545
|
+
|
|
546
|
+
# Branch 8: permit.
|
|
547
|
+
logger.debug(
|
|
548
|
+
"chokepoint.advisory.would-permit op_class=%s path=%s mode=%s capability=%s",
|
|
549
|
+
op_class,
|
|
550
|
+
path_str,
|
|
551
|
+
mode,
|
|
552
|
+
capability,
|
|
553
|
+
)
|
|
554
|
+
|
|
555
|
+
|
|
556
|
+
def _audit_engines_set():
|
|
557
|
+
"""Helper to maintain reference to global engines."""
|
|
558
|
+
return _AUDIT_ENGINES
|
|
559
|
+
|
|
560
|
+
|
|
561
|
+
# =============================================================================
|
|
562
|
+
# Global Singleton
|
|
563
|
+
# =============================================================================
|
|
564
|
+
|
|
565
|
+
_INTENT_GUARD: IntentGuard | None = None
|
|
566
|
+
|
|
567
|
+
|
|
568
|
+
# ID: 57841a53-4ecb-4f5f-bbb3-af7e490bd8f9
|
|
569
|
+
def get_intent_guard(
|
|
570
|
+
repo_path: Path | None = None,
|
|
571
|
+
path_resolver: PathResolver | None = None,
|
|
572
|
+
strict_mode: bool = False,
|
|
573
|
+
) -> IntentGuard:
|
|
574
|
+
"""
|
|
575
|
+
Return the global IntentGuard singleton.
|
|
576
|
+
|
|
577
|
+
Note on strict_mode
|
|
578
|
+
-------------------
|
|
579
|
+
strict_mode=False (default) does NOT mean "no enforcement".
|
|
580
|
+
Constitutional rules (authority="constitution") always block.
|
|
581
|
+
strict_mode only controls whether *policy* rules (authority="policy")
|
|
582
|
+
are advisory or blocking. See IntentGuard docstring for the full
|
|
583
|
+
enforcement tier matrix.
|
|
584
|
+
"""
|
|
585
|
+
global _INTENT_GUARD
|
|
586
|
+
if _INTENT_GUARD is None:
|
|
587
|
+
if repo_path is None:
|
|
588
|
+
raise ValueError(
|
|
589
|
+
"repo_path is required on first call to get_intent_guard()"
|
|
590
|
+
)
|
|
591
|
+
_INTENT_GUARD = IntentGuard(repo_path, path_resolver, strict_mode)
|
|
592
|
+
return _INTENT_GUARD
|