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,337 @@
1
+ # src/cli/resources/workers/remediate.py
2
+ """
3
+ Remediation pipeline command.
4
+
5
+ Chains AuditViolationSensor → ViolationRemediator for a given audit rule.
6
+
7
+ Usage:
8
+ # Dry-run (default) — sense violations, run LLM + Canary, post proposed
9
+ # fixes to blackboard for review. Nothing written to src/.
10
+ core-admin workers remediate purity.no_ast_duplication
11
+
12
+ # Write mode — apply fixes, commit
13
+ core-admin workers remediate purity.no_ast_duplication --write
14
+
15
+ # Sense only — just post findings to blackboard, no LLM
16
+ core-admin workers remediate purity.no_ast_duplication --sense-only
17
+
18
+ # File mode — audit a single file across all rules, then remediate
19
+ core-admin workers remediate --file src/body/workers/violation_remediator.py
20
+ core-admin workers remediate --file src/body/workers/violation_remediator.py --write
21
+ """
22
+
23
+ from __future__ import annotations
24
+
25
+ import logging
26
+ import uuid
27
+ from pathlib import Path
28
+ from typing import Any
29
+
30
+ import typer
31
+ from rich.console import Console
32
+
33
+ from cli.utils.decorators import core_command
34
+ from shared.context import CoreContext
35
+ from shared.infrastructure.database.session_manager import get_session
36
+
37
+ from .run import workers_app
38
+
39
+
40
+ logger = logging.getLogger(__name__)
41
+ console = Console()
42
+
43
+
44
+ @workers_app.command("remediate")
45
+ @core_command(dangerous=True)
46
+ # ID: 75e79945-f796-49d5-ba87-783cae6233d0
47
+ async def remediate_cmd(
48
+ ctx: typer.Context,
49
+ rule: str = typer.Argument(
50
+ None, help="Audit rule ID to remediate (e.g. 'purity.no_ast_duplication')."
51
+ ),
52
+ write: bool = typer.Option(
53
+ False,
54
+ "--write",
55
+ help="Apply fixes to src/ and commit. Default is dry-run: LLM + Canary run but nothing is written.",
56
+ ),
57
+ sense_only: bool = typer.Option(
58
+ False,
59
+ "--sense-only",
60
+ help="Only run the sensor — post findings to blackboard, skip LLM.",
61
+ ),
62
+ file: str | None = typer.Option(
63
+ None,
64
+ "--file",
65
+ help=(
66
+ "Audit a single file across all rules, then remediate. "
67
+ "Mutually exclusive with rule and --sense-only. "
68
+ "Path must be relative to repo root."
69
+ ),
70
+ ),
71
+ ) -> None:
72
+ """
73
+ Run the autonomous remediation pipeline for a constitutional audit rule.
74
+
75
+ Default (dry-run): sensor finds violations → LLM proposes fix →
76
+ Canary validates → proposed fix posted to blackboard for review.
77
+
78
+ With --write: same pipeline but fix is applied to src/ and committed.
79
+
80
+ With --sense-only: only the sensor runs — violations are posted to
81
+ the blackboard but no LLM is invoked.
82
+
83
+ With --file: run a full audit scoped to a single file across all rules,
84
+ then feed findings directly into ViolationRemediator (bypasses sensor
85
+ and blackboard). Mutually exclusive with rule and --sense-only.
86
+
87
+ Examples:
88
+ # Dry-run — review proposed fixes on the blackboard first
89
+ core-admin workers remediate purity.no_ast_duplication
90
+
91
+ # Apply fixes
92
+ core-admin workers remediate purity.no_ast_duplication --write
93
+
94
+ # Just sense — populate blackboard, no LLM
95
+ core-admin workers remediate purity.no_ast_duplication --sense-only
96
+
97
+ # File mode — audit one file, remediate all violations found
98
+ core-admin workers remediate --file src/body/workers/violation_remediator.py
99
+ """
100
+ # --- mutual exclusion checks ---
101
+ if file and rule:
102
+ logger.info(
103
+ "--file and rule are mutually exclusive. "
104
+ "Use --file to audit a single file across all rules, "
105
+ "or provide a rule argument to use the sensor pipeline."
106
+ )
107
+ raise typer.Exit(code=1)
108
+
109
+ if file and sense_only:
110
+ logger.info(
111
+ "--file and --sense-only are incompatible. "
112
+ "--file already runs the audit; there is nothing to sense."
113
+ )
114
+ raise typer.Exit(code=1)
115
+
116
+ if not file and not rule:
117
+ logger.info("Either a rule argument or --file option is required.")
118
+ raise typer.Exit(code=1)
119
+
120
+ core_context: CoreContext = ctx.obj
121
+ async with get_session() as session:
122
+ await core_context.cognitive_service.initialize(session)
123
+
124
+ if file:
125
+ await _run_file_pipeline(core_context, file, write)
126
+ else:
127
+ await _run_rule_pipeline(core_context, rule, write, sense_only)
128
+
129
+
130
+ async def _run_file_pipeline(
131
+ core_context: CoreContext,
132
+ file_path: str,
133
+ write: bool,
134
+ ) -> None:
135
+ """Audit a single file across all rules, then feed findings into ViolationRemediator."""
136
+ from mind.governance.audit_context import AuditorContext
137
+ from mind.governance.auditor import ConstitutionalAuditor
138
+ from will.workers.violation_remediator_body import ViolationRemediator
139
+
140
+ repo_root: Path = core_context.git_service.repo_path
141
+ abs_path = repo_root / file_path
142
+
143
+ if not abs_path.is_file():
144
+ logger.info("File not found: %s (resolved to %s)", file_path, abs_path)
145
+ raise typer.Exit(code=1)
146
+
147
+ mode = "WRITE" if write else "DRY-RUN"
148
+ logger.info(
149
+ "Remediation pipeline (file mode) file=%s mode=%s",
150
+ file_path,
151
+ mode,
152
+ )
153
+
154
+ # Step 1 — File-scoped full audit
155
+ logger.info("Step 1/2 - Full audit scoped to %s", file_path)
156
+
157
+ auditor_context: AuditorContext = core_context.auditor_context
158
+ async with get_session() as session:
159
+ auditor_context.db_session = session
160
+ await auditor_context.load_knowledge_graph()
161
+ auditor = ConstitutionalAuditor(auditor_context)
162
+ result = await auditor.run_full_audit_async()
163
+ auditor_context.db_session = None
164
+
165
+ all_findings = result.get("findings", [])
166
+ file_findings = _filter_findings_for_file(all_findings, file_path)
167
+
168
+ if not file_findings:
169
+ logger.info("No violations found in %s", file_path)
170
+ return
171
+
172
+ logger.info(
173
+ "Found %d violation(s) in %s across %d rule(s)",
174
+ len(file_findings),
175
+ file_path,
176
+ len({f["rule"] for f in file_findings}),
177
+ )
178
+
179
+ # Step 2 — Feed findings into ViolationRemediator directly
180
+ logger.info("Step 2/2 - ViolationRemediator (file mode)")
181
+
182
+ # Build synthetic blackboard-style finding dicts that ViolationRemediator expects.
183
+ synthetic_findings = _build_synthetic_findings(file_findings, file_path)
184
+
185
+ # Determine a combined target_rule label for the remediator.
186
+ unique_rules = sorted({f["rule"] for f in file_findings})
187
+ target_rule = unique_rules[0] if len(unique_rules) == 1 else "file-audit"
188
+
189
+ remediator = ViolationRemediator(
190
+ core_context=core_context, target_rule=target_rule, write=write
191
+ )
192
+
193
+ # Bypass blackboard: override _claim_open_findings to return our findings,
194
+ # and _mark_finding / _mark_findings to no-op (no blackboard entries exist).
195
+ async def _injected_claim() -> list[dict[str, Any]]:
196
+ return synthetic_findings
197
+
198
+ async def _noop_mark_findings(findings: list[dict[str, Any]], status: str) -> None:
199
+ pass
200
+
201
+ async def _noop_mark_finding(finding_id: str, status: str) -> None:
202
+ pass
203
+
204
+ remediator._claim_open_findings = _injected_claim # type: ignore[assignment]
205
+ remediator._mark_findings = _noop_mark_findings # type: ignore[assignment]
206
+ remediator._mark_finding = _noop_mark_finding # type: ignore[assignment]
207
+
208
+ await remediator.start()
209
+ logger.info("Remediator complete.")
210
+
211
+ console.print()
212
+ if write:
213
+ logger.info(
214
+ "Pipeline complete in WRITE mode. "
215
+ "Fixes applied and committed. Run audit to verify:"
216
+ )
217
+ logger.info(" core-admin code audit")
218
+ else:
219
+ logger.info(
220
+ "Pipeline complete in DRY-RUN mode. "
221
+ "Proposed fixes are on the blackboard. Review them:"
222
+ )
223
+ logger.info(
224
+ " core-admin workers blackboard --filter 'audit.remediation.dry_run'"
225
+ )
226
+ logger.info("\nWhen satisfied, apply with:")
227
+ logger.info(" core-admin workers remediate --file %s --write", file_path)
228
+
229
+
230
+ def _filter_findings_for_file(
231
+ findings: list[Any], target_file: str
232
+ ) -> list[dict[str, Any]]:
233
+ """Filter audit findings to only those matching the target file path."""
234
+ result = []
235
+ for f in findings:
236
+ if isinstance(f, dict):
237
+ fp = f.get("file_path") or ""
238
+ check_id = f.get("check_id", "unknown")
239
+ message = f.get("message", "")
240
+ severity = str(f.get("severity", "warning"))
241
+ line_number = f.get("line_number")
242
+ else:
243
+ fp = getattr(f, "file_path", None) or ""
244
+ check_id = getattr(f, "check_id", "unknown")
245
+ message = getattr(f, "message", "")
246
+ severity = str(getattr(f, "severity", "warning"))
247
+ line_number = getattr(f, "line_number", None)
248
+
249
+ if fp == target_file:
250
+ result.append(
251
+ {
252
+ "file_path": fp,
253
+ "rule": check_id,
254
+ "message": message,
255
+ "severity": severity,
256
+ "line_number": line_number,
257
+ }
258
+ )
259
+ return result
260
+
261
+
262
+ def _build_synthetic_findings(
263
+ file_findings: list[dict[str, Any]], file_path: str
264
+ ) -> list[dict[str, Any]]:
265
+ """Convert filtered audit findings into the blackboard-entry format ViolationRemediator expects."""
266
+ synthetic = []
267
+ for f in file_findings:
268
+ synthetic.append(
269
+ {
270
+ "id": str(uuid.uuid4()),
271
+ "payload": {
272
+ "file_path": file_path,
273
+ "rule": f["rule"],
274
+ "message": f["message"],
275
+ "severity": f["severity"],
276
+ "line_number": f.get("line_number"),
277
+ "status": "unprocessed",
278
+ },
279
+ }
280
+ )
281
+ return synthetic
282
+
283
+
284
+ async def _run_rule_pipeline(
285
+ core_context: CoreContext,
286
+ rule: str,
287
+ write: bool,
288
+ sense_only: bool,
289
+ ) -> None:
290
+ """Original rule-based pipeline: AuditViolationSensor → ViolationRemediator."""
291
+ from will.workers.audit_violation_sensor import AuditViolationSensor
292
+ from will.workers.violation_remediator_body import ViolationRemediator
293
+
294
+ mode = "SENSE-ONLY" if sense_only else "WRITE" if write else "DRY-RUN"
295
+ logger.info(
296
+ "Remediation pipeline rule=%s mode=%s",
297
+ rule,
298
+ mode,
299
+ )
300
+ logger.info("Step 1/2 - AuditViolationSensor")
301
+ sensor = AuditViolationSensor(
302
+ core_context=core_context,
303
+ declaration_name=f"audit_sensor_{rule.split('.')[0]}",
304
+ rule_namespace=rule,
305
+ dry_run=not write,
306
+ )
307
+ await sensor.start()
308
+ logger.info("Sensor complete.")
309
+ if sense_only:
310
+ logger.info("--sense-only: skipping remediator. Check blackboard for findings:")
311
+ logger.info(
312
+ " core-admin workers blackboard --filter 'audit.violation::%s'", rule
313
+ )
314
+ return
315
+ logger.info("Step 2/2 - ViolationRemediator")
316
+ remediator = ViolationRemediator(
317
+ core_context=core_context, target_rule=rule, write=write
318
+ )
319
+ await remediator.start()
320
+ logger.info("Remediator complete.")
321
+ console.print()
322
+ if write:
323
+ logger.info(
324
+ "Pipeline complete in WRITE mode. "
325
+ "Fixes applied and committed. Run audit to verify:"
326
+ )
327
+ logger.info(" core-admin code audit")
328
+ else:
329
+ logger.info(
330
+ "Pipeline complete in DRY-RUN mode. "
331
+ "Proposed fixes are on the blackboard. Review them:"
332
+ )
333
+ logger.info(
334
+ " core-admin workers blackboard --filter 'audit.remediation.dry_run'"
335
+ )
336
+ logger.info("\nWhen satisfied, apply with:")
337
+ logger.info(" core-admin workers remediate %s --write", rule)
@@ -0,0 +1,140 @@
1
+ # src/cli/resources/workers/run.py
2
+ """Worker run command — starts a constitutional worker by declaration name."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import logging
7
+ from pathlib import Path
8
+ from typing import Any
9
+
10
+ import typer
11
+ import yaml
12
+ from rich.console import Console
13
+
14
+ from cli.utils.decorators import core_command
15
+ from shared.config import settings
16
+ from shared.context import CoreContext
17
+ from shared.infrastructure.database.session_manager import get_session
18
+
19
+
20
+ logger = logging.getLogger(__name__)
21
+ console = Console()
22
+ workers_app = typer.Typer(
23
+ help="Constitutional worker management.", no_args_is_help=True
24
+ )
25
+
26
+
27
+ def _load_worker_declarations() -> dict[str, dict]:
28
+ """
29
+ Discover all active worker declarations from .intent/workers/.
30
+
31
+ Returns a dict keyed by declaration name (YAML stem), value is the
32
+ parsed declaration dict. Only active workers are included.
33
+
34
+ This is the constitutional alternative to a hardcoded Python registry —
35
+ adding a new worker requires only a YAML declaration, not a code change.
36
+ """
37
+ workers_dir: Path = settings.MIND / "workers"
38
+ if not workers_dir.exists():
39
+ return {}
40
+ declarations = {}
41
+ for yaml_path in sorted(workers_dir.glob("*.yaml")):
42
+ try:
43
+ data = yaml.safe_load(yaml_path.read_text(encoding="utf-8"))
44
+ if data.get("metadata", {}).get("status") != "active":
45
+ continue
46
+ impl = data.get("implementation")
47
+ if not impl or not impl.get("module") or (not impl.get("class")):
48
+ logger.warning(
49
+ "Worker declaration '%s' is missing implementation block — skipped.",
50
+ yaml_path.stem,
51
+ )
52
+ continue
53
+ declarations[yaml_path.stem] = data
54
+ except Exception as e:
55
+ logger.warning("Could not load worker declaration %s: %s", yaml_path, e)
56
+ return declarations
57
+
58
+
59
+ @workers_app.command("run")
60
+ @core_command(dangerous=False)
61
+ # ID: ed6afc60-992e-4695-9a64-59844ec6be65
62
+ async def workers_run_cmd(
63
+ ctx: typer.Context,
64
+ worker_name: str = typer.Argument(
65
+ ..., help="Worker declaration name (e.g. doc_worker)."
66
+ ),
67
+ ) -> None:
68
+ """Start a constitutional worker by its declaration name."""
69
+ import importlib
70
+
71
+ declarations = _load_worker_declarations()
72
+ if worker_name not in declarations:
73
+ available = ", ".join(sorted(declarations.keys())) or "(none declared)"
74
+ console.print(f"[red]Unknown worker: {worker_name}[/red]")
75
+ console.print(f"Available: {available}")
76
+ raise typer.Exit(code=1)
77
+ declaration = declarations[worker_name]
78
+ impl = declaration["implementation"]
79
+ module_path: str = impl["module"]
80
+ class_name: str = impl["class"]
81
+ needs_context: bool = impl.get("requires_core_context", False)
82
+ core_context: CoreContext = ctx.obj
83
+ async with get_session() as session:
84
+ await core_context.cognitive_service.initialize(session)
85
+ module = importlib.import_module(module_path)
86
+ worker_class = getattr(module, class_name)
87
+
88
+ # Replicate the daemon's constructor-kwargs build (see _run_daemon in
89
+ # cli/commands/daemon.py) so parameterised workers — those declaring
90
+ # mandate.scope.rule_namespace or implementation.params — receive the
91
+ # same arguments they get under the daemon. Without this, sensors like
92
+ # AuditViolationSensor TypeError on missing rule_namespace (#262).
93
+ kwargs: dict[str, Any] = {"declaration_name": worker_name}
94
+ rule_namespace = (
95
+ declaration.get("mandate", {}).get("scope", {}).get("rule_namespace", "")
96
+ )
97
+ if rule_namespace:
98
+ kwargs["rule_namespace"] = rule_namespace
99
+
100
+ extra_params = impl.get("params") or {}
101
+ if extra_params:
102
+ protected = {
103
+ "declaration_name",
104
+ "rule_namespace",
105
+ "core_context",
106
+ "cognitive_service",
107
+ }
108
+ clashes = set(extra_params) & protected
109
+ if clashes:
110
+ logger.warning(
111
+ "Worker '%s' implementation.params contains protected keys "
112
+ "%s — they will be ignored.",
113
+ worker_name,
114
+ clashes,
115
+ )
116
+ extra_params = {k: v for k, v in extra_params.items() if k not in protected}
117
+ kwargs.update(extra_params)
118
+
119
+ cog_svc = core_context.cognitive_service
120
+
121
+ # Single fallback to bare instantiation handles workers whose
122
+ # __init__ takes no args and rely on a class-level declaration_name
123
+ # (e.g. ObserverWorker). Anything more elaborate belongs in the daemon's
124
+ # _instantiate_worker, not the CLI run path.
125
+ if needs_context:
126
+ try:
127
+ worker = worker_class(core_context=core_context, **kwargs)
128
+ except TypeError:
129
+ worker = worker_class(core_context=core_context)
130
+ else:
131
+ try:
132
+ worker = worker_class(cognitive_service=cog_svc, **kwargs)
133
+ except TypeError:
134
+ worker = worker_class()
135
+
136
+ if not worker.declaration_name:
137
+ worker.declaration_name = worker_name
138
+ console.print(f"[bold green]Starting worker: {worker_name}[/bold green]")
139
+ await worker.start()
140
+ console.print(f"[bold green]Worker {worker_name} completed.[/bold green]")
cli/utils/__init__.py ADDED
@@ -0,0 +1,32 @@
1
+ # src/cli/utils/__init__.py
2
+
3
+ """
4
+ Modularized Package Entry Point (V2.3).
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from .decorators import COMMAND_REGISTRY, async_command, core_command
10
+ from .display import (
11
+ console,
12
+ display_error,
13
+ display_info,
14
+ display_success,
15
+ display_warning,
16
+ )
17
+ from .helpers import deprecated_command
18
+ from .prompts import confirm_action
19
+
20
+
21
+ __all__ = [
22
+ "COMMAND_REGISTRY",
23
+ "async_command",
24
+ "confirm_action",
25
+ "console",
26
+ "core_command",
27
+ "deprecated_command",
28
+ "display_error",
29
+ "display_info",
30
+ "display_success",
31
+ "display_warning",
32
+ ]
@@ -0,0 +1,154 @@
1
+ # src/cli/utils/annotation_formatter.py
2
+
3
+ """F-10.2 — GitHub Actions workflow-command annotation formatter.
4
+
5
+ Renders the F-10.1a stateless-audit payload as GitHub Actions
6
+ workflow-command lines so findings surface inline in PR diff view
7
+ (next to the offending line) rather than only in the workflow log.
8
+
9
+ Format per GitHub Actions documentation:
10
+
11
+ ::error file=PATH,line=N,col=N::MESSAGE
12
+ ::warning file=PATH,line=N,col=N::MESSAGE
13
+ ::notice file=PATH,line=N,col=N::MESSAGE
14
+
15
+ ADR-085 §D5 lists "PR annotations + merge-blocking demonstrated
16
+ against a real external repo" as the F-10 exit criterion. The
17
+ annotation channel is the user-visible surface of the gate — findings
18
+ only in the workflow log are effectively invisible in a developer's
19
+ PR review flow.
20
+
21
+ Severity-to-channel mapping (constitutional contract):
22
+
23
+ | CORE severity | GH channel | Merge-block? | Why |
24
+ |---------------|------------|--------------|----------------------------------|
25
+ | blocking | error | yes | gate's whole point |
26
+ | high | error | yes | parse_min_severity default |
27
+ | medium | warning | no | visible in PR, doesn't block |
28
+ | low | notice | no | informational |
29
+ | info | notice | no | informational |
30
+
31
+ Skipped rules (from F-10.1a's `skipped_rules` field) are emitted as
32
+ notices so the operator sees them in the workflow log, but they do not
33
+ appear inline in the diff (no file/line). This preserves the honesty
34
+ commitment from F-10.1a — degraded coverage is surfaced, not silent.
35
+ """
36
+
37
+ from __future__ import annotations
38
+
39
+ from typing import Any
40
+
41
+
42
+ _SEVERITY_TO_CHANNEL: dict[str, str] = {
43
+ "blocking": "error",
44
+ "block": "error",
45
+ "high": "error",
46
+ "medium": "warning",
47
+ "low": "notice",
48
+ "info": "notice",
49
+ }
50
+
51
+ # The 'error' channel is what GitHub uses to fail required status
52
+ # checks; merge-blocking is keyed off this. Documented here so a future
53
+ # maintainer can audit the merge-block surface in one place.
54
+ _MERGE_BLOCKING_CHANNELS: frozenset[str] = frozenset({"error"})
55
+
56
+
57
+ # ID: 496df0ee-c556-41ba-b894-05e5979b2f64
58
+ def severity_to_channel(severity: str) -> str:
59
+ """Map a CORE severity string to a GH annotation channel.
60
+
61
+ Unknown severities fall back to ``notice`` (visible but non-blocking).
62
+ This is the safer default: a misclassified finding still surfaces
63
+ rather than getting silently swallowed.
64
+ """
65
+ return _SEVERITY_TO_CHANNEL.get(severity.lower(), "notice")
66
+
67
+
68
+ # ID: 9922cc55-939c-435d-94a3-74af7e048f04
69
+ def format_finding(finding: dict[str, Any]) -> str:
70
+ """Format a single finding as one GH workflow-command line.
71
+
72
+ Newlines and ``%``/``\\r`` characters in the message are URL-encoded
73
+ per GitHub's escaping rules; otherwise a multi-line message breaks
74
+ the workflow-command parser and the annotation never renders.
75
+ """
76
+ severity = str(finding.get("severity", "info"))
77
+ channel = severity_to_channel(severity)
78
+
79
+ file_path = finding.get("file", "")
80
+ line_no = finding.get("line", 1) or 1
81
+ raw_message = str(finding.get("message", "") or finding.get("rule_id", ""))
82
+ rule_id = finding.get("rule_id", "")
83
+ title = f"{rule_id} [{severity}]" if rule_id else severity
84
+
85
+ # GH's workflow-command parser breaks on raw newlines and on the
86
+ # literal characters % \r \n inside the message. Encode per the GH
87
+ # documentation: %25 %0D %0A.
88
+ safe_message = (
89
+ raw_message.replace("%", "%25").replace("\r", "%0D").replace("\n", "%0A")
90
+ )
91
+ safe_title = title.replace("%", "%25").replace("\r", "%0D").replace("\n", "%0A")
92
+
93
+ parts = [f"file={file_path}", f"line={line_no}", f"title={safe_title}"]
94
+ return f"::{channel} {','.join(parts)}::{safe_message}"
95
+
96
+
97
+ # ID: 319d626b-b926-4ab0-abf0-9df4cb07419a
98
+ def format_skipped_rule(skipped: dict[str, str]) -> str:
99
+ """Format one skipped-rule entry as a GH notice (no file/line).
100
+
101
+ Skipped rules surface as workflow-log notices so the operator sees
102
+ the F-10.1a honesty signal (which rules ran vs. were skipped) but
103
+ they do not appear in the PR diff. CI users learn about reduced
104
+ coverage from the workflow output, not from the absence of
105
+ annotations.
106
+ """
107
+ rule_id = skipped.get("rule_id", "")
108
+ reason = skipped.get("reason", "skipped").replace("%", "%25")
109
+ return f"::notice title=Rule skipped: {rule_id}::{reason}"
110
+
111
+
112
+ # ID: 2bc4a2c5-b119-40d1-88b4-27ee32978c5d
113
+ def format_payload(payload: dict[str, Any]) -> str:
114
+ """Render the full F-10.1a payload as GH workflow-command lines.
115
+
116
+ Returns a newline-joined string; trailing newline included so the
117
+ last annotation parses correctly. Suitable for direct write to
118
+ stdout from the CLI's --format=github-annotations path.
119
+
120
+ Output order:
121
+ 1. One line per finding (file/line/severity/message)
122
+ 2. One line per skipped rule (workflow-log notice, no file/line)
123
+ 3. One summary line on stderr-style notice (verdict + counts)
124
+
125
+ The summary appears last so a downstream consumer that truncates at
126
+ the first annotation still sees per-finding lines first.
127
+ """
128
+ lines: list[str] = []
129
+ findings = payload.get("findings", []) or []
130
+ for finding in findings:
131
+ lines.append(format_finding(finding))
132
+
133
+ skipped = payload.get("skipped_rules", []) or []
134
+ for entry in skipped:
135
+ lines.append(format_skipped_rule(entry))
136
+
137
+ verdict = payload.get("verdict", "UNKNOWN")
138
+ finding_count = len(findings)
139
+ skipped_count = len(skipped)
140
+ summary = (
141
+ f"CORE audit (stateless): verdict={verdict} "
142
+ f"findings={finding_count} skipped_rules={skipped_count}"
143
+ )
144
+ lines.append(f"::notice title=CORE audit summary::{summary}")
145
+
146
+ return "\n".join(lines) + "\n"
147
+
148
+
149
+ __all__ = [
150
+ "format_finding",
151
+ "format_payload",
152
+ "format_skipped_rule",
153
+ "severity_to_channel",
154
+ ]