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.
Files changed (962) hide show
  1. api/__init__.py +4 -0
  2. api/cli/__init__.py +10 -0
  3. api/cli/audit_client.py +92 -0
  4. api/cli/census_client.py +77 -0
  5. api/cli/client.py +508 -0
  6. api/cli/coverage_client.py +121 -0
  7. api/cli/daemon_client.py +42 -0
  8. api/cli/fix_client.py +101 -0
  9. api/cli/inspect_client.py +143 -0
  10. api/cli/integration_client.py +42 -0
  11. api/cli/integrity_client.py +45 -0
  12. api/cli/proposals_client.py +101 -0
  13. api/cli/quality_client.py +83 -0
  14. api/cli/refactor_client.py +82 -0
  15. api/cli/sync_client.py +106 -0
  16. api/dependencies.py +37 -0
  17. api/errors.py +74 -0
  18. api/main.py +88 -0
  19. api/v1/__init__.py +4 -0
  20. api/v1/audit_routes.py +302 -0
  21. api/v1/census_routes.py +207 -0
  22. api/v1/coverage_routes.py +352 -0
  23. api/v1/daemon_routes.py +86 -0
  24. api/v1/development_routes.py +70 -0
  25. api/v1/fix_routes.py +428 -0
  26. api/v1/inspect_routes.py +220 -0
  27. api/v1/integration_routes.py +56 -0
  28. api/v1/integrity_routes.py +72 -0
  29. api/v1/knowledge_routes.py +36 -0
  30. api/v1/lint_routes.py +40 -0
  31. api/v1/proposals_routes.py +267 -0
  32. api/v1/quality_routes.py +272 -0
  33. api/v1/refactor_routes.py +225 -0
  34. api/v1/sync_routes.py +261 -0
  35. body/__init__.py +4 -0
  36. body/analyzers/__init__.py +25 -0
  37. body/analyzers/base_analyzer.py +28 -0
  38. body/analyzers/constitutional_path_analyzer.py +63 -0
  39. body/analyzers/file_analyzer.py +211 -0
  40. body/analyzers/knowledge_graph_analyzer.py +86 -0
  41. body/analyzers/prompt_analyzer.py +155 -0
  42. body/analyzers/symbol_extractor.py +280 -0
  43. body/atomic/__init__.py +74 -0
  44. body/atomic/build_tests_action.py +354 -0
  45. body/atomic/check_actions.py +142 -0
  46. body/atomic/crate_ops.py +59 -0
  47. body/atomic/executor.py +470 -0
  48. body/atomic/file_ops.py +153 -0
  49. body/atomic/fix_actions.py +1142 -0
  50. body/atomic/import_resolver.py +200 -0
  51. body/atomic/metadata_ops.py +161 -0
  52. body/atomic/modularity_fix.py +839 -0
  53. body/atomic/modularity_splitter.py +521 -0
  54. body/atomic/proposal_lifecycle_actions.py +171 -0
  55. body/atomic/registry.py +326 -0
  56. body/atomic/remediate_cognitive_role.py +104 -0
  57. body/atomic/sandbox_lifecycle.py +252 -0
  58. body/atomic/split_plan.py +155 -0
  59. body/atomic/sync_actions/__init__.py +22 -0
  60. body/atomic/sync_actions/chunking_helpers.py +218 -0
  61. body/atomic/sync_actions/sync_actions.py +431 -0
  62. body/atomic/test_actions.py +47 -0
  63. body/autonomy/__init__.py +16 -0
  64. body/autonomy/audit_analyzer.py +343 -0
  65. body/autonomy/micro_proposal_executor.py +316 -0
  66. body/crate_processing/canary_executor.py +144 -0
  67. body/evaluators/__init__.py +27 -0
  68. body/evaluators/atomic_actions_evaluator.py +162 -0
  69. body/evaluators/atomic_actions_format.py +45 -0
  70. body/evaluators/atomic_actions_rules.py +278 -0
  71. body/evaluators/base_evaluator.py +67 -0
  72. body/evaluators/clarity_evaluator.py +83 -0
  73. body/evaluators/constitutional_evaluator.py +227 -0
  74. body/evaluators/failure_evaluator.py +136 -0
  75. body/evaluators/performance_evaluator.py +341 -0
  76. body/evaluators/security_evaluator.py +393 -0
  77. body/flows/__init__.py +33 -0
  78. body/flows/executor.py +275 -0
  79. body/flows/registry.py +272 -0
  80. body/flows/result.py +113 -0
  81. body/governance/__init__.py +29 -0
  82. body/governance/body_contracts_service.py +317 -0
  83. body/governance/code_validator.py +118 -0
  84. body/governance/engine_dispatcher.py +128 -0
  85. body/governance/intent_guard.py +592 -0
  86. body/governance/intent_pattern_validators.py +197 -0
  87. body/governance/key_management_service.py +100 -0
  88. body/governance/path_validator.py +187 -0
  89. body/governance/remediation_service.py +263 -0
  90. body/governance/runtime_validator.py +184 -0
  91. body/infrastructure/bootstrap.py +135 -0
  92. body/infrastructure/lifespan.py +85 -0
  93. body/infrastructure/repositories/__init__.py +1 -0
  94. body/infrastructure/repositories/decision_trace_repository.py +210 -0
  95. body/infrastructure/repositories/refusal_repository.py +294 -0
  96. body/introspection/__init__.py +4 -0
  97. body/introspection/capability_discovery_service.py +107 -0
  98. body/introspection/discovery/from_kgb.py +33 -0
  99. body/introspection/discovery/from_source_scan.py +40 -0
  100. body/introspection/discovery/loader.py +62 -0
  101. body/introspection/discovery/registry.py +22 -0
  102. body/introspection/discovery/semantics.py +21 -0
  103. body/introspection/discovery/sync.py +47 -0
  104. body/introspection/drift_detector.py +81 -0
  105. body/introspection/drift_service.py +48 -0
  106. body/introspection/export_vectors.py +133 -0
  107. body/introspection/generate_capability_docs.py +130 -0
  108. body/introspection/generate_correction_map.py +98 -0
  109. body/introspection/graph_analysis_service.py +66 -0
  110. body/introspection/knowledge_graph_service.py +170 -0
  111. body/introspection/semantic_clusterer.py +128 -0
  112. body/introspection/symbol_index_builder.py +244 -0
  113. body/introspection/sync/engine.py +92 -0
  114. body/introspection/sync/scanner.py +56 -0
  115. body/introspection/sync/visitor.py +83 -0
  116. body/introspection/sync_service.py +62 -0
  117. body/invokers/__init__.py +4 -0
  118. body/invokers/capability_invoker.py +4 -0
  119. body/maintenance/command_sync_service.py +73 -0
  120. body/maintenance/dotenv_sync_service.py +99 -0
  121. body/maintenance/idempotency_harness.py +70 -0
  122. body/maintenance/maintenance_service.py +123 -0
  123. body/maintenance/memory_cleanup_service.py +131 -0
  124. body/maintenance/refactor_settings_access.py +274 -0
  125. body/maintenance/scripts/__init__.py +5 -0
  126. body/maintenance/scripts/context_export.py +278 -0
  127. body/maintenance/scripts/vector_verify.py +73 -0
  128. body/maintenance/sync_vectors.py +338 -0
  129. body/models/__init__.py +4 -0
  130. body/project_lifecycle/__init__.py +4 -0
  131. body/project_lifecycle/bootstrap_service.py +157 -0
  132. body/project_lifecycle/definition_service.py +264 -0
  133. body/project_lifecycle/integration_service.py +113 -0
  134. body/project_lifecycle/scaffolding_service.py +187 -0
  135. body/quality/coverage_analyzer.py +177 -0
  136. body/repositories/__init__.py +4 -0
  137. body/self_healing/atomic_actions_fixer.py +113 -0
  138. body/self_healing/body_ui_fixer.py +193 -0
  139. body/self_healing/capability_parser.py +65 -0
  140. body/self_healing/code_style_service.py +51 -0
  141. body/self_healing/complexity_filter.py +70 -0
  142. body/self_healing/docstring_service.py +345 -0
  143. body/self_healing/duplicate_id_service.py +407 -0
  144. body/self_healing/duplicates_service.py +165 -0
  145. body/self_healing/handlers/__init__.py +1 -0
  146. body/self_healing/handlers/id_assignment_handler.py +201 -0
  147. body/self_healing/handlers/import_sorting_handler.py +181 -0
  148. body/self_healing/header_service.py +308 -0
  149. body/self_healing/id_tagging_service.py +227 -0
  150. body/self_healing/knowledge_consolidation_service.py +80 -0
  151. body/self_healing/logging_service.py +292 -0
  152. body/self_healing/owner_tagging_service.py +5 -0
  153. body/self_healing/placeholder_fixer_service.py +27 -0
  154. body/self_healing/prune_private_capabilities.py +144 -0
  155. body/self_healing/purge_legacy_tags_service.py +146 -0
  156. body/self_healing/remediation_models.py +238 -0
  157. body/self_healing/test_context/__init__.py +10 -0
  158. body/self_healing/test_context/detectors.py +74 -0
  159. body/self_healing/test_context/examples.py +53 -0
  160. body/self_healing/test_context/formatter.py +65 -0
  161. body/self_healing/test_context/metrics.py +62 -0
  162. body/self_healing/test_context/models.py +83 -0
  163. body/self_healing/test_context/parsers.py +70 -0
  164. body/self_healing/test_context_analyzer.py +79 -0
  165. body/self_healing/test_failure_analyzer.py +259 -0
  166. body/self_healing/test_target_analyzer.py +118 -0
  167. body/self_healing/vulture_healer.py +161 -0
  168. body/services/__init__.py +4 -0
  169. body/services/artifact_service.py +155 -0
  170. body/services/blackboard_service/__init__.py +22 -0
  171. body/services/blackboard_service/blackboard_claim_service.py +216 -0
  172. body/services/blackboard_service/blackboard_proposal_service.py +305 -0
  173. body/services/blackboard_service/blackboard_query_service.py +333 -0
  174. body/services/blackboard_service/blackboard_service.py +602 -0
  175. body/services/capabilities.py +51 -0
  176. body/services/cim/__init__.py +22 -0
  177. body/services/cim/baselines.py +102 -0
  178. body/services/cim/census_service.py +190 -0
  179. body/services/cim/cim_constants.py +116 -0
  180. body/services/cim/cim_path_utils.py +123 -0
  181. body/services/cim/diff.py +152 -0
  182. body/services/cim/history.py +94 -0
  183. body/services/cim/models.py +319 -0
  184. body/services/cim/policy.py +149 -0
  185. body/services/cim/scanners.py +332 -0
  186. body/services/coherence_service.py +552 -0
  187. body/services/consequence_log_service.py +189 -0
  188. body/services/constitutional_rule_loader.py +141 -0
  189. body/services/constitutional_validator.py +366 -0
  190. body/services/crate_creation_service.py +217 -0
  191. body/services/crate_processing_service.py +279 -0
  192. body/services/crawl_service/__init__.py +10 -0
  193. body/services/crawl_service/main_module.py +531 -0
  194. body/services/crawl_service/orchestrator.py +452 -0
  195. body/services/crawl_service/symbol_processing.py +279 -0
  196. body/services/database_service.py +242 -0
  197. body/services/doc_service.py +57 -0
  198. body/services/file_service.py +260 -0
  199. body/services/governance_claims_service.py +240 -0
  200. body/services/governance_init.py +41 -0
  201. body/services/health_log_service.py +167 -0
  202. body/services/intent_schema_validator.py +211 -0
  203. body/services/llm_client.py +87 -0
  204. body/services/mind_state_service.py +129 -0
  205. body/services/policy_expression_evaluator.py +154 -0
  206. body/services/proposal_supervision_service.py +187 -0
  207. body/services/representation_coherence_service.py +209 -0
  208. body/services/service_registry.py +431 -0
  209. body/services/session_attached_service.py +51 -0
  210. body/services/symbol_query_service.py +218 -0
  211. body/services/symbol_service.py +94 -0
  212. body/services/validation/__init__.py +14 -0
  213. body/services/validation/python_validator.py +89 -0
  214. body/services/validation/validation_policies.py +121 -0
  215. body/services/worker_registry_service.py +184 -0
  216. body/validators/__init__.py +1 -0
  217. body/validators/logic_conservation_validator.py +201 -0
  218. body/workers/call_site_rewriter.py +527 -0
  219. body/workers/prompt_artifact_writer.py +323 -0
  220. cli/__init__.py +4 -0
  221. cli/admin_cli.py +98 -0
  222. cli/cli_user.py +121 -0
  223. cli/commands/__init__.py +4 -0
  224. cli/commands/audit_reporter.py +272 -0
  225. cli/commands/check/__init__.py +115 -0
  226. cli/commands/check/audit.py +130 -0
  227. cli/commands/check/converters.py +129 -0
  228. cli/commands/check/diagnostics_commands.py +70 -0
  229. cli/commands/check/formatters.py +310 -0
  230. cli/commands/check/imports.py +73 -0
  231. cli/commands/check/quality.py +71 -0
  232. cli/commands/check/quality_gates.py +107 -0
  233. cli/commands/check/rule.py +136 -0
  234. cli/commands/check/utils.py +28 -0
  235. cli/commands/check_atomic_actions.py +167 -0
  236. cli/commands/components.py +66 -0
  237. cli/commands/coverage/__init__.py +22 -0
  238. cli/commands/coverage/analysis_commands.py +87 -0
  239. cli/commands/coverage/check_commands.py +173 -0
  240. cli/commands/coverage/generation_commands.py +155 -0
  241. cli/commands/coverage/services/__init__.py +15 -0
  242. cli/commands/coverage/services/coverage_checker.py +50 -0
  243. cli/commands/coverage/services/coverage_reporter.py +81 -0
  244. cli/commands/coverage/services/gaps_analyzer.py +114 -0
  245. cli/commands/daemon.py +908 -0
  246. cli/commands/develop.py +127 -0
  247. cli/commands/diagnostics.py +32 -0
  248. cli/commands/fix/__init__.py +84 -0
  249. cli/commands/fix/all_commands.py +94 -0
  250. cli/commands/fix/atomic_actions.py +48 -0
  251. cli/commands/fix/audit.py +146 -0
  252. cli/commands/fix/body_ui.py +93 -0
  253. cli/commands/fix/code_style.py +52 -0
  254. cli/commands/fix/db_tools.py +90 -0
  255. cli/commands/fix/fix_ir.py +79 -0
  256. cli/commands/fix/handler_discovery.py +54 -0
  257. cli/commands/fix/imports.py +55 -0
  258. cli/commands/fix/list_commands.py +54 -0
  259. cli/commands/fix/metadata.py +160 -0
  260. cli/commands/fix/modularity.py +88 -0
  261. cli/commands/fix/settings_access.py +65 -0
  262. cli/commands/fix_governed.py +103 -0
  263. cli/commands/fix_logging.py +24 -0
  264. cli/commands/governance.py +294 -0
  265. cli/commands/guard.py +125 -0
  266. cli/commands/inspect/__init__.py +79 -0
  267. cli/commands/inspect/_helpers.py +226 -0
  268. cli/commands/inspect/analysis.py +158 -0
  269. cli/commands/inspect/decisions.py +140 -0
  270. cli/commands/inspect/diagnostics.py +126 -0
  271. cli/commands/inspect/drift.py +100 -0
  272. cli/commands/inspect/patterns.py +102 -0
  273. cli/commands/inspect/refusals.py +211 -0
  274. cli/commands/inspect/repo_census.py +175 -0
  275. cli/commands/inspect/status.py +48 -0
  276. cli/commands/interactive_test.py +85 -0
  277. cli/commands/mind.py +49 -0
  278. cli/commands/refactor.py +234 -0
  279. cli/commands/refactor_support/__init__.py +7 -0
  280. cli/commands/refactor_support/analyzer.py +107 -0
  281. cli/commands/refactor_support/config.py +67 -0
  282. cli/commands/refactor_support/display.py +170 -0
  283. cli/commands/refactor_support/recommendations.py +55 -0
  284. cli/commands/run.py +60 -0
  285. cli/commands/search.py +103 -0
  286. cli/commands/status.py +86 -0
  287. cli/commands/submit.py +23 -0
  288. cli/interactive.py +177 -0
  289. cli/logic/__init__.py +7 -0
  290. cli/logic/agent.py +110 -0
  291. cli/logic/audit_capability_domains.py +106 -0
  292. cli/logic/audit_renderer.py +150 -0
  293. cli/logic/autonomy/actions.py +36 -0
  294. cli/logic/autonomy/views.py +116 -0
  295. cli/logic/body_contracts_checker.py +23 -0
  296. cli/logic/build.py +27 -0
  297. cli/logic/byor.py +148 -0
  298. cli/logic/capability.py +27 -0
  299. cli/logic/cli_utils.py +210 -0
  300. cli/logic/context.py +7 -0
  301. cli/logic/db.py +154 -0
  302. cli/logic/db_manage.py +22 -0
  303. cli/logic/decision_inspect_logic.py +62 -0
  304. cli/logic/diagnostics.py +148 -0
  305. cli/logic/diagnostics_policy.py +100 -0
  306. cli/logic/diagnostics_registry.py +165 -0
  307. cli/logic/duplicates.py +19 -0
  308. cli/logic/embeddings_cli.py +43 -0
  309. cli/logic/governance/__init__.py +16 -0
  310. cli/logic/governance/engine.py +216 -0
  311. cli/logic/governance/forensics_service.py +67 -0
  312. cli/logic/governance/limb_status_service.py +83 -0
  313. cli/logic/governance/renderer.py +115 -0
  314. cli/logic/governance/traceability_service.py +78 -0
  315. cli/logic/governance_logic.py +33 -0
  316. cli/logic/hub/__init__.py +14 -0
  317. cli/logic/hub/app.py +107 -0
  318. cli/logic/hub/formatter.py +29 -0
  319. cli/logic/hub/introspection.py +20 -0
  320. cli/logic/hub/repository.py +17 -0
  321. cli/logic/init.py +22 -0
  322. cli/logic/interactive_test/__init__.py +21 -0
  323. cli/logic/interactive_test/session.py +102 -0
  324. cli/logic/interactive_test/steps/__init__.py +23 -0
  325. cli/logic/interactive_test/steps/execution.py +53 -0
  326. cli/logic/interactive_test/steps/generation.py +88 -0
  327. cli/logic/interactive_test/steps/healing.py +79 -0
  328. cli/logic/interactive_test/steps/utils.py +31 -0
  329. cli/logic/interactive_test/steps/verification.py +71 -0
  330. cli/logic/interactive_test/ui.py +203 -0
  331. cli/logic/interactive_test/workflow.py +168 -0
  332. cli/logic/interactive_test_logic.py +41 -0
  333. cli/logic/knowledge.py +47 -0
  334. cli/logic/legacy_scan_logic.py +306 -0
  335. cli/logic/list_audits.py +49 -0
  336. cli/logic/log_audit.py +53 -0
  337. cli/logic/new.py +8 -0
  338. cli/logic/project_docs.py +28 -0
  339. cli/logic/reconcile.py +127 -0
  340. cli/logic/refusal_inspect_logic.py +208 -0
  341. cli/logic/report.py +47 -0
  342. cli/logic/status.py +47 -0
  343. cli/logic/symbol_drift.py +77 -0
  344. cli/logic/sync.py +48 -0
  345. cli/logic/sync_domains.py +72 -0
  346. cli/logic/sync_manifest.py +31 -0
  347. cli/logic/tools.py +133 -0
  348. cli/logic/utils_migration.py +43 -0
  349. cli/logic/validate.py +107 -0
  350. cli/logic/vector_drift.py +109 -0
  351. cli/logic/yaml_processor.py +5 -0
  352. cli/renderers/audit_detail.py +37 -0
  353. cli/renderers/audit_overview.py +39 -0
  354. cli/resources/__init__.py +27 -0
  355. cli/resources/admin/__init__.py +23 -0
  356. cli/resources/admin/coverage.py +63 -0
  357. cli/resources/admin/debt_scan.py +195 -0
  358. cli/resources/admin/forensics.py +97 -0
  359. cli/resources/admin/health.py +66 -0
  360. cli/resources/admin/hub.py +9 -0
  361. cli/resources/admin/meta.py +47 -0
  362. cli/resources/admin/patterns.py +28 -0
  363. cli/resources/admin/refusals.py +31 -0
  364. cli/resources/admin/self_check.py +175 -0
  365. cli/resources/admin/status.py +66 -0
  366. cli/resources/admin/summary.py +67 -0
  367. cli/resources/admin/traces.py +46 -0
  368. cli/resources/admin/validate_env.py +56 -0
  369. cli/resources/code/__init__.py +31 -0
  370. cli/resources/code/actions.py +48 -0
  371. cli/resources/code/audit.py +416 -0
  372. cli/resources/code/audit_duplicates.py +22 -0
  373. cli/resources/code/check_imports.py +75 -0
  374. cli/resources/code/check_ui.py +62 -0
  375. cli/resources/code/clarity.py +51 -0
  376. cli/resources/code/complexity.py +55 -0
  377. cli/resources/code/docstrings.py +51 -0
  378. cli/resources/code/fix_atomic.py +51 -0
  379. cli/resources/code/format.py +62 -0
  380. cli/resources/code/hub.py +10 -0
  381. cli/resources/code/integrity.py +75 -0
  382. cli/resources/code/lint.py +37 -0
  383. cli/resources/code/logging.py +49 -0
  384. cli/resources/code/refactor.py +32 -0
  385. cli/resources/code/test.py +30 -0
  386. cli/resources/coherence/__init__.py +13 -0
  387. cli/resources/coherence/check.py +111 -0
  388. cli/resources/coherence/hub.py +13 -0
  389. cli/resources/coherence/repair_counts.py +73 -0
  390. cli/resources/coherence/report.py +144 -0
  391. cli/resources/coherence/seed.py +297 -0
  392. cli/resources/coherence/supersede.py +124 -0
  393. cli/resources/coherence/triage.py +81 -0
  394. cli/resources/constitution/__init__.py +19 -0
  395. cli/resources/constitution/audit.py +49 -0
  396. cli/resources/constitution/query.py +45 -0
  397. cli/resources/constitution/status.py +34 -0
  398. cli/resources/constitution/validate.py +36 -0
  399. cli/resources/context/__init__.py +21 -0
  400. cli/resources/context/build.py +374 -0
  401. cli/resources/context/cache.py +156 -0
  402. cli/resources/context/explain.py +140 -0
  403. cli/resources/context/hub.py +11 -0
  404. cli/resources/context/search.py +114 -0
  405. cli/resources/database/__init__.py +13 -0
  406. cli/resources/database/cleanup.py +107 -0
  407. cli/resources/database/export.py +61 -0
  408. cli/resources/database/hub.py +11 -0
  409. cli/resources/database/migrate.py +57 -0
  410. cli/resources/database/status.py +101 -0
  411. cli/resources/database/sync.py +84 -0
  412. cli/resources/database/sync_env.py +76 -0
  413. cli/resources/database/sync_registry.py +48 -0
  414. cli/resources/dev/__init__.py +14 -0
  415. cli/resources/dev/hub.py +11 -0
  416. cli/resources/dev/refactor.py +92 -0
  417. cli/resources/dev/stability.py +60 -0
  418. cli/resources/dev/strategic_audit.py +113 -0
  419. cli/resources/dev/sync.py +51 -0
  420. cli/resources/dev/test.py +34 -0
  421. cli/resources/intent/__init__.py +11 -0
  422. cli/resources/intent/hub.py +9 -0
  423. cli/resources/intent/sync_vocabulary.py +396 -0
  424. cli/resources/project/__init__.py +19 -0
  425. cli/resources/project/docs.py +41 -0
  426. cli/resources/project/new.py +40 -0
  427. cli/resources/project/onboard.py +31 -0
  428. cli/resources/proposals/__init__.py +28 -0
  429. cli/resources/proposals/create.py +82 -0
  430. cli/resources/proposals/integrate.py +49 -0
  431. cli/resources/proposals/list.py +76 -0
  432. cli/resources/proposals/manage.py +117 -0
  433. cli/resources/runtime/__init__.py +9 -0
  434. cli/resources/runtime/health.py +925 -0
  435. cli/resources/secrets/__init__.py +10 -0
  436. cli/resources/secrets/hub.py +9 -0
  437. cli/resources/secrets/manage.py +309 -0
  438. cli/resources/symbols/__init__.py +13 -0
  439. cli/resources/symbols/audit.py +46 -0
  440. cli/resources/symbols/fix_ids.py +43 -0
  441. cli/resources/symbols/hub.py +11 -0
  442. cli/resources/symbols/resolve_duplicates.py +30 -0
  443. cli/resources/symbols/sync.py +39 -0
  444. cli/resources/symbols/tag.py +47 -0
  445. cli/resources/vectors/__init__.py +11 -0
  446. cli/resources/vectors/cleanup.py +95 -0
  447. cli/resources/vectors/hub.py +9 -0
  448. cli/resources/vectors/query.py +105 -0
  449. cli/resources/vectors/status.py +30 -0
  450. cli/resources/vectors/sync.py +57 -0
  451. cli/resources/vectors/sync_code.py +67 -0
  452. cli/resources/workers/__init__.py +13 -0
  453. cli/resources/workers/blackboard.py +253 -0
  454. cli/resources/workers/remediate.py +337 -0
  455. cli/resources/workers/run.py +140 -0
  456. cli/utils/__init__.py +32 -0
  457. cli/utils/annotation_formatter.py +154 -0
  458. cli/utils/decorators.py +184 -0
  459. cli/utils/display.py +79 -0
  460. cli/utils/exit_codes.py +59 -0
  461. cli/utils/helpers.py +34 -0
  462. cli/utils/prompts.py +21 -0
  463. core_runtime-0.1.1.dist-info/LICENSE +21 -0
  464. core_runtime-0.1.1.dist-info/METADATA +346 -0
  465. core_runtime-0.1.1.dist-info/RECORD +962 -0
  466. core_runtime-0.1.1.dist-info/WHEEL +4 -0
  467. core_runtime-0.1.1.dist-info/entry_points.txt +4 -0
  468. mind/__init__.py +4 -0
  469. mind/coherence/__init__.py +1 -0
  470. mind/coherence/checker.py +314 -0
  471. mind/coherence/checks/__init__.py +4 -0
  472. mind/coherence/checks/base.py +34 -0
  473. mind/coherence/checks/r1_scoped.py +228 -0
  474. mind/coherence/checks/row2_grounding.py +69 -0
  475. mind/coherence/checks/row3_citation.py +119 -0
  476. mind/coherence/checks/row4_naming.py +126 -0
  477. mind/coherence/checks/sameconcern.py +136 -0
  478. mind/coherence/checks/specgap.py +233 -0
  479. mind/coherence/checks/vocabulary.py +112 -0
  480. mind/coherence/llm_judge.py +207 -0
  481. mind/enforcement/audit.py +78 -0
  482. mind/governance/__init__.py +22 -0
  483. mind/governance/assumption_extractor.py +326 -0
  484. mind/governance/audit_context.py +520 -0
  485. mind/governance/audit_postprocessor.py +36 -0
  486. mind/governance/audit_report_writer.py +46 -0
  487. mind/governance/audit_types.py +98 -0
  488. mind/governance/auditor.py +179 -0
  489. mind/governance/authority_package_builder.py +502 -0
  490. mind/governance/constitutional_auditor_dynamic.py +362 -0
  491. mind/governance/enforcement/__init__.py +24 -0
  492. mind/governance/enforcement_loader.py +245 -0
  493. mind/governance/enforcement_methods.py +28 -0
  494. mind/governance/entry_point_policy.py +62 -0
  495. mind/governance/executable_rule.py +127 -0
  496. mind/governance/filtered_audit.py +272 -0
  497. mind/governance/finding_processor.py +76 -0
  498. mind/governance/meta_validator.py +259 -0
  499. mind/governance/micro_proposal_validator.py +169 -0
  500. mind/governance/policy_coverage_service.py +183 -0
  501. mind/governance/policy_rule.py +94 -0
  502. mind/governance/rule_conflict_detector.py +127 -0
  503. mind/governance/rule_executor.py +306 -0
  504. mind/governance/rule_extractor.py +376 -0
  505. mind/governance/stateless_audit.py +206 -0
  506. mind/governance/violation_report.py +136 -0
  507. mind/logic/engines/_knowledge_gate_duplication.py +117 -0
  508. mind/logic/engines/action_gate.py +76 -0
  509. mind/logic/engines/artifact_gate.py +1168 -0
  510. mind/logic/engines/ast_gate/__init__.py +9 -0
  511. mind/logic/engines/ast_gate/base.py +263 -0
  512. mind/logic/engines/ast_gate/checks/__init__.py +35 -0
  513. mind/logic/engines/ast_gate/checks/async_checks.py +276 -0
  514. mind/logic/engines/ast_gate/checks/capability_checks.py +197 -0
  515. mind/logic/engines/ast_gate/checks/conservation_checks.py +126 -0
  516. mind/logic/engines/ast_gate/checks/generic_checks.py +244 -0
  517. mind/logic/engines/ast_gate/checks/import_checks.py +164 -0
  518. mind/logic/engines/ast_gate/checks/knowledge_source_check.py +88 -0
  519. mind/logic/engines/ast_gate/checks/logging_checks.py +133 -0
  520. mind/logic/engines/ast_gate/checks/metadata_checks.py +242 -0
  521. mind/logic/engines/ast_gate/checks/modularity_checks.py +436 -0
  522. mind/logic/engines/ast_gate/checks/naming_checks.py +120 -0
  523. mind/logic/engines/ast_gate/checks/prompt_model_checks.py +83 -0
  524. mind/logic/engines/ast_gate/checks/protected_namespace_access_check.py +298 -0
  525. mind/logic/engines/ast_gate/checks/purity_checks.py +421 -0
  526. mind/logic/engines/ast_gate/checks/purity_enforcement_check.py +56 -0
  527. mind/logic/engines/ast_gate/checks/runtime_import_boundary.py +198 -0
  528. mind/logic/engines/ast_gate/checks/schema_conformance_checks.py +130 -0
  529. mind/logic/engines/ast_gate/engine.py +317 -0
  530. mind/logic/engines/ast_gate.py +19 -0
  531. mind/logic/engines/base.py +106 -0
  532. mind/logic/engines/cli_gate/__init__.py +25 -0
  533. mind/logic/engines/cli_gate/base_check.py +45 -0
  534. mind/logic/engines/cli_gate/checks/__init__.py +31 -0
  535. mind/logic/engines/cli_gate/checks/async_execution.py +65 -0
  536. mind/logic/engines/cli_gate/checks/dangerous_explicit.py +60 -0
  537. mind/logic/engines/cli_gate/checks/discovery_strict.py +167 -0
  538. mind/logic/engines/cli_gate/checks/help_required.py +43 -0
  539. mind/logic/engines/cli_gate/checks/no_duplicates.py +57 -0
  540. mind/logic/engines/cli_gate/checks/no_layer_exposure.py +48 -0
  541. mind/logic/engines/cli_gate/checks/resource_first.py +58 -0
  542. mind/logic/engines/cli_gate/checks/standard_verbs.py +50 -0
  543. mind/logic/engines/cli_gate/engine.py +211 -0
  544. mind/logic/engines/glob_gate.py +214 -0
  545. mind/logic/engines/knowledge_gate.py +410 -0
  546. mind/logic/engines/llm_gate.py +407 -0
  547. mind/logic/engines/llm_gate_stub.py +67 -0
  548. mind/logic/engines/passive_gate.py +45 -0
  549. mind/logic/engines/regex_gate.py +97 -0
  550. mind/logic/engines/registry.py +134 -0
  551. mind/logic/engines/runtime_gate.py +265 -0
  552. mind/logic/engines/taxonomy_gate.py +229 -0
  553. mind/logic/engines/workflow_gate/__init__.py +22 -0
  554. mind/logic/engines/workflow_gate/base_check.py +42 -0
  555. mind/logic/engines/workflow_gate/checks/__init__.py +32 -0
  556. mind/logic/engines/workflow_gate/checks/alignment.py +93 -0
  557. mind/logic/engines/workflow_gate/checks/audit.py +80 -0
  558. mind/logic/engines/workflow_gate/checks/canary.py +47 -0
  559. mind/logic/engines/workflow_gate/checks/coverage.py +74 -0
  560. mind/logic/engines/workflow_gate/checks/dead_code.py +53 -0
  561. mind/logic/engines/workflow_gate/checks/import_resolution.py +97 -0
  562. mind/logic/engines/workflow_gate/checks/linter.py +104 -0
  563. mind/logic/engines/workflow_gate/checks/quality.py +49 -0
  564. mind/logic/engines/workflow_gate/checks/ruff_format.py +99 -0
  565. mind/logic/engines/workflow_gate/checks/tests.py +81 -0
  566. mind/logic/engines/workflow_gate/engine.py +207 -0
  567. shared/__init__.py +32 -0
  568. shared/action_logger.py +61 -0
  569. shared/action_types.py +199 -0
  570. shared/activity_logging.py +149 -0
  571. shared/ai/constitutional_envelope.py +341 -0
  572. shared/ai/prompt_model.py +585 -0
  573. shared/ai/response_parser.py +191 -0
  574. shared/ast_utility.py +279 -0
  575. shared/atomic_action.py +117 -0
  576. shared/cli/__init__.py +6 -0
  577. shared/cli/app_introspection.py +134 -0
  578. shared/cli/command_meta.py +224 -0
  579. shared/cli_types.py +92 -0
  580. shared/component_primitive.py +216 -0
  581. shared/config.py +216 -0
  582. shared/config_loader.py +54 -0
  583. shared/context.py +113 -0
  584. shared/exceptions.py +100 -0
  585. shared/governance/__init__.py +9 -0
  586. shared/governance/coherence_harvester.py +258 -0
  587. shared/governance_token.py +77 -0
  588. shared/infrastructure/__init__.py +5 -0
  589. shared/infrastructure/adapters/__init__.py +5 -0
  590. shared/infrastructure/adapters/embedding_provider.py +66 -0
  591. shared/infrastructure/bootstrap_registry.py +57 -0
  592. shared/infrastructure/clients/__init__.py +5 -0
  593. shared/infrastructure/clients/qdrant_client.py +455 -0
  594. shared/infrastructure/config_service.py +382 -0
  595. shared/infrastructure/config_validator.py +70 -0
  596. shared/infrastructure/context/__init__.py +45 -0
  597. shared/infrastructure/context/builder.py +804 -0
  598. shared/infrastructure/context/cache.py +101 -0
  599. shared/infrastructure/context/database.py +205 -0
  600. shared/infrastructure/context/limb_workspace.py +134 -0
  601. shared/infrastructure/context/models.py +65 -0
  602. shared/infrastructure/context/providers/__init__.py +18 -0
  603. shared/infrastructure/context/providers/ast.py +211 -0
  604. shared/infrastructure/context/providers/db.py +165 -0
  605. shared/infrastructure/context/providers/vectors.py +195 -0
  606. shared/infrastructure/context/redactor.py +109 -0
  607. shared/infrastructure/context/serializers.py +144 -0
  608. shared/infrastructure/context/service.py +271 -0
  609. shared/infrastructure/context/validator.py +247 -0
  610. shared/infrastructure/database/models/__init__.py +80 -0
  611. shared/infrastructure/database/models/autonomous_proposals.py +83 -0
  612. shared/infrastructure/database/models/decision_traces.py +129 -0
  613. shared/infrastructure/database/models/governance.py +183 -0
  614. shared/infrastructure/database/models/knowledge.py +205 -0
  615. shared/infrastructure/database/models/learning.py +99 -0
  616. shared/infrastructure/database/models/llm_config.py +274 -0
  617. shared/infrastructure/database/models/operations.py +152 -0
  618. shared/infrastructure/database/models/refusals.py +147 -0
  619. shared/infrastructure/database/models/system.py +124 -0
  620. shared/infrastructure/database/models/vectors.py +113 -0
  621. shared/infrastructure/database/models/workers.py +96 -0
  622. shared/infrastructure/database/session_manager.py +166 -0
  623. shared/infrastructure/diagnostic_service.py +103 -0
  624. shared/infrastructure/events/__init__.py +5 -0
  625. shared/infrastructure/events/base.py +44 -0
  626. shared/infrastructure/events/bus.py +76 -0
  627. shared/infrastructure/git_service.py +385 -0
  628. shared/infrastructure/intent/action_risk.py +135 -0
  629. shared/infrastructure/intent/audit_verdict.py +131 -0
  630. shared/infrastructure/intent/autonomy_dirty_tree.py +104 -0
  631. shared/infrastructure/intent/canonical_enums.py +116 -0
  632. shared/infrastructure/intent/cognitive_roles.py +96 -0
  633. shared/infrastructure/intent/errors.py +13 -0
  634. shared/infrastructure/intent/filesystem_operations.py +359 -0
  635. shared/infrastructure/intent/intent_connector.py +157 -0
  636. shared/infrastructure/intent/intent_repository.py +707 -0
  637. shared/infrastructure/intent/intent_validator.py +248 -0
  638. shared/infrastructure/intent/operational_capabilities.py +470 -0
  639. shared/infrastructure/intent/operational_config.py +1343 -0
  640. shared/infrastructure/intent/operational_mode.py +66 -0
  641. shared/infrastructure/intent/task_type_phases.py +180 -0
  642. shared/infrastructure/intent/test_coverage_paths.py +181 -0
  643. shared/infrastructure/intent/vocabulary_projection.py +241 -0
  644. shared/infrastructure/knowledge/knowledge_service.py +155 -0
  645. shared/infrastructure/knowledge_graph_service.py +214 -0
  646. shared/infrastructure/llm/client.py +448 -0
  647. shared/infrastructure/llm/client_registry.py +153 -0
  648. shared/infrastructure/llm/fallback_client.py +144 -0
  649. shared/infrastructure/llm/providers/anthropic.py +113 -0
  650. shared/infrastructure/llm/providers/base.py +130 -0
  651. shared/infrastructure/llm/providers/ollama.py +265 -0
  652. shared/infrastructure/llm/providers/openai.py +168 -0
  653. shared/infrastructure/repositories/__init__.py +5 -0
  654. shared/infrastructure/repositories/db/__init__.py +5 -0
  655. shared/infrastructure/repositories/db/common.py +138 -0
  656. shared/infrastructure/repositories/db/engine.py +26 -0
  657. shared/infrastructure/repositories/db/migration_service.py +75 -0
  658. shared/infrastructure/repositories/db/status_service.py +61 -0
  659. shared/infrastructure/repositories/memory_repository.py +134 -0
  660. shared/infrastructure/repositories/symbol_definition_repository.py +170 -0
  661. shared/infrastructure/repositories/task_repository.py +59 -0
  662. shared/infrastructure/repositories/vector_link_repository.py +83 -0
  663. shared/infrastructure/rooted_repository.py +50 -0
  664. shared/infrastructure/secrets_service.py +317 -0
  665. shared/infrastructure/specs/__init__.py +9 -0
  666. shared/infrastructure/specs/specs_repository.py +100 -0
  667. shared/infrastructure/storage/file_classifier.py +32 -0
  668. shared/infrastructure/storage/file_handler.py +330 -0
  669. shared/infrastructure/storage/file_provider.py +233 -0
  670. shared/infrastructure/storage/integrity_service.py +108 -0
  671. shared/infrastructure/validation/black_formatter.py +41 -0
  672. shared/infrastructure/validation/quality.py +46 -0
  673. shared/infrastructure/validation/ruff_linter.py +104 -0
  674. shared/infrastructure/validation/syntax_checker.py +45 -0
  675. shared/infrastructure/validation/test_runner.py +167 -0
  676. shared/infrastructure/validation/yaml_validator.py +45 -0
  677. shared/infrastructure/vector/__init__.py +15 -0
  678. shared/infrastructure/vector/adapters/__init__.py +20 -0
  679. shared/infrastructure/vector/adapters/constitutional/__init__.py +26 -0
  680. shared/infrastructure/vector/adapters/constitutional/chunker.py +246 -0
  681. shared/infrastructure/vector/adapters/constitutional/doc_key_resolver.py +109 -0
  682. shared/infrastructure/vector/adapters/constitutional/item_builder.py +158 -0
  683. shared/infrastructure/vector/adapters/constitutional/utils.py +39 -0
  684. shared/infrastructure/vector/adapters/constitutional_adapter.py +309 -0
  685. shared/infrastructure/vector/adapters/specs_adapter.py +171 -0
  686. shared/infrastructure/vector/cognitive_adapter.py +119 -0
  687. shared/infrastructure/vector/vector_index_service.py +230 -0
  688. shared/logger.py +195 -0
  689. shared/models/__init__.py +47 -0
  690. shared/models/action_result.py +77 -0
  691. shared/models/audit_models.py +106 -0
  692. shared/models/audit_rendering.py +30 -0
  693. shared/models/capability_models.py +22 -0
  694. shared/models/constitutional_validation.py +185 -0
  695. shared/models/drift_models.py +24 -0
  696. shared/models/embedding_payload.py +45 -0
  697. shared/models/execution_models.py +71 -0
  698. shared/models/pattern_graph.py +62 -0
  699. shared/models/prompt_model.py +244 -0
  700. shared/models/refusal_result.py +294 -0
  701. shared/models/remediation.py +35 -0
  702. shared/models/validation_result.py +34 -0
  703. shared/models/vector_models.py +62 -0
  704. shared/models/workflow_models.py +242 -0
  705. shared/path_resolver.py +408 -0
  706. shared/path_utils.py +60 -0
  707. shared/processors/base_processor.py +171 -0
  708. shared/processors/yaml_processor.py +72 -0
  709. shared/protocols/__init__.py +21 -0
  710. shared/protocols/brain_services.py +35 -0
  711. shared/protocols/cognitive.py +35 -0
  712. shared/protocols/executor.py +47 -0
  713. shared/protocols/interpreter.py +24 -0
  714. shared/protocols/knowledge.py +21 -0
  715. shared/protocols/llm.py +25 -0
  716. shared/protocols/typer_protocols.py +37 -0
  717. shared/time.py +18 -0
  718. shared/universal.py +43 -0
  719. shared/utils/__init__.py +81 -0
  720. shared/utils/audit_grouping.py +50 -0
  721. shared/utils/common_knowledge.py +82 -0
  722. shared/utils/domain_mapper.py +61 -0
  723. shared/utils/embedding_utils.py +182 -0
  724. shared/utils/glob_match.py +93 -0
  725. shared/utils/header_tools.py +177 -0
  726. shared/utils/parallel_processor.py +60 -0
  727. shared/utils/parsing.py +189 -0
  728. shared/utils/path_utils.py +268 -0
  729. shared/utils/subprocess_utils.py +87 -0
  730. shared/workers/__init__.py +19 -0
  731. shared/workers/base.py +533 -0
  732. shared/workers/declaration_validator.py +124 -0
  733. shared/workers/loop_hold_telemetry.py +210 -0
  734. shared/workers/schedule.py +123 -0
  735. will/__init__.py +4 -0
  736. will/agents/__init__.py +4 -0
  737. will/agents/base_planner.py +133 -0
  738. will/agents/code_generation/__init__.py +15 -0
  739. will/agents/code_generation/code_generator.py +247 -0
  740. will/agents/code_generation/context_formatters.py +99 -0
  741. will/agents/code_generation/correction_engine.py +157 -0
  742. will/agents/code_generation/extraction.py +165 -0
  743. will/agents/code_generation/pattern_validator.py +264 -0
  744. will/agents/code_generation/prompt_builders.py +209 -0
  745. will/agents/coder_agent.py +229 -0
  746. will/agents/coder_agent_refusal_handler.py +168 -0
  747. will/agents/cognitive_orchestrator.py +152 -0
  748. will/agents/conversational/__init__.py +13 -0
  749. will/agents/conversational/agent.py +271 -0
  750. will/agents/conversational/factory.py +72 -0
  751. will/agents/conversational/helpers.py +116 -0
  752. will/agents/execution_agent.py +294 -0
  753. will/agents/governance_mixin.py +132 -0
  754. will/agents/planner_agent.py +261 -0
  755. will/agents/resource_selector.py +228 -0
  756. will/agents/strategic_auditor/__init__.py +15 -0
  757. will/agents/strategic_auditor/agent.py +199 -0
  758. will/agents/strategic_auditor/context_gatherer.py +586 -0
  759. will/agents/strategic_auditor/effects.py +136 -0
  760. will/agents/strategic_auditor/models.py +61 -0
  761. will/agents/strategic_auditor/reasoning.py +169 -0
  762. will/agents/tagger_agent.py +294 -0
  763. will/agents/traced_agent_mixin.py +33 -0
  764. will/autonomy/__init__.py +20 -0
  765. will/autonomy/autonomous_developer.py +127 -0
  766. will/autonomy/proposal.py +585 -0
  767. will/autonomy/proposal_execution_pipeline.py +264 -0
  768. will/autonomy/proposal_executor.py +410 -0
  769. will/autonomy/proposal_mapper.py +187 -0
  770. will/autonomy/proposal_repository.py +118 -0
  771. will/autonomy/proposal_service.py +251 -0
  772. will/autonomy/proposal_state_manager.py +239 -0
  773. will/deciders/__init__.py +9 -0
  774. will/deciders/governance_decider.py +207 -0
  775. will/governance/__init__.py +13 -0
  776. will/governance/audit_remediation_runner.py +197 -0
  777. will/governance/audit_runner.py +368 -0
  778. will/governance/census_runner.py +278 -0
  779. will/governance/coverage_runner.py +489 -0
  780. will/governance/daemon_runner.py +164 -0
  781. will/governance/fix_runner.py +693 -0
  782. will/governance/inspect_runner.py +521 -0
  783. will/governance/integrity_runner.py +66 -0
  784. will/governance/lint_runner.py +93 -0
  785. will/governance/refactor_runner.py +372 -0
  786. will/governance/sync_runner.py +186 -0
  787. will/interpreters/__init__.py +44 -0
  788. will/interpreters/cli_args_interpreter.py +106 -0
  789. will/interpreters/natural_language_interpreter.py +276 -0
  790. will/interpreters/request_interpreter.py +126 -0
  791. will/lifecycle/__init__.py +12 -0
  792. will/lifecycle/integration_runner.py +54 -0
  793. will/maintenance/metadata_scribe_service.py +64 -0
  794. will/orchestration/__init__.py +4 -0
  795. will/orchestration/cognitive_service.py +185 -0
  796. will/orchestration/decision_tracer.py +257 -0
  797. will/orchestration/intent_alignment.py +59 -0
  798. will/orchestration/intent_guard.py +20 -0
  799. will/orchestration/phase_registry.py +92 -0
  800. will/orchestration/process_orchestrator.py +270 -0
  801. will/orchestration/prompt_pipeline.py +174 -0
  802. will/orchestration/remediation_orchestrator.py +292 -0
  803. will/orchestration/self_correction_engine.py +154 -0
  804. will/orchestration/validation_pipeline.py +45 -0
  805. will/orchestration/workflow_orchestrator.py +277 -0
  806. will/phases/__init__.py +24 -0
  807. will/phases/audit_phase.py +152 -0
  808. will/phases/canary/pytest_runner.py +156 -0
  809. will/phases/canary/result_builder.py +130 -0
  810. will/phases/canary/test_discovery.py +104 -0
  811. will/phases/canary_validation_phase.py +188 -0
  812. will/phases/code_generation/artifact_saver.py +175 -0
  813. will/phases/code_generation/code_sensor.py +117 -0
  814. will/phases/code_generation/file_path_extractor.py +53 -0
  815. will/phases/code_generation/work_directory_manager.py +83 -0
  816. will/phases/code_generation_phase.py +480 -0
  817. will/phases/execution_phase.py +179 -0
  818. will/phases/interpret_phase.py +266 -0
  819. will/phases/load_phase.py +102 -0
  820. will/phases/parse_phase.py +117 -0
  821. will/phases/planning_phase.py +182 -0
  822. will/phases/runtime_phase.py +112 -0
  823. will/phases/sandbox_validation_phase.py +130 -0
  824. will/phases/style_check_phase.py +209 -0
  825. will/phases/test_generation_phase.py +159 -0
  826. will/self_healing/alignment/persistence.py +53 -0
  827. will/self_healing/alignment/sandbox.py +51 -0
  828. will/self_healing/alignment/specialists.py +165 -0
  829. will/self_healing/alignment_orchestrator.py +140 -0
  830. will/self_healing/audit_remediation_service.py +199 -0
  831. will/self_healing/batch_remediation_service.py +280 -0
  832. will/self_healing/capability_reconciliation_service.py +96 -0
  833. will/self_healing/capability_tagging_service.py +224 -0
  834. will/self_healing/clarity_service.py +204 -0
  835. will/self_healing/complexity_service.py +260 -0
  836. will/self_healing/context_aware_test_generator.py +298 -0
  837. will/self_healing/coverage_remediation_service.py +97 -0
  838. will/self_healing/coverage_watcher.py +192 -0
  839. will/self_healing/enrichment_service.py +211 -0
  840. will/self_healing/linelength_service.py +168 -0
  841. will/self_healing/modularity_remediation_service.py +203 -0
  842. will/self_healing/remediation_evidence_writer.py +144 -0
  843. will/self_healing/remediation_executor.py +113 -0
  844. will/self_healing/remediation_interpretation/__init__.py +1 -0
  845. will/self_healing/remediation_interpretation/file_context_assembler.py +383 -0
  846. will/self_healing/remediation_interpretation/file_role_detector.py +599 -0
  847. will/self_healing/remediation_interpretation/finding_normalizer.py +221 -0
  848. will/self_healing/remediation_interpretation/models.py +198 -0
  849. will/self_healing/remediation_interpretation/reasoning_brief_builder.py +235 -0
  850. will/self_healing/remediation_interpretation/responsibility_extractor.py +421 -0
  851. will/self_healing/remediation_interpretation/service.py +202 -0
  852. will/self_healing/remediation_interpretation/strategy_catalog.py +252 -0
  853. will/self_healing/remediation_interpretation/strategy_selector.py +395 -0
  854. will/self_healing/remediation_pattern_matcher.py +126 -0
  855. will/self_healing/simple_test_generator.py +252 -0
  856. will/self_healing/single_file_remediation.py +137 -0
  857. will/self_healing/test_generation/automatic_repair.py +377 -0
  858. will/self_healing/test_generation/code_extractor.py +238 -0
  859. will/self_healing/test_generation/context_builder.py +140 -0
  860. will/self_healing/test_generation/executor.py +64 -0
  861. will/self_healing/test_generation/failure_parser.py +37 -0
  862. will/self_healing/test_generation/generation_workflow.py +140 -0
  863. will/self_healing/test_generation/generator.py +283 -0
  864. will/self_healing/test_generation/llm_correction.py +160 -0
  865. will/self_healing/test_generation/repair_workflow.py +128 -0
  866. will/self_healing/test_generation/single_test_fixer.py +77 -0
  867. will/self_healing/test_generation/test_extractor.py +50 -0
  868. will/self_healing/test_generation/test_scorer.py +53 -0
  869. will/self_healing/test_generation/test_validator.py +64 -0
  870. will/self_healing/test_generator.py +12 -0
  871. will/strategists/__init__.py +46 -0
  872. will/strategists/base_strategist.py +29 -0
  873. will/strategists/clarity_strategist.py +55 -0
  874. will/strategists/complexity_strategist.py +55 -0
  875. will/strategists/fix_strategist.py +467 -0
  876. will/strategists/sync_strategist.py +369 -0
  877. will/strategists/test_strategist.py +140 -0
  878. will/strategists/validation_strategist.py +315 -0
  879. will/test_generation/__init__.py +46 -0
  880. will/test_generation/adaptive_test_generator.py +123 -0
  881. will/test_generation/artifacts.py +102 -0
  882. will/test_generation/harness_detection.py +103 -0
  883. will/test_generation/helpers/__init__.py +14 -0
  884. will/test_generation/helpers/context_extractor.py +100 -0
  885. will/test_generation/helpers/test_executor.py +230 -0
  886. will/test_generation/llm_output.py +62 -0
  887. will/test_generation/models.py +25 -0
  888. will/test_generation/persistence.py +248 -0
  889. will/test_generation/phases/__init__.py +16 -0
  890. will/test_generation/phases/generation_phase.py +150 -0
  891. will/test_generation/phases/load_phase.py +53 -0
  892. will/test_generation/phases/parse_phase.py +50 -0
  893. will/test_generation/prompt_engine.py +123 -0
  894. will/test_generation/result_aggregator.py +73 -0
  895. will/test_generation/sandbox.py +203 -0
  896. will/test_generation/strategy_link.py +56 -0
  897. will/test_generation/test_extractor.py +140 -0
  898. will/test_generation/validation.py +89 -0
  899. will/tools/__init__.py +13 -0
  900. will/tools/anchor_builder.py +111 -0
  901. will/tools/anchor_search.py +73 -0
  902. will/tools/anchors/discovery.py +55 -0
  903. will/tools/anchors/storage.py +32 -0
  904. will/tools/architectural_context_builder.py +94 -0
  905. will/tools/cognitive_toolbox.py +47 -0
  906. will/tools/context/code_snippet_extractor.py +83 -0
  907. will/tools/context/embedding_search.py +76 -0
  908. will/tools/context/formatter.py +87 -0
  909. will/tools/context/models.py +38 -0
  910. will/tools/context/query_builder.py +42 -0
  911. will/tools/context/retriever.py +182 -0
  912. will/tools/context/standards.py +53 -0
  913. will/tools/file_navigator.py +180 -0
  914. will/tools/layers.py +31 -0
  915. will/tools/module_anchor_generator.py +137 -0
  916. will/tools/module_descriptor.py +154 -0
  917. will/tools/policy_vectorizer.py +184 -0
  918. will/tools/symbol_finder.py +188 -0
  919. will/tools/tool_generator.py +103 -0
  920. will/workers/audit_ingest_worker.py +207 -0
  921. will/workers/audit_violation_filter.py +108 -0
  922. will/workers/audit_violation_normalizer.py +108 -0
  923. will/workers/audit_violation_sensor.py +370 -0
  924. will/workers/blackboard_shop_manager.py +280 -0
  925. will/workers/capability_tagger.py +153 -0
  926. will/workers/circuit_breaker.py +335 -0
  927. will/workers/coherence_sensor.py +212 -0
  928. will/workers/commit_reachability_auditor.py +135 -0
  929. will/workers/db_sync_worker.py +96 -0
  930. will/workers/governance_embedding/__init__.py +9 -0
  931. will/workers/governance_embedding/governance_embedder_worker.py +189 -0
  932. will/workers/intent_inspector.py +599 -0
  933. will/workers/observer_worker.py +158 -0
  934. will/workers/prompt_extractor_worker.py +241 -0
  935. will/workers/proposal_consumer_effects.py +216 -0
  936. will/workers/proposal_consumer_revival.py +131 -0
  937. will/workers/proposal_consumer_worker.py +271 -0
  938. will/workers/proposal_pipeline_shop_manager.py +273 -0
  939. will/workers/repo_crawler.py +171 -0
  940. will/workers/repo_embedding/__init__.py +18 -0
  941. will/workers/repo_embedding/helpers.py +245 -0
  942. will/workers/repo_embedding/repo_embedder_workers.py +163 -0
  943. will/workers/test_coverage_sensor.py +208 -0
  944. will/workers/test_remediator/__init__.py +12 -0
  945. will/workers/test_remediator/_operations.py +295 -0
  946. will/workers/test_remediator/worker.py +187 -0
  947. will/workers/test_runner_sensor.py +430 -0
  948. will/workers/violation_executor.py +496 -0
  949. will/workers/violation_remediator.py +394 -0
  950. will/workers/violation_remediator_blackboard.py +225 -0
  951. will/workers/violation_remediator_body/__init__.py +12 -0
  952. will/workers/violation_remediator_body/blackboard.py +139 -0
  953. will/workers/violation_remediator_body/ceremony.py +154 -0
  954. will/workers/violation_remediator_body/context.py +70 -0
  955. will/workers/violation_remediator_body/llm.py +112 -0
  956. will/workers/violation_remediator_body/models.py +35 -0
  957. will/workers/violation_remediator_body/worker.py +518 -0
  958. will/workers/violation_remediator_proposal.py +328 -0
  959. will/workers/worker_shop_manager.py +244 -0
  960. will/workflows/__init__.py +23 -0
  961. will/workflows/dev_sync_reporter.py +274 -0
  962. will/workflows/dev_sync_workflow.py +118 -0
