code-coordinator 0.5.80__tar.gz → 0.5.82__tar.gz

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 (829) hide show
  1. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/CLAUDE.md +19 -3
  2. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/PKG-INFO +1 -1
  3. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/code_coordinator.egg-info/PKG-INFO +1 -1
  4. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/code_coordinator.egg-info/SOURCES.txt +3 -0
  5. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/code_coordinator.egg-info/scm_file_list.json +3 -0
  6. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/code_coordinator.egg-info/scm_version.json +2 -2
  7. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/agent.py +211 -40
  8. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/agent_app.py +80 -0
  9. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/commands/repo.py +131 -5
  10. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/commands/status.py +7 -6
  11. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/graph_health.py +282 -9
  12. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/health/checks/graph.py +15 -1
  13. code_coordinator-0.5.82/coord/health/checks/graphify_cli.py +87 -0
  14. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/providers/opencode.py +13 -0
  15. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/repo_onboard.py +438 -10
  16. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/worker_events.py +225 -0
  17. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/docs/ARCHITECTURE.md +32 -6
  18. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/docs/GRAPHIFY_SETUP.md +74 -0
  19. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_agent.py +144 -0
  20. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_agent_graph_self_heal.py +11 -2
  21. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_graph_health.py +37 -0
  22. code_coordinator-0.5.82/tests/test_graph_selfheal_absent_2237.py +212 -0
  23. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_health_checks.py +74 -0
  24. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_health_context.py +4 -0
  25. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_providers.py +41 -0
  26. code_coordinator-0.5.82/tests/test_repo_graph_fleet_2237.py +632 -0
  27. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_repo_onboard_2220.py +32 -1
  28. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_worker_events.py +239 -0
  29. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/.claude/commands/board.md +0 -0
  30. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/.claude/commands/complete-session.md +0 -0
  31. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/.claude/commands/coordinator.md +0 -0
  32. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/.githooks/_lib.sh +0 -0
  33. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/.githooks/post-checkout +0 -0
  34. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/.githooks/post-commit +0 -0
  35. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/.githooks/post-merge +0 -0
  36. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  37. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/.github/coord-ci-acceptance.yml +0 -0
  38. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/.github/workflows/auto-release.yml +0 -0
  39. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/.github/workflows/cargo-test.yml +0 -0
  40. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/.github/workflows/publish.yml +0 -0
  41. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/.github/workflows/release-tui.yml +0 -0
  42. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/.github/workflows/test.yml +0 -0
  43. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/.gitignore +0 -0
  44. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/GOAL.md +0 -0
  45. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/LICENSE +0 -0
  46. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/MANIFEST.in +0 -0
  47. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/README.md +0 -0
  48. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/code_coordinator.egg-info/dependency_links.txt +0 -0
  49. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/code_coordinator.egg-info/entry_points.txt +0 -0
  50. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/code_coordinator.egg-info/requires.txt +0 -0
  51. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/code_coordinator.egg-info/top_level.txt +0 -0
  52. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/__init__.py +0 -0
  53. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/_board_mapping.py +0 -0
  54. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/acceptance.py +0 -0
  55. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/acceptance_drivers.py +0 -0
  56. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/agent_update.py +0 -0
  57. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/agents/opencode/.gitignore +0 -0
  58. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/agents/opencode/agents/work.md +0 -0
  59. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/agents/opencode/routing.jsonc +0 -0
  60. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/audit.py +0 -0
  61. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/auto_loop.py +0 -0
  62. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/board_bool_guard.py +0 -0
  63. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/board_service.py +0 -0
  64. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/board_wire.py +0 -0
  65. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/brain.py +0 -0
  66. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/branch_model.py +0 -0
  67. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/bug_intake.py +0 -0
  68. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/cargo_cache.py +0 -0
  69. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/ci_github.py +0 -0
  70. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/ci_store.py +0 -0
  71. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/claim.py +0 -0
  72. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/cli.py +0 -0
  73. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/client.py +0 -0
  74. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/commands/__init__.py +0 -0
  75. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/commands/_common.py +0 -0
  76. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/commands/acceptance.py +0 -0
  77. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/commands/agent_ops.py +0 -0
  78. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/commands/audit.py +0 -0
  79. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/commands/chat.py +0 -0
  80. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/commands/dispatch.py +0 -0
  81. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/commands/dispatch_workers.py +0 -0
  82. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/commands/drive.py +0 -0
  83. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/commands/drive_queue.py +0 -0
  84. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/commands/gate_a.py +0 -0
  85. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/commands/gates.py +0 -0
  86. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/commands/issues.py +0 -0
  87. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/commands/lifecycle.py +0 -0
  88. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/commands/merge.py +0 -0
  89. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/commands/milestone.py +0 -0
  90. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/commands/plan_followup.py +0 -0
  91. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/commands/plans.py +0 -0
  92. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/commands/portal.py +0 -0
  93. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/commands/release.py +0 -0
  94. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/commands/report.py +0 -0
  95. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/commands/review.py +0 -0
  96. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/commands/scorecard.py +0 -0
  97. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/commands/sessions.py +0 -0
  98. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/commands/setup.py +0 -0
  99. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/commands/terminal.py +0 -0
  100. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/commands/test_gate.py +0 -0
  101. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/commands/tui.py +0 -0
  102. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/comments.py +0 -0
  103. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/config.py +0 -0
  104. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/conflict_fix.py +0 -0
  105. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dao.py +0 -0
  106. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/__init__.py +0 -0
  107. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/fixture.py +0 -0
  108. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/index.html +0 -0
  109. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/server.py +0 -0
  110. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/terminal.py +0 -0
  111. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/.gitignore +0 -0
  112. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/components.json +0 -0
  113. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js +0 -0
  114. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  115. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js +0 -0
  116. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js +0 -0
  117. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  118. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  119. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  120. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  121. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  122. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/dist/index.html +0 -0
  123. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  124. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/dist/sw.js +0 -0
  125. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  126. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  127. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  128. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  129. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  130. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  131. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  132. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  133. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  134. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  135. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/eslint.config.js +0 -0
  136. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/index.html +0 -0
  137. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  138. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/package-lock.json +0 -0
  139. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/package.json +0 -0
  140. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  141. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/playwright.config.ts +0 -0
  142. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/postcss.config.js +0 -0
  143. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  144. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  145. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  146. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/App.tsx +0 -0
  147. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/api/client.ts +0 -0
  148. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  149. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  150. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  151. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  152. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  153. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  154. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  155. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  156. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  157. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  158. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  159. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  160. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  161. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  162. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  163. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  164. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  165. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  166. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  167. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  168. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  169. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  170. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  171. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  172. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  173. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  174. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  175. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  176. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  177. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  178. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  179. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  180. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  181. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  182. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  183. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/index.css +0 -0
  184. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  185. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  186. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/main.tsx +0 -0
  187. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  188. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  189. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  190. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  191. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  192. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  193. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  194. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  195. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  196. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  197. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  198. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  199. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  200. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  201. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  202. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  203. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  204. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  205. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  206. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  207. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  208. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  209. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  210. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/tailwind.config.js +0 -0
  211. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/tsconfig.json +0 -0
  212. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  213. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dashboard/webapp/vite.config.ts +0 -0
  214. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/db.py +0 -0
  215. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dead_end.py +0 -0
  216. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/deploy/README.md +0 -0
  217. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/deploy/coord-agent.service +0 -0
  218. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/deploy/coord-db-backup.service +0 -0
  219. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/deploy/coord-db-backup.sh +0 -0
  220. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/deploy/coord-db-backup.timer +0 -0
  221. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/deploy/coord-drive-queue.service +0 -0
  222. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/deploy/coord-drive-queue.timer +0 -0
  223. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/deploy/coord-notify.service +0 -0
  224. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/deploy/coord-notify.timer +0 -0
  225. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/deploy/coord-release-propagate.service +0 -0
  226. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/deploy/coord-release-propagate.timer +0 -0
  227. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/deploy/coord-release-window.service +0 -0
  228. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/deploy/coord-release-window.timer +0 -0
  229. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/deploy/coord-serve.service +0 -0
  230. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/deploy/coord-web-dist-build.service +0 -0
  231. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/deploy/coord-web-dist-build.timer +0 -0
  232. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/deploy/coord-web.service +0 -0
  233. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/deploy_manifest.py +0 -0
  234. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/deploy_units.py +0 -0
  235. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/deps.py +0 -0
  236. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/diagnose.py +0 -0
  237. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dispatch.py +0 -0
  238. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/dist_name.py +0 -0
  239. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/drive.py +0 -0
  240. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/drive_queue.py +0 -0
  241. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/drive_state.py +0 -0
  242. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/events.py +0 -0
  243. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/failure_class.py +0 -0
  244. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/filelock.py +0 -0
  245. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/fleet_config_health.py +0 -0
  246. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/freshness.py +0 -0
  247. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/gate_a.py +0 -0
  248. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/gate_b.py +0 -0
  249. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/gate_snapshot.py +0 -0
  250. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/gates.py +0 -0
  251. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/github_ops.py +0 -0
  252. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/goal.py +0 -0
  253. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/health/__init__.py +0 -0
  254. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/health/aggregate.py +0 -0
  255. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/health/checks/__init__.py +0 -0
  256. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/health/checks/agent_install.py +0 -0
  257. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/health/checks/cargo_targets.py +0 -0
  258. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/health/checks/claude_binary.py +0 -0
  259. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/health/checks/deploy_lane_facts.py +0 -0
  260. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/health/checks/disk.py +0 -0
  261. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/health/checks/fleet_board.py +0 -0
  262. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  263. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/health/checks/fleet_phantom.py +0 -0
  264. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/health/checks/fleet_unit_drift.py +0 -0
  265. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/health/checks/plan_usage.py +0 -0
  266. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/health/checks/repo_state.py +0 -0
  267. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/health/checks/spawned_coord.py +0 -0
  268. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/health/checks/timer_active.py +0 -0
  269. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/health/checks/toolchain.py +0 -0
  270. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/health/checks/unit_drift.py +0 -0
  271. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/health/checks/unit_enablement.py +0 -0
  272. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/health/checks/worktrees.py +0 -0
  273. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/health/cli.py +0 -0
  274. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/health/context.py +0 -0
  275. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/health/fleet_snapshot.py +0 -0
  276. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/health/models.py +0 -0
  277. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/health/pypi.py +0 -0
  278. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/health/registry.py +0 -0
  279. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/health/render.py +0 -0
  280. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/health/units.py +0 -0
  281. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/hooks.py +0 -0
  282. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/housekeeping.py +0 -0
  283. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/interactive.py +0 -0
  284. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/issue_store.py +0 -0
  285. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/liveness_auditor.py +0 -0
  286. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/machine_pause.py +0 -0
  287. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/merge_queue.py +0 -0
  288. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/milestone_chat.py +0 -0
  289. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/milestone_dispatch.py +0 -0
  290. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/milestone_gate.py +0 -0
  291. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/milestone_order.py +0 -0
  292. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/mock_author.py +0 -0
  293. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/models.py +0 -0
  294. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/network.py +0 -0
  295. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/new_issue_chat.py +0 -0
  296. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/notifier/__init__.py +0 -0
  297. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/notifier/baseline.py +0 -0
  298. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/notifier/cli.py +0 -0
  299. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/notifier/collect.py +0 -0
  300. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/notifier/digest.py +0 -0
  301. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/notifier/models.py +0 -0
  302. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/notifier/predicate.py +0 -0
  303. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/notifier/service.py +0 -0
  304. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/notifier/store.py +0 -0
  305. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/notifier/transport.py +0 -0
  306. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/notify.py +0 -0
  307. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/openapi.py +0 -0
  308. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/overlap_fence.py +0 -0
  309. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/parentage.py +0 -0
  310. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/parentage_github.py +0 -0
  311. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/pipeline.py +0 -0
  312. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/plan_parser.py +0 -0
  313. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/plans.py +0 -0
  314. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/platform_paths.py +0 -0
  315. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/portal_bridge.py +0 -0
  316. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/pr_body_lint.py +0 -0
  317. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/prereqs.py +0 -0
  318. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/progress.py +0 -0
  319. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/providers/__init__.py +0 -0
  320. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/providers/base.py +0 -0
  321. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/providers/claude.py +0 -0
  322. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/providers/claude_pty.py +0 -0
  323. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/reconcile.py +0 -0
  324. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/refine_chat.py +0 -0
  325. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/release_cordon.py +0 -0
  326. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/release_propagate.py +0 -0
  327. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/release_verify.py +0 -0
  328. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/release_window.py +0 -0
  329. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/repo_edit.py +0 -0
  330. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/reports.py +0 -0
  331. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/revalidate.py +0 -0
  332. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/review.py +0 -0
  333. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/scorecard.py +0 -0
  334. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/serve_app.py +0 -0
  335. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/skills/update-issue/SKILL.md +0 -0
  336. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/smoke.py +0 -0
  337. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/spend_ceiling.py +0 -0
  338. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/split_work.py +0 -0
  339. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/stage_projection.py +0 -0
  340. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/state.py +0 -0
  341. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/test_author.py +0 -0
  342. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/test_chat.py +0 -0
  343. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/test_orchestrator.py +0 -0
  344. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/test_report.py +0 -0
  345. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/tui_release.py +0 -0
  346. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/usage.py +0 -0
  347. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/usage_limits.py +0 -0
  348. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coord/usage_rollup.py +0 -0
  349. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/coordinator.example.yml +0 -0
  350. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/deploy/coord-agent.service +0 -0
  351. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/deploy/coord-db-backup.service +0 -0
  352. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/deploy/coord-db-backup.sh +0 -0
  353. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/deploy/coord-db-backup.timer +0 -0
  354. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/deploy/coord-drive-queue.service +0 -0
  355. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/deploy/coord-drive-queue.timer +0 -0
  356. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/deploy/coord-notify.service +0 -0
  357. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/deploy/coord-notify.timer +0 -0
  358. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/deploy/coord-release-propagate.service +0 -0
  359. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/deploy/coord-release-propagate.timer +0 -0
  360. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/deploy/coord-release-window.service +0 -0
  361. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/deploy/coord-release-window.timer +0 -0
  362. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/deploy/coord-serve.service +0 -0
  363. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/deploy/coord-web-dist-build.service +0 -0
  364. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/deploy/coord-web-dist-build.sh +0 -0
  365. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/deploy/coord-web-dist-build.timer +0 -0
  366. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/deploy/coord-web-rollback.sh +0 -0
  367. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/deploy/coord-web.service +0 -0
  368. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/deploy/node-shim.sh +0 -0
  369. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/docs/AGENT_OPERATIONS.md +0 -0
  370. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/docs/ARCH_SECURITY_GATES.md +0 -0
  371. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/docs/COCKPIT.md +0 -0
  372. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/docs/CONTROL_CENTER.md +0 -0
  373. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/docs/COST_DISCIPLINE.md +0 -0
  374. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/docs/CROSS_PLATFORM.md +0 -0
  375. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/docs/CUSTOMER_PORTAL.md +0 -0
  376. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/docs/DRIVE_QUEUE.md +0 -0
  377. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/docs/EPHEMERAL_WORKERS.md +0 -0
  378. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/docs/FORGE_MIGRATION.md +0 -0
  379. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/docs/ISSUE_GUIDANCE.md +0 -0
  380. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/docs/MAC_MINI.md +0 -0
  381. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  382. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/docs/NOTIFIER.md +0 -0
  383. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/docs/OPENCODE_VERIFICATION.md +0 -0
  384. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/docs/OPERATING_GOTCHAS.md +0 -0
  385. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/docs/ORACLE_LOOP.md +0 -0
  386. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/docs/PHONE_WEBAPP.md +0 -0
  387. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/docs/PIPELINE_V2.md +0 -0
  388. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/docs/PLATFORM_EVOLUTION.md +0 -0
  389. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/docs/SECOND_BACKEND.md +0 -0
  390. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/docs/STORE_SERVICE.md +0 -0
  391. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  392. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/docs/WEB_CONTROL_CENTER.md +0 -0
  393. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/docs/mocks/web/README.md +0 -0
  394. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/docs/mocks/web/_tokens.css +0 -0
  395. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/docs/mocks/web/issue-detail.html +0 -0
  396. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/docs/mocks/web/pipeline-narrow.html +0 -0
  397. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/docs/mocks/web/pipeline-wide.html +0 -0
  398. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/graphify-out/.gitignore +0 -0
  399. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/install-agent.sh +0 -0
  400. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/pyproject.toml +0 -0
  401. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/scripts/audit_review_verdict_overrides.py +0 -0
  402. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  403. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/scripts/azure-workers/build-worker-image.sh +0 -0
  404. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/scripts/azure-workers/coordinator-machine.py +0 -0
  405. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/scripts/azure-workers/epic-down.sh +0 -0
  406. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/scripts/azure-workers/epic-up.sh +0 -0
  407. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/scripts/azure-workers/preflight.sh +0 -0
  408. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/scripts/azure-workers/provision-worker.sh +0 -0
  409. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  410. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  411. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/scripts/azure-workers/verify-github-token.sh +0 -0
  412. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/scripts/codegen.py +0 -0
  413. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/scripts/coord-test-runner.sh +0 -0
  414. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/scripts/drive-batch.sh +0 -0
  415. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/scripts/gen_board_fixture.py +0 -0
  416. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/scripts/next_release_tag.py +0 -0
  417. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/scripts/run_tests_in_populated_home.sh +0 -0
  418. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/scripts/run_tests_without_gh.sh +0 -0
  419. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/scripts/smoke_437_interactive.py +0 -0
  420. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/scripts/verify_878_review_capture.py +0 -0
  421. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/scripts/verify_release_published.py +0 -0
  422. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/scripts/verify_release_wheel.py +0 -0
  423. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/setup.cfg +0 -0
  424. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/SMOKE_SET.md +0 -0
  425. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/__init__.py +0 -0
  426. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  427. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/acceptance/ms-33/contract.md +0 -0
  428. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/acceptance/ms-33/manifest.yml +0 -0
  429. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  430. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  431. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  432. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  433. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/acceptance/ms-37/conftest.py +0 -0
  434. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/acceptance/ms-37/contract.md +0 -0
  435. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/acceptance/ms-37/manifest.yml +0 -0
  436. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  437. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  438. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/acceptance/ms-38/contract.md +0 -0
  439. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/acceptance/ms-38/manifest.yml +0 -0
  440. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  441. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  442. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  443. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  444. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  445. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  446. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  447. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  448. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  449. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  450. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/acceptance/ms-51/contract.md +0 -0
  451. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  452. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  453. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/acceptance/ms-51/manifest.yml +0 -0
  454. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  455. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/acceptance/ms-51/tsconfig.json +0 -0
  456. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  457. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/conftest.py +0 -0
  458. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/fixtures/board-pipeline-basic.json +0 -0
  459. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  460. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  461. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  462. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/fixtures/playwright/all_pass.json +0 -0
  463. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  464. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/fixtures/playwright/mixed_fail.json +0 -0
  465. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  466. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  467. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/fixtures/playwright/skip.json +0 -0
  468. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/fixtures/playwright/truncated.json +0 -0
  469. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  470. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  471. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  472. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  473. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  474. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  475. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  476. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  477. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_acceptance.py +0 -0
  478. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_acceptance_drivers.py +0 -0
  479. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_agent_api_error.py +0 -0
  480. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_agent_app.py +0 -0
  481. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_agent_branch_base.py +0 -0
  482. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_agent_branch_capture.py +0 -0
  483. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_agent_config_free_1712.py +0 -0
  484. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_agent_deploy_units_endpoint.py +0 -0
  485. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_agent_dirty_worktree.py +0 -0
  486. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_agent_health_h3.py +0 -0
  487. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_agent_idle_restart.py +0 -0
  488. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_agent_push_failure.py +0 -0
  489. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_agent_reap.py +0 -0
  490. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_agent_repos_and_pull.py +0 -0
  491. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_agent_restart_services_endpoint.py +0 -0
  492. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_agent_startup_diagnostics.py +0 -0
  493. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_agent_update.py +0 -0
  494. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_agent_update_bluegreen.py +0 -0
  495. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_agent_usage_limit.py +0 -0
  496. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_agent_zero_commit.py +0 -0
  497. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_ambient_home_isolation.py +0 -0
  498. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_approve_reject_plan.py +0 -0
  499. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_approve_usage_gate.py +0 -0
  500. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_assignment_already_recorded_daemon.py +0 -0
  501. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_audit_log.py +0 -0
  502. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_audit_outcome.py +0 -0
  503. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_audit_query.py +0 -0
  504. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_auto_loop.py +0 -0
  505. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_auto_release_publish_2035.py +0 -0
  506. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_base_checkout_restore.py +0 -0
  507. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_board_cap_762.py +0 -0
  508. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_board_fixture.py +0 -0
  509. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_board_read_path.py +0 -0
  510. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_board_service.py +0 -0
  511. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_board_state.py +0 -0
  512. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_board_wire.py +0 -0
  513. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_brain.py +0 -0
  514. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_branch_model.py +0 -0
  515. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_bug_intake.py +0 -0
  516. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_build_worker_image_env_update.py +0 -0
  517. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cargo_cache.py +0 -0
  518. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_ci_acceptance_gate_1950.py +0 -0
  519. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_ci_parity_2091.py +0 -0
  520. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_ci_store.py +0 -0
  521. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_claim.py +0 -0
  522. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_acceptance.py +0 -0
  523. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_assign.py +0 -0
  524. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  525. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_assign_interactive_remote.py +0 -0
  526. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_assign_provider.py +0 -0
  527. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  528. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_audit.py +0 -0
  529. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_chat_continue.py +0 -0
  530. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_diagnose_config_provenance.py +0 -0
  531. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_diagnose_graph.py +0 -0
  532. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_doctor.py +0 -0
  533. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_doctor_config_free_1801.py +0 -0
  534. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  535. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_drive.py +0 -0
  536. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_drive_queue.py +0 -0
  537. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_escalate.py +0 -0
  538. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_fix_headless_review.py +0 -0
  539. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_gate_a.py +0 -0
  540. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_install_drift.py +0 -0
  541. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_install_skills.py +0 -0
  542. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_issue_create_label.py +0 -0
  543. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_issue_reopen.py +0 -0
  544. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_merge.py +0 -0
  545. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_milestone_assign.py +0 -0
  546. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_milestone_capture.py +0 -0
  547. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_milestone_chat_add_child.py +0 -0
  548. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_milestone_dispatch.py +0 -0
  549. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_milestone_gate_b.py +0 -0
  550. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_milestone_gate_c.py +0 -0
  551. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_milestone_order.py +0 -0
  552. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  553. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_milestone_ship.py +0 -0
  554. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_network.py +0 -0
  555. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_new_issue_chat.py +0 -0
  556. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_plans.py +0 -0
  557. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_portal.py +0 -0
  558. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_pull_artifact.py +0 -0
  559. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_queue.py +0 -0
  560. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_reattach_sessions.py +0 -0
  561. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_refine_board.py +0 -0
  562. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_release_preflight.py +0 -0
  563. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_release_propagate.py +0 -0
  564. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_release_window.py +0 -0
  565. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_repo_2220.py +0 -0
  566. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_scorecard.py +0 -0
  567. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_set_review_findings.py +0 -0
  568. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_status_advisory_terminal.py +0 -0
  569. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_status_merge_queue.py +0 -0
  570. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_status_provider.py +0 -0
  571. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_status_review_finalizing.py +0 -0
  572. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_status_test_failed_tag.py +0 -0
  573. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_status_usage_limit.py +0 -0
  574. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_sync_comments_873.py +0 -0
  575. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_test_plan.py +0 -0
  576. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_track.py +0 -0
  577. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_tui_update.py +0 -0
  578. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cli_wait.py +0 -0
  579. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_client_base_install.py +0 -0
  580. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_comments.py +0 -0
  581. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_completion_summary.py +0 -0
  582. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_config.py +0 -0
  583. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_config_acceptance.py +0 -0
  584. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_config_audit.py +0 -0
  585. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_config_pricing.py +0 -0
  586. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_config_usage_gate.py +0 -0
  587. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_conflict_fix.py +0 -0
  588. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_conflict_fix_semantic.py +0 -0
  589. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_coord_test.py +0 -0
  590. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_coord_test_runner_baseline.py +0 -0
  591. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_coord_test_runner_routing.py +0 -0
  592. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_coord_test_runner_toolchain.py +0 -0
  593. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_coord_web_sse_restart_live.py +0 -0
  594. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_coordinator_machine.py +0 -0
  595. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_cross_platform_imports.py +0 -0
  596. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_dashboard.py +0 -0
  597. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_dashboard_fixture.py +0 -0
  598. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_dashboard_terminal.py +0 -0
  599. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_dashboard_terminal_live.py +0 -0
  600. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_db.py +0 -0
  601. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_dead_end.py +0 -0
  602. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_deploy_coord_db_backup.py +0 -0
  603. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_deploy_coord_web_dist.py +0 -0
  604. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_deploy_coord_web_rollback.py +0 -0
  605. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_deploy_drive_queue_unit.py +0 -0
  606. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_deploy_manifest.py +0 -0
  607. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_deploy_units_lane.py +0 -0
  608. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_deploy_web_unit.py +0 -0
  609. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_deps.py +0 -0
  610. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_diagnose.py +0 -0
  611. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_dispatch.py +0 -0
  612. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_dispatch_target_validation.py +0 -0
  613. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_dist_name.py +0 -0
  614. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_done_housekeeping.py +0 -0
  615. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_drive.py +0 -0
  616. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_drive_queue.py +0 -0
  617. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_drive_state.py +0 -0
  618. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_drive_tmux.py +0 -0
  619. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_epic_up_capability_detection.py +0 -0
  620. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  621. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_epic_up_image_provenance.py +0 -0
  622. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_errors.py +0 -0
  623. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_events.py +0 -0
  624. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_failure_class.py +0 -0
  625. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_filelock.py +0 -0
  626. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  627. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_fix_of_force_override.py +0 -0
  628. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_fleet_config_health.py +0 -0
  629. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_fleet_health_probes.py +0 -0
  630. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_fleet_health_snapshot.py +0 -0
  631. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_freshness.py +0 -0
  632. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_gate_a.py +0 -0
  633. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_gate_b.py +0 -0
  634. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_gate_snapshot_staleness.py +0 -0
  635. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_gates.py +0 -0
  636. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  637. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_generated_types_fixture.py +0 -0
  638. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_github_ops.py +0 -0
  639. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_goal.py +0 -0
  640. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_handoff.py +0 -0
  641. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_health_cli.py +0 -0
  642. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_health_cli_graph.py +0 -0
  643. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_health_config.py +0 -0
  644. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_health_deploy_lane_facts.py +0 -0
  645. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_health_incident_regression.py +0 -0
  646. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_health_pypi.py +0 -0
  647. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_health_registry.py +0 -0
  648. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_health_timer_active.py +0 -0
  649. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_health_toolchain.py +0 -0
  650. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_health_unit_drift.py +0 -0
  651. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_health_unit_enablement.py +0 -0
  652. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_hooks.py +0 -0
  653. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_human_attended_437.py +0 -0
  654. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_init.py +0 -0
  655. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_integration.py +0 -0
  656. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_interactive_briefing_echo.py +0 -0
  657. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_interactive_prefill_state.py +0 -0
  658. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_interactive_session_relaunch.py +0 -0
  659. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_interactive_test_verdict_backstop.py +0 -0
  660. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_interactive_token_attribution.py +0 -0
  661. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_interactive_worktree.py +0 -0
  662. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_issue_store_seam.py +0 -0
  663. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_liveness_auditor.py +0 -0
  664. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_liveness_notify.py +0 -0
  665. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_machine_pause.py +0 -0
  666. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_merge_queue.py +0 -0
  667. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_merge_verify.py +0 -0
  668. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_milestone_chat.py +0 -0
  669. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_milestone_dispatch.py +0 -0
  670. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_milestone_gate.py +0 -0
  671. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_milestone_order.py +0 -0
  672. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_milestone_seam.py +0 -0
  673. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_mock_author.py +0 -0
  674. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_model_tiering.py +0 -0
  675. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_models.py +0 -0
  676. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_models_config_labels.py +0 -0
  677. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_needs_attention.py +0 -0
  678. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_network.py +0 -0
  679. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_new_issue_chat.py +0 -0
  680. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_next_release_tag.py +0 -0
  681. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_no_direct_gh_calls.py +0 -0
  682. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_node_shim.py +0 -0
  683. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_notifier_baseline.py +0 -0
  684. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_notifier_cli.py +0 -0
  685. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_notifier_collect.py +0 -0
  686. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_notifier_config.py +0 -0
  687. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_notifier_drive_seam.py +0 -0
  688. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_notifier_isolation.py +0 -0
  689. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_notifier_predicate.py +0 -0
  690. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_notifier_quiet_hours.py +0 -0
  691. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_notifier_service.py +0 -0
  692. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_notify.py +0 -0
  693. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_notify_drain.py +0 -0
  694. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_openapi.py +0 -0
  695. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_operational_defaults.py +0 -0
  696. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_overlap_fence.py +0 -0
  697. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_packaged_deploy_units.py +0 -0
  698. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_parentage.py +0 -0
  699. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_paste_landed.py +0 -0
  700. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_pipeline.py +0 -0
  701. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_plan_followup_approve_plan_command.py +0 -0
  702. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_plan_followup_pr_command.py +0 -0
  703. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_plan_followup_review_command.py +0 -0
  704. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_plan_only.py +0 -0
  705. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_plan_parser.py +0 -0
  706. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_platform_paths.py +0 -0
  707. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_portal_bridge.py +0 -0
  708. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_portal_config.py +0 -0
  709. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_pr_body_lint.py +0 -0
  710. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_prereqs.py +0 -0
  711. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_production_db_guard.py +0 -0
  712. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_progress.py +0 -0
  713. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_provider_seam.py +0 -0
  714. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_providers_config_labels.py +0 -0
  715. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_providers_pty.py +0 -0
  716. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_quiet_hours.py +0 -0
  717. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_quiet_hours_store_2146.py +0 -0
  718. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_reap_merged_sessions.py +0 -0
  719. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_reap_stale_interactive_tick.py +0 -0
  720. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_reconcile_branch.py +0 -0
  721. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_reconcile_completions.py +0 -0
  722. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_reconcile_merges.py +0 -0
  723. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_reconcile_usage_limit_done.py +0 -0
  724. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_refine_chat.py +0 -0
  725. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_release_cordon_2101.py +0 -0
  726. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_release_propagate.py +0 -0
  727. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_release_unified_1242.py +0 -0
  728. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_release_verify.py +0 -0
  729. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_release_window.py +0 -0
  730. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_remote_auto_prune.py +0 -0
  731. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_remote_interactive_reaper.py +0 -0
  732. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_repo_edit_2220.py +0 -0
  733. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_report_result_push.py +0 -0
  734. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_reports.py +0 -0
  735. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_retry.py +0 -0
  736. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_retry_advisory_1606.py +0 -0
  737. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_retry_type_1636.py +0 -0
  738. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_revalidate.py +0 -0
  739. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_review.py +0 -0
  740. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_review_end_review_without_verdict.py +0 -0
  741. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_review_parse_failure_diagnostic.py +0 -0
  742. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_review_reaffirm.py +0 -0
  743. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_review_state.py +0 -0
  744. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_review_verdict_backstop.py +0 -0
  745. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_review_verdict_override_audit.py +0 -0
  746. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_review_verdict_relay.py +0 -0
  747. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_review_zero_commits.py +0 -0
  748. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_scoped_review_wiring.py +0 -0
  749. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_scorecard.py +0 -0
  750. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_serve.py +0 -0
  751. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_serve_app_board_trim.py +0 -0
  752. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_session.py +0 -0
  753. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_slice_issue_attribution.py +0 -0
  754. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_smoke.py +0 -0
  755. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_smoke_live_checkout_restore.py +0 -0
  756. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_smoke_workflow.py +0 -0
  757. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_spend_ceiling.py +0 -0
  758. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_spend_ceiling_coordinator.py +0 -0
  759. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_split.py +0 -0
  760. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_split_work.py +0 -0
  761. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_stage_projection.py +0 -0
  762. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_stalled_pipeline.py +0 -0
  763. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_state.py +0 -0
  764. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_state_review_findings_daemon.py +0 -0
  765. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_status_fleet_footer.py +0 -0
  766. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_stop_1567.py +0 -0
  767. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_stuck.py +0 -0
  768. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_terminal_command.py +0 -0
  769. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_test_author.py +0 -0
  770. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_test_chat.py +0 -0
  771. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_test_orchestrator.py +0 -0
  772. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_test_report.py +0 -0
  773. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_test_verdict_parsing.py +0 -0
  774. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_test_verdict_transcript_floor.py +0 -0
  775. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_thin_client_board_audit.py +0 -0
  776. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_thin_client_config_load_1080.py +0 -0
  777. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_thin_client_daemon_routing_906.py +0 -0
  778. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_tmux_host.py +0 -0
  779. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_tmux_session.py +0 -0
  780. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_transcript_floor.py +0 -0
  781. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_usage.py +0 -0
  782. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_usage_limits.py +0 -0
  783. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_usage_rollup.py +0 -0
  784. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_venv_live_install_2121.py +0 -0
  785. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_version_single_source.py +0 -0
  786. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_watch.py +0 -0
  787. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_worker_image_pin_sync.py +0 -0
  788. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_worker_safety.py +0 -0
  789. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_worker_test_scoping.py +0 -0
  790. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_worktree.py +0 -0
  791. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  792. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/Cargo.lock +0 -0
  793. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/Cargo.toml +0 -0
  794. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/cargo-config-local-quadraui.toml.example +0 -0
  795. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/app/audit.rs +0 -0
  796. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/app/chat.rs +0 -0
  797. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/app/data.rs +0 -0
  798. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/app/dialogs.rs +0 -0
  799. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/app/drive.rs +0 -0
  800. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/app/drive_queue.rs +0 -0
  801. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/app/escalation.rs +0 -0
  802. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/app/events.rs +0 -0
  803. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/app/fixtures.rs +0 -0
  804. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/app/fleet_health.rs +0 -0
  805. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/app/fleet_sessions.rs +0 -0
  806. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/app/fleet_terminals.rs +0 -0
  807. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/app/format.rs +0 -0
  808. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/app/milestone_dag.rs +0 -0
  809. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/app/mod.rs +0 -0
  810. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/app/msv.rs +0 -0
  811. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/app/pipeline.rs +0 -0
  812. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/app/plans.rs +0 -0
  813. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/app/render.rs +0 -0
  814. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/app/reports.rs +0 -0
  815. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/app/sessions.rs +0 -0
  816. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/app/settings_ui.rs +0 -0
  817. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/app/sidebar.rs +0 -0
  818. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/app/terminal.rs +0 -0
  819. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/app/tests.rs +0 -0
  820. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/app/types.rs +0 -0
  821. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/app/workspace.rs +0 -0
  822. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/bin/gtk.rs +0 -0
  823. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/commands.rs +0 -0
  824. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/lib.rs +0 -0
  825. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/main.rs +0 -0
  826. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/src/settings.rs +0 -0
  827. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/tests/acceptance.rs +0 -0
  828. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/tests/cli.rs +0 -0
  829. {code_coordinator-0.5.80 → code_coordinator-0.5.82}/tui/tests/fixtures/board_sample.json +0 -0
