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
mind/__init__.py
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# src/mind/coherence/__init__.py
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
# src/mind/coherence/checker.py
|
|
2
|
+
|
|
3
|
+
"""
|
|
4
|
+
CoherenceChecker — Mind-layer orchestrator for the Constitutional Coherence Checker.
|
|
5
|
+
|
|
6
|
+
Governing paper: .specs/papers/CORE-Governance-Topology.md (the directional grid)
|
|
7
|
+
Governing ADR: .specs/decisions/ADR-073-ccc-scanner-redesign.md
|
|
8
|
+
Preserves: ADR-067 D1 (storage), D2 (CLI), D4 (scheduling), D5 (dashboard).
|
|
9
|
+
|
|
10
|
+
Per ADR-073 D3, the scanner dispatches to seven check classes covering the
|
|
11
|
+
topology paper §10.2 enabled checks and the §10.3 retained/scoped R1. The
|
|
12
|
+
legacy R1/R2/R3 emission paths are removed.
|
|
13
|
+
|
|
14
|
+
Constitutional Compliance:
|
|
15
|
+
- Mind layer cognitive instrument; reads constitutional documents and invokes
|
|
16
|
+
the LLM judge only for SAMECONCERN and R1_SCOPED.
|
|
17
|
+
- LLM has no enforcement power — every output is a candidate for human triage.
|
|
18
|
+
- No direct database access from this module: writes route through
|
|
19
|
+
CoherenceService (body layer).
|
|
20
|
+
- Per ADR-073 D4: vector-dependent checks (SAMECONCERN, R1_SCOPED) refuse
|
|
21
|
+
when the governance_claims collection is not seeded by the governor's
|
|
22
|
+
`core-admin coherence seed bootstrap` operation. Structural checks operate
|
|
23
|
+
independently and are unaffected.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
from __future__ import annotations
|
|
27
|
+
|
|
28
|
+
import hashlib
|
|
29
|
+
from pathlib import Path
|
|
30
|
+
from typing import TYPE_CHECKING, Any
|
|
31
|
+
|
|
32
|
+
from shared.logger import getLogger
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
if TYPE_CHECKING:
|
|
36
|
+
from body.services.coherence_service import CoherenceService
|
|
37
|
+
from body.services.governance_claims_service import GovernanceClaimsService
|
|
38
|
+
|
|
39
|
+
from .checks.base import CheckClass
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
logger = getLogger(__name__)
|
|
43
|
+
|
|
44
|
+
__all__ = ["CoherenceChecker"]
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
# ID: 73a23100-c107-4205-9313-0318dca1143b
|
|
48
|
+
class CoherenceChecker:
|
|
49
|
+
"""Orchestrator for the seven ADR-073 D3 check classes.
|
|
50
|
+
|
|
51
|
+
Produces candidates only — no verdicts, no enforcement actions, no
|
|
52
|
+
constitutional amendments. All human triage runs through
|
|
53
|
+
``core-admin coherence triage``.
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
# ID: 5ae048c9-f6c7-4200-a4f1-193cbc82f1b9
|
|
57
|
+
def __init__(
|
|
58
|
+
self,
|
|
59
|
+
cognitive_service: Any,
|
|
60
|
+
coherence_service: CoherenceService,
|
|
61
|
+
repo_root: Path,
|
|
62
|
+
claims_service: GovernanceClaimsService | None = None,
|
|
63
|
+
):
|
|
64
|
+
self._cognitive_service = cognitive_service
|
|
65
|
+
self._coherence_service = coherence_service
|
|
66
|
+
self._repo_root = Path(repo_root)
|
|
67
|
+
self._claims_service = claims_service
|
|
68
|
+
|
|
69
|
+
# ID: 2e4a95a7-fdac-427a-94eb-ed20ce2930c9
|
|
70
|
+
async def run(self, full: bool = False, sample_rules: int | None = None) -> str:
|
|
71
|
+
"""Execute one CCC pass over the seven D3 check classes. Returns the new run_id.
|
|
72
|
+
|
|
73
|
+
``sample_rules`` is accepted for back-compat with the ADR-067-era CLI but
|
|
74
|
+
is no longer meaningful — rule-scoped relations (R2, R3) were retired
|
|
75
|
+
per topology §10.3. Set values are logged and ignored.
|
|
76
|
+
"""
|
|
77
|
+
if sample_rules is not None:
|
|
78
|
+
logger.info(
|
|
79
|
+
"CCC: sample_rules=%d ignored — R2/R3 retired per ADR-073 D1",
|
|
80
|
+
sample_rules,
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
trigger = await self._detect_trigger(full=full)
|
|
84
|
+
manifest = self._build_input_manifest()
|
|
85
|
+
run_id = await self._coherence_service.create_run(trigger)
|
|
86
|
+
|
|
87
|
+
check_status = await self._dispatch_checks(run_id)
|
|
88
|
+
manifest.append(
|
|
89
|
+
{
|
|
90
|
+
"domain": "_meta",
|
|
91
|
+
"path": None,
|
|
92
|
+
"type": "check_classes_run",
|
|
93
|
+
"check_status": check_status,
|
|
94
|
+
}
|
|
95
|
+
)
|
|
96
|
+
await self._coherence_service.update_manifest(run_id, manifest)
|
|
97
|
+
# Self-guarded close for zero-candidate scans — the triage-driven
|
|
98
|
+
# auto-close never fires when no candidates exist (issue #458). The
|
|
99
|
+
# service method's WHERE clause makes this a no-op when candidates
|
|
100
|
+
# were added, so the call is unconditional here.
|
|
101
|
+
await self._coherence_service.close_run_if_empty(run_id)
|
|
102
|
+
|
|
103
|
+
emitted_total = sum(s.get("emitted", 0) for s in check_status.values())
|
|
104
|
+
logger.info(
|
|
105
|
+
"CCC run %s complete (trigger=%s, %d candidates from %d check classes)",
|
|
106
|
+
run_id,
|
|
107
|
+
trigger,
|
|
108
|
+
emitted_total,
|
|
109
|
+
len(check_status),
|
|
110
|
+
)
|
|
111
|
+
return run_id
|
|
112
|
+
|
|
113
|
+
# ------------------------------------------------------------------ #
|
|
114
|
+
# Check-class dispatch
|
|
115
|
+
# ------------------------------------------------------------------ #
|
|
116
|
+
|
|
117
|
+
# ID: 43725b56-2fcb-4746-a414-dc57428ff02f
|
|
118
|
+
async def _dispatch_checks(self, run_id: str) -> dict[str, dict]:
|
|
119
|
+
from shared.governance.coherence_harvester import NormativeMarkerRegister
|
|
120
|
+
from shared.infrastructure.intent.intent_repository import get_intent_repository
|
|
121
|
+
|
|
122
|
+
from .checks.r1_scoped import R1ScopedCheck
|
|
123
|
+
from .checks.row2_grounding import Row2GroundingCheck
|
|
124
|
+
from .checks.row3_citation import Row3CitationCheck
|
|
125
|
+
from .checks.row4_naming import Row4NamingCheck
|
|
126
|
+
from .checks.sameconcern import SameConcernCheck
|
|
127
|
+
from .checks.specgap import SpecGapCheck
|
|
128
|
+
from .checks.vocabulary import VocabularyCheck
|
|
129
|
+
|
|
130
|
+
register = NormativeMarkerRegister.from_intent(get_intent_repository())
|
|
131
|
+
|
|
132
|
+
if self._claims_service is None:
|
|
133
|
+
logger.info(
|
|
134
|
+
"CCC: claims_service not injected; SAMECONCERN/R1_SCOPED will skip"
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
checks: list[CheckClass] = [
|
|
138
|
+
Row2GroundingCheck(self._repo_root),
|
|
139
|
+
Row3CitationCheck(self._repo_root, register),
|
|
140
|
+
Row4NamingCheck(self._repo_root),
|
|
141
|
+
VocabularyCheck(self._repo_root),
|
|
142
|
+
SpecGapCheck(self._repo_root, register),
|
|
143
|
+
]
|
|
144
|
+
if self._claims_service is not None:
|
|
145
|
+
checks.append(
|
|
146
|
+
SameConcernCheck(
|
|
147
|
+
self._repo_root,
|
|
148
|
+
register,
|
|
149
|
+
self._claims_service,
|
|
150
|
+
self._cognitive_service,
|
|
151
|
+
)
|
|
152
|
+
)
|
|
153
|
+
checks.append(
|
|
154
|
+
R1ScopedCheck(
|
|
155
|
+
self._repo_root,
|
|
156
|
+
register,
|
|
157
|
+
self._claims_service,
|
|
158
|
+
self._cognitive_service,
|
|
159
|
+
)
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
status: dict[str, dict] = {}
|
|
163
|
+
for check in checks:
|
|
164
|
+
try:
|
|
165
|
+
candidates = await check.run()
|
|
166
|
+
except Exception as exc:
|
|
167
|
+
logger.warning(
|
|
168
|
+
"CCC: check %s failed: %s", check.relation, exc, exc_info=True
|
|
169
|
+
)
|
|
170
|
+
status[check.relation] = {
|
|
171
|
+
"status": "error",
|
|
172
|
+
"error": str(exc),
|
|
173
|
+
"emitted": 0,
|
|
174
|
+
}
|
|
175
|
+
continue
|
|
176
|
+
for candidate in candidates:
|
|
177
|
+
await self._coherence_service.add_candidate(
|
|
178
|
+
run_id=run_id,
|
|
179
|
+
relation=candidate.relation,
|
|
180
|
+
documents=candidate.documents,
|
|
181
|
+
claim=candidate.claim,
|
|
182
|
+
rationale=candidate.rationale,
|
|
183
|
+
)
|
|
184
|
+
status[check.relation] = {"status": "ok", "emitted": len(candidates)}
|
|
185
|
+
logger.info(
|
|
186
|
+
"CCC: %s emitted %d candidates", check.relation, len(candidates)
|
|
187
|
+
)
|
|
188
|
+
return status
|
|
189
|
+
|
|
190
|
+
# ------------------------------------------------------------------ #
|
|
191
|
+
# Trigger detection (preserved from ADR-067 implementation)
|
|
192
|
+
# ------------------------------------------------------------------ #
|
|
193
|
+
|
|
194
|
+
async def _detect_trigger(self, full: bool) -> str:
|
|
195
|
+
if full:
|
|
196
|
+
return "manual"
|
|
197
|
+
|
|
198
|
+
latest = await self._coherence_service.get_latest_run()
|
|
199
|
+
if latest is None:
|
|
200
|
+
return "manual"
|
|
201
|
+
|
|
202
|
+
last_manifest = latest.get("input_manifest") or []
|
|
203
|
+
|
|
204
|
+
last_adr_count = sum(
|
|
205
|
+
1 for entry in last_manifest if entry.get("domain") == "adr"
|
|
206
|
+
)
|
|
207
|
+
current_adr_count = len(self._adr_paths())
|
|
208
|
+
if current_adr_count > last_adr_count:
|
|
209
|
+
return "adr_added"
|
|
210
|
+
|
|
211
|
+
last_northstar_hashes = {
|
|
212
|
+
entry.get("path"): entry.get("sha256")
|
|
213
|
+
for entry in last_manifest
|
|
214
|
+
if entry.get("domain") == "northstar"
|
|
215
|
+
}
|
|
216
|
+
for path in self._northstar_paths():
|
|
217
|
+
try:
|
|
218
|
+
current_hash = _sha256(path)
|
|
219
|
+
except OSError:
|
|
220
|
+
return "northstar_changed"
|
|
221
|
+
rel = self._rel(path)
|
|
222
|
+
if last_northstar_hashes.get(rel) != current_hash:
|
|
223
|
+
return "northstar_changed"
|
|
224
|
+
|
|
225
|
+
return "manual"
|
|
226
|
+
|
|
227
|
+
# ------------------------------------------------------------------ #
|
|
228
|
+
# Manifest construction
|
|
229
|
+
# ------------------------------------------------------------------ #
|
|
230
|
+
|
|
231
|
+
# ID: c44f8192-948c-4671-82a1-445dc657ee59
|
|
232
|
+
def _build_input_manifest(self) -> list[dict]:
|
|
233
|
+
"""Document the governance inputs consumed by the redesigned scanner.
|
|
234
|
+
|
|
235
|
+
ADR-067-era 'rule' entries are no longer emitted — rule-scoped relations
|
|
236
|
+
(R2, R3) were retired per topology §10.3. The new scanner consumes
|
|
237
|
+
ADRs, papers, northstar, phases, and the vocabulary projection.
|
|
238
|
+
"""
|
|
239
|
+
manifest: list[dict] = []
|
|
240
|
+
for path in self._adr_paths():
|
|
241
|
+
manifest.append(self._manifest_entry(path, "adr"))
|
|
242
|
+
for path in self._paper_paths():
|
|
243
|
+
manifest.append(self._manifest_entry(path, "paper"))
|
|
244
|
+
for path in self._northstar_paths():
|
|
245
|
+
manifest.append(self._manifest_entry(path, "northstar"))
|
|
246
|
+
for path in self._phase_paths():
|
|
247
|
+
manifest.append(self._manifest_entry(path, "phase"))
|
|
248
|
+
vocab = self._repo_root / ".intent" / "META" / "vocabulary.json"
|
|
249
|
+
if vocab.exists():
|
|
250
|
+
manifest.append(self._manifest_entry(vocab, "vocabulary"))
|
|
251
|
+
return manifest
|
|
252
|
+
|
|
253
|
+
# ID: f6ffc21f-e4ef-477c-9bb7-2cdd2d4599c5
|
|
254
|
+
def _manifest_entry(self, path: Path, domain: str) -> dict:
|
|
255
|
+
rel = self._rel(path)
|
|
256
|
+
try:
|
|
257
|
+
sha = _sha256(path)
|
|
258
|
+
except OSError:
|
|
259
|
+
return {
|
|
260
|
+
"path": rel,
|
|
261
|
+
"domain": domain,
|
|
262
|
+
"status": "skipped",
|
|
263
|
+
"skipped_reason": "file_read_failure",
|
|
264
|
+
"sha256": None,
|
|
265
|
+
}
|
|
266
|
+
return {
|
|
267
|
+
"path": rel,
|
|
268
|
+
"domain": domain,
|
|
269
|
+
"status": "checked",
|
|
270
|
+
"skipped_reason": None,
|
|
271
|
+
"sha256": sha,
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
# ------------------------------------------------------------------ #
|
|
275
|
+
# Input enumeration
|
|
276
|
+
# ------------------------------------------------------------------ #
|
|
277
|
+
|
|
278
|
+
def _adr_paths(self) -> list[Path]:
|
|
279
|
+
decisions = self._repo_root / ".specs" / "decisions"
|
|
280
|
+
if not decisions.exists():
|
|
281
|
+
return []
|
|
282
|
+
return sorted(decisions.glob("ADR-*.md"))
|
|
283
|
+
|
|
284
|
+
def _paper_paths(self) -> list[Path]:
|
|
285
|
+
papers = self._repo_root / ".specs" / "papers"
|
|
286
|
+
if not papers.exists():
|
|
287
|
+
return []
|
|
288
|
+
return sorted(papers.glob("*.md"))
|
|
289
|
+
|
|
290
|
+
def _northstar_paths(self) -> list[Path]:
|
|
291
|
+
northstar = self._repo_root / ".specs" / "northstar"
|
|
292
|
+
if not northstar.exists():
|
|
293
|
+
return []
|
|
294
|
+
return sorted(northstar.glob("*.md"))
|
|
295
|
+
|
|
296
|
+
def _phase_paths(self) -> list[Path]:
|
|
297
|
+
phases = self._repo_root / ".intent" / "phases"
|
|
298
|
+
if not phases.exists():
|
|
299
|
+
return []
|
|
300
|
+
return sorted(phases.glob("*.yaml"))
|
|
301
|
+
|
|
302
|
+
# ------------------------------------------------------------------ #
|
|
303
|
+
# Helpers
|
|
304
|
+
# ------------------------------------------------------------------ #
|
|
305
|
+
|
|
306
|
+
def _rel(self, path: Path) -> str:
|
|
307
|
+
try:
|
|
308
|
+
return str(path.relative_to(self._repo_root))
|
|
309
|
+
except ValueError:
|
|
310
|
+
return str(path)
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
def _sha256(path: Path) -> str:
|
|
314
|
+
return hashlib.sha256(path.read_bytes()).hexdigest()
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# src/mind/coherence/checks/base.py
|
|
2
|
+
"""Shared types for CCC check classes per ADR-073 D3."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from typing import Protocol
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@dataclass(frozen=True)
|
|
11
|
+
# ID: f65b81c3-fff5-41e2-9c9a-58db1d4eeb6b
|
|
12
|
+
class CoherenceCandidate:
|
|
13
|
+
"""One emitted candidate row, persisted via CoherenceService.add_candidate."""
|
|
14
|
+
|
|
15
|
+
relation: str
|
|
16
|
+
documents: list[str]
|
|
17
|
+
claim: str
|
|
18
|
+
rationale: str
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
# ID: 5641414f-99ba-42d9-bf53-d0e41d4d4291
|
|
22
|
+
class CheckClass(Protocol):
|
|
23
|
+
"""Common shape for every check class in the ADR-073 D3 taxonomy.
|
|
24
|
+
|
|
25
|
+
Implementations are constructed by the CoherenceChecker orchestrator
|
|
26
|
+
with the resources each class needs (repo_root, harvester, claims
|
|
27
|
+
service, etc.) and yield CoherenceCandidate instances. Persistence
|
|
28
|
+
and manifest book-keeping is the orchestrator's responsibility.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
relation: str
|
|
32
|
+
|
|
33
|
+
# ID: a8967c42-38a3-4161-bb66-bf03f1fe5a35
|
|
34
|
+
async def run(self) -> list[CoherenceCandidate]: ...
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
# src/mind/coherence/checks/r1_scoped.py
|
|
2
|
+
"""R1_SCOPED — same-concern contradiction over ADR pairs declared via `Relates:`.
|
|
3
|
+
|
|
4
|
+
Per ADR-073 D2. Subset of SAMECONCERN constrained at the pair-membership step.
|
|
5
|
+
One-directional citation is sufficient: if ADR-X cites ADR-Y, pair (X, Y) is
|
|
6
|
+
checked regardless of whether ADR-Y cites ADR-X.
|
|
7
|
+
|
|
8
|
+
Mechanism: parse `Relates:` frontmatter, for each declared pair run kNN with
|
|
9
|
+
filter restricting hits to the partner ADR, then LLM-judge with the same
|
|
10
|
+
tiered policy as SAMECONCERN.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import re
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
from typing import TYPE_CHECKING, Any
|
|
18
|
+
|
|
19
|
+
from shared.logger import getLogger
|
|
20
|
+
|
|
21
|
+
from ..llm_judge import judge_contradiction_pair
|
|
22
|
+
from .base import CoherenceCandidate
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
if TYPE_CHECKING:
|
|
26
|
+
from body.services.governance_claims_service import GovernanceClaimsService
|
|
27
|
+
from shared.governance.coherence_harvester import NormativeMarkerRegister
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
logger = getLogger(__name__)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
_RELATES_FRONTMATTER = re.compile(
|
|
34
|
+
r"^\*\*Relates:\*\*\s*(.+?)\s*$", re.IGNORECASE | re.MULTILINE
|
|
35
|
+
)
|
|
36
|
+
_ADR_TOKEN = re.compile(r"ADR-\d{3}")
|
|
37
|
+
|
|
38
|
+
# Body-level reconciliation prefix: `**Compatibility with ADR-NNN**`,
|
|
39
|
+
# `**Supersedes:** ADR-NNN`, `**Supersedes (partial):** ADR-NNN`, etc.
|
|
40
|
+
# Used to filter out R1_SCOPED pairs where the author has explicitly
|
|
41
|
+
# reconciled the relationship — the LLM judge cannot see the reconciliation
|
|
42
|
+
# when only chunked claims reach the prompt, and routinely emits
|
|
43
|
+
# false-positive contradiction verdicts on reconciled pairs. See #474.
|
|
44
|
+
_RECONCILIATION_PREFIX = re.compile(
|
|
45
|
+
r"\*\*\s*(?:Compatibility\s+with|Supersedes)\b",
|
|
46
|
+
re.IGNORECASE,
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _declared_compatibility_partners(text: str) -> set[str]:
|
|
51
|
+
"""Return ADR-NNN tokens this document explicitly reconciles with.
|
|
52
|
+
|
|
53
|
+
Scans for body-level patterns: `**Compatibility with ADR-NNN**`,
|
|
54
|
+
`**Supersedes:** ADR-NNN`, `**Supersedes (partial):** ADR-NNN`.
|
|
55
|
+
The returned set is treated as authoritative for skipping R1_SCOPED
|
|
56
|
+
pairs — if the author declares reconciliation, the judge does not get
|
|
57
|
+
to override it (per #474). Line-level scan; multi-line declarations
|
|
58
|
+
capture only ADRs cited on the prefix line.
|
|
59
|
+
"""
|
|
60
|
+
partners: set[str] = set()
|
|
61
|
+
for line in text.splitlines():
|
|
62
|
+
if not _RECONCILIATION_PREFIX.search(line):
|
|
63
|
+
continue
|
|
64
|
+
partners.update(_ADR_TOKEN.findall(line))
|
|
65
|
+
return partners
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
_HIGH_CONFIDENCE_COSINE = 0.78
|
|
69
|
+
_AMBIGUOUS_COSINE = 0.74
|
|
70
|
+
_KNN_LIMIT = 10
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
# ID: 411d5a1f-0a88-4a34-b1bc-4a64143daf09
|
|
74
|
+
class R1ScopedCheck:
|
|
75
|
+
"""Emit R1_SCOPED candidates for contradicting claims across declared ADR pairs."""
|
|
76
|
+
|
|
77
|
+
relation = "R1_SCOPED"
|
|
78
|
+
|
|
79
|
+
# ID: f24bd798-1f30-461e-9038-b791751970bc
|
|
80
|
+
def __init__(
|
|
81
|
+
self,
|
|
82
|
+
repo_root: Path,
|
|
83
|
+
register: NormativeMarkerRegister,
|
|
84
|
+
claims_service: GovernanceClaimsService,
|
|
85
|
+
cognitive_service: Any,
|
|
86
|
+
) -> None:
|
|
87
|
+
self._repo_root = Path(repo_root)
|
|
88
|
+
self._register = register
|
|
89
|
+
self._claims_service = claims_service
|
|
90
|
+
self._cognitive_service = cognitive_service
|
|
91
|
+
|
|
92
|
+
# ID: 9208e1dc-5108-45b7-a2e1-514cc9df6af9
|
|
93
|
+
async def run(self) -> list[CoherenceCandidate]:
|
|
94
|
+
from shared.governance.coherence_harvester import GovernanceClaimHarvester
|
|
95
|
+
from shared.infrastructure.vector.cognitive_adapter import (
|
|
96
|
+
CognitiveEmbedderAdapter,
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
pairs = self._declared_pairs()
|
|
100
|
+
if not pairs:
|
|
101
|
+
logger.info(
|
|
102
|
+
"R1_SCOPED: no ADRs declare `Relates:` frontmatter — emitting zero (expected per D2)"
|
|
103
|
+
)
|
|
104
|
+
return []
|
|
105
|
+
|
|
106
|
+
if not await self._claims_service.is_seeded():
|
|
107
|
+
logger.info("R1_SCOPED: governance_claims not seeded; skipping (D4)")
|
|
108
|
+
return []
|
|
109
|
+
|
|
110
|
+
harvester = GovernanceClaimHarvester(self._repo_root, self._register)
|
|
111
|
+
claims_by_path: dict[str, list] = {}
|
|
112
|
+
for claim in harvester.harvest():
|
|
113
|
+
claims_by_path.setdefault(claim.source_path, []).append(claim)
|
|
114
|
+
|
|
115
|
+
embedder = CognitiveEmbedderAdapter(self._cognitive_service)
|
|
116
|
+
seen: set[frozenset[tuple[str, str]]] = set()
|
|
117
|
+
candidates: list[CoherenceCandidate] = []
|
|
118
|
+
|
|
119
|
+
for source_path, partner_path in pairs:
|
|
120
|
+
source_claims = claims_by_path.get(source_path, [])
|
|
121
|
+
if not source_claims:
|
|
122
|
+
continue
|
|
123
|
+
for claim in source_claims:
|
|
124
|
+
try:
|
|
125
|
+
vector = await embedder.get_embedding(claim.text)
|
|
126
|
+
except Exception as exc:
|
|
127
|
+
logger.warning("R1_SCOPED: embed failed: %s", exc)
|
|
128
|
+
continue
|
|
129
|
+
hits = await self._claims_service.search(
|
|
130
|
+
query_vector=vector,
|
|
131
|
+
limit=_KNN_LIMIT,
|
|
132
|
+
score_threshold=_AMBIGUOUS_COSINE,
|
|
133
|
+
source_path_in=[partner_path],
|
|
134
|
+
)
|
|
135
|
+
for hit in hits:
|
|
136
|
+
if (
|
|
137
|
+
hit.source_path == claim.source_path
|
|
138
|
+
and hit.content_sha == claim.content_sha
|
|
139
|
+
):
|
|
140
|
+
continue
|
|
141
|
+
tier = (
|
|
142
|
+
"high_confidence"
|
|
143
|
+
if hit.cosine >= _HIGH_CONFIDENCE_COSINE
|
|
144
|
+
else "ambiguous"
|
|
145
|
+
)
|
|
146
|
+
pair_key: frozenset[tuple[str, str]] = frozenset(
|
|
147
|
+
{
|
|
148
|
+
(claim.source_path, claim.content_sha),
|
|
149
|
+
(hit.source_path, hit.content_sha),
|
|
150
|
+
}
|
|
151
|
+
)
|
|
152
|
+
if pair_key in seen:
|
|
153
|
+
continue
|
|
154
|
+
seen.add(pair_key)
|
|
155
|
+
|
|
156
|
+
verdict = await judge_contradiction_pair(
|
|
157
|
+
cognitive_service=self._cognitive_service,
|
|
158
|
+
text_a=claim.text,
|
|
159
|
+
source_a=claim.source_path,
|
|
160
|
+
text_b=hit.text,
|
|
161
|
+
source_b=hit.source_path,
|
|
162
|
+
tier=tier,
|
|
163
|
+
relation=self.relation,
|
|
164
|
+
category_a=claim.category,
|
|
165
|
+
category_b=hit.category,
|
|
166
|
+
)
|
|
167
|
+
if verdict is not None:
|
|
168
|
+
candidates.append(verdict)
|
|
169
|
+
return candidates
|
|
170
|
+
|
|
171
|
+
# ID: 7939908b-6686-4b35-b3e6-a74f6ae1fbaf
|
|
172
|
+
def _declared_pairs(self) -> list[tuple[str, str]]:
|
|
173
|
+
"""Parse Relates: frontmatter across all accepted ADRs.
|
|
174
|
+
|
|
175
|
+
Returns a list of (source_adr_path, partner_adr_path) tuples — one
|
|
176
|
+
per declared link. One-directional sufficient per D2.
|
|
177
|
+
|
|
178
|
+
Per #474: pairs where either ADR reconciles with the other via a
|
|
179
|
+
body-level `**Compatibility with ADR-NNN**` or `**Supersedes**`
|
|
180
|
+
declaration are filtered out. The LLM judge cannot see the
|
|
181
|
+
reconciliation when only chunked claims reach the prompt and
|
|
182
|
+
routinely emits false-positive contradictions on reconciled pairs.
|
|
183
|
+
"""
|
|
184
|
+
decisions = self._repo_root / ".specs" / "decisions"
|
|
185
|
+
if not decisions.is_dir():
|
|
186
|
+
return []
|
|
187
|
+
# Map ADR-NNN → relative path, used to resolve cited tokens to files.
|
|
188
|
+
adr_path_by_id: dict[str, str] = {}
|
|
189
|
+
for path in sorted(decisions.glob("ADR-*.md")):
|
|
190
|
+
m = _ADR_TOKEN.match(path.stem)
|
|
191
|
+
if m:
|
|
192
|
+
adr_path_by_id[m.group(0)] = str(path.relative_to(self._repo_root))
|
|
193
|
+
|
|
194
|
+
# Single read per ADR — extract Relates: partners and reconciliation set.
|
|
195
|
+
relates_by_id: dict[str, list[str]] = {}
|
|
196
|
+
reconciled_by_id: dict[str, set[str]] = {}
|
|
197
|
+
for source_id, source_rel in adr_path_by_id.items():
|
|
198
|
+
content = (self._repo_root / source_rel).read_text(
|
|
199
|
+
encoding="utf-8", errors="replace"
|
|
200
|
+
)
|
|
201
|
+
match = _RELATES_FRONTMATTER.search(content)
|
|
202
|
+
if match:
|
|
203
|
+
relates_by_id[source_id] = _ADR_TOKEN.findall(match.group(1))
|
|
204
|
+
reconciled_by_id[source_id] = _declared_compatibility_partners(content)
|
|
205
|
+
|
|
206
|
+
pairs: list[tuple[str, str]] = []
|
|
207
|
+
reconciled_skips = 0
|
|
208
|
+
for source_id, source_rel in adr_path_by_id.items():
|
|
209
|
+
partners = relates_by_id.get(source_id, [])
|
|
210
|
+
for partner_id in partners:
|
|
211
|
+
if partner_id == source_id:
|
|
212
|
+
continue
|
|
213
|
+
partner_rel = adr_path_by_id.get(partner_id)
|
|
214
|
+
if partner_rel is None:
|
|
215
|
+
continue
|
|
216
|
+
if partner_id in reconciled_by_id.get(
|
|
217
|
+
source_id, set()
|
|
218
|
+
) or source_id in reconciled_by_id.get(partner_id, set()):
|
|
219
|
+
reconciled_skips += 1
|
|
220
|
+
continue
|
|
221
|
+
pairs.append((source_rel, partner_rel))
|
|
222
|
+
|
|
223
|
+
if reconciled_skips:
|
|
224
|
+
logger.info(
|
|
225
|
+
"R1_SCOPED: skipped %d Relates: pair(s) due to declared compatibility/supersedes (per #474)",
|
|
226
|
+
reconciled_skips,
|
|
227
|
+
)
|
|
228
|
+
return pairs
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# src/mind/coherence/checks/row2_grounding.py
|
|
2
|
+
"""ROW2_GROUNDING — every accepted ADR cites at least one grounding paper.
|
|
3
|
+
|
|
4
|
+
Per ADR-073 D6 / topology §10.2 row 2.
|
|
5
|
+
|
|
6
|
+
Mechanism: structural grep over ADR References / Relates / Supersedes blocks.
|
|
7
|
+
No LLM, no embeddings.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import re
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
|
|
15
|
+
from .base import CoherenceCandidate
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
_PAPERS_CITE = re.compile(r"\.specs/papers/[\w\-./]+\.md", re.IGNORECASE)
|
|
19
|
+
_SUPERSEDES_FRONTMATTER = re.compile(r"^\*\*Supersedes", re.IGNORECASE | re.MULTILINE)
|
|
20
|
+
_STATUS_ACCEPTED = re.compile(
|
|
21
|
+
r"^\*\*Status:\*\*\s*Accepted", re.IGNORECASE | re.MULTILINE
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# ID: d89bcb64-5a44-42a9-af06-ba730a70cf10
|
|
26
|
+
class Row2GroundingCheck:
|
|
27
|
+
"""Emit ROW2_GROUNDING for accepted ADRs missing a grounding paper citation."""
|
|
28
|
+
|
|
29
|
+
relation = "ROW2_GROUNDING"
|
|
30
|
+
|
|
31
|
+
# ID: 21f65c05-2345-4135-a581-b68b8000de23
|
|
32
|
+
def __init__(self, repo_root: Path) -> None:
|
|
33
|
+
self._repo_root = Path(repo_root)
|
|
34
|
+
|
|
35
|
+
# ID: 460370e4-9d2d-479e-967c-df37f7e7ab9e
|
|
36
|
+
async def run(self) -> list[CoherenceCandidate]:
|
|
37
|
+
decisions = self._repo_root / ".specs" / "decisions"
|
|
38
|
+
if not decisions.is_dir():
|
|
39
|
+
return []
|
|
40
|
+
candidates: list[CoherenceCandidate] = []
|
|
41
|
+
for adr_path in sorted(decisions.glob("ADR-*.md")):
|
|
42
|
+
content = adr_path.read_text(encoding="utf-8", errors="replace")
|
|
43
|
+
if not _STATUS_ACCEPTED.search(content):
|
|
44
|
+
continue
|
|
45
|
+
if _SUPERSEDES_FRONTMATTER.search(content):
|
|
46
|
+
continue
|
|
47
|
+
if _PAPERS_CITE.search(content):
|
|
48
|
+
continue
|
|
49
|
+
rel = str(adr_path.relative_to(self._repo_root))
|
|
50
|
+
candidates.append(
|
|
51
|
+
CoherenceCandidate(
|
|
52
|
+
relation=self.relation,
|
|
53
|
+
documents=[rel],
|
|
54
|
+
claim=(
|
|
55
|
+
f"ADR {adr_path.stem} cites no grounding paper "
|
|
56
|
+
"(.specs/papers/...) and carries no Supersedes: declaration."
|
|
57
|
+
),
|
|
58
|
+
rationale=(
|
|
59
|
+
"Topology paper §3 row 2 requires every accepted ADR to "
|
|
60
|
+
"either cite at least one grounding paper or declare "
|
|
61
|
+
"supersession of a predecessor (which inherits its "
|
|
62
|
+
"predecessor's grounding). Neither was found in this "
|
|
63
|
+
"ADR's text. Either backfill the References block with "
|
|
64
|
+
"the operationalized paper, or — if no grounding paper "
|
|
65
|
+
"exists — author the missing paper first per §11.3."
|
|
66
|
+
),
|
|
67
|
+
)
|
|
68
|
+
)
|
|
69
|
+
return candidates
|