@@ -0,0 +1,925 @@
1
+ # src/cli/resources/runtime/health.py
2
+ """
3
+ Runtime health and dashboard commands.
4
+
5
+ Provides a single-shot dashboard of the live CORE runtime:
6
+ - Worker heartbeats + status
7
+ - Observer health snapshot (findings, stale, silent, orphaned)
8
+ - Blackboard pulse (status summary + recent entries)
9
+ - Recent crawl stats
10
+ - Blast radius top symbols
11
+
12
+ Also provides a five-panel governor dashboard:
13
+ - Convergence direction
14
+ - Governor inbox
15
+ - Loop running
16
+ - Pipeline moving
17
+ - Governance coverage
18
+ """
19
+
20
+ from __future__ import annotations
21
+
22
+ import logging
23
+ from datetime import UTC, datetime, timedelta
24
+ from typing import Any
25
+
26
+ import typer
27
+ from rich.columns import Columns
28
+ from rich.console import Console
29
+ from rich.panel import Panel
30
+ from rich.table import Table
31
+ from sqlalchemy import text
32
+
33
+ from body.services.worker_registry_service import WorkerRegistryService
34
+ from cli.utils import async_command
35
+ from shared.infrastructure.database.session_manager import get_session
36
+ from shared.infrastructure.intent.operational_config import load_operational_config
37
+ from shared.workers.schedule import load_worker_schedule_state
38
+
39
+
40
+ logger = logging.getLogger(__name__)
41
+ console = Console()
42
+
43
+ _CFG_H = load_operational_config().health
44
+ runtime_app = typer.Typer(
45
+ help="Runtime state and health of the running CORE system.", no_args_is_help=True
46
+ )
47
+
48
+
49
+ def _age(ts: datetime | None) -> str:
50
+ """Human-readable age from a UTC-aware timestamp."""
51
+ if ts is None:
52
+ return "never"
53
+ if ts.tzinfo is None:
54
+ ts = ts.replace(tzinfo=UTC)
55
+ s = int((datetime.now(UTC) - ts).total_seconds())
56
+ if s < 60:
57
+ return f"{s}s ago"
58
+ if s < 3600:
59
+ return f"{s // 60}m ago"
60
+ if s < 86400:
61
+ return f"{s // 3600}h ago"
62
+ return f"{s // 86400}d ago"
63
+
64
+
65
+ def _worker_colour(
66
+ last_heartbeat: datetime | None, is_active_declared: bool = True
67
+ ) -> str:
68
+ """Liveness colour derived from heartbeat age. Per ADR-020,
69
+ last_heartbeat is the canonical liveness signal.
70
+
71
+ Workers whose declaration is not status=active (paused, deprecated,
72
+ or orphan rows whose YAML was removed) are rendered dim — they are
73
+ not expected to heartbeat, so heartbeat age is irrelevant.
74
+ """
75
+ if not is_active_declared:
76
+ return "dim"
77
+ if last_heartbeat is None:
78
+ return "yellow"
79
+ if last_heartbeat.tzinfo is None:
80
+ last_heartbeat = last_heartbeat.replace(tzinfo=UTC)
81
+ age_s = (datetime.now(UTC) - last_heartbeat).total_seconds()
82
+ if age_s < _CFG_H.worker_alive_threshold_sec:
83
+ return "green"
84
+ if age_s < _CFG_H.worker_warn_threshold_sec:
85
+ return "yellow"
86
+ return "red"
87
+
88
+
89
+ def _liveness_label(
90
+ last_heartbeat: datetime | None, is_active_declared: bool = True
91
+ ) -> str:
92
+ """Liveness label derived from heartbeat freshness. Per ADR-020,
93
+ a worker is alive iff its last heartbeat is within the silent-worker
94
+ threshold (10 minutes, matching health_log_service.silent_workers).
95
+
96
+ Workers whose declaration is not status=active are labelled
97
+ ``inactive`` regardless of heartbeat age — heartbeat staleness is
98
+ expected and not a fault signal.
99
+ """
100
+ if not is_active_declared:
101
+ return "inactive"
102
+ if last_heartbeat is None:
103
+ return "stale"
104
+ if last_heartbeat.tzinfo is None:
105
+ last_heartbeat = last_heartbeat.replace(tzinfo=UTC)
106
+ age_s = (datetime.now(UTC) - last_heartbeat).total_seconds()
107
+ if age_s >= _CFG_H.worker_alive_threshold_sec:
108
+ return "stale"
109
+ return "alive"
110
+
111
+
112
+ @runtime_app.command("health")
113
+ @async_command
114
+ # ID: 38e31fa3-0c8c-4721-aeaa-57562292cf9f
115
+ async def health_cmd(
116
+ plain: bool = typer.Option(
117
+ False, "--plain", help="Plain text output (log/pipe friendly)."
118
+ ),
119
+ ) -> None:
120
+ """
121
+ Live health dashboard for the CORE runtime.
122
+
123
+ Shows workers, observer snapshot, blackboard pulse,
124
+ recent crawl stats, and blast radius top symbols.
125
+ """
126
+ schedule_state = load_worker_schedule_state()
127
+ active_uuids = schedule_state.active_uuids
128
+
129
+ async with get_session() as session:
130
+ workers = (
131
+ await session.execute(
132
+ text(
133
+ "\n SELECT worker_name, worker_uuid, worker_class, phase, last_heartbeat\n FROM core.worker_registry\n ORDER BY last_heartbeat DESC NULLS LAST\n "
134
+ )
135
+ )
136
+ ).fetchall()
137
+ bb_summary = (
138
+ await session.execute(
139
+ text(
140
+ "\n SELECT status, COUNT(*) AS cnt\n FROM core.blackboard_entries\n GROUP BY status\n ORDER BY cnt DESC\n "
141
+ )
142
+ )
143
+ ).fetchall()
144
+ bb_recent = (
145
+ await session.execute(
146
+ text(
147
+ "\n SELECT entry_type, subject, status, created_at\n FROM core.blackboard_entries\n ORDER BY created_at DESC\n LIMIT 8\n "
148
+ )
149
+ )
150
+ ).fetchall()
151
+ health = (
152
+ await session.execute(
153
+ text(
154
+ "\n SELECT observed_at, open_findings, stale_entries,\n silent_workers, orphaned_symbols\n FROM core.system_health_log\n ORDER BY observed_at DESC\n LIMIT 1\n "
155
+ )
156
+ )
157
+ ).fetchone()
158
+ crawl = (
159
+ await session.execute(
160
+ text(
161
+ "\n SELECT started_at, status, files_scanned, files_changed, edges_created\n FROM core.crawl_runs\n ORDER BY started_at DESC\n LIMIT 3\n "
162
+ )
163
+ )
164
+ ).fetchall()
165
+ blast = (
166
+ await session.execute(
167
+ text(
168
+ "\n SELECT symbol_path, affected_symbol_count, direct_caller_count\n FROM core.v_symbol_blast_radius\n ORDER BY affected_symbol_count DESC\n LIMIT 10\n "
169
+ )
170
+ )
171
+ ).fetchall()
172
+ if plain:
173
+ _render_plain(
174
+ workers, bb_summary, bb_recent, health, crawl, blast, active_uuids
175
+ )
176
+ else:
177
+ _render_rich(workers, bb_summary, bb_recent, health, crawl, blast, active_uuids)
178
+
179
+
180
+ def _render_rich(
181
+ workers,
182
+ bb_summary,
183
+ bb_recent,
184
+ health,
185
+ crawl,
186
+ blast,
187
+ active_uuids: frozenset[str],
188
+ ) -> None:
189
+ console.rule("[bold cyan]CORE Runtime Health[/bold cyan]")
190
+ console.print("\n[bold]Workers[/bold]")
191
+ t = Table(show_header=True, header_style="bold magenta")
192
+ t.add_column("Name")
193
+ t.add_column("Class")
194
+ t.add_column("Phase")
195
+ t.add_column("Liveness")
196
+ t.add_column("Last Heartbeat")
197
+ for w in workers:
198
+ is_active = str(w.worker_uuid) in active_uuids
199
+ c = _worker_colour(w.last_heartbeat, is_active)
200
+ label = _liveness_label(w.last_heartbeat, is_active)
201
+ t.add_row(
202
+ w.worker_name,
203
+ w.worker_class,
204
+ w.phase,
205
+ f"[{c}]{label}[/{c}]",
206
+ _age(w.last_heartbeat),
207
+ )
208
+ console.print(t)
209
+ if health:
210
+ console.print("\n[bold]Observer — Latest Snapshot[/bold]")
211
+ t2 = Table(show_header=True, header_style="bold magenta")
212
+ t2.add_column("Observed")
213
+ t2.add_column("Open Findings")
214
+ t2.add_column("Stale Entries")
215
+ t2.add_column("Silent Workers")
216
+ t2.add_column("Orphaned Symbols")
217
+ t2.add_row(
218
+ _age(health.observed_at),
219
+ str(health.open_findings),
220
+ str(health.stale_entries),
221
+ str(health.silent_workers),
222
+ str(health.orphaned_symbols),
223
+ )
224
+ console.print(t2)
225
+ console.print("\n[bold]Blackboard[/bold]")
226
+ t3 = Table(show_header=True, header_style="bold magenta")
227
+ t3.add_column("Status")
228
+ t3.add_column("Count")
229
+ for row in bb_summary:
230
+ t3.add_row(row.status, str(row.cnt))
231
+ console.print(t3)
232
+ console.print("\n[bold]Blackboard — Recent Entries[/bold]")
233
+ t4 = Table(show_header=True, header_style="bold magenta")
234
+ t4.add_column("Type")
235
+ t4.add_column("Subject")
236
+ t4.add_column("Status")
237
+ t4.add_column("Age")
238
+ for e in bb_recent:
239
+ t4.add_row(e.entry_type, e.subject, e.status, _age(e.created_at))
240
+ console.print(t4)
241
+ console.print("\n[bold]Recent Crawls[/bold]")
242
+ t5 = Table(show_header=True, header_style="bold magenta")
243
+ t5.add_column("Started")
244
+ t5.add_column("Status")
245
+ t5.add_column("Files Scanned")
246
+ t5.add_column("Files Changed")
247
+ t5.add_column("Edges Created")
248
+ for c in crawl:
249
+ t5.add_row(
250
+ _age(c.started_at),
251
+ c.status,
252
+ str(c.files_scanned),
253
+ str(c.files_changed),
254
+ str(c.edges_created),
255
+ )
256
+ console.print(t5)
257
+ console.print("\n[bold]Blast Radius — Top Symbols[/bold]")
258
+ t6 = Table(show_header=True, header_style="bold magenta")
259
+ t6.add_column("Symbol Path")
260
+ t6.add_column("Affected", justify="right")
261
+ t6.add_column("Direct Callers", justify="right")
262
+ for b in blast:
263
+ t6.add_row(
264
+ b.symbol_path, str(b.affected_symbol_count), str(b.direct_caller_count)
265
+ )
266
+ console.print(t6)
267
+ console.rule()
268
+
269
+
270
+ def _render_plain(
271
+ workers,
272
+ bb_summary,
273
+ bb_recent,
274
+ health,
275
+ crawl,
276
+ blast,
277
+ active_uuids: frozenset[str],
278
+ ) -> None:
279
+ logger.info("=== CORE Runtime Health ===\n")
280
+ logger.info("-- Workers --")
281
+ for w in workers:
282
+ is_active = str(w.worker_uuid) in active_uuids
283
+ label = _liveness_label(w.last_heartbeat, is_active)
284
+ logger.info(
285
+ " %s %s %s",
286
+ w.worker_name.ljust(30),
287
+ label.ljust(10),
288
+ _age(w.last_heartbeat),
289
+ )
290
+ if health:
291
+ logger.info("\n-- Observer (latest) --")
292
+ logger.info(" observed: %s", _age(health.observed_at))
293
+ logger.info(" open_findings: %s", health.open_findings)
294
+ logger.info(" stale_entries: %s", health.stale_entries)
295
+ logger.info(" silent_workers: %s", health.silent_workers)
296
+ logger.info(" orphaned_symbols: %s", health.orphaned_symbols)
297
+ logger.info("\n-- Blackboard --")
298
+ for row in bb_summary:
299
+ logger.info(" %s %s", row.status.ljust(12), row.cnt)
300
+ logger.info("\n-- Recent Blackboard Entries --")
301
+ for e in bb_recent:
302
+ logger.info(
303
+ " %s %s %s %s",
304
+ e.entry_type.ljust(12),
305
+ e.subject.ljust(40),
306
+ e.status.ljust(10),
307
+ _age(e.created_at),
308
+ )
309
+ logger.info("\n-- Recent Crawls --")
310
+ for c in crawl:
311
+ logger.info(
312
+ " %s %s scanned=%s changed=%s edges=%s",
313
+ _age(c.started_at).ljust(12),
314
+ c.status.ljust(12),
315
+ c.files_scanned,
316
+ c.files_changed,
317
+ c.edges_created,
318
+ )
319
+ logger.info("\n-- Blast Radius Top Symbols --")
320
+ for b in blast:
321
+ logger.info(
322
+ " affected=%-5s callers=%-5s %s",
323
+ b.affected_symbol_count,
324
+ b.direct_caller_count,
325
+ b.symbol_path,
326
+ )
327
+
328
+
329
+ # ---------------------------------------------------------------------------
330
+ # Governor Dashboard
331
+ # ---------------------------------------------------------------------------
332
+
333
+ _SIGNAL_STYLE = {
334
+ "green": "bold green",
335
+ "blue": "bold blue",
336
+ "amber": "bold yellow",
337
+ "red": "bold red",
338
+ "grey": "dim",
339
+ }
340
+
341
+ _SIGNAL_EMOJI = {
342
+ "green": "🟢",
343
+ "blue": "🔵",
344
+ "amber": "🟡",
345
+ "red": "🔴",
346
+ "grey": "⚪",
347
+ }
348
+
349
+
350
+ # ID: 25ad54a6-9889-4a66-91dc-05ba912c679f
351
+ def _make_panel(
352
+ title: str,
353
+ signal: str,
354
+ headline: str,
355
+ rows: list[tuple[str, str]],
356
+ ) -> Panel:
357
+ """Build a Rich Panel with a color-coded signal headline and key/value rows."""
358
+ style = _SIGNAL_STYLE.get(signal, "dim")
359
+ emoji = _SIGNAL_EMOJI.get(signal, "⚪")
360
+ body_lines = [f"[{style}]{emoji} {headline}[/{style}]", ""]
361
+ for label, value in rows:
362
+ body_lines.append(f" {label}: {value}")
363
+ return Panel("\n".join(body_lines), title=f"[bold]{title}[/bold]", expand=True)
364
+
365
+
366
+ # ID: 27038966-d764-433e-b72d-591a460c0728
367
+ async def _query_dashboard_data(session: Any) -> dict[str, Any]:
368
+ """Run all dashboard queries inside an open session. Returns raw data dict."""
369
+ now = datetime.now(UTC)
370
+ cutoff_24h = now - timedelta(hours=_CFG_H.long_lookback_hours)
371
+ cutoff_60m = now - timedelta(minutes=_CFG_H.medium_lookback_minutes)
372
+ cutoff_30m = now - timedelta(minutes=_CFG_H.short_lookback_minutes)
373
+ cutoff_10m = now - timedelta(minutes=_CFG_H.recent_lookback_minutes)
374
+ today_start = now.replace(hour=0, minute=0, second=0, microsecond=0)
375
+
376
+ data: dict[str, Any] = {}
377
+
378
+ # --- Panel 1: Convergence Direction ---
379
+ # total_open counts both 'open' and 'awaiting_reaudit' (ADR-045):
380
+ # the quarantine queue is unresolved work pending sensor adjudication,
381
+ # not terminal state. Matches the open_findings count in
382
+ # health_log_service so the dashboard and the trajectory series agree.
383
+ row = (
384
+ await session.execute(
385
+ text("""
386
+ SELECT
387
+ COUNT(*) FILTER (WHERE created_at >= :cutoff) AS created_24h,
388
+ COUNT(*) FILTER (WHERE updated_at >= :cutoff AND status = 'resolved') AS resolved_24h,
389
+ COUNT(*) FILTER (WHERE status IN ('open', 'awaiting_reaudit')
390
+ AND entry_type = 'finding') AS total_open
391
+ FROM core.blackboard_entries
392
+ WHERE entry_type = 'finding'
393
+ """),
394
+ {"cutoff": cutoff_24h},
395
+ )
396
+ ).fetchone()
397
+
398
+ # Trajectory metric (#261): compare current open_findings against the
399
+ # value from ~6 hours ago using the existing system_health_log series.
400
+ # Backlog-trend, not flow-noise — converges/diverges if the open set
401
+ # is shrinking/growing across the window.
402
+ trajectory_lookback_hours = 6
403
+ log_count_row = (
404
+ await session.execute(
405
+ text("SELECT COUNT(*) AS cnt FROM core.system_health_log"),
406
+ )
407
+ ).fetchone()
408
+ log_count = log_count_row.cnt if log_count_row else 0
409
+
410
+ trajectory: dict[str, Any]
411
+ if log_count >= 2:
412
+ current_row = (
413
+ await session.execute(
414
+ text("""
415
+ SELECT observed_at, open_findings
416
+ FROM core.system_health_log
417
+ ORDER BY observed_at DESC
418
+ LIMIT 1
419
+ """),
420
+ )
421
+ ).fetchone()
422
+ prior_row = (
423
+ await session.execute(
424
+ text("""
425
+ SELECT observed_at, open_findings
426
+ FROM core.system_health_log
427
+ ORDER BY ABS(
428
+ EXTRACT(EPOCH FROM (
429
+ observed_at - (now() - make_interval(hours => :hours))
430
+ ))
431
+ )
432
+ LIMIT 1
433
+ """),
434
+ {"hours": trajectory_lookback_hours},
435
+ )
436
+ ).fetchone()
437
+ current_open = current_row.open_findings
438
+ prior_open = prior_row.open_findings
439
+ delta = current_open - prior_open
440
+ if delta < 0:
441
+ direction = "converging"
442
+ elif delta > 0:
443
+ direction = "diverging"
444
+ else:
445
+ direction = "stable"
446
+ trajectory = {
447
+ "current": current_open,
448
+ "prior": prior_open,
449
+ "delta": delta,
450
+ "lookback_hours": trajectory_lookback_hours,
451
+ "direction": direction,
452
+ }
453
+ else:
454
+ # 0 or 1 rows in the health log — no usable backlog comparison yet.
455
+ trajectory = {
456
+ "current": None,
457
+ "prior": None,
458
+ "delta": None,
459
+ "lookback_hours": trajectory_lookback_hours,
460
+ "direction": "insufficient-data",
461
+ }
462
+
463
+ data["convergence"] = {
464
+ "created": row.created_24h if row else 0,
465
+ "resolved": row.resolved_24h if row else 0,
466
+ "total_open": row.total_open if row else 0,
467
+ "trajectory": trajectory,
468
+ }
469
+
470
+ # --- Panel 2: Governor Inbox ---
471
+ inbox_row = (
472
+ await session.execute(
473
+ text("""
474
+ SELECT
475
+ COUNT(*) FILTER (
476
+ WHERE bb.status = 'indeterminate' AND bb.entry_type = 'finding'
477
+ ) AS delegate_count,
478
+ MIN(bb.created_at) FILTER (
479
+ WHERE bb.status = 'indeterminate' AND bb.entry_type = 'finding'
480
+ ) AS oldest_delegate
481
+ FROM core.blackboard_entries bb
482
+ """),
483
+ )
484
+ ).fetchone()
485
+ approval_row = (
486
+ await session.execute(
487
+ text("""
488
+ SELECT
489
+ COUNT(*) AS approval_count,
490
+ MIN(created_at) AS oldest_approval
491
+ FROM core.autonomous_proposals
492
+ WHERE status = 'draft' AND approval_required = true
493
+ """),
494
+ )
495
+ ).fetchone()
496
+ delegate_count = inbox_row.delegate_count if inbox_row else 0
497
+ oldest_delegate = inbox_row.oldest_delegate if inbox_row else None
498
+ approval_count = approval_row.approval_count if approval_row else 0
499
+ oldest_approval = approval_row.oldest_approval if approval_row else None
500
+ data["inbox"] = {
501
+ "delegate_count": delegate_count,
502
+ "approval_count": approval_count,
503
+ "total": delegate_count + approval_count,
504
+ "oldest_delegate": oldest_delegate,
505
+ "oldest_approval": oldest_approval,
506
+ "cutoff_24h": cutoff_24h,
507
+ }
508
+
509
+ # --- Panel 3: Loop Running (ADR-041 D2/D3/D5) ---
510
+ # Per-worker thresholds + orphan-skip from the shared loader. Binary
511
+ # stale/alive: amber tier dropped (ADR-041 D5) because it had no
512
+ # semantic basis under per-worker thresholds.
513
+ schedule_state = load_worker_schedule_state()
514
+ worker_registry_svc = WorkerRegistryService()
515
+ stale_rows = await worker_registry_svc.fetch_stale_workers_with_schedules(
516
+ thresholds=schedule_state.thresholds,
517
+ active_uuids=schedule_state.active_uuids,
518
+ fallback_sec=schedule_state.fallback_sec,
519
+ )
520
+ stale_workers: list[tuple[str, str]] = [
521
+ (r["worker_name"], _age(r["last_heartbeat"])) for r in stale_rows
522
+ ]
523
+ data["loop"] = {
524
+ # Active count = declared active workers (ADR-041 D3 orphan-skip
525
+ # applied). Previously this counted every worker_registry row
526
+ # including orphans, which overstated the live worker count.
527
+ "active_count": len(schedule_state.active_uuids),
528
+ "stale_workers": stale_workers,
529
+ "signal": "red" if stale_workers else "green",
530
+ }
531
+
532
+ # --- Panel 4: Pipeline Moving ---
533
+ proposal_dist = (
534
+ await session.execute(
535
+ text("""
536
+ SELECT status, COUNT(*) AS cnt
537
+ FROM core.autonomous_proposals
538
+ GROUP BY status
539
+ ORDER BY cnt DESC
540
+ """),
541
+ )
542
+ ).fetchall()
543
+ executed_today = (
544
+ await session.execute(
545
+ text("""
546
+ SELECT COUNT(*) AS cnt
547
+ FROM core.autonomous_proposals
548
+ WHERE status = 'completed' AND execution_completed_at >= :today
549
+ """),
550
+ {"today": today_start},
551
+ )
552
+ ).fetchone()
553
+ failed_today = (
554
+ await session.execute(
555
+ text("""
556
+ SELECT COUNT(*) AS cnt
557
+ FROM core.autonomous_proposals
558
+ WHERE status = 'failed' AND execution_completed_at >= :today
559
+ """),
560
+ {"today": today_start},
561
+ )
562
+ ).fetchone()
563
+ stuck_count = (
564
+ await session.execute(
565
+ text("""
566
+ SELECT COUNT(*) AS cnt
567
+ FROM core.autonomous_proposals
568
+ WHERE status = 'approved' AND approved_at < :cutoff
569
+ """),
570
+ {"cutoff": cutoff_30m},
571
+ )
572
+ ).fetchone()
573
+ last_consequence = (
574
+ await session.execute(
575
+ text("""
576
+ SELECT MAX(recorded_at) AS last_ts
577
+ FROM core.proposal_consequences
578
+ """),
579
+ )
580
+ ).fetchone()
581
+ data["pipeline"] = {
582
+ "distribution": {r.status: r.cnt for r in proposal_dist},
583
+ "executed_today": executed_today.cnt if executed_today else 0,
584
+ "failed_today": failed_today.cnt if failed_today else 0,
585
+ "stuck_approved": stuck_count.cnt if stuck_count else 0,
586
+ "last_consequence_ts": last_consequence.last_ts if last_consequence else None,
587
+ "cutoff_60m": cutoff_60m,
588
+ }
589
+
590
+ # --- Panel 5: Autonomous Reach ---
591
+ dry_run = (
592
+ await session.execute(
593
+ text("""
594
+ SELECT COUNT(*) AS cnt
595
+ FROM core.blackboard_entries
596
+ WHERE subject LIKE 'audit.remediation.dry_run%'
597
+ AND status = 'open'
598
+ """),
599
+ )
600
+ ).fetchone()
601
+ abandoned = (
602
+ await session.execute(
603
+ text("""
604
+ SELECT COUNT(*) AS cnt
605
+ FROM core.blackboard_entries
606
+ WHERE entry_type = 'finding'
607
+ AND status = 'abandoned'
608
+ """),
609
+ )
610
+ ).fetchone()
611
+ in_flight = (
612
+ await session.execute(
613
+ text("""
614
+ SELECT COUNT(*) AS cnt
615
+ FROM core.blackboard_entries
616
+ WHERE entry_type = 'finding'
617
+ AND status = 'claimed'
618
+ AND claimed_by = (
619
+ SELECT worker_uuid FROM core.worker_registry
620
+ WHERE worker_name = 'Violation Executor'
621
+ LIMIT 1
622
+ )
623
+ """),
624
+ )
625
+ ).fetchone()
626
+ data["reach"] = {
627
+ "dry_run_candidates": dry_run.cnt if dry_run else 0,
628
+ "abandoned": abandoned.cnt if abandoned else 0,
629
+ "in_flight": in_flight.cnt if in_flight else 0,
630
+ }
631
+
632
+ return data
633
+
634
+
635
+ # ID: 178097be-03e6-4b27-90c9-2b76599f0d38
636
+ def _build_panels(data: dict[str, Any]) -> list[Panel]:
637
+ """Translate raw query data into five Rich Panels with color signals."""
638
+ panels: list[Panel] = []
639
+
640
+ # --- Panel 1: Convergence Direction ---
641
+ # Backlog-trend metric: compares current total open findings against the
642
+ # value from ~lookback_hours ago in the system_health_log series.
643
+ # Shrinking open set = converging; growing = diverging; unchanged = stable.
644
+ try:
645
+ traj = data["convergence"]["trajectory"]
646
+ direction = traj["direction"]
647
+ current = traj["current"]
648
+ prior = traj["prior"]
649
+ delta = traj["delta"]
650
+ lookback = traj["lookback_hours"]
651
+
652
+ direction_meta = {
653
+ "converging": ("green", "Converging ↓"),
654
+ "diverging": ("red", "Diverging ↑"),
655
+ "stable": ("amber", "Stable →"),
656
+ "insufficient-data": ("grey", "Insufficient data"),
657
+ }
658
+ signal, headline = direction_meta.get(direction, ("grey", "Insufficient data"))
659
+
660
+ panels.append(
661
+ _make_panel(
662
+ "Convergence Direction",
663
+ signal,
664
+ headline,
665
+ [
666
+ ("Open now", str(current) if current is not None else "—"),
667
+ (
668
+ f"Open {lookback}h ago",
669
+ str(prior) if prior is not None else "—",
670
+ ),
671
+ ("Delta", f"{delta:+d}" if delta is not None else "—"),
672
+ ],
673
+ )
674
+ )
675
+ except Exception:
676
+ panels.append(
677
+ _make_panel("Convergence Direction", "grey", "UNKNOWN — query failed", [])
678
+ )
679
+
680
+ # --- Panel 2: Governor Inbox ---
681
+ try:
682
+ inbox = data["inbox"]
683
+ total = inbox["total"]
684
+ has_old = False
685
+ for ts in (inbox["oldest_delegate"], inbox["oldest_approval"]):
686
+ if ts is not None:
687
+ if ts.tzinfo is None:
688
+ ts = ts.replace(tzinfo=UTC)
689
+ if ts < inbox["cutoff_24h"]:
690
+ has_old = True
691
+ if total == 0:
692
+ signal = "green"
693
+ elif total <= 3 and not has_old:
694
+ signal = "amber"
695
+ else:
696
+ signal = "red"
697
+ panels.append(
698
+ _make_panel(
699
+ "Governor Inbox",
700
+ signal,
701
+ f"{total} item{'s' if total != 1 else ''} awaiting governor",
702
+ [
703
+ ("Delegate (indeterminate)", str(inbox["delegate_count"])),
704
+ ("Approval required", str(inbox["approval_count"])),
705
+ ("Total", str(total)),
706
+ ],
707
+ )
708
+ )
709
+ except Exception:
710
+ panels.append(
711
+ _make_panel("Governor Inbox", "grey", "UNKNOWN — query failed", [])
712
+ )
713
+
714
+ # --- Panel 3: Loop Running ---
715
+ try:
716
+ loop = data["loop"]
717
+ signal = loop["signal"]
718
+ stale = loop["stale_workers"]
719
+ active = loop["active_count"]
720
+ if active == 0:
721
+ signal = "red"
722
+ headline = "No active workers"
723
+ elif stale:
724
+ names = ", ".join(f"{n} ({a})" for n, a in stale)
725
+ headline = f"{active} active — stale: {names}"
726
+ else:
727
+ headline = f"{active} active — all heartbeats current"
728
+ panels.append(
729
+ _make_panel(
730
+ "Loop Running",
731
+ signal,
732
+ headline,
733
+ [("Active workers", str(active))]
734
+ + [(f"Stale: {n}", a) for n, a in stale],
735
+ )
736
+ )
737
+ except Exception:
738
+ panels.append(_make_panel("Loop Running", "grey", "UNKNOWN — query failed", []))
739
+
740
+ # --- Panel 4: Pipeline Moving ---
741
+ try:
742
+ p = data["pipeline"]
743
+ dist = p["distribution"]
744
+ executed_today = p["executed_today"]
745
+ failed_today = p["failed_today"]
746
+ stuck = p["stuck_approved"]
747
+ last_ts = p["last_consequence_ts"]
748
+ if failed_today > 0 or stuck > 0:
749
+ signal = "red"
750
+ elif executed_today > 0:
751
+ if last_ts is not None:
752
+ if last_ts.tzinfo is None:
753
+ last_ts = last_ts.replace(tzinfo=UTC)
754
+ if last_ts >= p["cutoff_60m"]:
755
+ signal = "green"
756
+ else:
757
+ signal = "amber"
758
+ else:
759
+ signal = "green"
760
+ else:
761
+ signal = "amber"
762
+ rows = [(s, str(n)) for s, n in dist.items()]
763
+ rows.append(("Executed today", str(executed_today)))
764
+ rows.append(("Failed today", str(failed_today)))
765
+ rows.append(("Stuck (approved > 30m)", str(stuck)))
766
+ rows.append(("Last consequence", _age(p["last_consequence_ts"])))
767
+ panels.append(
768
+ _make_panel(
769
+ "Pipeline Moving",
770
+ signal,
771
+ f"{executed_today} executed today, {failed_today} failed today",
772
+ rows,
773
+ )
774
+ )
775
+ except Exception:
776
+ panels.append(
777
+ _make_panel("Pipeline Moving", "grey", "UNKNOWN — query failed", [])
778
+ )
779
+
780
+ # --- Panel 5: Autonomous Reach ---
781
+ try:
782
+ r = data["reach"]
783
+ dry_run_candidates = r["dry_run_candidates"]
784
+ abandoned = r["abandoned"]
785
+ in_flight = r["in_flight"]
786
+ if abandoned > 0:
787
+ signal = "red"
788
+ headline = (
789
+ f"{abandoned} finding{'s' if abandoned != 1 else ''} "
790
+ "abandoned — daemon cannot self-heal"
791
+ )
792
+ elif dry_run_candidates > 0:
793
+ signal = "amber"
794
+ headline = (
795
+ f"{dry_run_candidates} graduation candidate{'s' if dry_run_candidates != 1 else ''} "
796
+ "waiting"
797
+ )
798
+ else:
799
+ signal = "green"
800
+ headline = "Full autonomous reach — no blocked findings"
801
+ rows: list[tuple[str, str]] = [
802
+ ("Dry-run candidates (ready to graduate)", str(dry_run_candidates)),
803
+ ("Currently on ViolationExecutor path", str(in_flight)),
804
+ ("Abandoned (no path forward)", str(abandoned)),
805
+ ]
806
+ panels.append(_make_panel("Autonomous Reach", signal, headline, rows))
807
+ except Exception:
808
+ panels.append(
809
+ _make_panel("Autonomous Reach", "grey", "UNKNOWN — query failed", [])
810
+ )
811
+
812
+ return panels
813
+
814
+
815
+ @runtime_app.command("dashboard")
816
+ @async_command
817
+ # ID: e570aefa-1103-4edc-921a-47d7dc97b5fb
818
+ async def dashboard_cmd(
819
+ plain: bool = typer.Option(
820
+ False, "--plain", help="Plain text output (log/pipe friendly)."
821
+ ),
822
+ ) -> None:
823
+ """
824
+ Five-panel governor dashboard for the CORE runtime.
825
+
826
+ Shows convergence direction, governor inbox, loop health,
827
+ pipeline status, and governance coverage — all read-only.
828
+ """
829
+ async with get_session() as session:
830
+ data = await _query_dashboard_data(session)
831
+
832
+ if plain:
833
+ _render_dashboard_plain(data)
834
+ else:
835
+ _render_dashboard_rich(data)
836
+
837
+
838
+ # ID: c1a3d7e2-5f89-4b6c-a0d1-9e8f7c6b5a43
839
+ def _render_dashboard_rich(data: dict[str, Any]) -> None:
840
+ panels = _build_panels(data)
841
+ console.rule("[bold cyan]CORE Governor Dashboard[/bold cyan]")
842
+ console.print(panels[0])
843
+ console.print(Columns([panels[1], panels[2]], expand=True))
844
+ console.print(Columns([panels[3], panels[4]], expand=True))
845
+ console.rule()
846
+
847
+
848
+ # ID: d2b4e8f3-6a90-4c7d-b1e2-0f9a8d7c6b54
849
+ def _render_dashboard_plain(data: dict[str, Any]) -> None:
850
+ logger.info("=== CORE Governor Dashboard ===\n")
851
+
852
+ # Panel 1: Convergence — backlog trajectory over the lookback window.
853
+ try:
854
+ traj = data["convergence"]["trajectory"]
855
+ direction_label = {
856
+ "converging": "Converging (↓)",
857
+ "diverging": "Diverging (↑)",
858
+ "stable": "Stable (→)",
859
+ "insufficient-data": "Insufficient data",
860
+ }.get(traj["direction"], "Insufficient data")
861
+
862
+ current = traj["current"]
863
+ prior = traj["prior"]
864
+ delta = traj["delta"]
865
+ lookback = traj["lookback_hours"]
866
+
867
+ logger.info("-- Convergence Direction --")
868
+ logger.info(" direction: %s", direction_label)
869
+ logger.info(
870
+ " open_now: %s", str(current) if current is not None else "—"
871
+ )
872
+ logger.info(
873
+ " open_%dh_ago: %s",
874
+ lookback,
875
+ str(prior) if prior is not None else "—",
876
+ )
877
+ logger.info(
878
+ " delta: %s",
879
+ f"{delta:+d}" if delta is not None else "—",
880
+ )
881
+ except Exception:
882
+ logger.info("-- Convergence Direction: UNKNOWN --")
883
+
884
+ # Panel 2: Inbox
885
+ try:
886
+ inbox = data["inbox"]
887
+ logger.info("\n-- Governor Inbox --")
888
+ logger.info(" delegate: %s", inbox["delegate_count"])
889
+ logger.info(" approval: %s", inbox["approval_count"])
890
+ logger.info(" total: %s", inbox["total"])
891
+ except Exception:
892
+ logger.info("\n-- Governor Inbox: UNKNOWN --")
893
+
894
+ # Panel 3: Loop
895
+ try:
896
+ loop = data["loop"]
897
+ logger.info("\n-- Loop Running --")
898
+ logger.info(" active_workers: %s", loop["active_count"])
899
+ for name, age_str in loop["stale_workers"]:
900
+ logger.info(" stale: %s (%s)", name, age_str)
901
+ except Exception:
902
+ logger.info("\n-- Loop Running: UNKNOWN --")
903
+
904
+ # Panel 4: Pipeline
905
+ try:
906
+ p = data["pipeline"]
907
+ logger.info("\n-- Pipeline Moving --")
908
+ for status, cnt in p["distribution"].items():
909
+ logger.info(" %s %s", status.ljust(16), cnt)
910
+ logger.info(" executed_today: %s", p["executed_today"])
911
+ logger.info(" failed_today: %s", p["failed_today"])
912
+ logger.info(" stuck_approved: %s", p["stuck_approved"])
913
+ logger.info(" last_consequence: %s", _age(p["last_consequence_ts"]))
914
+ except Exception:
915
+ logger.info("\n-- Pipeline Moving: UNKNOWN --")
916
+
917
+ # Panel 5: Autonomous Reach
918
+ try:
919
+ r = data["reach"]
920
+ logger.info("\n-- Autonomous Reach --")
921
+ logger.info(" dry_run_candidates: %s", r["dry_run_candidates"])
922
+ logger.info(" in_flight: %s", r["in_flight"])
923
+ logger.info(" abandoned: %s", r["abandoned"])
924
+ except Exception:
925
+ logger.info("\n-- Autonomous Reach: UNKNOWN --")