@@ -42,13 +42,29 @@ bootstrap only runs where `core.hooksPath` is set: `git config core.hooksPath
42
42
  rebase/merge/cherry-pick (so the merge agent's proactive rebase never rebuilds),
43
43
  nothing fires at all for `git reset --hard`, every failure path is a silent
44
44
  `exit 0` behind a detached 600s-timeout background process, concurrent triggers
45
- coalesce, and their `[ ! -f graphify-out/graph.json ]` guard is a permanent
46
- off-switch once the graph is purged. Treat the hooks as an optimization and check
45
+ coalesce, and their `[ ! -f graphify-out/graph.json ]` guard is an off-switch
46
+ once the graph is purged. Treat the hooks as an optimization and check
47
47
  freshness instead — `GRAPH_REPORT.md` records its source commit, and
48
48
  **`coord diagnose --graph`** compares that to HEAD for every local checkout (and
49
49
  flags an unset `core.hooksPath`). If it reports STALE, `graphify update .` in that
50
50
  checkout.
51
51
 
52
+ **It mostly heals itself now (#1729, #2237).** Each agent's health tick rebuilds
53
+ a checkout whose graph is stale *or absent* — so `rm -rf graphify-out/` is no
54
+ longer permanent — subject to four guards: idle machines only, base checkouts
55
+ only (never a linked worktree), once per HEAD (a build that cannot succeed is
56
+ never a retry loop), and never `--force`. What it cannot do is anything
57
+ versioned: `.githooks/` are tracked files, so porting them to a repo is a PR
58
+ against that repo.
59
+
60
+ **`coord repo doctor <repo>`** reports graph readiness **per machine** (folded
61
+ from each agent's `/health`, no extra round trip) — the operator's laptop is
62
+ usually not where the workers run. `--fix` performs the machine-local half
63
+ (`graphify update .` where absent, `core.hooksPath` where unset) on every
64
+ machine that clones the repo; it is idempotent, never writes a tracked file,
65
+ and refuses on a repo whose `.githooks/` were never ported. A repo with no
66
+ graph on *any* machine that runs workers is CRIT and fails the gate.
67
+
52
68
  Setting this up on a new machine: [`docs/GRAPHIFY_SETUP.md`](docs/GRAPHIFY_SETUP.md).
53
69
 
54
70
  ## Architecture
@@ -155,7 +171,7 @@ One line each — the reasoning behind them is in
155
171
  - **`coordinator.yml` is the single source of truth** for repo topology, machine capabilities, dependencies, concurrency limits, review settings, smoke-test rules, and the pipeline gate order (`pipeline.default_gates`). It lives in `~/.coord/`, **not** the repo checkout.
156
172
  - **User approves everything.** `coord plan` proposes, the user reviews, `coord approve` dispatches. No autonomous dispatch.
157
173
  - **Claim detection prevents duplicate work.** Before dispatching, the coordinator checks the board for active assignments and the remote for `issue-{N}-*` branches.
158
- - **Conflict rules are inferred, not configured.** The brain reads issue bodies and infers which files will be touched.
174
+ - **Conflict rules are inferred, not configured** and only on the `coord plan` path. Overlap avoidance is a line in the planning brain's *prompt*, not a mechanism; the drive queue bypasses the brain entirely, so unattended work gets no file-overlap check. There is no `file_groups`/`exclusive_files` config.
159
175
  - **Adversarial reviews are rule-enforcing, not rubber-stamping.** On worker completion a fresh `claude -p` session on a *different* machine reviews the PR diff against this file and the review checklist, with zero shared context with the worker — that's the whole point.
160
176
  - **The pipeline order is `Work → Test → Review → Merge`.** Test precedes Review; the headless auto-loop holds review dispatch until there is a `passed`/`skipped` test verdict.
161
177
  - **Merge is gated on CI checks (#240).** `coord merge` refuses when a check failed or is still running — and a PR with *zero* reported checks is not automatically clear either (#1904).
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.80
3
+ Version: 0.5.82
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.80
3
+ Version: 0.5.82
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -311,6 +311,7 @@ coord/health/checks/fleet_deploy_lanes.py
311
311
  coord/health/checks/fleet_phantom.py
312
312
  coord/health/checks/fleet_unit_drift.py
313
313
  coord/health/checks/graph.py
314
+ coord/health/checks/graphify_cli.py
314
315
  coord/health/checks/plan_usage.py
315
316
  coord/health/checks/repo_state.py
316
317
  coord/health/checks/spawned_coord.py
@@ -577,6 +578,7 @@ tests/test_generated_types_fixture.py
577
578
  tests/test_github_ops.py
578
579
  tests/test_goal.py
579
580
  tests/test_graph_health.py
581
+ tests/test_graph_selfheal_absent_2237.py
580
582
  tests/test_handoff.py
581
583
  tests/test_health_checks.py
582
584
  tests/test_health_cli.py
@@ -673,6 +675,7 @@ tests/test_release_window.py
673
675
  tests/test_remote_auto_prune.py
674
676
  tests/test_remote_interactive_reaper.py
675
677
  tests/test_repo_edit_2220.py
678
+ tests/test_repo_graph_fleet_2237.py
676
679
  tests/test_repo_onboard_2220.py
677
680
  tests/test_report_result_push.py
678
681
  tests/test_reports.py
@@ -225,6 +225,7 @@
225
225
  "coord/health/checks/fleet_phantom.py",
226
226
  "coord/health/checks/fleet_unit_drift.py",
227
227
  "coord/health/checks/graph.py",
228
+ "coord/health/checks/graphify_cli.py",
228
229
  "coord/health/checks/plan_usage.py",
229
230
  "coord/health/checks/repo_state.py",
230
231
  "coord/health/checks/spawned_coord.py",
@@ -607,6 +608,7 @@
607
608
  "tests/test_github_ops.py",
608
609
  "tests/test_goal.py",
609
610
  "tests/test_graph_health.py",
611
+ "tests/test_graph_selfheal_absent_2237.py",
610
612
  "tests/test_handoff.py",
611
613
  "tests/test_health_checks.py",
612
614
  "tests/test_health_cli.py",
@@ -703,6 +705,7 @@
703
705
  "tests/test_remote_auto_prune.py",
704
706
  "tests/test_remote_interactive_reaper.py",
705
707
  "tests/test_repo_edit_2220.py",
708
+ "tests/test_repo_graph_fleet_2237.py",
706
709
  "tests/test_repo_onboard_2220.py",
707
710
  "tests/test_report_result_push.py",
708
711
  "tests/test_reports.py",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.80",
2
+ "tag": "0.5.82",
3
3
  "distance": 0,
4
- "node": "g8c6e8430b5fa1613efee27434db00b3e3b59d32b",
4
+ "node": "g329c3981912cb4a0cb249010221980bd64ee12b4",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-14"
@@ -715,36 +715,20 @@ def _is_linked_worktree(repo_path: Path) -> bool:
715
715
  def _graphify_update(repo_path: Path, *, timeout: float = 600.0) -> tuple[bool, str]:
716
716
  """Run ``graphify update .`` in *repo_path* (#1729, H-6's self-heal).
717
717
 
718
- Deliberately the plain, no-flags command graphify's own hooks run (see
719
- ``docs/GRAPHIFY_SETUP.md``) **never** ``--force``: that flag exists
720
- only to defeat graphify's node-count refusal guard, and defeating it
721
- automatically is exactly what turns a visible stall into silent
722
- corruption of the graph agents navigate by (#1729 guard 4).
723
-
724
- Returns ``(ok, detail)``. ``ok`` is False on a non-zero exit, a missing
725
- ``graphify`` binary, or a timeout — the caller treats all three the
726
- same way: surface the reason on the health check and remember this
727
- HEAD as attempted so the next tick does not retry it (guard 3).
718
+ Thin delegate to :func:`coord.graph_health.run_graphify_update` (#2237),
719
+ which is the single place that decides what command coord shells out to
720
+ and with which flags ``coord repo doctor --fix`` repairs checkouts on
721
+ every machine through the same function, and two copies of "the command
722
+ graphify's hooks run, never ``--force``" is exactly the split-brain that
723
+ would let one of them quietly acquire the flag that caused the
724
+ 2026-08-02 incident.
725
+
726
+ Kept as a module-level name here because it is the seam the self-heal
727
+ tests patch. Returns ``(ok, detail)``.
728
728
  """
729
- try:
730
- result = subprocess.run(
731
- ["graphify", "update", "."],
732
- cwd=str(repo_path),
733
- capture_output=True,
734
- text=True,
735
- timeout=timeout,
736
- )
737
- except FileNotFoundError:
738
- return False, "graphify: command not found on this machine's PATH"
739
- except subprocess.TimeoutExpired:
740
- return False, f"graphify update . timed out after {timeout:.0f}s"
741
- except OSError as exc:
742
- return False, f"graphify update . failed to start: {exc}"
729
+ from coord.graph_health import run_graphify_update # noqa: PLC0415
743
730
 
744
- if result.returncode != 0:
745
- reason = (result.stderr or result.stdout or "").strip()
746
- return False, reason or f"graphify update . exited {result.returncode}"
747
- return True, (result.stdout or "").strip()
731
+ return run_graphify_update(repo_path, timeout=timeout)
748
732
 
749
733
 
750
734
  # #2212: count how many Bash commands in a worker's leg invoked `graphify` —
@@ -756,13 +740,11 @@ def _graphify_update(repo_path: Path, *, timeout: float = 600.0) -> tuple[bool,
756
740
  # across N consecutive legs means the prompt instruction isn't landing.
757
741
  # Deliberately NOT a DB column: this is a cheap, best-effort signal, not a
758
742
  # gate anything blocks on, so it stays out of the Assignment schema/migrations.
759
- # Separators recognized before a command token: `;`, `&`, `|` (covers `&&`
760
- # and `||` too, since `\s*` after the class soaks up the second char) and a
761
- # bare newline Claude Code's Bash tool very commonly emits multi-line
762
- # command strings (e.g. `cd repo\ngraphify query "foo"`) that aren't joined
763
- # with `;`/`&&`, so newline must count as a separator or those legs
764
- # undercount to 0 (#2212 review).
765
- _GRAPHIFY_INVOCATION_RE = re.compile(r"(?:^|[\n;&|]\s*)graphify(?:\s|$)")
743
+ # #2236: the pattern itself now lives in `coord.worker_events`, which grew a
744
+ # need for it when the summary parser started recording each query's OUTCOME
745
+ # and not just the count. Imported lazily (like every other
746
+ # `coord.worker_events` use in this module) rather than duplicated, so the two
747
+ # halves of the measurement can never drift apart on what counts as a query.
766
748
 
767
749
 
768
750
  def _count_graphify_invocations(bash_commands: list[str]) -> int:
@@ -781,7 +763,68 @@ def _count_graphify_invocations(bash_commands: list[str]) -> int:
781
763
  b"`` counts once, not twice. Treat the result as an "at least one graph
782
764
  query this leg" signal, not an exact invocation tally.
783
765
  """
784
- return sum(1 for cmd in bash_commands if cmd and _GRAPHIFY_INVOCATION_RE.search(cmd))
766
+ from coord.worker_events import is_graphify_command # noqa: PLC0415
767
+
768
+ return sum(1 for cmd in bash_commands if is_graphify_command(cmd))
769
+
770
+
771
+ def _worktree_graph_present(
772
+ worktree_path: str | None, repo_path_fallback: str | None = None
773
+ ) -> bool:
774
+ """True iff the worker's checkout has a **resolvable** ``graphify-out/graph.json``.
775
+
776
+ #2236: ``graphify_invocations=0`` is ambiguous on its own. Two of five
777
+ repos ship no graph and no ``.githooks/post-checkout``, so their worktrees
778
+ get an empty ``graphify-out/`` — and the worker prompt's own escape hatch
779
+ ("no graph? skip straight to grep, silently") then fires correctly and
780
+ says nothing. Those workers were *obeying* the rule, not ignoring it, and
781
+ the counter cannot tell them apart from a worker that had a graph and
782
+ never asked. Recording this alongside the count is what disambiguates.
783
+
784
+ *repo_path_fallback* mirrors the branch-capture logic a few hundred
785
+ lines up in ``_reap`` ("for legacy assignments (no worktree_path) we
786
+ fall back to the main repo clone"): a legacy/non-worktree assignment has
787
+ no ``worktree_path`` at all, but its worker still ran against
788
+ ``spec.repo_path`` directly, which may have a perfectly good graph.
789
+ Without this fallback, every legacy assignment logs ``graph_present=0``
790
+ regardless — conflating "no worktree" with "no graph".
791
+
792
+ ``exists()`` follows symlinks deliberately: a linked worktree's
793
+ ``graph.json`` is a symlink into the base checkout (see
794
+ ``coord/graph_health.py``), and a *dangling* symlink is exactly as
795
+ graph-blind as no file at all — so both must read as absent.
796
+ """
797
+ path = worktree_path or repo_path_fallback
798
+ if not path:
799
+ return False
800
+ try:
801
+ return (Path(path) / "graphify-out" / "graph.json").exists()
802
+ except OSError:
803
+ return False
804
+
805
+
806
+ def _format_graphify_query_lines(queries: Iterable[Any]) -> list[str]:
807
+ """Render per-query ``# graphify_query …`` log lines (#2236).
808
+
809
+ ``graphify_invocations=N`` counts attempts but cannot distinguish
810
+ "queried and got a useful answer" from "queried, got nothing, fell back to
811
+ grep" — and those imply opposite fixes (a habit problem the prompt can
812
+ move, vs. a graph coverage/quality problem no amount of prompting helps).
813
+ One line per query, ``grep``-able on ``outcome=``, with the command text
814
+ last because it is the only free-form field.
815
+ """
816
+ lines: list[str] = []
817
+ for q in queries:
818
+ results = getattr(q, "results", None)
819
+ # `worker_events._truncate` already newline-strips and trims this
820
+ # when the `GraphifyQuery` entry is built — no need to redo it here.
821
+ command = str(getattr(q, "command", ""))
822
+ lines.append(
823
+ f"# graphify_query: outcome={getattr(q, 'outcome', 'unknown')} "
824
+ f"results={results if results is not None else '?'} "
825
+ f"cmd={command!r}\n"
826
+ )
827
+ return lines
785
828
 
786
829
 
787
830
  def _infer_repo_github_slug(repo_path: str) -> str | None:
@@ -4092,6 +4135,21 @@ class AgentServer:
4092
4135
  # already follows.
4093
4136
  self._graph_rebuild_in_progress: set[str] = set()
4094
4137
 
4138
+ # #2237 item 7: guard 1 (the idle-gate) skips the whole self-heal
4139
+ # pass whenever this machine has a RUNNING assignment. Sensible —
4140
+ # a rebuild during a worker's leg fights it for CPU — but it means
4141
+ # the BUSIEST machine in the fleet gets the FEWEST heal windows,
4142
+ # which is the opposite of where drift accumulates. Nothing recorded
4143
+ # that, so "this machine never gets an idle window" was
4144
+ # indistinguishable from "this machine never needed a heal".
4145
+ # Measure before changing the guard: these two counters ride
4146
+ # /health's `graph_self_heal` block so the ratio is observable, and
4147
+ # only if it turns out to be common does the guard need replacing
4148
+ # with a heal window.
4149
+ self._graph_heal_skipped_active: int = 0
4150
+ self._graph_heal_last_skip_at: float | None = None
4151
+ self._graph_heal_passes: int = 0
4152
+
4095
4153
  self.state_dir.mkdir(parents=True, exist_ok=True)
4096
4154
  self.log_dir.mkdir(parents=True, exist_ok=True)
4097
4155
  self._load_state()
@@ -4165,6 +4223,19 @@ class AgentServer:
4165
4223
  # block (`_cached_local_health`'s own try/except) rather than
4166
4224
  # omitting the key, so an old/new client can always find it.
4167
4225
  "health": self._cached_local_health(),
4226
+ # #2237 item 7: how often the graph self-heal pass has actually
4227
+ # run on this machine, and how often guard 1 (the idle-gate)
4228
+ # turned it away because an assignment was RUNNING. The busiest
4229
+ # host in the fleet is the one most likely to drift AND the least
4230
+ # likely to be idle, so "never healed" and "never needed healing"
4231
+ # were indistinguishable until this. Cheap, in-memory, resets on
4232
+ # agent restart — it exists to answer "is the idle-gate starving
4233
+ # this machine", not to be a durable metric.
4234
+ "graph_self_heal": {
4235
+ "passes": self._graph_heal_passes,
4236
+ "skipped_active": self._graph_heal_skipped_active,
4237
+ "last_skip_at": self._graph_heal_last_skip_at,
4238
+ },
4168
4239
  }
4169
4240
 
4170
4241
  def _cached_local_health(self) -> dict:
@@ -4229,6 +4300,19 @@ class AgentServer:
4229
4300
  """React to the ``graph`` check's STATE verdict instead of chasing
4230
4301
  the git events that produced it (#1729, H-6).
4231
4302
 
4303
+ Covers a **missing** graph as well as a stale one (#2237 item 5).
4304
+ Ongoing drift was already handled here; absence was not, because
4305
+ ``graph_status`` returns early for a checkout with no
4306
+ ``graphify-out/graph.json`` and never computes ``stale`` — so this
4307
+ pass skipped it, and so did the graphify hooks' own
4308
+ ``[ ! -f graphify-out/graph.json ] && exit 0``. Two independent
4309
+ mechanisms declining to rebuild a graph that is not there made a
4310
+ single ``rm -rf graphify-out/`` (or a fresh clone on a machine that
4311
+ never had one) permanent until a human intervened. The guards below
4312
+ are unchanged and cover the absent case as-is — in particular guard
4313
+ 3, which is what stops a repo where ``graphify update .`` genuinely
4314
+ cannot succeed from retrying every poll forever.
4315
+
4232
4316
  The git hooks (`.githooks/`) are event-driven and structurally
4233
4317
  cannot cover every ref-moving operation — rebase/merge/cherry-pick
4234
4318
  `exit 0`, `git reset --hard` fires no hook at all, and every hook
@@ -4245,8 +4329,13 @@ class AgentServer:
4245
4329
  1. **Idle-gate.** Only when this machine has no RUNNING assignment.
4246
4330
  A rebuild is hundreds of files across many workers; running it
4247
4331
  while a worker is mid-build steals the CPU that worker was
4248
- dispatched for. This reads `self._assignments` under a brief
4249
- lock and releases it before the (possibly slow) rebuild runs —
4332
+ dispatched for. Every skip is counted
4333
+ (`_graph_heal_skipped_active`, surfaced as /health's
4334
+ `graph_self_heal` block) because the guard's cost lands hardest
4335
+ on the busiest machine — the one most likely to drift — and
4336
+ #2237 item 7 asks for that to be measured before the guard is
4337
+ traded for a heal window. This reads `self._assignments` under a
4338
+ brief lock and releases it before the (possibly slow) rebuild runs —
4250
4339
  load-bearing for guard-adjacent requirement #1625 decision 3:
4251
4340
  health must stay advisory, so a dispatch landing mid-rebuild
4252
4341
  must never be delayed by it (see `_graphify_update`, called
@@ -4301,13 +4390,32 @@ class AgentServer:
4301
4390
  with self._lock:
4302
4391
  active = sum(1 for a in self._assignments.values() if a.status == RUNNING)
4303
4392
  if active:
4393
+ # #2237 item 7: count the skip instead of returning silently, so
4394
+ # "the busiest machine never heals" is a number an operator can
4395
+ # read off /health rather than an inference from a graph that
4396
+ # stays stale.
4397
+ self._graph_heal_skipped_active += 1
4398
+ self._graph_heal_last_skip_at = time.time()
4304
4399
  return
4400
+ self._graph_heal_passes += 1
4305
4401
 
4306
4402
  for i, result in enumerate(report.results):
4307
4403
  if result.check_id != "graph":
4308
4404
  continue
4309
4405
  values = result.values or {}
4310
- if not values.get("stale"):
4406
+ # #2237 item 5: ABSENT counts, not just stale. `graph_status`
4407
+ # returns early with `unknown_reason` when there is no
4408
+ # graphify-out/graph.json, so `stale` is never even computed for a
4409
+ # never-built (or `rm -rf`'d) checkout — which meant two
4410
+ # independent mechanisms declined to rebuild a graph that is not
4411
+ # there: this gate, and the graphify hooks' own
4412
+ # `[ ! -f graphify-out/graph.json ] && exit 0`. Between them, a
4413
+ # single `rm -rf graphify-out/` was permanent. Guard 3's
4414
+ # once-per-HEAD bookkeeping below keys on `head_sha`, which a
4415
+ # never-built checkout now carries (#2237 in `graph_health`), so a
4416
+ # repo where the build genuinely cannot succeed still gets exactly
4417
+ # one attempt per HEAD rather than one per poll.
4418
+ if not values.get("stale") and values.get("present", True):
4311
4419
  continue
4312
4420
  path_str = values.get("path")
4313
4421
  if not path_str:
@@ -5262,6 +5370,51 @@ class AgentServer:
5262
5370
  servable.append(repo_name)
5263
5371
  return servable, degraded
5264
5372
 
5373
+ def fix_graph(self, repo_name: str, *, timeout: float = 600.0) -> dict:
5374
+ """Repair the machine-local half of graphify for *repo_name* here
5375
+ (#2237 item 1 — the agent side of ``coord repo doctor --fix``).
5376
+
5377
+ The whole point of routing this through the agent is that the
5378
+ operator's laptop is *not* where the workers run: layer 5 was the one
5379
+ onboarding layer probed only on the machine running the command, so a
5380
+ repo with a graph on the operator's box and none on dellserver
5381
+ reported clean. Repairing it has the same shape — a fix that only
5382
+ ever repairs the local clone fixes the machine that needed it least.
5383
+
5384
+ Idempotent and never touches a tracked file:
5385
+ :func:`coord.graph_health.apply_local_graph_fix` sets
5386
+ ``core.hooksPath`` and builds a missing graph, and refuses outright
5387
+ when the repo does not ship ``.githooks/post-checkout`` (a versioned
5388
+ change, which is a PR against that repo and must never be automated).
5389
+
5390
+ Returns the :meth:`~coord.graph_health.GraphFixResult.to_dict` shape
5391
+ plus ``repo``. An unknown repo, or one with no checkout on this
5392
+ machine, comes back as a ``refused`` result rather than an error —
5393
+ the caller is sweeping every machine and wants a per-machine answer,
5394
+ not an exception that hides the other machines' results.
5395
+ """
5396
+ from coord.graph_health import GraphFixResult, apply_local_graph_fix # noqa: PLC0415
5397
+
5398
+ path_str = self.repo_paths.get(repo_name)
5399
+ if not path_str:
5400
+ result = GraphFixResult(
5401
+ repo_path="",
5402
+ refused=f"no repo_path configured for {repo_name!r} on this machine",
5403
+ )
5404
+ return {**result.to_dict(), "repo": repo_name}
5405
+
5406
+ repo_path = Path(path_str).expanduser()
5407
+ result = apply_local_graph_fix(repo_path, timeout=timeout)
5408
+ # A rebuild that succeeds here invalidates whatever this HEAD was
5409
+ # last recorded as failing (guard 3's bookkeeping) — otherwise the
5410
+ # self-heal would keep replaying a stale failure reason at an
5411
+ # operator who just fixed it by hand.
5412
+ if result.ok:
5413
+ with self._lock:
5414
+ self._graph_rebuild_failed.pop(str(repo_path), None)
5415
+ self._local_health_cache = None
5416
+ return {**result.to_dict(), "repo": repo_name}
5417
+
5265
5418
  def list_repos(self) -> dict[str, dict]:
5266
5419
  """Return local HEAD / branch / dirty flag for each configured repo.
5267
5420
 
@@ -7511,9 +7664,27 @@ class AgentServer:
7511
7664
  _graphify_invocations = _count_graphify_invocations(
7512
7665
  _worker_summary.bash_commands if _worker_summary is not None else []
7513
7666
  )
7667
+ # #2236: the count alone can't separate "didn't try" from
7668
+ # "couldn't try" (no graph in this worktree — the prompt's own
7669
+ # escape hatch fires silently) or from "tried, got nothing".
7670
+ # `graph_present` answers the first; the per-query lines below
7671
+ # answer the second. Read while the worktree still exists —
7672
+ # `_cleanup_worktree` runs further down this same function.
7673
+ _graph_present = _worktree_graph_present(
7674
+ getattr(assignment, "worktree_path", None) if assignment else None,
7675
+ getattr(assignment.spec, "repo_path", None) if assignment else None,
7676
+ )
7514
7677
  reopen.write(
7515
7678
  f"# reap: done (exit_code={exit_code} status={final_status} "
7516
- f"graphify_invocations={_graphify_invocations})\n"
7679
+ f"graphify_invocations={_graphify_invocations} "
7680
+ f"graph_present={int(_graph_present)})\n"
7681
+ )
7682
+ reopen.writelines(
7683
+ _format_graphify_query_lines(
7684
+ _worker_summary.graphify_queries
7685
+ if _worker_summary is not None
7686
+ else []
7687
+ )
7517
7688
  )
7518
7689
  except (OSError, AttributeError):
7519
7690
  pass
@@ -980,6 +980,48 @@ def _openapi_spec() -> dict:
980
980
  "responses": {"200": {"description": "OK"}},
981
981
  }
982
982
  },
983
+ "/graph-fix": {
984
+ "post": {
985
+ "summary": (
986
+ "Build a missing graphify graph and set core.hooksPath for "
987
+ "one repo on this machine (#2237)"
988
+ ),
989
+ "description": (
990
+ "The machine-local half of graphify onboarding only: "
991
+ "`graphify update .` when no graph exists here, plus "
992
+ "`git config core.hooksPath .githooks`. Idempotent. "
993
+ "Refuses (200, `refused` set) when the repo does not ship "
994
+ "`.githooks/post-checkout` — porting those is a versioned "
995
+ "change and is never automated."
996
+ ),
997
+ "requestBody": {
998
+ "required": True,
999
+ "content": {
1000
+ "application/json": {
1001
+ "schema": {
1002
+ "type": "object",
1003
+ "required": ["repo"],
1004
+ "properties": {
1005
+ "repo": {"type": "string"},
1006
+ "timeout": {
1007
+ "type": "number",
1008
+ "description": (
1009
+ "seconds for `graphify update .`; a "
1010
+ "first build on a large repo is "
1011
+ "minutes, so this defaults to 600."
1012
+ ),
1013
+ },
1014
+ },
1015
+ }
1016
+ }
1017
+ },
1018
+ },
1019
+ "responses": {
1020
+ "200": {"description": "OK (including a refusal)"},
1021
+ "400": {"description": "repo missing from the body"},
1022
+ },
1023
+ }
1024
+ },
983
1025
  "/artifact/{repo}/{branch}": {
984
1026
  "get": {
985
1027
  "summary": "Manifest of stashed build artifacts for a (repo, branch) pair",
@@ -1874,6 +1916,40 @@ def build_app(
1874
1916
  }
1875
1917
  )
1876
1918
 
1919
+ async def graph_fix(request: Request) -> JSONResponse:
1920
+ """Repair graphify's machine-local half for one repo on THIS machine
1921
+ (#2237) — ``coord repo doctor --fix`` fans this out to every machine
1922
+ that clones the repo.
1923
+
1924
+ Body: ``{"repo": "<name>", "timeout": 600}``. ``repo`` is required;
1925
+ anything else is ignored, so an older coordinator posting extra
1926
+ fields and a newer one omitting optional ones both work.
1927
+
1928
+ Idempotent by construction (``git config core.hooksPath`` +
1929
+ ``graphify update .``), and it **refuses** rather than acting when
1930
+ the repo does not ship ``.githooks/post-checkout`` — see
1931
+ :func:`coord.graph_health.apply_local_graph_fix`. Never writes a
1932
+ tracked file, so this can never turn into "the tool silently
1933
+ committed hooks into my repo".
1934
+
1935
+ Runs off the event loop: a first build is minutes of AST work, and
1936
+ blocking the loop here would stall /health for the whole fleet.
1937
+ """
1938
+ body: dict = {}
1939
+ try:
1940
+ body = await request.json()
1941
+ except Exception:
1942
+ pass
1943
+ repo = body.get("repo")
1944
+ if not isinstance(repo, str) or not repo:
1945
+ return JSONResponse({"error": "repo is required"}, status_code=400)
1946
+ try:
1947
+ timeout = float(body.get("timeout", 600.0))
1948
+ except (TypeError, ValueError):
1949
+ timeout = 600.0
1950
+ result = await asyncio.to_thread(server.fix_graph, repo, timeout=timeout)
1951
+ return JSONResponse(result)
1952
+
1877
1953
  routes = [
1878
1954
  Route("/health", health, methods=["GET"]),
1879
1955
  Route("/status", status, methods=["GET"]),
@@ -1895,6 +1971,10 @@ def build_app(
1895
1971
  Route("/rollback", rollback, methods=["POST"]),
1896
1972
  Route("/restart", restart, methods=["POST"]),
1897
1973
  Route("/worktree-clean", worktree_clean, methods=["POST"]),
1974
+ # #2237: `coord repo doctor --fix`'s per-machine leg — build a
1975
+ # missing graph and set core.hooksPath, on the machines that
1976
+ # actually run workers rather than only on the operator's laptop.
1977
+ Route("/graph-fix", graph_fix, methods=["POST"]),
1898
1978
  # #305: artifact stash manifest (GET /artifact/<repo>/<branch>)
1899
1979
  Route("/artifact/{repo}/{branch}", artifact_manifest, methods=["GET"]),
1900
1980
  # #207: CPU + memory snapshot for TUI sparklines