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,111 @@
|
|
|
1
|
+
# src/cli/resources/coherence/check.py
|
|
2
|
+
"""
|
|
3
|
+
`core-admin coherence check` — trigger a Constitutional Coherence Checker run.
|
|
4
|
+
|
|
5
|
+
Governing ADR: .specs/decisions/ADR-067-constitutional-coherence-checker.md (D2).
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import logging
|
|
11
|
+
|
|
12
|
+
import typer
|
|
13
|
+
from rich.console import Console
|
|
14
|
+
|
|
15
|
+
from body.services.coherence_service import CoherenceService
|
|
16
|
+
from body.services.governance_claims_service import GovernanceClaimsService
|
|
17
|
+
from cli.utils import core_command
|
|
18
|
+
from mind.coherence.checker import CoherenceChecker
|
|
19
|
+
from shared.config import settings
|
|
20
|
+
from shared.context import CoreContext
|
|
21
|
+
from shared.infrastructure.database.session_manager import get_session
|
|
22
|
+
|
|
23
|
+
from .hub import app
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
logger = logging.getLogger(__name__)
|
|
27
|
+
console = Console()
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@app.command("check")
|
|
31
|
+
@core_command(dangerous=True, requires_context=True)
|
|
32
|
+
# ID: 02507f9f-3bdc-41d8-b9af-982b0411ce37
|
|
33
|
+
async def check_command(
|
|
34
|
+
ctx: typer.Context,
|
|
35
|
+
full: bool = typer.Option(
|
|
36
|
+
False,
|
|
37
|
+
"--full",
|
|
38
|
+
help=(
|
|
39
|
+
"Evaluate the full corpus regardless of prior runs. Required for "
|
|
40
|
+
"the first run on any installation. Without --full, trigger is "
|
|
41
|
+
"auto-detected from the previous run's input_manifest."
|
|
42
|
+
),
|
|
43
|
+
),
|
|
44
|
+
sample: int = typer.Option(
|
|
45
|
+
None,
|
|
46
|
+
"--sample",
|
|
47
|
+
help=(
|
|
48
|
+
"Randomly sample N rule files for R2/R3 (R1 still scans all "
|
|
49
|
+
"ADRs). Use for narrow exploratory runs. Omit to evaluate all "
|
|
50
|
+
"rule files."
|
|
51
|
+
),
|
|
52
|
+
),
|
|
53
|
+
) -> None:
|
|
54
|
+
"""Run one Constitutional Coherence Checker pass — 7 check classes per ADR-073."""
|
|
55
|
+
context: CoreContext = ctx.obj
|
|
56
|
+
try:
|
|
57
|
+
cognitive_service = await context.registry.get_cognitive_service()
|
|
58
|
+
except Exception as exc:
|
|
59
|
+
logger.exception("Failed to acquire CognitiveService")
|
|
60
|
+
console.print(f"[red]❌ Cognitive service unavailable: {exc}[/red]")
|
|
61
|
+
raise typer.Exit(code=1) from exc
|
|
62
|
+
|
|
63
|
+
claims_service: GovernanceClaimsService | None = None
|
|
64
|
+
try:
|
|
65
|
+
qdrant = await context.registry.get_qdrant_service()
|
|
66
|
+
claims_service = GovernanceClaimsService(qdrant)
|
|
67
|
+
except Exception as exc:
|
|
68
|
+
logger.warning("Qdrant unavailable; SAMECONCERN/R1_SCOPED will skip (%s)", exc)
|
|
69
|
+
|
|
70
|
+
async with get_session() as session:
|
|
71
|
+
coherence_service = CoherenceService(session)
|
|
72
|
+
checker = CoherenceChecker(
|
|
73
|
+
cognitive_service=cognitive_service,
|
|
74
|
+
coherence_service=coherence_service,
|
|
75
|
+
repo_root=settings.REPO_PATH,
|
|
76
|
+
claims_service=claims_service,
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
console.print("[cyan]Starting coherence run…[/cyan]")
|
|
80
|
+
try:
|
|
81
|
+
run_id = await checker.run(full=full, sample_rules=sample)
|
|
82
|
+
except Exception as exc:
|
|
83
|
+
logger.exception("Coherence run failed")
|
|
84
|
+
console.print(f"[red]❌ Coherence run failed: {exc}[/red]")
|
|
85
|
+
raise typer.Exit(code=1) from exc
|
|
86
|
+
|
|
87
|
+
console.print(f"Run started: {run_id}")
|
|
88
|
+
|
|
89
|
+
run = await coherence_service.get_run(run_id)
|
|
90
|
+
|
|
91
|
+
if run is None:
|
|
92
|
+
console.print("[yellow]Run row not found after completion.[/yellow]")
|
|
93
|
+
raise typer.Exit(code=1)
|
|
94
|
+
|
|
95
|
+
manifest = run.get("input_manifest") or []
|
|
96
|
+
checked = sum(1 for e in manifest if e.get("status") == "checked")
|
|
97
|
+
skipped = sum(1 for e in manifest if e.get("status") == "skipped")
|
|
98
|
+
candidates = int(run.get("candidate_count") or 0)
|
|
99
|
+
|
|
100
|
+
console.print(
|
|
101
|
+
f"[green]Coverage:[/green] {checked} checked, {skipped} skipped "
|
|
102
|
+
f"· [bold]Candidates:[/bold] {candidates} produced"
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
total = checked + skipped
|
|
106
|
+
if total > 0 and skipped / total > 0.20:
|
|
107
|
+
console.print(
|
|
108
|
+
f"[yellow]⚠ WARNING: {skipped}/{total} input items skipped "
|
|
109
|
+
f"({skipped / total:.0%}). See `core-admin coherence report` for "
|
|
110
|
+
f"per-item skipped_reason.[/yellow]"
|
|
111
|
+
)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# src/cli/resources/coherence/hub.py
|
|
2
|
+
import typer
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
app = typer.Typer(
|
|
6
|
+
name="coherence",
|
|
7
|
+
help=(
|
|
8
|
+
"Constitutional Coherence Checker — scan ADRs, rule domains, and "
|
|
9
|
+
"northstar documents for candidate contradictions, gaps, and drift. "
|
|
10
|
+
"Governing ADR: ADR-067."
|
|
11
|
+
),
|
|
12
|
+
no_args_is_help=True,
|
|
13
|
+
)
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# src/cli/resources/coherence/repair_counts.py
|
|
2
|
+
"""
|
|
3
|
+
`core-admin coherence repair-counts` — recompute the denormalized
|
|
4
|
+
``unreviewed_count`` on every open coherence run from live candidate state.
|
|
5
|
+
|
|
6
|
+
Governing ADR: .specs/decisions/ADR-067-constitutional-coherence-checker.md (D6).
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import logging
|
|
12
|
+
|
|
13
|
+
import typer
|
|
14
|
+
from rich.console import Console
|
|
15
|
+
from rich.table import Table
|
|
16
|
+
|
|
17
|
+
from body.services.coherence_service import CoherenceService
|
|
18
|
+
from cli.utils import core_command
|
|
19
|
+
from shared.infrastructure.database.session_manager import get_session
|
|
20
|
+
|
|
21
|
+
from .hub import app
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
logger = logging.getLogger(__name__)
|
|
25
|
+
console = Console()
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@app.command("repair-counts")
|
|
29
|
+
@core_command(dangerous=True, requires_context=False)
|
|
30
|
+
# ID: a7f3ef25-a40c-46b9-8f6a-029acb69ffab
|
|
31
|
+
async def repair_counts_command() -> None:
|
|
32
|
+
"""Recompute unreviewed_count from live triage state across all open runs."""
|
|
33
|
+
async with get_session() as session:
|
|
34
|
+
service = CoherenceService(session)
|
|
35
|
+
try:
|
|
36
|
+
deltas = await service.repair_unreviewed_counts()
|
|
37
|
+
except Exception as exc:
|
|
38
|
+
logger.exception("repair-counts failed")
|
|
39
|
+
console.print(f"[red]X repair-counts failed: {exc}[/red]")
|
|
40
|
+
raise typer.Exit(code=1) from exc
|
|
41
|
+
|
|
42
|
+
if not deltas:
|
|
43
|
+
console.print("[green]No open runs — nothing to repair.[/green]")
|
|
44
|
+
return
|
|
45
|
+
|
|
46
|
+
table = Table(title="Coherence repair-counts — per-run delta")
|
|
47
|
+
table.add_column("run_id", style="cyan", no_wrap=True)
|
|
48
|
+
table.add_column("old", justify="right")
|
|
49
|
+
table.add_column("new", justify="right")
|
|
50
|
+
table.add_column("delta", justify="right")
|
|
51
|
+
table.add_column("closed?")
|
|
52
|
+
|
|
53
|
+
drift_total = 0
|
|
54
|
+
closed_total = 0
|
|
55
|
+
for d in deltas:
|
|
56
|
+
delta_n = d["new_count"] - d["old_count"]
|
|
57
|
+
drift_total += abs(delta_n)
|
|
58
|
+
if d["closed"]:
|
|
59
|
+
closed_total += 1
|
|
60
|
+
delta_str = f"{delta_n:+d}" if delta_n != 0 else "0"
|
|
61
|
+
table.add_row(
|
|
62
|
+
d["run_id"][:8],
|
|
63
|
+
str(d["old_count"]),
|
|
64
|
+
str(d["new_count"]),
|
|
65
|
+
delta_str,
|
|
66
|
+
"yes" if d["closed"] else "no",
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
console.print(table)
|
|
70
|
+
console.print(
|
|
71
|
+
f"[bold]Drift repaired:[/bold] {drift_total} row(s) across "
|
|
72
|
+
f"{len(deltas)} run(s); [bold]auto-closed:[/bold] {closed_total}."
|
|
73
|
+
)
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# src/cli/resources/coherence/report.py
|
|
2
|
+
"""
|
|
3
|
+
`core-admin coherence report` — display a Constitutional Coherence Report.
|
|
4
|
+
|
|
5
|
+
Governing ADR: .specs/decisions/ADR-067-constitutional-coherence-checker.md (D2).
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import logging
|
|
11
|
+
from collections import Counter
|
|
12
|
+
|
|
13
|
+
import typer
|
|
14
|
+
from rich.console import Console
|
|
15
|
+
from rich.panel import Panel
|
|
16
|
+
from rich.table import Table
|
|
17
|
+
|
|
18
|
+
from body.services.coherence_service import CoherenceService
|
|
19
|
+
from cli.utils import core_command
|
|
20
|
+
from shared.infrastructure.database.session_manager import get_session
|
|
21
|
+
|
|
22
|
+
from .hub import app
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
logger = logging.getLogger(__name__)
|
|
26
|
+
console = Console()
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
_CLAIM_TRUNCATE = 80
|
|
30
|
+
_TRIAGE_COLORS = {
|
|
31
|
+
"unreviewed": "yellow",
|
|
32
|
+
"confirmed": "red",
|
|
33
|
+
"dismissed": "dim",
|
|
34
|
+
"deferred": "cyan",
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@app.command("report")
|
|
39
|
+
@core_command(dangerous=False, requires_context=False)
|
|
40
|
+
# ID: ef0a593c-f8b4-4398-ab1e-369086501481
|
|
41
|
+
async def report_command(
|
|
42
|
+
run_id: str = typer.Argument(
|
|
43
|
+
None,
|
|
44
|
+
help="Run id to report on. Omit to use the most recent run.",
|
|
45
|
+
),
|
|
46
|
+
) -> None:
|
|
47
|
+
"""Display the Constitutional Coherence Report for a run."""
|
|
48
|
+
async with get_session() as session:
|
|
49
|
+
service = CoherenceService(session)
|
|
50
|
+
try:
|
|
51
|
+
run = (
|
|
52
|
+
await service.get_run(run_id)
|
|
53
|
+
if run_id
|
|
54
|
+
else await service.get_latest_run()
|
|
55
|
+
)
|
|
56
|
+
except Exception as exc:
|
|
57
|
+
logger.exception("Failed to load coherence run")
|
|
58
|
+
console.print(f"[red]❌ Failed to load run: {exc}[/red]")
|
|
59
|
+
raise typer.Exit(code=1) from exc
|
|
60
|
+
|
|
61
|
+
if run is None:
|
|
62
|
+
console.print(
|
|
63
|
+
"[yellow]No coherence runs recorded. Run "
|
|
64
|
+
"`core-admin coherence check --full` to create one.[/yellow]"
|
|
65
|
+
)
|
|
66
|
+
return
|
|
67
|
+
|
|
68
|
+
candidates = await service.get_candidates(run["run_id"])
|
|
69
|
+
|
|
70
|
+
_render_metadata(run)
|
|
71
|
+
_render_manifest(run.get("input_manifest") or [])
|
|
72
|
+
_render_candidates(candidates)
|
|
73
|
+
_render_triage_summary(candidates)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def _render_metadata(run: dict) -> None:
|
|
77
|
+
grid = Table.grid(expand=False, padding=(0, 1))
|
|
78
|
+
grid.add_row("run_id:", run["run_id"])
|
|
79
|
+
grid.add_row("run_at:", str(run["run_at"]))
|
|
80
|
+
grid.add_row("trigger:", run["trigger"])
|
|
81
|
+
status_color = "green" if run["run_status"] == "closed" else "yellow"
|
|
82
|
+
grid.add_row("status:", f"[{status_color}]{run['run_status']}[/{status_color}]")
|
|
83
|
+
grid.add_row(
|
|
84
|
+
"counts:",
|
|
85
|
+
f"{run['candidate_count']} candidate(s) · {run['unreviewed_count']} unreviewed",
|
|
86
|
+
)
|
|
87
|
+
console.print(Panel(grid, title="Coherence Run", expand=False))
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def _render_manifest(manifest: list[dict]) -> None:
|
|
91
|
+
if not manifest:
|
|
92
|
+
console.print("[dim]Manifest is empty.[/dim]")
|
|
93
|
+
return
|
|
94
|
+
table = Table(title="Coverage Manifest", expand=True)
|
|
95
|
+
table.add_column("path", style="cyan", no_wrap=True)
|
|
96
|
+
table.add_column("domain", style="magenta")
|
|
97
|
+
table.add_column("status", justify="center")
|
|
98
|
+
table.add_column("skipped_reason", style="dim")
|
|
99
|
+
for entry in manifest:
|
|
100
|
+
status = entry.get("status", "unknown")
|
|
101
|
+
status_color = "green" if status == "checked" else "yellow"
|
|
102
|
+
table.add_row(
|
|
103
|
+
str(entry.get("path", "")),
|
|
104
|
+
str(entry.get("domain", "")),
|
|
105
|
+
f"[{status_color}]{status}[/{status_color}]",
|
|
106
|
+
str(entry.get("skipped_reason") or ""),
|
|
107
|
+
)
|
|
108
|
+
console.print(table)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def _render_candidates(candidates: list[dict]) -> None:
|
|
112
|
+
if not candidates:
|
|
113
|
+
console.print("[dim]No candidates produced.[/dim]")
|
|
114
|
+
return
|
|
115
|
+
table = Table(title="Candidates", expand=True)
|
|
116
|
+
table.add_column("candidate_id", style="cyan", no_wrap=True)
|
|
117
|
+
table.add_column("relation", justify="center")
|
|
118
|
+
table.add_column("claim")
|
|
119
|
+
table.add_column("triage", justify="center")
|
|
120
|
+
for c in candidates:
|
|
121
|
+
claim = c.get("claim") or ""
|
|
122
|
+
if len(claim) > _CLAIM_TRUNCATE:
|
|
123
|
+
claim = claim[: _CLAIM_TRUNCATE - 1] + "…"
|
|
124
|
+
decision = c.get("triage_decision", "unreviewed")
|
|
125
|
+
color = _TRIAGE_COLORS.get(decision, "white")
|
|
126
|
+
table.add_row(
|
|
127
|
+
c["candidate_id"],
|
|
128
|
+
c.get("relation", ""),
|
|
129
|
+
claim,
|
|
130
|
+
f"[{color}]{decision}[/{color}]",
|
|
131
|
+
)
|
|
132
|
+
console.print(table)
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def _render_triage_summary(candidates: list[dict]) -> None:
|
|
136
|
+
counts = Counter(c.get("triage_decision", "unreviewed") for c in candidates)
|
|
137
|
+
summary = Table.grid(expand=False, padding=(0, 1))
|
|
138
|
+
summary.add_row(
|
|
139
|
+
f"[red]{counts.get('confirmed', 0)}[/red] confirmed",
|
|
140
|
+
f"[dim]{counts.get('dismissed', 0)}[/dim] dismissed",
|
|
141
|
+
f"[cyan]{counts.get('deferred', 0)}[/cyan] deferred",
|
|
142
|
+
f"[yellow]{counts.get('unreviewed', 0)}[/yellow] unreviewed",
|
|
143
|
+
)
|
|
144
|
+
console.print(Panel(summary, title="Triage Summary", expand=False))
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
# src/cli/resources/coherence/seed.py
|
|
2
|
+
"""`core-admin coherence seed` — governance_claims bootstrap and disaster recovery.
|
|
3
|
+
|
|
4
|
+
Per ADR-073 D4:
|
|
5
|
+
- bootstrap : one-shot embed of the full corpus (governor-only; 30-70 min).
|
|
6
|
+
- export : dump payloads + vectors to JSONL for disaster recovery.
|
|
7
|
+
- import : hydrate the collection from a JSONL fixture.
|
|
8
|
+
|
|
9
|
+
The daemon worker does NOT auto-bootstrap; this is the explicit governor path.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import json
|
|
15
|
+
import logging
|
|
16
|
+
from datetime import UTC, datetime
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
|
|
19
|
+
import typer
|
|
20
|
+
from rich.console import Console
|
|
21
|
+
|
|
22
|
+
from cli.utils import core_command
|
|
23
|
+
from shared.config import settings
|
|
24
|
+
from shared.context import CoreContext
|
|
25
|
+
from shared.infrastructure.storage.file_handler import FileHandler
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
logger = logging.getLogger(__name__)
|
|
29
|
+
console = Console()
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
seed_app = typer.Typer(
|
|
33
|
+
name="seed",
|
|
34
|
+
help=(
|
|
35
|
+
"Manage the governance_claims Qdrant collection: one-shot bootstrap "
|
|
36
|
+
"and disaster-recovery export/import. Per ADR-073 D4."
|
|
37
|
+
),
|
|
38
|
+
no_args_is_help=True,
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
# Batch size for the bootstrap embed call. 32 is the #461 D1-confirmed default;
|
|
43
|
+
# larger risks Ollama timeout on slow embed models, smaller loses throughput.
|
|
44
|
+
# Tunable if a future Ollama version or model changes the trade-off.
|
|
45
|
+
_BOOTSTRAP_EMBED_BATCH = 32
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@seed_app.command("bootstrap")
|
|
49
|
+
@core_command(dangerous=True, requires_context=True)
|
|
50
|
+
# ID: 73ce1ee6-67ce-4806-8a3c-252838cd3212
|
|
51
|
+
async def bootstrap_command(ctx: typer.Context) -> None:
|
|
52
|
+
"""Embed the full governance corpus into the governance_claims collection.
|
|
53
|
+
|
|
54
|
+
One-shot operation; wall-clock dominated by embedding throughput.
|
|
55
|
+
Post-#461 the embed call is batched (~3-10x speedup), so a 1572-claim
|
|
56
|
+
corpus completes well under 10 min on the current `.40` setup.
|
|
57
|
+
The daemon worker handles steady-state incremental sync after this
|
|
58
|
+
completes. Run once on install or after a collection drop.
|
|
59
|
+
"""
|
|
60
|
+
from body.services.governance_claims_service import (
|
|
61
|
+
ClaimVector,
|
|
62
|
+
GovernanceClaimsService,
|
|
63
|
+
)
|
|
64
|
+
from shared.governance.coherence_harvester import GovernanceClaimHarvester
|
|
65
|
+
from shared.infrastructure.vector.cognitive_adapter import (
|
|
66
|
+
CognitiveEmbedderAdapter,
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
context: CoreContext = ctx.obj
|
|
70
|
+
try:
|
|
71
|
+
cognitive_service = await context.registry.get_cognitive_service()
|
|
72
|
+
qdrant = await context.registry.get_qdrant_service()
|
|
73
|
+
except Exception as exc:
|
|
74
|
+
logger.exception("Failed to acquire embedding services")
|
|
75
|
+
console.print(f"[red]Service unavailable: {exc}[/red]")
|
|
76
|
+
raise typer.Exit(code=1) from exc
|
|
77
|
+
|
|
78
|
+
claims_service = GovernanceClaimsService(qdrant)
|
|
79
|
+
await claims_service.ensure_collection()
|
|
80
|
+
|
|
81
|
+
harvester = GovernanceClaimHarvester(Path(settings.REPO_PATH))
|
|
82
|
+
claims = list(harvester.harvest())
|
|
83
|
+
if not claims:
|
|
84
|
+
console.print("[yellow]No claims harvested — nothing to embed.[/yellow]")
|
|
85
|
+
return
|
|
86
|
+
|
|
87
|
+
console.print(
|
|
88
|
+
f"[cyan]Bootstrapping[/cyan] governance_claims with [bold]{len(claims)}[/bold] "
|
|
89
|
+
f"claims (batch={_BOOTSTRAP_EMBED_BATCH}, expect <10 min)."
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
embedder = CognitiveEmbedderAdapter(cognitive_service)
|
|
93
|
+
items: list[ClaimVector] = []
|
|
94
|
+
failures = 0
|
|
95
|
+
upsert_batch = 50
|
|
96
|
+
embedded = 0
|
|
97
|
+
started = datetime.now(UTC)
|
|
98
|
+
|
|
99
|
+
for window_start in range(0, len(claims), _BOOTSTRAP_EMBED_BATCH):
|
|
100
|
+
window = claims[window_start : window_start + _BOOTSTRAP_EMBED_BATCH]
|
|
101
|
+
window_vectors, window_failures = await _embed_window(embedder, window)
|
|
102
|
+
items.extend(window_vectors)
|
|
103
|
+
failures += window_failures
|
|
104
|
+
if len(items) >= upsert_batch:
|
|
105
|
+
embedded += await claims_service.upsert_claims(items)
|
|
106
|
+
items = []
|
|
107
|
+
done = window_start + len(window)
|
|
108
|
+
console.print(
|
|
109
|
+
f" [dim]progress[/dim] {embedded}/{len(claims)} "
|
|
110
|
+
f"({done / len(claims):.0%})"
|
|
111
|
+
)
|
|
112
|
+
if items:
|
|
113
|
+
embedded += await claims_service.upsert_claims(items)
|
|
114
|
+
|
|
115
|
+
elapsed = (datetime.now(UTC) - started).total_seconds()
|
|
116
|
+
console.print(
|
|
117
|
+
f"[green]Bootstrap complete[/green] — embedded {embedded}/{len(claims)} "
|
|
118
|
+
f"claims in {elapsed / 60:.1f} min ({failures} failures)"
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
# ID: a47b6c39-2e85-4d18-8f06-c5b9e3a7d149
|
|
123
|
+
async def _embed_window(embedder, window):
|
|
124
|
+
"""Embed a window of claims via the batch entry point with single-shot fallback.
|
|
125
|
+
|
|
126
|
+
Tries `get_embeddings_batch` first; on batch failure, falls back to
|
|
127
|
+
per-claim single-input embed so a single bad claim does not abort
|
|
128
|
+
the whole window. This preserves the original bootstrap's error
|
|
129
|
+
isolation while still capturing the batch speedup on the common path.
|
|
130
|
+
|
|
131
|
+
Returns:
|
|
132
|
+
(list[ClaimVector] for successfully-embedded claims, failure_count)
|
|
133
|
+
"""
|
|
134
|
+
from body.services.governance_claims_service import ClaimVector
|
|
135
|
+
|
|
136
|
+
texts = [c.text for c in window]
|
|
137
|
+
try:
|
|
138
|
+
vectors = await embedder.get_embeddings_batch(texts)
|
|
139
|
+
return (
|
|
140
|
+
[ClaimVector(claim=c, vector=v) for c, v in zip(window, vectors)],
|
|
141
|
+
0,
|
|
142
|
+
)
|
|
143
|
+
except Exception as exc:
|
|
144
|
+
logger.warning(
|
|
145
|
+
"bootstrap: batch embed failed for window of %d claims (%s); "
|
|
146
|
+
"falling back to single-shot for this window",
|
|
147
|
+
len(window),
|
|
148
|
+
exc,
|
|
149
|
+
)
|
|
150
|
+
items: list[ClaimVector] = []
|
|
151
|
+
failures = 0
|
|
152
|
+
for claim in window:
|
|
153
|
+
try:
|
|
154
|
+
vector = await embedder.get_embedding(claim.text)
|
|
155
|
+
except Exception as exc2:
|
|
156
|
+
logger.warning(
|
|
157
|
+
"bootstrap: single-shot embed failed for %s (sha=%s): %s",
|
|
158
|
+
claim.source_path,
|
|
159
|
+
claim.content_sha[:8],
|
|
160
|
+
exc2,
|
|
161
|
+
)
|
|
162
|
+
failures += 1
|
|
163
|
+
continue
|
|
164
|
+
items.append(ClaimVector(claim=claim, vector=vector))
|
|
165
|
+
return items, failures
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
@seed_app.command("export")
|
|
169
|
+
@core_command(dangerous=False, requires_context=True)
|
|
170
|
+
# ID: 1fefb5ca-3d3d-474c-aed6-06c68f3b0694
|
|
171
|
+
async def export_command(
|
|
172
|
+
ctx: typer.Context,
|
|
173
|
+
output: Path = typer.Argument(
|
|
174
|
+
...,
|
|
175
|
+
help="Destination JSONL path. One line per claim: {payload, vector}.",
|
|
176
|
+
),
|
|
177
|
+
) -> None:
|
|
178
|
+
"""Dump payloads + vectors from governance_claims to a JSONL fixture.
|
|
179
|
+
|
|
180
|
+
The fixture restores via `coherence seed import` without consulting the
|
|
181
|
+
embedding endpoint — disaster-recovery path per ADR-073 D4.
|
|
182
|
+
"""
|
|
183
|
+
from body.services.governance_claims_service import GovernanceClaimsService
|
|
184
|
+
|
|
185
|
+
context: CoreContext = ctx.obj
|
|
186
|
+
try:
|
|
187
|
+
qdrant = await context.registry.get_qdrant_service()
|
|
188
|
+
except Exception as exc:
|
|
189
|
+
logger.exception("Failed to acquire Qdrant service")
|
|
190
|
+
console.print(f"[red]Service unavailable: {exc}[/red]")
|
|
191
|
+
raise typer.Exit(code=1) from exc
|
|
192
|
+
|
|
193
|
+
claims_service = GovernanceClaimsService(qdrant)
|
|
194
|
+
if not await claims_service.is_seeded():
|
|
195
|
+
console.print(
|
|
196
|
+
"[yellow]governance_claims is empty or absent — nothing to export.[/yellow]"
|
|
197
|
+
)
|
|
198
|
+
raise typer.Exit(code=1)
|
|
199
|
+
|
|
200
|
+
records = await qdrant.scroll_all_points(
|
|
201
|
+
with_payload=True,
|
|
202
|
+
with_vectors=True,
|
|
203
|
+
page_size=1024,
|
|
204
|
+
collection_name=claims_service.collection_name,
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
repo_root = context.git_service.repo_path
|
|
208
|
+
file_handler = FileHandler(str(repo_root))
|
|
209
|
+
file_handler.ensure_dir(str(output.parent.relative_to(repo_root)))
|
|
210
|
+
written = 0
|
|
211
|
+
# NOTE: streaming `output.open("w")` below is the #506 variable-receiver
|
|
212
|
+
# gap (silent in current taxonomy). The mkdir above is routed through
|
|
213
|
+
# FileHandler so the check no longer fires; the streaming write is
|
|
214
|
+
# enumerated in #506, not laundered as sanctuary here.
|
|
215
|
+
with output.open("w", encoding="utf-8") as fh:
|
|
216
|
+
for record in records:
|
|
217
|
+
fh.write(
|
|
218
|
+
json.dumps(
|
|
219
|
+
{
|
|
220
|
+
"id": str(record.id),
|
|
221
|
+
"payload": record.payload,
|
|
222
|
+
"vector": list(record.vector)
|
|
223
|
+
if record.vector is not None
|
|
224
|
+
else None,
|
|
225
|
+
},
|
|
226
|
+
separators=(",", ":"),
|
|
227
|
+
)
|
|
228
|
+
)
|
|
229
|
+
fh.write("\n")
|
|
230
|
+
written += 1
|
|
231
|
+
console.print(f"[green]Exported[/green] {written} claims to [bold]{output}[/bold]")
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
@seed_app.command("import")
|
|
235
|
+
@core_command(dangerous=True, requires_context=True)
|
|
236
|
+
# ID: 0d96f158-176d-4701-9cd9-131b2c2a0f9a
|
|
237
|
+
async def import_command(
|
|
238
|
+
ctx: typer.Context,
|
|
239
|
+
source: Path = typer.Argument(
|
|
240
|
+
...,
|
|
241
|
+
help="JSONL fixture produced by `coherence seed export`.",
|
|
242
|
+
),
|
|
243
|
+
) -> None:
|
|
244
|
+
"""Hydrate governance_claims from a JSONL fixture (disaster recovery).
|
|
245
|
+
|
|
246
|
+
Does not consult the embedding endpoint — vectors come from the fixture.
|
|
247
|
+
"""
|
|
248
|
+
from qdrant_client.http import models as qm
|
|
249
|
+
|
|
250
|
+
from body.services.governance_claims_service import GovernanceClaimsService
|
|
251
|
+
|
|
252
|
+
context: CoreContext = ctx.obj
|
|
253
|
+
if not source.exists():
|
|
254
|
+
console.print(f"[red]Fixture not found: {source}[/red]")
|
|
255
|
+
raise typer.Exit(code=1)
|
|
256
|
+
|
|
257
|
+
try:
|
|
258
|
+
qdrant = await context.registry.get_qdrant_service()
|
|
259
|
+
except Exception as exc:
|
|
260
|
+
logger.exception("Failed to acquire Qdrant service")
|
|
261
|
+
console.print(f"[red]Service unavailable: {exc}[/red]")
|
|
262
|
+
raise typer.Exit(code=1) from exc
|
|
263
|
+
|
|
264
|
+
claims_service = GovernanceClaimsService(qdrant)
|
|
265
|
+
await claims_service.ensure_collection()
|
|
266
|
+
|
|
267
|
+
points: list[qm.PointStruct] = []
|
|
268
|
+
with source.open("r", encoding="utf-8") as fh:
|
|
269
|
+
for line in fh:
|
|
270
|
+
line = line.strip()
|
|
271
|
+
if not line:
|
|
272
|
+
continue
|
|
273
|
+
record = json.loads(line)
|
|
274
|
+
vector = record.get("vector")
|
|
275
|
+
if not vector:
|
|
276
|
+
continue
|
|
277
|
+
points.append(
|
|
278
|
+
qm.PointStruct(
|
|
279
|
+
id=record["id"],
|
|
280
|
+
vector=vector,
|
|
281
|
+
payload=record.get("payload") or {},
|
|
282
|
+
)
|
|
283
|
+
)
|
|
284
|
+
|
|
285
|
+
if not points:
|
|
286
|
+
console.print("[yellow]Fixture contained no usable records.[/yellow]")
|
|
287
|
+
raise typer.Exit(code=1)
|
|
288
|
+
|
|
289
|
+
batch = 200
|
|
290
|
+
for i in range(0, len(points), batch):
|
|
291
|
+
await qdrant.upsert_points(
|
|
292
|
+
claims_service.collection_name, points[i : i + batch], wait=True
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
console.print(
|
|
296
|
+
f"[green]Imported[/green] {len(points)} claims from [bold]{source}[/bold]"
|
|
297
|
+
)
|