code-coordinator 0.5.81__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.81 → code_coordinator-0.5.82}/CLAUDE.md +19 -3
  2. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/PKG-INFO +1 -1
  3. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/code_coordinator.egg-info/PKG-INFO +1 -1
  4. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/code_coordinator.egg-info/SOURCES.txt +3 -0
  5. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/code_coordinator.egg-info/scm_file_list.json +3 -0
  6. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/code_coordinator.egg-info/scm_version.json +2 -2
  7. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/agent.py +125 -31
  8. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/agent_app.py +80 -0
  9. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/commands/repo.py +131 -5
  10. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/commands/status.py +7 -6
  11. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/graph_health.py +269 -8
  12. {code_coordinator-0.5.81 → 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.81 → code_coordinator-0.5.82}/coord/repo_onboard.py +400 -9
  15. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/docs/ARCHITECTURE.md +32 -6
  16. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/docs/GRAPHIFY_SETUP.md +30 -0
  17. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_agent_graph_self_heal.py +11 -2
  18. code_coordinator-0.5.82/tests/test_graph_selfheal_absent_2237.py +212 -0
  19. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_health_checks.py +74 -0
  20. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_health_context.py +4 -0
  21. code_coordinator-0.5.82/tests/test_repo_graph_fleet_2237.py +632 -0
  22. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_repo_onboard_2220.py +9 -1
  23. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/.claude/commands/board.md +0 -0
  24. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/.claude/commands/complete-session.md +0 -0
  25. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/.claude/commands/coordinator.md +0 -0
  26. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/.githooks/_lib.sh +0 -0
  27. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/.githooks/post-checkout +0 -0
  28. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/.githooks/post-commit +0 -0
  29. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/.githooks/post-merge +0 -0
  30. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  31. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/.github/coord-ci-acceptance.yml +0 -0
  32. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/.github/workflows/auto-release.yml +0 -0
  33. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/.github/workflows/cargo-test.yml +0 -0
  34. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/.github/workflows/publish.yml +0 -0
  35. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/.github/workflows/release-tui.yml +0 -0
  36. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/.github/workflows/test.yml +0 -0
  37. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/.gitignore +0 -0
  38. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/GOAL.md +0 -0
  39. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/LICENSE +0 -0
  40. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/MANIFEST.in +0 -0
  41. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/README.md +0 -0
  42. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/code_coordinator.egg-info/dependency_links.txt +0 -0
  43. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/code_coordinator.egg-info/entry_points.txt +0 -0
  44. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/code_coordinator.egg-info/requires.txt +0 -0
  45. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/code_coordinator.egg-info/top_level.txt +0 -0
  46. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/__init__.py +0 -0
  47. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/_board_mapping.py +0 -0
  48. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/acceptance.py +0 -0
  49. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/acceptance_drivers.py +0 -0
  50. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/agent_update.py +0 -0
  51. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/agents/opencode/.gitignore +0 -0
  52. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/agents/opencode/agents/work.md +0 -0
  53. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/agents/opencode/routing.jsonc +0 -0
  54. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/audit.py +0 -0
  55. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/auto_loop.py +0 -0
  56. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/board_bool_guard.py +0 -0
  57. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/board_service.py +0 -0
  58. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/board_wire.py +0 -0
  59. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/brain.py +0 -0
  60. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/branch_model.py +0 -0
  61. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/bug_intake.py +0 -0
  62. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/cargo_cache.py +0 -0
  63. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/ci_github.py +0 -0
  64. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/ci_store.py +0 -0
  65. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/claim.py +0 -0
  66. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/cli.py +0 -0
  67. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/client.py +0 -0
  68. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/commands/__init__.py +0 -0
  69. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/commands/_common.py +0 -0
  70. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/commands/acceptance.py +0 -0
  71. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/commands/agent_ops.py +0 -0
  72. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/commands/audit.py +0 -0
  73. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/commands/chat.py +0 -0
  74. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/commands/dispatch.py +0 -0
  75. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/commands/dispatch_workers.py +0 -0
  76. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/commands/drive.py +0 -0
  77. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/commands/drive_queue.py +0 -0
  78. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/commands/gate_a.py +0 -0
  79. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/commands/gates.py +0 -0
  80. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/commands/issues.py +0 -0
  81. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/commands/lifecycle.py +0 -0
  82. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/commands/merge.py +0 -0
  83. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/commands/milestone.py +0 -0
  84. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/commands/plan_followup.py +0 -0
  85. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/commands/plans.py +0 -0
  86. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/commands/portal.py +0 -0
  87. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/commands/release.py +0 -0
  88. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/commands/report.py +0 -0
  89. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/commands/review.py +0 -0
  90. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/commands/scorecard.py +0 -0
  91. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/commands/sessions.py +0 -0
  92. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/commands/setup.py +0 -0
  93. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/commands/terminal.py +0 -0
  94. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/commands/test_gate.py +0 -0
  95. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/commands/tui.py +0 -0
  96. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/comments.py +0 -0
  97. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/config.py +0 -0
  98. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/conflict_fix.py +0 -0
  99. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dao.py +0 -0
  100. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/__init__.py +0 -0
  101. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/fixture.py +0 -0
  102. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/index.html +0 -0
  103. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/server.py +0 -0
  104. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/terminal.py +0 -0
  105. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/.gitignore +0 -0
  106. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/components.json +0 -0
  107. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js +0 -0
  108. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  109. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js +0 -0
  110. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js +0 -0
  111. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  112. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  113. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  114. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  115. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  116. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/dist/index.html +0 -0
  117. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  118. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/dist/sw.js +0 -0
  119. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  120. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  121. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  122. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  123. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  124. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  125. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  126. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  127. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  128. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  129. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/eslint.config.js +0 -0
  130. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/index.html +0 -0
  131. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  132. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/package-lock.json +0 -0
  133. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/package.json +0 -0
  134. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  135. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/playwright.config.ts +0 -0
  136. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/postcss.config.js +0 -0
  137. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  138. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  139. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  140. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/App.tsx +0 -0
  141. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/api/client.ts +0 -0
  142. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  143. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  144. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  145. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  146. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  147. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  148. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  149. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  150. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  151. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  152. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  153. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  154. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  155. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  156. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  157. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  158. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  159. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  160. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  161. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  162. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  163. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  164. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  165. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  166. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  167. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  168. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  169. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  170. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  171. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  172. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  173. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  174. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  175. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  176. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  177. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/index.css +0 -0
  178. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  179. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  180. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/main.tsx +0 -0
  181. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  182. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  183. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  184. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  185. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  186. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  187. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  188. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  189. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  190. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  191. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  192. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  193. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  194. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  195. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  196. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  197. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  198. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  199. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  200. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  201. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  202. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  203. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  204. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/tailwind.config.js +0 -0
  205. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/tsconfig.json +0 -0
  206. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  207. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dashboard/webapp/vite.config.ts +0 -0
  208. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/db.py +0 -0
  209. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dead_end.py +0 -0
  210. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/deploy/README.md +0 -0
  211. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/deploy/coord-agent.service +0 -0
  212. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/deploy/coord-db-backup.service +0 -0
  213. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/deploy/coord-db-backup.sh +0 -0
  214. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/deploy/coord-db-backup.timer +0 -0
  215. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/deploy/coord-drive-queue.service +0 -0
  216. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/deploy/coord-drive-queue.timer +0 -0
  217. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/deploy/coord-notify.service +0 -0
  218. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/deploy/coord-notify.timer +0 -0
  219. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/deploy/coord-release-propagate.service +0 -0
  220. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/deploy/coord-release-propagate.timer +0 -0
  221. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/deploy/coord-release-window.service +0 -0
  222. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/deploy/coord-release-window.timer +0 -0
  223. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/deploy/coord-serve.service +0 -0
  224. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/deploy/coord-web-dist-build.service +0 -0
  225. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/deploy/coord-web-dist-build.timer +0 -0
  226. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/deploy/coord-web.service +0 -0
  227. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/deploy_manifest.py +0 -0
  228. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/deploy_units.py +0 -0
  229. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/deps.py +0 -0
  230. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/diagnose.py +0 -0
  231. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dispatch.py +0 -0
  232. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/dist_name.py +0 -0
  233. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/drive.py +0 -0
  234. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/drive_queue.py +0 -0
  235. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/drive_state.py +0 -0
  236. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/events.py +0 -0
  237. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/failure_class.py +0 -0
  238. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/filelock.py +0 -0
  239. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/fleet_config_health.py +0 -0
  240. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/freshness.py +0 -0
  241. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/gate_a.py +0 -0
  242. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/gate_b.py +0 -0
  243. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/gate_snapshot.py +0 -0
  244. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/gates.py +0 -0
  245. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/github_ops.py +0 -0
  246. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/goal.py +0 -0
  247. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/health/__init__.py +0 -0
  248. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/health/aggregate.py +0 -0
  249. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/health/checks/__init__.py +0 -0
  250. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/health/checks/agent_install.py +0 -0
  251. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/health/checks/cargo_targets.py +0 -0
  252. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/health/checks/claude_binary.py +0 -0
  253. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/health/checks/deploy_lane_facts.py +0 -0
  254. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/health/checks/disk.py +0 -0
  255. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/health/checks/fleet_board.py +0 -0
  256. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  257. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/health/checks/fleet_phantom.py +0 -0
  258. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/health/checks/fleet_unit_drift.py +0 -0
  259. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/health/checks/plan_usage.py +0 -0
  260. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/health/checks/repo_state.py +0 -0
  261. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/health/checks/spawned_coord.py +0 -0
  262. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/health/checks/timer_active.py +0 -0
  263. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/health/checks/toolchain.py +0 -0
  264. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/health/checks/unit_drift.py +0 -0
  265. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/health/checks/unit_enablement.py +0 -0
  266. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/health/checks/worktrees.py +0 -0
  267. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/health/cli.py +0 -0
  268. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/health/context.py +0 -0
  269. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/health/fleet_snapshot.py +0 -0
  270. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/health/models.py +0 -0
  271. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/health/pypi.py +0 -0
  272. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/health/registry.py +0 -0
  273. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/health/render.py +0 -0
  274. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/health/units.py +0 -0
  275. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/hooks.py +0 -0
  276. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/housekeeping.py +0 -0
  277. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/interactive.py +0 -0
  278. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/issue_store.py +0 -0
  279. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/liveness_auditor.py +0 -0
  280. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/machine_pause.py +0 -0
  281. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/merge_queue.py +0 -0
  282. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/milestone_chat.py +0 -0
  283. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/milestone_dispatch.py +0 -0
  284. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/milestone_gate.py +0 -0
  285. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/milestone_order.py +0 -0
  286. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/mock_author.py +0 -0
  287. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/models.py +0 -0
  288. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/network.py +0 -0
  289. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/new_issue_chat.py +0 -0
  290. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/notifier/__init__.py +0 -0
  291. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/notifier/baseline.py +0 -0
  292. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/notifier/cli.py +0 -0
  293. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/notifier/collect.py +0 -0
  294. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/notifier/digest.py +0 -0
  295. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/notifier/models.py +0 -0
  296. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/notifier/predicate.py +0 -0
  297. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/notifier/service.py +0 -0
  298. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/notifier/store.py +0 -0
  299. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/notifier/transport.py +0 -0
  300. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/notify.py +0 -0
  301. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/openapi.py +0 -0
  302. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/overlap_fence.py +0 -0
  303. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/parentage.py +0 -0
  304. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/parentage_github.py +0 -0
  305. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/pipeline.py +0 -0
  306. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/plan_parser.py +0 -0
  307. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/plans.py +0 -0
  308. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/platform_paths.py +0 -0
  309. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/portal_bridge.py +0 -0
  310. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/pr_body_lint.py +0 -0
  311. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/prereqs.py +0 -0
  312. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/progress.py +0 -0
  313. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/providers/__init__.py +0 -0
  314. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/providers/base.py +0 -0
  315. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/providers/claude.py +0 -0
  316. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/providers/claude_pty.py +0 -0
  317. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/providers/opencode.py +0 -0
  318. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/reconcile.py +0 -0
  319. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/refine_chat.py +0 -0
  320. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/release_cordon.py +0 -0
  321. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/release_propagate.py +0 -0
  322. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/release_verify.py +0 -0
  323. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/release_window.py +0 -0
  324. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/repo_edit.py +0 -0
  325. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/reports.py +0 -0
  326. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/revalidate.py +0 -0
  327. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/review.py +0 -0
  328. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/scorecard.py +0 -0
  329. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/serve_app.py +0 -0
  330. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/skills/update-issue/SKILL.md +0 -0
  331. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/smoke.py +0 -0
  332. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/spend_ceiling.py +0 -0
  333. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/split_work.py +0 -0
  334. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/stage_projection.py +0 -0
  335. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/state.py +0 -0
  336. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/test_author.py +0 -0
  337. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/test_chat.py +0 -0
  338. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/test_orchestrator.py +0 -0
  339. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/test_report.py +0 -0
  340. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/tui_release.py +0 -0
  341. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/usage.py +0 -0
  342. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/usage_limits.py +0 -0
  343. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/usage_rollup.py +0 -0
  344. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coord/worker_events.py +0 -0
  345. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/coordinator.example.yml +0 -0
  346. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/deploy/coord-agent.service +0 -0
  347. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/deploy/coord-db-backup.service +0 -0
  348. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/deploy/coord-db-backup.sh +0 -0
  349. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/deploy/coord-db-backup.timer +0 -0
  350. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/deploy/coord-drive-queue.service +0 -0
  351. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/deploy/coord-drive-queue.timer +0 -0
  352. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/deploy/coord-notify.service +0 -0
  353. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/deploy/coord-notify.timer +0 -0
  354. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/deploy/coord-release-propagate.service +0 -0
  355. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/deploy/coord-release-propagate.timer +0 -0
  356. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/deploy/coord-release-window.service +0 -0
  357. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/deploy/coord-release-window.timer +0 -0
  358. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/deploy/coord-serve.service +0 -0
  359. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/deploy/coord-web-dist-build.service +0 -0
  360. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/deploy/coord-web-dist-build.sh +0 -0
  361. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/deploy/coord-web-dist-build.timer +0 -0
  362. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/deploy/coord-web-rollback.sh +0 -0
  363. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/deploy/coord-web.service +0 -0
  364. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/deploy/node-shim.sh +0 -0
  365. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/docs/AGENT_OPERATIONS.md +0 -0
  366. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/docs/ARCH_SECURITY_GATES.md +0 -0
  367. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/docs/COCKPIT.md +0 -0
  368. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/docs/CONTROL_CENTER.md +0 -0
  369. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/docs/COST_DISCIPLINE.md +0 -0
  370. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/docs/CROSS_PLATFORM.md +0 -0
  371. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/docs/CUSTOMER_PORTAL.md +0 -0
  372. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/docs/DRIVE_QUEUE.md +0 -0
  373. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/docs/EPHEMERAL_WORKERS.md +0 -0
  374. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/docs/FORGE_MIGRATION.md +0 -0
  375. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/docs/ISSUE_GUIDANCE.md +0 -0
  376. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/docs/MAC_MINI.md +0 -0
  377. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  378. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/docs/NOTIFIER.md +0 -0
  379. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/docs/OPENCODE_VERIFICATION.md +0 -0
  380. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/docs/OPERATING_GOTCHAS.md +0 -0
  381. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/docs/ORACLE_LOOP.md +0 -0
  382. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/docs/PHONE_WEBAPP.md +0 -0
  383. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/docs/PIPELINE_V2.md +0 -0
  384. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/docs/PLATFORM_EVOLUTION.md +0 -0
  385. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/docs/SECOND_BACKEND.md +0 -0
  386. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/docs/STORE_SERVICE.md +0 -0
  387. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  388. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/docs/WEB_CONTROL_CENTER.md +0 -0
  389. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/docs/mocks/web/README.md +0 -0
  390. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/docs/mocks/web/_tokens.css +0 -0
  391. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/docs/mocks/web/issue-detail.html +0 -0
  392. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/docs/mocks/web/pipeline-narrow.html +0 -0
  393. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/docs/mocks/web/pipeline-wide.html +0 -0
  394. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/graphify-out/.gitignore +0 -0
  395. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/install-agent.sh +0 -0
  396. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/pyproject.toml +0 -0
  397. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/scripts/audit_review_verdict_overrides.py +0 -0
  398. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  399. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/scripts/azure-workers/build-worker-image.sh +0 -0
  400. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/scripts/azure-workers/coordinator-machine.py +0 -0
  401. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/scripts/azure-workers/epic-down.sh +0 -0
  402. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/scripts/azure-workers/epic-up.sh +0 -0
  403. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/scripts/azure-workers/preflight.sh +0 -0
  404. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/scripts/azure-workers/provision-worker.sh +0 -0
  405. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  406. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  407. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/scripts/azure-workers/verify-github-token.sh +0 -0
  408. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/scripts/codegen.py +0 -0
  409. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/scripts/coord-test-runner.sh +0 -0
  410. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/scripts/drive-batch.sh +0 -0
  411. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/scripts/gen_board_fixture.py +0 -0
  412. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/scripts/next_release_tag.py +0 -0
  413. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/scripts/run_tests_in_populated_home.sh +0 -0
  414. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/scripts/run_tests_without_gh.sh +0 -0
  415. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/scripts/smoke_437_interactive.py +0 -0
  416. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/scripts/verify_878_review_capture.py +0 -0
  417. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/scripts/verify_release_published.py +0 -0
  418. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/scripts/verify_release_wheel.py +0 -0
  419. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/setup.cfg +0 -0
  420. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/SMOKE_SET.md +0 -0
  421. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/__init__.py +0 -0
  422. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  423. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/acceptance/ms-33/contract.md +0 -0
  424. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/acceptance/ms-33/manifest.yml +0 -0
  425. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  426. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  427. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  428. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  429. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/acceptance/ms-37/conftest.py +0 -0
  430. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/acceptance/ms-37/contract.md +0 -0
  431. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/acceptance/ms-37/manifest.yml +0 -0
  432. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  433. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  434. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/acceptance/ms-38/contract.md +0 -0
  435. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/acceptance/ms-38/manifest.yml +0 -0
  436. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  437. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  438. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  439. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  440. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  441. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  442. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  443. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  444. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  445. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  446. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/acceptance/ms-51/contract.md +0 -0
  447. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  448. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  449. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/acceptance/ms-51/manifest.yml +0 -0
  450. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  451. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/acceptance/ms-51/tsconfig.json +0 -0
  452. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  453. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/conftest.py +0 -0
  454. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/fixtures/board-pipeline-basic.json +0 -0
  455. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  456. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  457. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  458. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/fixtures/playwright/all_pass.json +0 -0
  459. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  460. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/fixtures/playwright/mixed_fail.json +0 -0
  461. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  462. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  463. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/fixtures/playwright/skip.json +0 -0
  464. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/fixtures/playwright/truncated.json +0 -0
  465. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  466. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  467. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  468. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  469. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  470. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  471. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  472. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  473. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_acceptance.py +0 -0
  474. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_acceptance_drivers.py +0 -0
  475. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_agent.py +0 -0
  476. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_agent_api_error.py +0 -0
  477. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_agent_app.py +0 -0
  478. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_agent_branch_base.py +0 -0
  479. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_agent_branch_capture.py +0 -0
  480. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_agent_config_free_1712.py +0 -0
  481. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_agent_deploy_units_endpoint.py +0 -0
  482. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_agent_dirty_worktree.py +0 -0
  483. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_agent_health_h3.py +0 -0
  484. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_agent_idle_restart.py +0 -0
  485. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_agent_push_failure.py +0 -0
  486. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_agent_reap.py +0 -0
  487. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_agent_repos_and_pull.py +0 -0
  488. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_agent_restart_services_endpoint.py +0 -0
  489. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_agent_startup_diagnostics.py +0 -0
  490. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_agent_update.py +0 -0
  491. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_agent_update_bluegreen.py +0 -0
  492. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_agent_usage_limit.py +0 -0
  493. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_agent_zero_commit.py +0 -0
  494. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_ambient_home_isolation.py +0 -0
  495. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_approve_reject_plan.py +0 -0
  496. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_approve_usage_gate.py +0 -0
  497. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_assignment_already_recorded_daemon.py +0 -0
  498. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_audit_log.py +0 -0
  499. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_audit_outcome.py +0 -0
  500. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_audit_query.py +0 -0
  501. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_auto_loop.py +0 -0
  502. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_auto_release_publish_2035.py +0 -0
  503. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_base_checkout_restore.py +0 -0
  504. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_board_cap_762.py +0 -0
  505. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_board_fixture.py +0 -0
  506. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_board_read_path.py +0 -0
  507. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_board_service.py +0 -0
  508. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_board_state.py +0 -0
  509. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_board_wire.py +0 -0
  510. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_brain.py +0 -0
  511. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_branch_model.py +0 -0
  512. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_bug_intake.py +0 -0
  513. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_build_worker_image_env_update.py +0 -0
  514. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cargo_cache.py +0 -0
  515. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_ci_acceptance_gate_1950.py +0 -0
  516. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_ci_parity_2091.py +0 -0
  517. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_ci_store.py +0 -0
  518. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_claim.py +0 -0
  519. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_acceptance.py +0 -0
  520. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_assign.py +0 -0
  521. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  522. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_assign_interactive_remote.py +0 -0
  523. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_assign_provider.py +0 -0
  524. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  525. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_audit.py +0 -0
  526. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_chat_continue.py +0 -0
  527. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_diagnose_config_provenance.py +0 -0
  528. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_diagnose_graph.py +0 -0
  529. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_doctor.py +0 -0
  530. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_doctor_config_free_1801.py +0 -0
  531. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  532. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_drive.py +0 -0
  533. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_drive_queue.py +0 -0
  534. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_escalate.py +0 -0
  535. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_fix_headless_review.py +0 -0
  536. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_gate_a.py +0 -0
  537. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_install_drift.py +0 -0
  538. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_install_skills.py +0 -0
  539. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_issue_create_label.py +0 -0
  540. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_issue_reopen.py +0 -0
  541. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_merge.py +0 -0
  542. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_milestone_assign.py +0 -0
  543. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_milestone_capture.py +0 -0
  544. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_milestone_chat_add_child.py +0 -0
  545. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_milestone_dispatch.py +0 -0
  546. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_milestone_gate_b.py +0 -0
  547. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_milestone_gate_c.py +0 -0
  548. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_milestone_order.py +0 -0
  549. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  550. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_milestone_ship.py +0 -0
  551. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_network.py +0 -0
  552. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_new_issue_chat.py +0 -0
  553. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_plans.py +0 -0
  554. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_portal.py +0 -0
  555. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_pull_artifact.py +0 -0
  556. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_queue.py +0 -0
  557. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_reattach_sessions.py +0 -0
  558. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_refine_board.py +0 -0
  559. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_release_preflight.py +0 -0
  560. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_release_propagate.py +0 -0
  561. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_release_window.py +0 -0
  562. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_repo_2220.py +0 -0
  563. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_scorecard.py +0 -0
  564. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_set_review_findings.py +0 -0
  565. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_status_advisory_terminal.py +0 -0
  566. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_status_merge_queue.py +0 -0
  567. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_status_provider.py +0 -0
  568. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_status_review_finalizing.py +0 -0
  569. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_status_test_failed_tag.py +0 -0
  570. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_status_usage_limit.py +0 -0
  571. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_sync_comments_873.py +0 -0
  572. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_test_plan.py +0 -0
  573. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_track.py +0 -0
  574. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_tui_update.py +0 -0
  575. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cli_wait.py +0 -0
  576. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_client_base_install.py +0 -0
  577. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_comments.py +0 -0
  578. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_completion_summary.py +0 -0
  579. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_config.py +0 -0
  580. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_config_acceptance.py +0 -0
  581. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_config_audit.py +0 -0
  582. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_config_pricing.py +0 -0
  583. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_config_usage_gate.py +0 -0
  584. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_conflict_fix.py +0 -0
  585. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_conflict_fix_semantic.py +0 -0
  586. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_coord_test.py +0 -0
  587. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_coord_test_runner_baseline.py +0 -0
  588. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_coord_test_runner_routing.py +0 -0
  589. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_coord_test_runner_toolchain.py +0 -0
  590. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_coord_web_sse_restart_live.py +0 -0
  591. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_coordinator_machine.py +0 -0
  592. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_cross_platform_imports.py +0 -0
  593. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_dashboard.py +0 -0
  594. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_dashboard_fixture.py +0 -0
  595. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_dashboard_terminal.py +0 -0
  596. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_dashboard_terminal_live.py +0 -0
  597. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_db.py +0 -0
  598. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_dead_end.py +0 -0
  599. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_deploy_coord_db_backup.py +0 -0
  600. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_deploy_coord_web_dist.py +0 -0
  601. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_deploy_coord_web_rollback.py +0 -0
  602. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_deploy_drive_queue_unit.py +0 -0
  603. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_deploy_manifest.py +0 -0
  604. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_deploy_units_lane.py +0 -0
  605. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_deploy_web_unit.py +0 -0
  606. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_deps.py +0 -0
  607. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_diagnose.py +0 -0
  608. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_dispatch.py +0 -0
  609. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_dispatch_target_validation.py +0 -0
  610. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_dist_name.py +0 -0
  611. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_done_housekeeping.py +0 -0
  612. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_drive.py +0 -0
  613. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_drive_queue.py +0 -0
  614. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_drive_state.py +0 -0
  615. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_drive_tmux.py +0 -0
  616. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_epic_up_capability_detection.py +0 -0
  617. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  618. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_epic_up_image_provenance.py +0 -0
  619. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_errors.py +0 -0
  620. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_events.py +0 -0
  621. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_failure_class.py +0 -0
  622. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_filelock.py +0 -0
  623. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  624. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_fix_of_force_override.py +0 -0
  625. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_fleet_config_health.py +0 -0
  626. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_fleet_health_probes.py +0 -0
  627. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_fleet_health_snapshot.py +0 -0
  628. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_freshness.py +0 -0
  629. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_gate_a.py +0 -0
  630. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_gate_b.py +0 -0
  631. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_gate_snapshot_staleness.py +0 -0
  632. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_gates.py +0 -0
  633. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  634. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_generated_types_fixture.py +0 -0
  635. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_github_ops.py +0 -0
  636. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_goal.py +0 -0
  637. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_graph_health.py +0 -0
  638. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_handoff.py +0 -0
  639. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_health_cli.py +0 -0
  640. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_health_cli_graph.py +0 -0
  641. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_health_config.py +0 -0
  642. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_health_deploy_lane_facts.py +0 -0
  643. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_health_incident_regression.py +0 -0
  644. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_health_pypi.py +0 -0
  645. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_health_registry.py +0 -0
  646. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_health_timer_active.py +0 -0
  647. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_health_toolchain.py +0 -0
  648. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_health_unit_drift.py +0 -0
  649. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_health_unit_enablement.py +0 -0
  650. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_hooks.py +0 -0
  651. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_human_attended_437.py +0 -0
  652. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_init.py +0 -0
  653. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_integration.py +0 -0
  654. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_interactive_briefing_echo.py +0 -0
  655. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_interactive_prefill_state.py +0 -0
  656. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_interactive_session_relaunch.py +0 -0
  657. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_interactive_test_verdict_backstop.py +0 -0
  658. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_interactive_token_attribution.py +0 -0
  659. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_interactive_worktree.py +0 -0
  660. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_issue_store_seam.py +0 -0
  661. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_liveness_auditor.py +0 -0
  662. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_liveness_notify.py +0 -0
  663. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_machine_pause.py +0 -0
  664. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_merge_queue.py +0 -0
  665. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_merge_verify.py +0 -0
  666. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_milestone_chat.py +0 -0
  667. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_milestone_dispatch.py +0 -0
  668. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_milestone_gate.py +0 -0
  669. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_milestone_order.py +0 -0
  670. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_milestone_seam.py +0 -0
  671. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_mock_author.py +0 -0
  672. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_model_tiering.py +0 -0
  673. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_models.py +0 -0
  674. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_models_config_labels.py +0 -0
  675. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_needs_attention.py +0 -0
  676. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_network.py +0 -0
  677. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_new_issue_chat.py +0 -0
  678. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_next_release_tag.py +0 -0
  679. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_no_direct_gh_calls.py +0 -0
  680. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_node_shim.py +0 -0
  681. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_notifier_baseline.py +0 -0
  682. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_notifier_cli.py +0 -0
  683. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_notifier_collect.py +0 -0
  684. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_notifier_config.py +0 -0
  685. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_notifier_drive_seam.py +0 -0
  686. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_notifier_isolation.py +0 -0
  687. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_notifier_predicate.py +0 -0
  688. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_notifier_quiet_hours.py +0 -0
  689. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_notifier_service.py +0 -0
  690. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_notify.py +0 -0
  691. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_notify_drain.py +0 -0
  692. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_openapi.py +0 -0
  693. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_operational_defaults.py +0 -0
  694. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_overlap_fence.py +0 -0
  695. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_packaged_deploy_units.py +0 -0
  696. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_parentage.py +0 -0
  697. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_paste_landed.py +0 -0
  698. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_pipeline.py +0 -0
  699. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_plan_followup_approve_plan_command.py +0 -0
  700. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_plan_followup_pr_command.py +0 -0
  701. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_plan_followup_review_command.py +0 -0
  702. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_plan_only.py +0 -0
  703. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_plan_parser.py +0 -0
  704. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_platform_paths.py +0 -0
  705. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_portal_bridge.py +0 -0
  706. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_portal_config.py +0 -0
  707. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_pr_body_lint.py +0 -0
  708. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_prereqs.py +0 -0
  709. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_production_db_guard.py +0 -0
  710. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_progress.py +0 -0
  711. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_provider_seam.py +0 -0
  712. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_providers.py +0 -0
  713. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_providers_config_labels.py +0 -0
  714. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_providers_pty.py +0 -0
  715. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_quiet_hours.py +0 -0
  716. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_quiet_hours_store_2146.py +0 -0
  717. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_reap_merged_sessions.py +0 -0
  718. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_reap_stale_interactive_tick.py +0 -0
  719. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_reconcile_branch.py +0 -0
  720. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_reconcile_completions.py +0 -0
  721. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_reconcile_merges.py +0 -0
  722. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_reconcile_usage_limit_done.py +0 -0
  723. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_refine_chat.py +0 -0
  724. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_release_cordon_2101.py +0 -0
  725. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_release_propagate.py +0 -0
  726. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_release_unified_1242.py +0 -0
  727. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_release_verify.py +0 -0
  728. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_release_window.py +0 -0
  729. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_remote_auto_prune.py +0 -0
  730. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_remote_interactive_reaper.py +0 -0
  731. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_repo_edit_2220.py +0 -0
  732. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_report_result_push.py +0 -0
  733. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_reports.py +0 -0
  734. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_retry.py +0 -0
  735. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_retry_advisory_1606.py +0 -0
  736. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_retry_type_1636.py +0 -0
  737. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_revalidate.py +0 -0
  738. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_review.py +0 -0
  739. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_review_end_review_without_verdict.py +0 -0
  740. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_review_parse_failure_diagnostic.py +0 -0
  741. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_review_reaffirm.py +0 -0
  742. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_review_state.py +0 -0
  743. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_review_verdict_backstop.py +0 -0
  744. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_review_verdict_override_audit.py +0 -0
  745. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_review_verdict_relay.py +0 -0
  746. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_review_zero_commits.py +0 -0
  747. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_scoped_review_wiring.py +0 -0
  748. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_scorecard.py +0 -0
  749. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_serve.py +0 -0
  750. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_serve_app_board_trim.py +0 -0
  751. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_session.py +0 -0
  752. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_slice_issue_attribution.py +0 -0
  753. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_smoke.py +0 -0
  754. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_smoke_live_checkout_restore.py +0 -0
  755. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_smoke_workflow.py +0 -0
  756. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_spend_ceiling.py +0 -0
  757. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_spend_ceiling_coordinator.py +0 -0
  758. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_split.py +0 -0
  759. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_split_work.py +0 -0
  760. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_stage_projection.py +0 -0
  761. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_stalled_pipeline.py +0 -0
  762. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_state.py +0 -0
  763. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_state_review_findings_daemon.py +0 -0
  764. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_status_fleet_footer.py +0 -0
  765. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_stop_1567.py +0 -0
  766. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_stuck.py +0 -0
  767. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_terminal_command.py +0 -0
  768. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_test_author.py +0 -0
  769. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_test_chat.py +0 -0
  770. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_test_orchestrator.py +0 -0
  771. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_test_report.py +0 -0
  772. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_test_verdict_parsing.py +0 -0
  773. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_test_verdict_transcript_floor.py +0 -0
  774. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_thin_client_board_audit.py +0 -0
  775. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_thin_client_config_load_1080.py +0 -0
  776. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_thin_client_daemon_routing_906.py +0 -0
  777. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_tmux_host.py +0 -0
  778. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_tmux_session.py +0 -0
  779. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_transcript_floor.py +0 -0
  780. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_usage.py +0 -0
  781. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_usage_limits.py +0 -0
  782. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_usage_rollup.py +0 -0
  783. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_venv_live_install_2121.py +0 -0
  784. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_version_single_source.py +0 -0
  785. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_watch.py +0 -0
  786. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_worker_events.py +0 -0
  787. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_worker_image_pin_sync.py +0 -0
  788. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_worker_safety.py +0 -0
  789. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_worker_test_scoping.py +0 -0
  790. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_worktree.py +0 -0
  791. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  792. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/Cargo.lock +0 -0
  793. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/Cargo.toml +0 -0
  794. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/cargo-config-local-quadraui.toml.example +0 -0
  795. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/app/audit.rs +0 -0
  796. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/app/chat.rs +0 -0
  797. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/app/data.rs +0 -0
  798. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/app/dialogs.rs +0 -0
  799. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/app/drive.rs +0 -0
  800. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/app/drive_queue.rs +0 -0
  801. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/app/escalation.rs +0 -0
  802. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/app/events.rs +0 -0
  803. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/app/fixtures.rs +0 -0
  804. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/app/fleet_health.rs +0 -0
  805. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/app/fleet_sessions.rs +0 -0
  806. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/app/fleet_terminals.rs +0 -0
  807. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/app/format.rs +0 -0
  808. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/app/milestone_dag.rs +0 -0
  809. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/app/mod.rs +0 -0
  810. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/app/msv.rs +0 -0
  811. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/app/pipeline.rs +0 -0
  812. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/app/plans.rs +0 -0
  813. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/app/render.rs +0 -0
  814. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/app/reports.rs +0 -0
  815. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/app/sessions.rs +0 -0
  816. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/app/settings_ui.rs +0 -0
  817. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/app/sidebar.rs +0 -0
  818. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/app/terminal.rs +0 -0
  819. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/app/tests.rs +0 -0
  820. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/app/types.rs +0 -0
  821. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/app/workspace.rs +0 -0
  822. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/bin/gtk.rs +0 -0
  823. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/commands.rs +0 -0
  824. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/lib.rs +0 -0
  825. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/main.rs +0 -0
  826. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/src/settings.rs +0 -0
  827. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/tests/acceptance.rs +0 -0
  828. {code_coordinator-0.5.81 → code_coordinator-0.5.82}/tui/tests/cli.rs +0 -0
  829. {code_coordinator-0.5.81 → 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.81
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.81
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.81",
2
+ "tag": "0.5.82",
3
3
  "distance": 0,
4
- "node": "gf5568b98773fd08c6165236df1c398d57ecc9260",
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` —
@@ -4151,6 +4135,21 @@ class AgentServer:
4151
4135
  # already follows.
4152
4136
  self._graph_rebuild_in_progress: set[str] = set()
4153
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
+
4154
4153
  self.state_dir.mkdir(parents=True, exist_ok=True)
4155
4154
  self.log_dir.mkdir(parents=True, exist_ok=True)
4156
4155
  self._load_state()
@@ -4224,6 +4223,19 @@ class AgentServer:
4224
4223
  # block (`_cached_local_health`'s own try/except) rather than
4225
4224
  # omitting the key, so an old/new client can always find it.
4226
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
+ },
4227
4239
  }
4228
4240
 
4229
4241
  def _cached_local_health(self) -> dict:
@@ -4288,6 +4300,19 @@ class AgentServer:
4288
4300
  """React to the ``graph`` check's STATE verdict instead of chasing
4289
4301
  the git events that produced it (#1729, H-6).
4290
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
+
4291
4316
  The git hooks (`.githooks/`) are event-driven and structurally
4292
4317
  cannot cover every ref-moving operation — rebase/merge/cherry-pick
4293
4318
  `exit 0`, `git reset --hard` fires no hook at all, and every hook
@@ -4304,8 +4329,13 @@ class AgentServer:
4304
4329
  1. **Idle-gate.** Only when this machine has no RUNNING assignment.
4305
4330
  A rebuild is hundreds of files across many workers; running it
4306
4331
  while a worker is mid-build steals the CPU that worker was
4307
- dispatched for. This reads `self._assignments` under a brief
4308
- 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 —
4309
4339
  load-bearing for guard-adjacent requirement #1625 decision 3:
4310
4340
  health must stay advisory, so a dispatch landing mid-rebuild
4311
4341
  must never be delayed by it (see `_graphify_update`, called
@@ -4360,13 +4390,32 @@ class AgentServer:
4360
4390
  with self._lock:
4361
4391
  active = sum(1 for a in self._assignments.values() if a.status == RUNNING)
4362
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()
4363
4399
  return
4400
+ self._graph_heal_passes += 1
4364
4401
 
4365
4402
  for i, result in enumerate(report.results):
4366
4403
  if result.check_id != "graph":
4367
4404
  continue
4368
4405
  values = result.values or {}
4369
- 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):
4370
4419
  continue
4371
4420
  path_str = values.get("path")
4372
4421
  if not path_str:
@@ -5321,6 +5370,51 @@ class AgentServer:
5321
5370
  servable.append(repo_name)
5322
5371
  return servable, degraded
5323
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
+
5324
5418
  def list_repos(self) -> dict[str, dict]:
5325
5419
  """Return local HEAD / branch / dirty flag for each configured repo.
5326
5420
 
@@ -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
@@ -293,9 +293,27 @@ def repo_add( # noqa: PLR0913 — one option per thing the command can set
293
293
  "for this repo's paths, and (if it joins the oracle loop) "
294
294
  "`acceptance.drivers`."
295
295
  )
296
+ # #2237: layer 5 used to be one vague line here and nothing else — so
297
+ # every repo onboarded from this command started with no graph, and the
298
+ # only thing that would ever say so was a `repo doctor` nobody is obliged
299
+ # to run. Split into the two halves that have genuinely different owners:
300
+ # the versioned port (a PR against the repo, never automated) and the
301
+ # machine-local half (idempotent, and `--fix` does it on every machine).
296
302
  click.echo(
297
- " 7. graphify build + `graphify hook install` + `core.hooksPath`, in "
298
- "that order, per machine (docs/GRAPHIFY_SETUP.md)."
303
+ " 7. GRAPH, versioned half port `.githooks/` (_lib.sh, "
304
+ "post-checkout, post-commit, post-merge) into the repo and commit "
305
+ "them. Tracked files, so one PR reaches every machine. Without them "
306
+ "worktrees get no linked graph and every worker falls back to grep "
307
+ "(docs/GRAPHIFY_SETUP.md)."
308
+ )
309
+ click.echo(
310
+ " 8. GRAPH, machine-local half — once the repo is cloned on each "
311
+ f"machine: `coord repo doctor {name} --fix` builds the graph "
312
+ "(`graphify update .`) and sets `core.hooksPath .githooks` on every "
313
+ "machine that runs workers. Idempotent; safe to re-run. Do it AFTER "
314
+ "step 7 — pointing core.hooksPath at a .githooks/ that does not "
315
+ "exist silently disables every hook in the checkout, so --fix refuses "
316
+ "until the hooks are ported."
299
317
  )
300
318
  click.echo("")
301
319
  click.echo(f"Then: coord repo doctor {name}")
@@ -306,8 +324,10 @@ def repo_add( # noqa: PLR0913 — one option per thing the command can set
306
324
  help=(
307
325
  "Probe all five onboarding layers for a repo and report per-layer "
308
326
  "status. Reads LIVE state — each agent's /health repo list, the labels "
309
- "that exist on GitHub, whether any workflow triggers on pull_request "
310
- "not config. Exits non-zero on any CRIT so it can gate."
327
+ "that exist on GitHub, whether any workflow triggers on pull_request, "
328
+ "and (since #2237) each machine's graph readiness rather than only "
329
+ "this one's — not config. Exits non-zero on any CRIT so it can gate. "
330
+ "Use --fix to repair the machine-local half of the graph layer."
311
331
  ),
312
332
  )
313
333
  @click.argument("name")
@@ -324,12 +344,28 @@ def repo_add( # noqa: PLR0913 — one option per thing the command can set
324
344
  "--verbose", "-v", is_flag=True, default=False,
325
345
  help="Show passing checks too, not just the residue.",
326
346
  )
327
- def repo_doctor(
347
+ @click.option(
348
+ "--fix", "do_fix", is_flag=True, default=False,
349
+ help=(
350
+ "Repair graphify's MACHINE-LOCAL half on every machine that clones "
351
+ "this repo: build a missing graph (`graphify update .`) and set "
352
+ "`core.hooksPath .githooks`. Idempotent, never touches a tracked "
353
+ "file, and refuses on a repo that has not ported `.githooks/` — that "
354
+ "port is a PR against the repo, reported here as remaining work."
355
+ ),
356
+ )
357
+ @click.option(
358
+ "--fix-timeout", default=900.0, show_default=True, type=float,
359
+ help="Per-machine timeout for --fix (a first graph build is minutes).",
360
+ )
361
+ def repo_doctor( # noqa: PLR0913 — one option per thing the command can do
328
362
  name: str,
329
363
  config_path: Path,
330
364
  timeout: float,
331
365
  probe_github: bool, # noqa: FBT001
332
366
  verbose: bool, # noqa: FBT001
367
+ do_fix: bool, # noqa: FBT001
368
+ fix_timeout: float,
333
369
  ) -> None:
334
370
  from coord import repo_onboard # noqa: PLC0415
335
371
  from coord.network import check_all # noqa: PLC0415
@@ -355,6 +391,14 @@ def repo_doctor(
355
391
  machines = [m for m in cfg.machines if name in (m.repos or [])]
356
392
  statuses = check_all(machines, timeout=timeout) if machines else []
357
393
 
394
+ if do_fix:
395
+ # Repair BEFORE reporting, so the report an operator reads is the
396
+ # state they are actually leaving behind — a --fix run that printed
397
+ # the pre-fix findings would be indistinguishable from one that did
398
+ # nothing.
399
+ _run_graph_fix(cfg, name, machines, statuses, timeout=fix_timeout)
400
+ statuses = check_all(machines, timeout=timeout) if machines else []
401
+
358
402
  facts = repo_onboard.gather_facts(
359
403
  cfg, name,
360
404
  statuses=statuses,
@@ -366,3 +410,85 @@ def repo_doctor(
366
410
  click.echo(line)
367
411
  if not report.ok:
368
412
  sys.exit(1)
413
+
414
+
415
+ def _run_graph_fix(cfg, name: str, machines, statuses, *, timeout: float) -> None:
416
+ """``--fix``: graphify's machine-local half, on every machine (#2237).
417
+
418
+ Fans out to each machine's agent (``POST /graph-fix``) rather than
419
+ repairing the local clone, because the local clone is the one that
420
+ matters least: workers run on dellserver and precision, the operator runs
421
+ this on elitebook. A fixer that only ever fixed here would recreate
422
+ layer 5's original blind spot one level up.
423
+
424
+ The local clone is still repaired directly when this machine has one that
425
+ no agent covers — an operator's laptop is a legitimate place to want a
426
+ graph, it just isn't a place workers run.
427
+
428
+ Everything it does is idempotent and machine-local (``graphify update .``,
429
+ ``git config core.hooksPath``); the versioned ``.githooks/`` port is
430
+ reported as remaining work by the report that follows, never performed.
431
+ """
432
+ import httpx # noqa: PLC0415
433
+ from coord.network import AGENT_PORT # noqa: PLC0415
434
+
435
+ click.echo(f"--fix: repairing graphify's machine-local half for {name}")
436
+ online = {s.machine.name for s in statuses if s.is_online}
437
+ fixed_paths: set[str] = set()
438
+
439
+ for machine in machines:
440
+ if machine.name not in online:
441
+ click.echo(
442
+ f" ⚠ {machine.name}: skipped — agent not reachable, so nothing "
443
+ f"here could be repaired (it is NOT known to be fine)"
444
+ )
445
+ continue
446
+ try:
447
+ resp = httpx.post(
448
+ f"http://{machine.host}:{AGENT_PORT}/graph-fix",
449
+ json={"repo": name, "timeout": timeout},
450
+ timeout=timeout + 30.0,
451
+ )
452
+ resp.raise_for_status()
453
+ result = resp.json()
454
+ except Exception as exc: # noqa: BLE001 — one machine must not abort the sweep
455
+ click.echo(f" ✗ {machine.name}: /graph-fix failed — {exc}")
456
+ continue
457
+ for line in _format_fix_result(machine.name, result):
458
+ click.echo(line)
459
+ if result.get("repo_path"):
460
+ fixed_paths.add(str(Path(result["repo_path"]).expanduser()))
461
+
462
+ # The local clone, when it is not one of the checkouts just repaired.
463
+ from coord import repo_onboard # noqa: PLC0415
464
+ from coord.graph_health import apply_local_graph_fix # noqa: PLC0415
465
+
466
+ local = repo_onboard.local_clone_path(cfg, name)
467
+ if local is not None and str(local.expanduser()) not in fixed_paths:
468
+ result = apply_local_graph_fix(local, timeout=timeout).to_dict()
469
+ for line in _format_fix_result("this machine", result):
470
+ click.echo(line)
471
+ click.echo("")
472
+
473
+
474
+ def _format_fix_result(where: str, result: dict) -> list[str]:
475
+ """Render one machine's ``/graph-fix`` result.
476
+
477
+ A refusal reads as a refusal, not a failure and emphatically not a
478
+ success: "no `.githooks/` in this repo" means the fixer deliberately did
479
+ nothing, and the operator's next move is a PR, not a re-run.
480
+ """
481
+ if result.get("refused"):
482
+ return [f" ⊘ {where}: refused — {result['refused']}"]
483
+ lines: list[str] = []
484
+ for step in result.get("steps") or []:
485
+ if step.get("ok") and step.get("changed"):
486
+ mark = "✓"
487
+ elif step.get("ok"):
488
+ mark = "·" # already in the desired state — the idempotent no-op
489
+ else:
490
+ mark = "✗"
491
+ lines.append(f" {mark} {where}: {step.get('action')} — {step.get('detail')}")
492
+ if not lines:
493
+ lines.append(f" · {where}: nothing to do")
494
+ return lines
@@ -963,12 +963,13 @@ def _repo_onboarding_lines(cfg, statuses) -> list[tuple[bool, str]]:
963
963
  two-thirds onboarded for days and the only thing that ever noticed was a
964
964
  queue entry dying of it.
965
965
 
966
- Runs with ``probe_github=False`` and no graph probe, so it costs **zero**
967
- extra round trips — it re-reads the ``/health`` bodies this command has
968
- already fetched. That is enough for the finding that actually bit: the
969
- #2219 agent/config repo skew is visible from ``/health`` alone. The GitHub
970
- and repo-contents layers need ``coord repo doctor <name>``, which the
971
- footer below points at.
966
+ Runs with ``probe_github=False`` and no local-disk graph probe, so it costs
967
+ **zero** extra round trips — it re-reads the ``/health`` bodies this
968
+ command has already fetched. That is enough for the two findings that
969
+ actually bit: the #2219 agent/config repo skew, and (since #2237) a repo
970
+ with no graph on any machine that runs workers — both visible from
971
+ ``/health`` alone. The GitHub and repo-contents layers need ``coord repo
972
+ doctor <name>``, which the footer below points at.
972
973
 
973
974
  Mirrors :func:`_unit_drift_lines`/:func:`_release_lag_lines`: same
974
975
  computation as the dedicated command (#2096's "two surfaces, one