code-coordinator 0.5.75__tar.gz → 0.5.76__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 (827) hide show
  1. code_coordinator-0.5.76/CLAUDE.md +253 -0
  2. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/PKG-INFO +1 -1
  3. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/code_coordinator.egg-info/PKG-INFO +1 -1
  4. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/code_coordinator.egg-info/SOURCES.txt +2 -0
  5. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/code_coordinator.egg-info/scm_file_list.json +2 -0
  6. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/code_coordinator.egg-info/scm_version.json +2 -2
  7. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/commands/release.py +89 -1
  8. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/interactive.py +72 -1
  9. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/release_propagate.py +4 -0
  10. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/docs/AGENT_OPERATIONS.md +48 -0
  11. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/docs/ARCHITECTURE.md +156 -0
  12. code_coordinator-0.5.76/docs/COST_DISCIPLINE.md +67 -0
  13. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_release_propagate.py +168 -1
  14. code_coordinator-0.5.76/tests/test_gather_fleet_tmux_sessions.py +134 -0
  15. code_coordinator-0.5.75/CLAUDE.md +0 -220
  16. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/.claude/commands/board.md +0 -0
  17. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/.claude/commands/complete-session.md +0 -0
  18. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/.claude/commands/coordinator.md +0 -0
  19. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/.githooks/_lib.sh +0 -0
  20. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/.githooks/post-checkout +0 -0
  21. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/.githooks/post-commit +0 -0
  22. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/.githooks/post-merge +0 -0
  23. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  24. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/.github/coord-ci-acceptance.yml +0 -0
  25. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/.github/workflows/auto-release.yml +0 -0
  26. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/.github/workflows/cargo-test.yml +0 -0
  27. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/.github/workflows/publish.yml +0 -0
  28. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/.github/workflows/release-tui.yml +0 -0
  29. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/.github/workflows/test.yml +0 -0
  30. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/.gitignore +0 -0
  31. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/GOAL.md +0 -0
  32. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/LICENSE +0 -0
  33. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/MANIFEST.in +0 -0
  34. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/README.md +0 -0
  35. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/code_coordinator.egg-info/dependency_links.txt +0 -0
  36. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/code_coordinator.egg-info/entry_points.txt +0 -0
  37. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/code_coordinator.egg-info/requires.txt +0 -0
  38. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/code_coordinator.egg-info/top_level.txt +0 -0
  39. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/__init__.py +0 -0
  40. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/_board_mapping.py +0 -0
  41. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/acceptance.py +0 -0
  42. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/acceptance_drivers.py +0 -0
  43. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/agent.py +0 -0
  44. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/agent_app.py +0 -0
  45. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/agent_update.py +0 -0
  46. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/agents/opencode/.gitignore +0 -0
  47. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/agents/opencode/agents/work.md +0 -0
  48. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/agents/opencode/routing.jsonc +0 -0
  49. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/audit.py +0 -0
  50. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/auto_loop.py +0 -0
  51. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/board_bool_guard.py +0 -0
  52. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/board_service.py +0 -0
  53. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/board_wire.py +0 -0
  54. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/brain.py +0 -0
  55. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/branch_model.py +0 -0
  56. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/bug_intake.py +0 -0
  57. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/cargo_cache.py +0 -0
  58. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/ci_github.py +0 -0
  59. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/ci_store.py +0 -0
  60. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/claim.py +0 -0
  61. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/cli.py +0 -0
  62. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/client.py +0 -0
  63. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/commands/__init__.py +0 -0
  64. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/commands/_common.py +0 -0
  65. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/commands/acceptance.py +0 -0
  66. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/commands/agent_ops.py +0 -0
  67. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/commands/audit.py +0 -0
  68. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/commands/chat.py +0 -0
  69. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/commands/dispatch.py +0 -0
  70. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/commands/dispatch_workers.py +0 -0
  71. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/commands/drive.py +0 -0
  72. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/commands/drive_queue.py +0 -0
  73. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/commands/gate_a.py +0 -0
  74. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/commands/gates.py +0 -0
  75. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/commands/issues.py +0 -0
  76. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/commands/lifecycle.py +0 -0
  77. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/commands/merge.py +0 -0
  78. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/commands/milestone.py +0 -0
  79. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/commands/plan_followup.py +0 -0
  80. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/commands/plans.py +0 -0
  81. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/commands/portal.py +0 -0
  82. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/commands/repo.py +0 -0
  83. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/commands/report.py +0 -0
  84. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/commands/review.py +0 -0
  85. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/commands/scorecard.py +0 -0
  86. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/commands/sessions.py +0 -0
  87. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/commands/setup.py +0 -0
  88. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/commands/status.py +0 -0
  89. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/commands/terminal.py +0 -0
  90. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/commands/test_gate.py +0 -0
  91. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/commands/tui.py +0 -0
  92. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/comments.py +0 -0
  93. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/config.py +0 -0
  94. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/conflict_fix.py +0 -0
  95. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dao.py +0 -0
  96. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/__init__.py +0 -0
  97. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/fixture.py +0 -0
  98. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/index.html +0 -0
  99. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/server.py +0 -0
  100. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/terminal.py +0 -0
  101. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/.gitignore +0 -0
  102. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/components.json +0 -0
  103. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js +0 -0
  104. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  105. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js +0 -0
  106. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js +0 -0
  107. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  108. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  109. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  110. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  111. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  112. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/dist/index.html +0 -0
  113. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  114. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/dist/sw.js +0 -0
  115. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  116. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  117. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  118. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  119. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  120. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  121. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  122. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  123. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  124. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  125. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/eslint.config.js +0 -0
  126. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/index.html +0 -0
  127. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  128. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/package-lock.json +0 -0
  129. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/package.json +0 -0
  130. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  131. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/playwright.config.ts +0 -0
  132. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/postcss.config.js +0 -0
  133. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  134. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  135. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  136. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/App.tsx +0 -0
  137. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/api/client.ts +0 -0
  138. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  139. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  140. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  141. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  142. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  143. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  144. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  145. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  146. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  147. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  148. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  149. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  150. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  151. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  152. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  153. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  154. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  155. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  156. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  157. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  158. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  159. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  160. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  161. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  162. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  163. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  164. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  165. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  166. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  167. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  168. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  169. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  170. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  171. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  172. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  173. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/index.css +0 -0
  174. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  175. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  176. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/main.tsx +0 -0
  177. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  178. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  179. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  180. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  181. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  182. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  183. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  184. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  185. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  186. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  187. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  188. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  189. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  190. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  191. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  192. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  193. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  194. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  195. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  196. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  197. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  198. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  199. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  200. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/tailwind.config.js +0 -0
  201. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/tsconfig.json +0 -0
  202. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  203. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dashboard/webapp/vite.config.ts +0 -0
  204. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/db.py +0 -0
  205. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dead_end.py +0 -0
  206. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/deploy/README.md +0 -0
  207. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/deploy/coord-agent.service +0 -0
  208. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/deploy/coord-db-backup.service +0 -0
  209. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/deploy/coord-db-backup.sh +0 -0
  210. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/deploy/coord-db-backup.timer +0 -0
  211. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/deploy/coord-drive-queue.service +0 -0
  212. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/deploy/coord-drive-queue.timer +0 -0
  213. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/deploy/coord-notify.service +0 -0
  214. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/deploy/coord-notify.timer +0 -0
  215. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/deploy/coord-release-propagate.service +0 -0
  216. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/deploy/coord-release-propagate.timer +0 -0
  217. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/deploy/coord-release-window.service +0 -0
  218. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/deploy/coord-release-window.timer +0 -0
  219. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/deploy/coord-serve.service +0 -0
  220. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/deploy/coord-web-dist-build.service +0 -0
  221. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/deploy/coord-web-dist-build.timer +0 -0
  222. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/deploy/coord-web.service +0 -0
  223. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/deploy_manifest.py +0 -0
  224. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/deploy_units.py +0 -0
  225. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/deps.py +0 -0
  226. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/diagnose.py +0 -0
  227. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dispatch.py +0 -0
  228. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/dist_name.py +0 -0
  229. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/drive.py +0 -0
  230. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/drive_queue.py +0 -0
  231. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/drive_state.py +0 -0
  232. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/events.py +0 -0
  233. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/failure_class.py +0 -0
  234. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/filelock.py +0 -0
  235. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/fleet_config_health.py +0 -0
  236. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/freshness.py +0 -0
  237. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/gate_a.py +0 -0
  238. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/gate_b.py +0 -0
  239. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/gate_snapshot.py +0 -0
  240. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/gates.py +0 -0
  241. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/github_ops.py +0 -0
  242. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/goal.py +0 -0
  243. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/graph_health.py +0 -0
  244. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/health/__init__.py +0 -0
  245. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/health/aggregate.py +0 -0
  246. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/health/checks/__init__.py +0 -0
  247. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/health/checks/agent_install.py +0 -0
  248. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/health/checks/cargo_targets.py +0 -0
  249. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/health/checks/claude_binary.py +0 -0
  250. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/health/checks/deploy_lane_facts.py +0 -0
  251. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/health/checks/disk.py +0 -0
  252. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/health/checks/fleet_board.py +0 -0
  253. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  254. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/health/checks/fleet_phantom.py +0 -0
  255. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/health/checks/fleet_unit_drift.py +0 -0
  256. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/health/checks/graph.py +0 -0
  257. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/health/checks/plan_usage.py +0 -0
  258. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/health/checks/repo_state.py +0 -0
  259. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/health/checks/spawned_coord.py +0 -0
  260. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/health/checks/timer_active.py +0 -0
  261. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/health/checks/toolchain.py +0 -0
  262. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/health/checks/unit_drift.py +0 -0
  263. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/health/checks/unit_enablement.py +0 -0
  264. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/health/checks/worktrees.py +0 -0
  265. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/health/cli.py +0 -0
  266. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/health/context.py +0 -0
  267. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/health/fleet_snapshot.py +0 -0
  268. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/health/models.py +0 -0
  269. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/health/pypi.py +0 -0
  270. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/health/registry.py +0 -0
  271. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/health/render.py +0 -0
  272. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/health/units.py +0 -0
  273. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/hooks.py +0 -0
  274. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/housekeeping.py +0 -0
  275. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/issue_store.py +0 -0
  276. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/liveness_auditor.py +0 -0
  277. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/machine_pause.py +0 -0
  278. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/merge_queue.py +0 -0
  279. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/milestone_chat.py +0 -0
  280. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/milestone_dispatch.py +0 -0
  281. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/milestone_gate.py +0 -0
  282. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/milestone_order.py +0 -0
  283. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/mock_author.py +0 -0
  284. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/models.py +0 -0
  285. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/network.py +0 -0
  286. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/new_issue_chat.py +0 -0
  287. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/notifier/__init__.py +0 -0
  288. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/notifier/baseline.py +0 -0
  289. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/notifier/cli.py +0 -0
  290. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/notifier/collect.py +0 -0
  291. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/notifier/digest.py +0 -0
  292. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/notifier/models.py +0 -0
  293. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/notifier/predicate.py +0 -0
  294. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/notifier/service.py +0 -0
  295. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/notifier/store.py +0 -0
  296. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/notifier/transport.py +0 -0
  297. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/notify.py +0 -0
  298. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/openapi.py +0 -0
  299. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/overlap_fence.py +0 -0
  300. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/parentage.py +0 -0
  301. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/parentage_github.py +0 -0
  302. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/pipeline.py +0 -0
  303. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/plan_parser.py +0 -0
  304. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/plans.py +0 -0
  305. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/platform_paths.py +0 -0
  306. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/portal_bridge.py +0 -0
  307. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/pr_body_lint.py +0 -0
  308. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/prereqs.py +0 -0
  309. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/progress.py +0 -0
  310. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/providers/__init__.py +0 -0
  311. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/providers/base.py +0 -0
  312. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/providers/claude.py +0 -0
  313. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/providers/claude_pty.py +0 -0
  314. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/providers/opencode.py +0 -0
  315. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/reconcile.py +0 -0
  316. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/refine_chat.py +0 -0
  317. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/release_cordon.py +0 -0
  318. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/release_verify.py +0 -0
  319. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/release_window.py +0 -0
  320. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/repo_edit.py +0 -0
  321. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/repo_onboard.py +0 -0
  322. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/reports.py +0 -0
  323. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/revalidate.py +0 -0
  324. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/review.py +0 -0
  325. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/scorecard.py +0 -0
  326. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/serve_app.py +0 -0
  327. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/skills/update-issue/SKILL.md +0 -0
  328. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/smoke.py +0 -0
  329. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/spend_ceiling.py +0 -0
  330. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/split_work.py +0 -0
  331. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/stage_projection.py +0 -0
  332. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/state.py +0 -0
  333. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/test_author.py +0 -0
  334. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/test_chat.py +0 -0
  335. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/test_orchestrator.py +0 -0
  336. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/test_report.py +0 -0
  337. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/tui_release.py +0 -0
  338. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/usage.py +0 -0
  339. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/usage_limits.py +0 -0
  340. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/usage_rollup.py +0 -0
  341. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coord/worker_events.py +0 -0
  342. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/coordinator.example.yml +0 -0
  343. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/deploy/coord-agent.service +0 -0
  344. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/deploy/coord-db-backup.service +0 -0
  345. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/deploy/coord-db-backup.sh +0 -0
  346. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/deploy/coord-db-backup.timer +0 -0
  347. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/deploy/coord-drive-queue.service +0 -0
  348. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/deploy/coord-drive-queue.timer +0 -0
  349. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/deploy/coord-notify.service +0 -0
  350. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/deploy/coord-notify.timer +0 -0
  351. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/deploy/coord-release-propagate.service +0 -0
  352. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/deploy/coord-release-propagate.timer +0 -0
  353. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/deploy/coord-release-window.service +0 -0
  354. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/deploy/coord-release-window.timer +0 -0
  355. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/deploy/coord-serve.service +0 -0
  356. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/deploy/coord-web-dist-build.service +0 -0
  357. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/deploy/coord-web-dist-build.sh +0 -0
  358. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/deploy/coord-web-dist-build.timer +0 -0
  359. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/deploy/coord-web-rollback.sh +0 -0
  360. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/deploy/coord-web.service +0 -0
  361. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/deploy/node-shim.sh +0 -0
  362. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/docs/ARCH_SECURITY_GATES.md +0 -0
  363. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/docs/COCKPIT.md +0 -0
  364. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/docs/CONTROL_CENTER.md +0 -0
  365. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/docs/CROSS_PLATFORM.md +0 -0
  366. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/docs/CUSTOMER_PORTAL.md +0 -0
  367. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/docs/DRIVE_QUEUE.md +0 -0
  368. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/docs/EPHEMERAL_WORKERS.md +0 -0
  369. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/docs/FORGE_MIGRATION.md +0 -0
  370. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/docs/GRAPHIFY_SETUP.md +0 -0
  371. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/docs/ISSUE_GUIDANCE.md +0 -0
  372. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/docs/MAC_MINI.md +0 -0
  373. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  374. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/docs/NOTIFIER.md +0 -0
  375. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/docs/OPENCODE_VERIFICATION.md +0 -0
  376. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/docs/OPERATING_GOTCHAS.md +0 -0
  377. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/docs/ORACLE_LOOP.md +0 -0
  378. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/docs/PHONE_WEBAPP.md +0 -0
  379. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/docs/PIPELINE_V2.md +0 -0
  380. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/docs/PLATFORM_EVOLUTION.md +0 -0
  381. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/docs/SECOND_BACKEND.md +0 -0
  382. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/docs/STORE_SERVICE.md +0 -0
  383. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  384. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/docs/WEB_CONTROL_CENTER.md +0 -0
  385. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/docs/mocks/web/README.md +0 -0
  386. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/docs/mocks/web/_tokens.css +0 -0
  387. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/docs/mocks/web/issue-detail.html +0 -0
  388. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/docs/mocks/web/pipeline-narrow.html +0 -0
  389. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/docs/mocks/web/pipeline-wide.html +0 -0
  390. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/graphify-out/.gitignore +0 -0
  391. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/install-agent.sh +0 -0
  392. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/pyproject.toml +0 -0
  393. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/scripts/audit_review_verdict_overrides.py +0 -0
  394. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  395. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/scripts/azure-workers/build-worker-image.sh +0 -0
  396. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/scripts/azure-workers/coordinator-machine.py +0 -0
  397. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/scripts/azure-workers/epic-down.sh +0 -0
  398. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/scripts/azure-workers/epic-up.sh +0 -0
  399. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/scripts/azure-workers/preflight.sh +0 -0
  400. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/scripts/azure-workers/provision-worker.sh +0 -0
  401. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  402. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  403. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/scripts/azure-workers/verify-github-token.sh +0 -0
  404. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/scripts/codegen.py +0 -0
  405. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/scripts/coord-test-runner.sh +0 -0
  406. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/scripts/drive-batch.sh +0 -0
  407. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/scripts/gen_board_fixture.py +0 -0
  408. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/scripts/next_release_tag.py +0 -0
  409. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/scripts/run_tests_in_populated_home.sh +0 -0
  410. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/scripts/run_tests_without_gh.sh +0 -0
  411. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/scripts/smoke_437_interactive.py +0 -0
  412. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/scripts/verify_878_review_capture.py +0 -0
  413. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/scripts/verify_release_published.py +0 -0
  414. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/scripts/verify_release_wheel.py +0 -0
  415. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/setup.cfg +0 -0
  416. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/SMOKE_SET.md +0 -0
  417. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/__init__.py +0 -0
  418. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  419. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/acceptance/ms-33/contract.md +0 -0
  420. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/acceptance/ms-33/manifest.yml +0 -0
  421. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  422. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  423. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  424. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  425. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/acceptance/ms-37/conftest.py +0 -0
  426. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/acceptance/ms-37/contract.md +0 -0
  427. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/acceptance/ms-37/manifest.yml +0 -0
  428. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  429. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  430. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/acceptance/ms-38/contract.md +0 -0
  431. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/acceptance/ms-38/manifest.yml +0 -0
  432. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  433. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  434. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  435. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  436. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  437. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  438. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  439. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  440. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  441. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  442. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/acceptance/ms-51/contract.md +0 -0
  443. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  444. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  445. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/acceptance/ms-51/manifest.yml +0 -0
  446. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  447. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/acceptance/ms-51/tsconfig.json +0 -0
  448. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  449. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/conftest.py +0 -0
  450. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/fixtures/board-pipeline-basic.json +0 -0
  451. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  452. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  453. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  454. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/fixtures/playwright/all_pass.json +0 -0
  455. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  456. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/fixtures/playwright/mixed_fail.json +0 -0
  457. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  458. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  459. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/fixtures/playwright/skip.json +0 -0
  460. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/fixtures/playwright/truncated.json +0 -0
  461. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  462. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  463. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  464. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  465. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  466. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  467. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  468. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  469. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_acceptance.py +0 -0
  470. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_acceptance_drivers.py +0 -0
  471. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_agent.py +0 -0
  472. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_agent_api_error.py +0 -0
  473. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_agent_app.py +0 -0
  474. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_agent_branch_base.py +0 -0
  475. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_agent_branch_capture.py +0 -0
  476. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_agent_config_free_1712.py +0 -0
  477. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_agent_deploy_units_endpoint.py +0 -0
  478. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_agent_dirty_worktree.py +0 -0
  479. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_agent_graph_self_heal.py +0 -0
  480. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_agent_health_h3.py +0 -0
  481. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_agent_idle_restart.py +0 -0
  482. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_agent_push_failure.py +0 -0
  483. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_agent_reap.py +0 -0
  484. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_agent_repos_and_pull.py +0 -0
  485. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_agent_restart_services_endpoint.py +0 -0
  486. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_agent_startup_diagnostics.py +0 -0
  487. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_agent_update.py +0 -0
  488. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_agent_update_bluegreen.py +0 -0
  489. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_agent_usage_limit.py +0 -0
  490. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_agent_zero_commit.py +0 -0
  491. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_ambient_home_isolation.py +0 -0
  492. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_approve_reject_plan.py +0 -0
  493. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_approve_usage_gate.py +0 -0
  494. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_assignment_already_recorded_daemon.py +0 -0
  495. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_audit_log.py +0 -0
  496. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_audit_outcome.py +0 -0
  497. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_audit_query.py +0 -0
  498. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_auto_loop.py +0 -0
  499. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_auto_release_publish_2035.py +0 -0
  500. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_base_checkout_restore.py +0 -0
  501. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_board_cap_762.py +0 -0
  502. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_board_fixture.py +0 -0
  503. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_board_read_path.py +0 -0
  504. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_board_service.py +0 -0
  505. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_board_state.py +0 -0
  506. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_board_wire.py +0 -0
  507. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_brain.py +0 -0
  508. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_branch_model.py +0 -0
  509. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_bug_intake.py +0 -0
  510. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_build_worker_image_env_update.py +0 -0
  511. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cargo_cache.py +0 -0
  512. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_ci_acceptance_gate_1950.py +0 -0
  513. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_ci_parity_2091.py +0 -0
  514. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_ci_store.py +0 -0
  515. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_claim.py +0 -0
  516. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_acceptance.py +0 -0
  517. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_assign.py +0 -0
  518. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  519. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_assign_interactive_remote.py +0 -0
  520. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_assign_provider.py +0 -0
  521. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  522. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_audit.py +0 -0
  523. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_chat_continue.py +0 -0
  524. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_diagnose_config_provenance.py +0 -0
  525. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_diagnose_graph.py +0 -0
  526. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_doctor.py +0 -0
  527. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_doctor_config_free_1801.py +0 -0
  528. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  529. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_drive.py +0 -0
  530. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_drive_queue.py +0 -0
  531. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_escalate.py +0 -0
  532. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_fix_headless_review.py +0 -0
  533. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_gate_a.py +0 -0
  534. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_install_drift.py +0 -0
  535. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_install_skills.py +0 -0
  536. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_issue_create_label.py +0 -0
  537. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_issue_reopen.py +0 -0
  538. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_merge.py +0 -0
  539. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_milestone_assign.py +0 -0
  540. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_milestone_capture.py +0 -0
  541. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_milestone_chat_add_child.py +0 -0
  542. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_milestone_dispatch.py +0 -0
  543. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_milestone_gate_b.py +0 -0
  544. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_milestone_gate_c.py +0 -0
  545. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_milestone_order.py +0 -0
  546. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  547. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_milestone_ship.py +0 -0
  548. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_network.py +0 -0
  549. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_new_issue_chat.py +0 -0
  550. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_plans.py +0 -0
  551. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_portal.py +0 -0
  552. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_pull_artifact.py +0 -0
  553. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_queue.py +0 -0
  554. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_reattach_sessions.py +0 -0
  555. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_refine_board.py +0 -0
  556. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_release_preflight.py +0 -0
  557. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_release_window.py +0 -0
  558. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_repo_2220.py +0 -0
  559. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_scorecard.py +0 -0
  560. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_set_review_findings.py +0 -0
  561. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_status_advisory_terminal.py +0 -0
  562. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_status_merge_queue.py +0 -0
  563. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_status_provider.py +0 -0
  564. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_status_review_finalizing.py +0 -0
  565. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_status_test_failed_tag.py +0 -0
  566. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_status_usage_limit.py +0 -0
  567. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_sync_comments_873.py +0 -0
  568. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_test_plan.py +0 -0
  569. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_track.py +0 -0
  570. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_tui_update.py +0 -0
  571. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cli_wait.py +0 -0
  572. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_client_base_install.py +0 -0
  573. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_comments.py +0 -0
  574. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_completion_summary.py +0 -0
  575. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_config.py +0 -0
  576. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_config_acceptance.py +0 -0
  577. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_config_audit.py +0 -0
  578. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_config_pricing.py +0 -0
  579. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_config_usage_gate.py +0 -0
  580. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_conflict_fix.py +0 -0
  581. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_conflict_fix_semantic.py +0 -0
  582. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_coord_test.py +0 -0
  583. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_coord_test_runner_baseline.py +0 -0
  584. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_coord_test_runner_routing.py +0 -0
  585. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_coord_test_runner_toolchain.py +0 -0
  586. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_coord_web_sse_restart_live.py +0 -0
  587. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_coordinator_machine.py +0 -0
  588. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_cross_platform_imports.py +0 -0
  589. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_dashboard.py +0 -0
  590. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_dashboard_fixture.py +0 -0
  591. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_dashboard_terminal.py +0 -0
  592. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_dashboard_terminal_live.py +0 -0
  593. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_db.py +0 -0
  594. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_dead_end.py +0 -0
  595. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_deploy_coord_db_backup.py +0 -0
  596. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_deploy_coord_web_dist.py +0 -0
  597. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_deploy_coord_web_rollback.py +0 -0
  598. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_deploy_drive_queue_unit.py +0 -0
  599. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_deploy_manifest.py +0 -0
  600. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_deploy_units_lane.py +0 -0
  601. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_deploy_web_unit.py +0 -0
  602. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_deps.py +0 -0
  603. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_diagnose.py +0 -0
  604. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_dispatch.py +0 -0
  605. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_dispatch_target_validation.py +0 -0
  606. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_dist_name.py +0 -0
  607. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_done_housekeeping.py +0 -0
  608. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_drive.py +0 -0
  609. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_drive_queue.py +0 -0
  610. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_drive_state.py +0 -0
  611. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_drive_tmux.py +0 -0
  612. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_epic_up_capability_detection.py +0 -0
  613. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  614. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_epic_up_image_provenance.py +0 -0
  615. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_errors.py +0 -0
  616. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_events.py +0 -0
  617. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_failure_class.py +0 -0
  618. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_filelock.py +0 -0
  619. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  620. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_fix_of_force_override.py +0 -0
  621. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_fleet_config_health.py +0 -0
  622. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_fleet_health_probes.py +0 -0
  623. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_fleet_health_snapshot.py +0 -0
  624. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_freshness.py +0 -0
  625. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_gate_a.py +0 -0
  626. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_gate_b.py +0 -0
  627. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_gate_snapshot_staleness.py +0 -0
  628. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_gates.py +0 -0
  629. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_generated_types_fixture.py +0 -0
  630. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_github_ops.py +0 -0
  631. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_goal.py +0 -0
  632. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_graph_health.py +0 -0
  633. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_handoff.py +0 -0
  634. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_health_checks.py +0 -0
  635. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_health_cli.py +0 -0
  636. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_health_cli_graph.py +0 -0
  637. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_health_config.py +0 -0
  638. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_health_context.py +0 -0
  639. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_health_deploy_lane_facts.py +0 -0
  640. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_health_incident_regression.py +0 -0
  641. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_health_pypi.py +0 -0
  642. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_health_registry.py +0 -0
  643. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_health_timer_active.py +0 -0
  644. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_health_toolchain.py +0 -0
  645. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_health_unit_drift.py +0 -0
  646. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_health_unit_enablement.py +0 -0
  647. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_hooks.py +0 -0
  648. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_human_attended_437.py +0 -0
  649. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_init.py +0 -0
  650. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_integration.py +0 -0
  651. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_interactive_briefing_echo.py +0 -0
  652. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_interactive_prefill_state.py +0 -0
  653. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_interactive_session_relaunch.py +0 -0
  654. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_interactive_test_verdict_backstop.py +0 -0
  655. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_interactive_token_attribution.py +0 -0
  656. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_interactive_worktree.py +0 -0
  657. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_issue_store_seam.py +0 -0
  658. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_liveness_auditor.py +0 -0
  659. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_liveness_notify.py +0 -0
  660. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_machine_pause.py +0 -0
  661. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_merge_queue.py +0 -0
  662. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_merge_verify.py +0 -0
  663. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_milestone_chat.py +0 -0
  664. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_milestone_dispatch.py +0 -0
  665. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_milestone_gate.py +0 -0
  666. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_milestone_order.py +0 -0
  667. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_milestone_seam.py +0 -0
  668. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_mock_author.py +0 -0
  669. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_model_tiering.py +0 -0
  670. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_models.py +0 -0
  671. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_models_config_labels.py +0 -0
  672. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_needs_attention.py +0 -0
  673. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_network.py +0 -0
  674. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_new_issue_chat.py +0 -0
  675. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_next_release_tag.py +0 -0
  676. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_no_direct_gh_calls.py +0 -0
  677. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_node_shim.py +0 -0
  678. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_notifier_baseline.py +0 -0
  679. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_notifier_cli.py +0 -0
  680. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_notifier_collect.py +0 -0
  681. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_notifier_config.py +0 -0
  682. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_notifier_drive_seam.py +0 -0
  683. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_notifier_isolation.py +0 -0
  684. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_notifier_predicate.py +0 -0
  685. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_notifier_quiet_hours.py +0 -0
  686. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_notifier_service.py +0 -0
  687. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_notify.py +0 -0
  688. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_notify_drain.py +0 -0
  689. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_openapi.py +0 -0
  690. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_operational_defaults.py +0 -0
  691. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_overlap_fence.py +0 -0
  692. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_packaged_deploy_units.py +0 -0
  693. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_parentage.py +0 -0
  694. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_paste_landed.py +0 -0
  695. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_pipeline.py +0 -0
  696. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_plan_followup_approve_plan_command.py +0 -0
  697. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_plan_followup_pr_command.py +0 -0
  698. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_plan_followup_review_command.py +0 -0
  699. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_plan_only.py +0 -0
  700. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_plan_parser.py +0 -0
  701. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_platform_paths.py +0 -0
  702. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_portal_bridge.py +0 -0
  703. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_portal_config.py +0 -0
  704. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_pr_body_lint.py +0 -0
  705. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_prereqs.py +0 -0
  706. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_production_db_guard.py +0 -0
  707. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_progress.py +0 -0
  708. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_provider_seam.py +0 -0
  709. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_providers.py +0 -0
  710. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_providers_config_labels.py +0 -0
  711. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_providers_pty.py +0 -0
  712. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_quiet_hours.py +0 -0
  713. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_quiet_hours_store_2146.py +0 -0
  714. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_reap_merged_sessions.py +0 -0
  715. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_reap_stale_interactive_tick.py +0 -0
  716. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_reconcile_branch.py +0 -0
  717. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_reconcile_completions.py +0 -0
  718. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_reconcile_merges.py +0 -0
  719. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_reconcile_usage_limit_done.py +0 -0
  720. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_refine_chat.py +0 -0
  721. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_release_cordon_2101.py +0 -0
  722. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_release_propagate.py +0 -0
  723. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_release_unified_1242.py +0 -0
  724. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_release_verify.py +0 -0
  725. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_release_window.py +0 -0
  726. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_remote_auto_prune.py +0 -0
  727. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_remote_interactive_reaper.py +0 -0
  728. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_repo_edit_2220.py +0 -0
  729. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_repo_onboard_2220.py +0 -0
  730. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_report_result_push.py +0 -0
  731. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_reports.py +0 -0
  732. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_retry.py +0 -0
  733. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_retry_advisory_1606.py +0 -0
  734. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_retry_type_1636.py +0 -0
  735. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_revalidate.py +0 -0
  736. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_review.py +0 -0
  737. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_review_end_review_without_verdict.py +0 -0
  738. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_review_parse_failure_diagnostic.py +0 -0
  739. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_review_reaffirm.py +0 -0
  740. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_review_state.py +0 -0
  741. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_review_verdict_backstop.py +0 -0
  742. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_review_verdict_override_audit.py +0 -0
  743. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_review_verdict_relay.py +0 -0
  744. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_review_zero_commits.py +0 -0
  745. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_scoped_review_wiring.py +0 -0
  746. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_scorecard.py +0 -0
  747. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_serve.py +0 -0
  748. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_serve_app_board_trim.py +0 -0
  749. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_session.py +0 -0
  750. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_slice_issue_attribution.py +0 -0
  751. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_smoke.py +0 -0
  752. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_smoke_live_checkout_restore.py +0 -0
  753. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_smoke_workflow.py +0 -0
  754. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_spend_ceiling.py +0 -0
  755. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_spend_ceiling_coordinator.py +0 -0
  756. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_split.py +0 -0
  757. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_split_work.py +0 -0
  758. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_stage_projection.py +0 -0
  759. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_stalled_pipeline.py +0 -0
  760. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_state.py +0 -0
  761. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_state_review_findings_daemon.py +0 -0
  762. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_status_fleet_footer.py +0 -0
  763. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_stop_1567.py +0 -0
  764. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_stuck.py +0 -0
  765. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_terminal_command.py +0 -0
  766. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_test_author.py +0 -0
  767. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_test_chat.py +0 -0
  768. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_test_orchestrator.py +0 -0
  769. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_test_report.py +0 -0
  770. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_test_verdict_parsing.py +0 -0
  771. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_test_verdict_transcript_floor.py +0 -0
  772. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_thin_client_board_audit.py +0 -0
  773. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_thin_client_config_load_1080.py +0 -0
  774. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_thin_client_daemon_routing_906.py +0 -0
  775. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_tmux_host.py +0 -0
  776. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_tmux_session.py +0 -0
  777. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_transcript_floor.py +0 -0
  778. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_usage.py +0 -0
  779. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_usage_limits.py +0 -0
  780. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_usage_rollup.py +0 -0
  781. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_venv_live_install_2121.py +0 -0
  782. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_version_single_source.py +0 -0
  783. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_watch.py +0 -0
  784. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_worker_events.py +0 -0
  785. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_worker_image_pin_sync.py +0 -0
  786. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_worker_safety.py +0 -0
  787. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_worker_test_scoping.py +0 -0
  788. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_worktree.py +0 -0
  789. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  790. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/Cargo.lock +0 -0
  791. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/Cargo.toml +0 -0
  792. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/cargo-config-local-quadraui.toml.example +0 -0
  793. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/app/audit.rs +0 -0
  794. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/app/chat.rs +0 -0
  795. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/app/data.rs +0 -0
  796. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/app/dialogs.rs +0 -0
  797. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/app/drive.rs +0 -0
  798. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/app/drive_queue.rs +0 -0
  799. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/app/escalation.rs +0 -0
  800. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/app/events.rs +0 -0
  801. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/app/fixtures.rs +0 -0
  802. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/app/fleet_health.rs +0 -0
  803. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/app/fleet_sessions.rs +0 -0
  804. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/app/fleet_terminals.rs +0 -0
  805. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/app/format.rs +0 -0
  806. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/app/milestone_dag.rs +0 -0
  807. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/app/mod.rs +0 -0
  808. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/app/msv.rs +0 -0
  809. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/app/pipeline.rs +0 -0
  810. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/app/plans.rs +0 -0
  811. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/app/render.rs +0 -0
  812. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/app/reports.rs +0 -0
  813. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/app/sessions.rs +0 -0
  814. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/app/settings_ui.rs +0 -0
  815. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/app/sidebar.rs +0 -0
  816. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/app/terminal.rs +0 -0
  817. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/app/tests.rs +0 -0
  818. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/app/types.rs +0 -0
  819. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/app/workspace.rs +0 -0
  820. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/bin/gtk.rs +0 -0
  821. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/commands.rs +0 -0
  822. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/lib.rs +0 -0
  823. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/main.rs +0 -0
  824. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/src/settings.rs +0 -0
  825. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/tests/acceptance.rs +0 -0
  826. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/tests/cli.rs +0 -0
  827. {code_coordinator-0.5.75 → code_coordinator-0.5.76}/tui/tests/fixtures/board_sample.json +0 -0
@@ -0,0 +1,253 @@
1
+ # claude-coordinator
2
+
3
+ CLI tool + per-machine agent server that coordinates Claude Code workers across multiple machines and repos over Tailscale.
4
+
5
+ > **Scope of this file (#2195).** This is the **worker- and reviewer-facing** rulebook: it is
6
+ > loaded into every worker leg, every review leg, and every coordinator session, so it holds
7
+ > only what someone *editing this repo* must act on. Operator runbooks live in
8
+ > [`docs/`](docs/) — see [Operational guides](#operational-guides--operator-facing) at the
9
+ > bottom. Settled design rationale lives in
10
+ > [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md#design-decisions--the-settled-rationale).
11
+ > Keep it that way: if a new rule does not change what a worker does, it belongs in `docs/`.
12
+
13
+ ## Current Goal — read first
14
+
15
+ **[`GOAL.md`](GOAL.md) holds the current north-star objective** — the living, cross-repo / cross-machine goal that should bias all planning, triage, and dispatch. It is meta-level (above any single issue, repo, or session) and changes as priorities evolve: read it first, plan against it, and keep it current. `coordinator.yml` is the source of truth for *topology*; `GOAL.md` is the source of truth for *intent*.
16
+
17
+ ## Codebase navigation — query the graph first
18
+
19
+ This repo ships a **graphify** knowledge graph in `graphify-out/` (`graph.json`,
20
+ `GRAPH_REPORT.md`), kept current on a best-effort basis by `post-commit` /
21
+ `post-checkout` git hooks. For any architecture / "where is this handled" / "what
22
+ calls this" / file-relationship question, **query the graph first** (the `graphify`
23
+ skill, or the graphify CLI) before reaching for grep/Read. Grep/Read are for
24
+ exact-string or line-level confirmation — not the first move.
25
+
26
+ **In a worktree the graph is the base checkout's, not yours.** `graphify-out/` is
27
+ gitignored (only its `.gitignore` is tracked), so `git worktree add` yields an empty
28
+ one — and `graphify query` resolves `graphify-out/graph.json` strictly relative to
29
+ cwd, with no upward walk and no `--graph` override. `.githooks/post-checkout`
30
+ therefore symlinks the *contents* of a worktree's `graphify-out/` (`graph.json`,
31
+ `manifest.json`, `cache/`, ...) at the base checkout's graph — the directory
32
+ itself, and its tracked `.gitignore`, are left alone so the worktree stays
33
+ `git status`-clean.
34
+ Consequences worth knowing while working in one: the graph reflects the **base
35
+ checkout's HEAD, not your edits** — trust it for *"where is X handled"*, never for
36
+ *"did my change land"* — and rebuilds are deliberately disabled inside worktrees
37
+ (a rebuild there would overwrite the shared graph from a feature branch). The
38
+ bootstrap only runs where `core.hooksPath` is set: `git config core.hooksPath
39
+ .githooks`, once per machine.
40
+
41
+ **The graph drifts, and the hooks cannot prevent it.** They `exit 0` during
42
+ rebase/merge/cherry-pick (so the merge agent's proactive rebase never rebuilds),
43
+ nothing fires at all for `git reset --hard`, every failure path is a silent
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
47
+ freshness instead — `GRAPH_REPORT.md` records its source commit, and
48
+ **`coord diagnose --graph`** compares that to HEAD for every local checkout (and
49
+ flags an unset `core.hooksPath`). If it reports STALE, `graphify update .` in that
50
+ checkout.
51
+
52
+ Setting this up on a new machine: [`docs/GRAPHIFY_SETUP.md`](docs/GRAPHIFY_SETUP.md).
53
+
54
+ ## Architecture
55
+
56
+ ```
57
+ coordinator.yml — Single config file: repos, machines, dependencies
58
+ coord CLI — User-facing commands (plan, approve, assign, status, etc.)
59
+ coord agent (per-machine) — HTTP server (port 7433) that runs claude -p
60
+ coord serve — Board daemon (port 7435): canonical board state for thin clients
61
+ coord web — Lightweight dashboard (port 7434)
62
+ claude -p — The actual worker (runs locally on each machine)
63
+ GitHub issues — Work source + message bus (via issue comments)
64
+ Tailscale — Networking between machines
65
+ ```
66
+
67
+ Full walkthrough — the agent HTTP API, where each subcommand actually runs, the auto-loop end
68
+ to end: [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md).
69
+
70
+ ## Project Structure
71
+
72
+ Query the **graphify graph** (`graphify-out/`) for the full module map + relationships — it's authoritative and auto-updated. Key entry points: `coord/cli.py` (Click CLI + all subcommands), `coord/agent.py` (`AgentServer`: `claude -p` subprocess mgmt) + `coord/agent_app.py` / `coord/serve_app.py` (agent + board-daemon HTTP apps), `coord/brain.py` (planning), `coord/dispatch.py` (routing: POST to agents, briefings), `coord/review.py` (adversarial review), `coord/merge_queue.py` (merge sequencing) + `coord/reconcile.py` (board↔agent), `coord/state.py` (board persistence in `~/.coord/`), `coord/models.py` (dataclasses), `coord/config.py` (`coordinator.yml` parsing), `coord/dashboard/` (web dashboard + `webapp/` phone PWA). Tests: `tests/test_<module>.py` (pytest; fixtures in `conftest.py`).
73
+
74
+ ## Commands
75
+
76
+ `coord <cmd> --help` documents every command + flags. The core loop:
77
+
78
+ ```bash
79
+ coord plan # Brain proposes assignments for idle machines
80
+ coord approve 1,3 # Dispatch approved proposals (comma-separated IDs)
81
+ coord assign <machine> <repo> <issue> [--briefing TEXT | --briefing-file F] [--dry-run] # Direct dispatch
82
+ coord status [--freshness] # Machines, assignments, connectivity (+ repo freshness vs GitHub HEADs)
83
+ coord log <id> [-f] [--machine NAME] # claude -p output (remote logs need --machine)
84
+ coord notify # Poll agents, post completion/failure comments to GitHub
85
+ coord test --passed|--fail|--skipped <id> # Record the Test-gate verdict (bare `coord test <id>` builds+tests locally)
86
+ coord merge [--dry-run] [--repo NAME] [--method rebase|squash|merge] [--order IDs] [--force-merge]
87
+ coord reconcile-merges # Backfill missing branches + record out-of-band merges (#609/#611)
88
+ coord retry|stop|resume <id> # Recovery; `coord done` ends the session
89
+ ```
90
+
91
+ Setup / diagnostics (discoverable via `--help`): `coord init`, `coord config`, `coord agent`, `coord serve`, `coord web`, `coord diagnose`, `coord sessions [--remote]`, `coord split`, `coord notifier`, `coord repo add` / `coord repo doctor`.
92
+
93
+ ## Development
94
+
95
+ Always work in a virtualenv. Agent workers are spawned with the agent's own
96
+ venv stripped from `PATH` (#402), so a bare `pip install` resolves to system
97
+ Python (PEP 668) — and must **never** target the agent's runtime venv. Create
98
+ your own venv in the checkout (`.venv/` is gitignored):
99
+
100
+ ```bash
101
+ python3 -m venv .venv && . .venv/bin/activate
102
+ pip install -e ".[dev]"
103
+ pytest
104
+ coord plan --dry-run
105
+ coord approve --dry-run 1,2
106
+ coord assign --dry-run precision claude-coordinator 42
107
+ ```
108
+
109
+ **Workers: scope your test run to your diff, never `pytest` bare (#2169).**
110
+ The full suite exceeds Claude Code's 600s Bash ceiling on this repo and
111
+ duplicates the Test stage + CI, which both run it against your pushed SHA
112
+ regardless. Run just the file(s) that mirror what you changed — `pytest
113
+ tests/test_<module>.py` for a `coord/<module>.py` change, `cargo test` from
114
+ `tui/` scoped with a test-name filter for a `tui/**` change. To see what
115
+ the Test stage itself would run for your diff (and confirm you're not
116
+ missing a suite), `scripts/coord-test-runner.sh <worktree> --print-routing`
117
+ computes the routing without actually building or testing anything.
118
+
119
+ ## Working on `tui/` — the `quadraui` pin
120
+
121
+ **`coord-tui` pins `quadraui` to a git rev in `tui/Cargo.toml`**
122
+ (`quadraui = { git = "https://github.com/JDonaghy/quadraui", rev = "<sha>" }`, #1973). This
123
+ replaced the old relative-path dependency (`../../quadraui/quadraui`), which built against
124
+ whatever branch happened to be checked out in `~/src/quadraui` — a quadraui merge could break
125
+ coord-tui's build/merge with **zero coord-tui commits and no warning** (it already happened
126
+ once). `cargo build`/`cargo test` from `tui/` now fetch quadraui straight from GitHub at the
127
+ pinned rev and never touch `~/src/quadraui`, so the local checkout's branch is irrelevant.
128
+
129
+ - **Bumping the pin** (deliberate, reviewable, its own coord-tui commit): pick the target
130
+ quadraui rev — normally the tip of `origin/develop` (quadraui's default/integration branch,
131
+ per quadraui's CLAUDE.md) — edit the `rev = "..."` in `tui/Cargo.toml`, then run
132
+ `cargo build && cargo test` from `tui/` and confirm EXIT=0 before committing.
133
+ `cargo update -p quadraui` alone will **not** move a `rev`-pinned git dependency; the
134
+ `Cargo.toml` edit is the actual bump.
135
+ - **Co-developing against an unmerged quadraui branch/PR:** if a `tui/` task consumes a
136
+ not-yet-merged quadraui feature, the briefing **must** name the quadraui PR/branch. The
137
+ worker builds against a local `~/src/quadraui` checkout **without editing
138
+ `tui/Cargo.toml`**, via cargo's local-paths override:
139
+ `cp tui/cargo-config-local-quadraui.toml.example tui/.cargo/config.toml` (git-ignored — see
140
+ the example file's header) after checking out the target branch in `~/src/quadraui`. Delete
141
+ `tui/.cargo/config.toml` (or don't create it) to build against the pinned rev again — this
142
+ is the default and what CI/other workers use. **Verify build EXIT=0 from `tui/` both with
143
+ the override active (proves the feature works) and, before finishing, confirm the committed
144
+ `tui/Cargo.toml` still points at the pinned rev** (the override file itself is never
145
+ committed).
146
+
147
+ ## Key Design Decisions
148
+
149
+ One line each — the reasoning behind them is in
150
+ [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md#design-decisions--the-settled-rationale).
151
+
152
+ - **No API key needed.** Everything uses `claude -p`, which runs on a Max/Pro subscription via OAuth.
153
+ - **Agent servers are dumb dispatchers.** They spawn `claude -p` and track the subprocess; all intelligence is in the coordinator brain.
154
+ - **GitHub issue comments are the message bus.** Briefings, completion notices and failure reports are comments, carrying `<!-- coord:... -->` markers for machine parsing.
155
+ - **`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
+ - **User approves everything.** `coord plan` proposes, the user reviews, `coord approve` dispatches. No autonomous dispatch.
157
+ - **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.
159
+ - **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
+ - **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
+ - **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).
162
+ - **Mechanical merge conflicts auto-rebase (#241).** A `type="conflict-fix"` worker rebases and resolves additive merges; semantic conflicts are left for a human.
163
+ - **Smoke tests validate on capable hardware.** `smoke_tests.capability_rules` map changed files to required machine capabilities (e.g. GTK changes → a machine with GTK).
164
+ - **Progress streaming from workers.** Workers emit `STATUS:` and `STUCK:` lines; the coordinator parses these for real-time progress in `coord status` and the dashboard.
165
+ - **The notifier tells you when NOBODY IS COMING — and nothing else (#1632).** Advisory, isolated, off by default; it is not an error channel and not a progress feed.
166
+
167
+ ## Review Prompt Assembly
168
+
169
+ The reviewer gets a prompt built from:
170
+ 1. **Repo's CLAUDE.md** — the project rules (source of truth, not duplicated)
171
+ 2. **Generic checklist** — "did you add tests?", "did you stay in file scope?", "any security issues?"
172
+ 3. **Repo overrides** — project-specific patterns from `coordinator.yml` `reviews.repo_overrides`
173
+ 4. **The diff** — `gh pr diff` of the worker's branch vs base
174
+ 5. **The issue** — title and body for intent verification
175
+
176
+ The reviewer reads the rules and enforces them against the diff. It does not have the worker's session context — genuinely independent.
177
+
178
+ ## Rules for workers
179
+
180
+ - **Only the coordinator writes docs.** Workers must **not** update README, CHANGELOG, or shared documentation files — parallel doc edits cause merge conflicts. If a briefing lists docs in `files_forbidden`, respect it. An issue whose *entire* deliverable is a doc edit is coordinator work and should never have been dispatched; say so and stop rather than editing the doc.
181
+ - **Never edit `tests/acceptance/**`.** Those suites are sealed and delivered read-only / run-only. Write your own unit and internal tests instead.
182
+ - **Stay in file scope.** If you must touch a file outside your briefing, note it in your final message.
183
+ - **Commit and push before your final message** — even if the build is broken or you ran out of time. Uncommitted work is destroyed when the session ends.
184
+ - **`gh` is on the deny-list.** The coordinator owns all GitHub interaction; use plain `git`.
185
+
186
+ The operator-side counterparts to these rules (dispatch economics, what to send to a worker
187
+ versus keep in the coordinator session) are in
188
+ [`docs/COST_DISCIPLINE.md`](docs/COST_DISCIPLINE.md).
189
+
190
+ ## Testing — black-box coverage is the acceptance bar
191
+
192
+ **Every PR that changes user-visible behavior must ship a black-box test** that drives the *running app* and asserts on its rendered output — not just unit tests on internal functions. The adversarial reviewer reads this file and **rejects behavior-changing PRs that lack one** (pure refactors / internal-only changes are exempt — say so in the PR if that applies). Build the **harness once per repo**; add **tests incrementally, one (or a few) per behavior-changing issue** — do *not* big-bang a full suite. Coverage then grows with churn and ratchets up (PRs add coverage, never remove it). Keep a thin **core smoke set** over the few most-trafficked screens so critical flows stay guarded even by unrelated changes.
193
+
194
+ > **The acceptance suite is becoming an independent, sealed *oracle* (2026-07-04, [`docs/ORACLE_LOOP.md`](docs/ORACLE_LOOP.md)).** In an oracle-loop milestone the worker **no longer authors** the acceptance tests — an independent `test-author` agent writes them from a mock-first Gate-A contract, and they are delivered to the worker **read-only / run-only** (`coord acceptance run --issue N`). The worker iterates against them **in its own warm session** until green (the tight loop), then the coordinator re-runs the sealed suite **externally** against the pushed SHA as the trust gate. The runner sits above **pluggable framework drivers**, declared per repo in `acceptance.drivers` and routed to a capability-matched machine. **Implemented today: `tui-tuidriver`** (quadraui `TuiDriver`, the coord-tui case below), **`cli-pytest`**, and **`web-playwright`** (#1539) — see `SUPPORTED_KINDS` in `coord/acceptance_drivers.py`, which is the source of truth. **Native is NOT implemented**: a kind may be *declared* in `coordinator.yml` ahead of its adapter, but `run_driver()` rejects it with a "not yet implemented" `DriverError` rather than silently no-opping. What still gates the webapp is **not** the driver but its inputs — the deterministic fixture server (#1538) and a machine whose `browser` capability actually probes as met (#1678); both milestone #51 / epic #1537 ([`docs/WEB_CONTROL_CENTER.md`](docs/WEB_CONTROL_CENTER.md)). Workers still write their **own unit/internal tests**; they must **never** edit `tests/acceptance/**`.
195
+
196
+ **How it runs:** black-box tests are part of the repo's normal test command, so the **Test stage** executes them on a capability-matched machine — `smoke_tests.capability_rules` route platform-specific suites to capable hardware (a GTK box; a machine with a browser). Favor the automated pre-review gate; the point is to trust the suite so manual/interactive smoke (incl. driving from a phone) is rarely needed.
197
+
198
+ ### coord-tui — quadraui `TuiDriver` (harness shipped: #690 / #691)
199
+ - Drives the whole app through the real `event → handle → render` path against ratatui's headless `TestBackend` and asserts on the screen grid. `cargo test`-native, deterministic, no TTY.
200
+ - `CoordApp` implements quadraui's `ShellApp`, so use `quadraui::tui::testing::driver_with_shell(app, CoordApp::shell_config(), w, h)`. API: `find("text")` → coords, `click(x, y)`, `press`, `type_char`, `screen()`, `screen_contains(needle)`. **Locate targets with `find` — never hardcode coordinates.**
201
+ - **Reuse the existing fixtures** — `make_test_app(data: BoardData) -> CoordApp` (and `make_app_with_assignments`, `make_app_with_one_completed_issue`, …) in `tui/src/app.rs` build a full app from in-memory `BoardData`, no live daemon. Put the tests **in-crate** (`#[cfg(test)]`), **not** in `tui/tests/` — the fixtures are `#[cfg(test)]`/private and an integration-test crate can't see them.
202
+ - Limit: `TuiDriver` renders to `TestBackend`, so it does **not** parse real ANSI — terminal-protocol bugs (raw-mode, SGR mouse, the embedded `claude` PTY pane) are out of reach and still need a live smoke. A native pty + vt100 tier is tracked in quadraui#302 (unbuilt).
203
+
204
+ ### coord web (Phone Control Center) — shipped v1 (#700–#703); browser E2E forthcoming
205
+ - The phone web app lives in `coord/dashboard/webapp/` (React / Vite / TS PWA, served by `coord/dashboard/server.py`). **v1 milestone (#700–#703) is shipped.** See [`docs/PHONE_WEBAPP.md`](docs/PHONE_WEBAPP.md) for the full runbook (build → serve → phone access over Tailscale).
206
+ - **Build the React bundle before first use** — `dist/` is gitignored. From `coord/dashboard/webapp/`: `npm install && npm run build`. Re-run after pulling changes to `src/`. The server falls back to the legacy `index.html` when `dist/` is absent so existing behaviour is unchanged without a build.
207
+ - **Run on the always-on host:** `coord web` binds `0.0.0.0:7434`. Reach it from a phone via the Tailscale MagicDNS name: `http://dellserver:7434` (replace with your host's name). Install as a PWA via "Add to Home Screen" in Safari / Chrome.
208
+ - **Vitest unit tests** ship in `coord/dashboard/webapp/src/components/__tests__/` — run with `npm test` inside `coord/dashboard/webapp/`.
209
+ - **Playwright E2E tests** are the acceptance bar: start the dashboard server against a seeded board (the web parallel of `make_test_app(BoardData)`), drive a real headless browser, assert on the rendered DOM. Browsers headless-test more cleanly than terminals, so the webapp should lean almost entirely on this automated gate rather than interactive smoke.
210
+ - **Shipped:** `playwright.config.ts` + specs in `coord/dashboard/webapp/e2e/` (`npm run test:e2e`), and `smoke_tests.capability_rules` already routes `coord/dashboard/webapp/**` → the `browser` capability, so the **Test stage** lands on a browser-capable machine.
211
+ - **Shipped:** the `web-playwright` acceptance driver (#1539) — it is in `SUPPORTED_KINDS`, so `coord acceptance run/record` can drive the webapp.
212
+ - **Not shipped:** the seeded-board fixture server (#1538) — today's specs run against whatever the live fleet is doing, so they are a smoke net, **not** a deterministic oracle. Milestone #51 / epic #1537.
213
+ - **`browser` is advertised by one machine (elitebook)** until #1541 adds it to dellserver — so all web testing currently funnels through the dev box. **And as of 2026-08-01 that machine's `browser` probe reads UNMET (#1678)**, so `dispatch_smoke` refuses to route any `coord/dashboard/webapp/**` change and the Test stage silently retries forever — check `coord doctor` before assuming a webapp change can be tested at all.
214
+
215
+ ## Conventions
216
+
217
+ - Python 3.12+, type hints everywhere
218
+ - Click for CLI
219
+ - httpx for HTTP client, Starlette + uvicorn for HTTP server
220
+ - PyYAML for config
221
+ - No Anthropic SDK — all Claude interaction is via `claude -p` subprocess
222
+ - Tests use pytest with fixtures in conftest.py
223
+ - State files go in `~/.coord/` — including `coordinator.yml` (canonical: `~/.coord/coordinator.yml`; override with `$COORD_CONFIG` or `--config`; `./coordinator.yml` is a dev fallback)
224
+ - Agent server port: 7433, dashboard port: 7434, board daemon port: 7435
225
+ - GitHub issue comments carry `<!-- coord:event=... assignment=... -->` markers for machine parsing
226
+
227
+ ## Operational guides — operator-facing
228
+
229
+ **Not needed to work on this repo.** These are runbooks for driving the fleet; a worker or
230
+ reviewer can stop reading here.
231
+
232
+ **Read before operating the fleet:**
233
+
234
+ - [`docs/OPERATING_GOTCHAS.md`](docs/OPERATING_GOTCHAS.md) — **READ BEFORE OPERATING.** Traps that each cost a real dispatch, real money, or real lost work, and are invisible from the code. The headline: **a merged fix is not a live fix.**
235
+ - [`docs/AGENT_OPERATIONS.md`](docs/AGENT_OPERATIONS.md) — releases, propagation, the deploy lanes, agent installs, and the **`~/.coord-venv` must-be-PyPI invariant**. **Read end-to-end before touching any agent install** — don't re-derive it.
236
+ - [`docs/DRIVE_QUEUE.md`](docs/DRIVE_QUEUE.md) — the durable, board-backed driver (`coord drive-queue`, #1750). **Read the top section before queuing more than ~2 issues on one repo.**
237
+
238
+ **Reference:**
239
+
240
+ - [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) — how it all fits together, plus the settled design rationale. Two diagnostic entry points: [why a merge/review isn't happening](docs/ARCHITECTURE.md#when-a-merge-isnt-happening) (**check here first when "Go does nothing"**) and [why an issue is in the Pipeline you never dispatched](docs/ARCHITECTURE.md#when-an-issue-is-sitting-in-the-pipeline-you-never-dispatched).
241
+ - [`docs/COST_DISCIPLINE.md`](docs/COST_DISCIPLINE.md) — dispatch economics; what to send to a worker versus keep in the coordinator session.
242
+ - [`docs/NOTIFIER.md`](docs/NOTIFIER.md) — the "nobody is coming" push channel (`coord notifier`).
243
+ - [`docs/ORACLE_LOOP.md`](docs/ORACLE_LOOP.md) — sealed acceptance suites, Gate-A contracts, the test-author agent.
244
+ - [`docs/PHONE_WEBAPP.md`](docs/PHONE_WEBAPP.md) — Phone Control Center v1 runbook and the `/api/pipeline` surface.
245
+ - [`docs/GRAPHIFY_SETUP.md`](docs/GRAPHIFY_SETUP.md) — installing the knowledge graph on a new machine (four layers, all of which fail *silently*).
246
+ - [`docs/EPHEMERAL_WORKERS.md`](docs/EPHEMERAL_WORKERS.md) — on-demand Azure worker VMs per epic. **The tailnet ACL is the security boundary** — `agent_app.py` has no authentication.
247
+ - [`docs/MAC_MINI.md`](docs/MAC_MINI.md) — adding a Mac mini; sizing, provisioning, and what non-macOS work routes there. The port itself is [`docs/CROSS_PLATFORM.md`](docs/CROSS_PLATFORM.md) (milestone #39).
248
+ - [`docs/FORGE_MIGRATION.md`](docs/FORGE_MIGRATION.md) — surviving a forge outage (cheap) versus leaving a forge (expensive); milestone #58 / epic #1902.
249
+
250
+ **Two deploy facts that bite most often:**
251
+
252
+ - **`coord-tui` ships as a locally-built binary, not via PyPI.** After a `tui/` PR merges, rebuild and reinstall locally: `cd tui && cargo build && cp target/debug/coord-tui ~/.local/bin/coord-tui`. Workers should not bump versions for tui-only changes.
253
+ - **Turn off Claude Code's Agent View when driving the fleet** — set `"disableAgentView": true` in `~/.claude/settings.json` (the Claude-Code *client* config, not `~/.coord/`; restart to apply), or its cross-session roster pops up mid-type when another session changes stage. Full note in [`docs/AGENT_OPERATIONS.md`](docs/AGENT_OPERATIONS.md#operator-claude-code-settings-driving-the-fleet).
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.75
3
+ Version: 0.5.76
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.75
3
+ Version: 0.5.76
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
@@ -359,6 +359,7 @@ docs/ARCHITECTURE.md
359
359
  docs/ARCH_SECURITY_GATES.md
360
360
  docs/COCKPIT.md
361
361
  docs/CONTROL_CENTER.md
362
+ docs/COST_DISCIPLINE.md
362
363
  docs/CROSS_PLATFORM.md
363
364
  docs/CUSTOMER_PORTAL.md
364
365
  docs/DRIVE_QUEUE.md
@@ -571,6 +572,7 @@ tests/test_gate_a.py
571
572
  tests/test_gate_b.py
572
573
  tests/test_gate_snapshot_staleness.py
573
574
  tests/test_gates.py
575
+ tests/test_gather_fleet_tmux_sessions.py
574
576
  tests/test_generated_types_fixture.py
575
577
  tests/test_github_ops.py
576
578
  tests/test_goal.py
@@ -337,6 +337,7 @@
337
337
  "docs/ARCH_SECURITY_GATES.md",
338
338
  "docs/COCKPIT.md",
339
339
  "docs/CONTROL_CENTER.md",
340
+ "docs/COST_DISCIPLINE.md",
340
341
  "docs/CROSS_PLATFORM.md",
341
342
  "docs/CUSTOMER_PORTAL.md",
342
343
  "docs/DRIVE_QUEUE.md",
@@ -601,6 +602,7 @@
601
602
  "tests/test_gate_b.py",
602
603
  "tests/test_gate_snapshot_staleness.py",
603
604
  "tests/test_gates.py",
605
+ "tests/test_gather_fleet_tmux_sessions.py",
604
606
  "tests/test_generated_types_fixture.py",
605
607
  "tests/test_github_ops.py",
606
608
  "tests/test_goal.py",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.75",
2
+ "tag": "0.5.76",
3
3
  "distance": 0,
4
- "node": "g73af79d5b857f3191b459e4fa74599e9d5f6e319",
4
+ "node": "gdd3b9581f5fd9462b2fb9a85757ee783e3b09911",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-14"
@@ -311,6 +311,66 @@ def _fetch_board() -> tuple[dict, str | None]:
311
311
  return {}, f"{type(exc).__name__}: {exc}"
312
312
 
313
313
 
314
+ def _interactive_session_busy(config) -> list:
315
+ """Live interactive tmux sessions as host-pinned `Busy` signals (#2228).
316
+
317
+ `release_propagate.assess_quiescence`'s ``extra_busy`` seam was built
318
+ for exactly this — its own docstring names "an interactive tmux
319
+ session" as the seam's purpose — but until now nothing ever fed it one.
320
+ An interactive session is invisible to the board *by construction*
321
+ (``coord assign --interactive`` launches into tmux; the tmux session
322
+ never POSTs ``/assign``), so without this a host running one reads as
323
+ idle and rolls out from under a human, restarting `coord-serve` on the
324
+ daemon host mid-session.
325
+
326
+ Reuses the same discovery `coord sessions --remote` renders
327
+ (:func:`coord.interactive.gather_fleet_tmux_sessions`) rather than
328
+ inventing a second way to look.
329
+
330
+ Fails OPEN, not closed: a probe error is logged and DROPPED, never
331
+ turned into a host-less `Busy` — an unattributable signal blocks EVERY
332
+ host by design (`Quiescence.fleet_wide_busy`), and an unreadable
333
+ session list must not silently escalate into that.
334
+ """
335
+ from coord import release_propagate as rp # noqa: PLC0415
336
+ from coord.interactive import gather_fleet_tmux_sessions # noqa: PLC0415
337
+
338
+ try:
339
+ sessions, errors = gather_fleet_tmux_sessions(config)
340
+ except Exception as exc: # noqa: BLE001 — fail open, see docstring
341
+ click.echo(
342
+ f"warning: could not probe interactive sessions ({exc}) — "
343
+ "quiescence is blind to them this run",
344
+ err=True,
345
+ )
346
+ return []
347
+
348
+ for machine in errors:
349
+ click.echo(
350
+ f"warning: could not probe {machine} for live interactive "
351
+ "sessions — quiescence is blind to that host this run",
352
+ err=True,
353
+ )
354
+
355
+ busy = []
356
+ for s in sessions:
357
+ if s.get("pane_dead") == "1":
358
+ continue # claude exited; tmux is up but nobody is driving it
359
+ machine = s.get("machine")
360
+ if not machine:
361
+ continue # no coordinator.yml host to pin it to (#2228: never invent one)
362
+ busy.append(
363
+ rp.Busy(
364
+ kind="interactive session",
365
+ subject=f"{machine}:{s['session_name']}",
366
+ detail="`coord assign --interactive` never POSTs /assign, "
367
+ "so the board cannot see this",
368
+ host=machine,
369
+ )
370
+ )
371
+ return busy
372
+
373
+
314
374
  def _daemon_machine_name(
315
375
  config, override: str | None, machine_health: dict | None = None
316
376
  ) -> str | None:
@@ -550,6 +610,11 @@ def release_propagate( # noqa: PLR0912, PLR0915 — a pipeline; the decisions a
550
610
  extra_busy.append(
551
611
  rp.Busy(kind="board unreadable", subject="/board", detail=board_error)
552
612
  )
613
+ # #2228: the board can't see an interactive session (no /assign POST) —
614
+ # feed assess_quiescence's extra_busy seam from the same fleet-wide tmux
615
+ # probe `coord sessions --remote` uses, so a live session defers a roll
616
+ # exactly like a live headless assignment does.
617
+ extra_busy.extend(_interactive_session_busy(config))
553
618
  quiescence = rp.assess_quiescence(
554
619
  queue_entries=board.get("drive_queue") or [],
555
620
  assignments=board.get("assignments") or [],
@@ -1933,8 +1998,10 @@ def _drain(
1933
1998
  config_path: Path,
1934
1999
  deadline: float,
1935
2000
  poll_interval: float,
2001
+ config=None,
1936
2002
  reconcile=None,
1937
2003
  board_fetch=None,
2004
+ extra_busy_fetch=None,
1938
2005
  now=None,
1939
2006
  sleep=None,
1940
2007
  ):
@@ -1945,7 +2012,21 @@ def _drain(
1945
2012
  may lead a roll — rather than a second definition of "busy" (#2096's
1946
2013
  "two surfaces, one function" rule). ``now``/``sleep`` are injectable so
1947
2014
  this loop is unit-testable without a real clock; ``reconcile``/
1948
- ``board_fetch`` default to the real subprocess/board calls.
2015
+ ``board_fetch``/``extra_busy_fetch`` default to the real subprocess/
2016
+ board/tmux-probe calls.
2017
+
2018
+ #2228: ``extra_busy_fetch`` re-probes live interactive sessions on
2019
+ every poll (not just once) — a session that ends mid-drain should let
2020
+ the daemon host clear within THIS wait, not only on the next `coord
2021
+ release propagate` tick. Deliberately keyed off the explicit *config*
2022
+ param, never an implicit ``_load_config(config_path)`` fallback: this
2023
+ function is called with ``config_path=None`` from unit tests that
2024
+ inject their own clock/board — silently resolving a real
2025
+ ``coordinator.yml`` (and then SSH-probing whatever machines it names)
2026
+ the moment ``config`` is omitted would make this loop non-hermetic by
2027
+ default. No *config* simply means "no interactive-session signal this
2028
+ call" — the caller opts in by passing one, as the real
2029
+ ``coord release nightly-window`` call site does.
1949
2030
  """
1950
2031
  import time as _time # noqa: PLC0415
1951
2032
 
@@ -1956,6 +2037,11 @@ def _drain(
1956
2037
  sleep_fn = sleep or _time.sleep
1957
2038
  reconcile_fn = reconcile or (lambda: _run_reconcile_tick(config_path))
1958
2039
  fetch_fn = board_fetch or _fetch_board
2040
+ if extra_busy_fetch is None:
2041
+ if config is not None:
2042
+ extra_busy_fetch = lambda: _interactive_session_busy(config) # noqa: E731
2043
+ else:
2044
+ extra_busy_fetch = lambda: [] # noqa: E731
1959
2045
 
1960
2046
  start = now_fn()
1961
2047
  while True:
@@ -1966,6 +2052,7 @@ def _drain(
1966
2052
  extra_busy.append(
1967
2053
  rp.Busy(kind="board unreadable", subject="/board", detail=board_error)
1968
2054
  )
2055
+ extra_busy.extend(extra_busy_fetch())
1969
2056
  quiescence = rp.assess_quiescence(
1970
2057
  queue_entries=board.get("drive_queue") or [],
1971
2058
  assignments=board.get("assignments") or [],
@@ -2327,6 +2414,7 @@ def release_nightly_window( # noqa: PLR0912, PLR0915 — a pipeline; see module
2327
2414
  outcome = _drain(
2328
2415
  daemon_host=daemon_name, config_path=config_path,
2329
2416
  deadline=drain_deadline, poll_interval=poll_interval,
2417
+ config=config,
2330
2418
  )
2331
2419
  record.drained = outcome.drained
2332
2420
  record.drain_seconds = outcome.elapsed_seconds
@@ -90,7 +90,7 @@ from typing import TYPE_CHECKING, Sequence
90
90
  if TYPE_CHECKING:
91
91
  from coord.agent import MergeVerify
92
92
  from coord.config import Config
93
- from coord.models import Board
93
+ from coord.models import Board, Machine
94
94
 
95
95
  from coord.providers.claude_pty import (
96
96
  BRACKETED_PASTE_ENABLE,
@@ -118,6 +118,7 @@ __all__ = [
118
118
  "tmux_session_alive",
119
119
  "tmux_pane_dead",
120
120
  "list_coord_tmux_sessions",
121
+ "gather_fleet_tmux_sessions",
121
122
  "TMUX_ATTACH_WARNING",
122
123
  "PTY_RELAY_NO_DETACH_WARNING",
123
124
  ]
@@ -469,6 +470,76 @@ def list_coord_tmux_sessions(
469
470
  return []
470
471
 
471
472
 
473
+ def gather_fleet_tmux_sessions(
474
+ config: "Config",
475
+ *,
476
+ max_workers: int = 8,
477
+ ) -> tuple[list[dict], list[str]]:
478
+ """Enumerate live ``coord-*`` tmux sessions across every machine in *config*.
479
+
480
+ Mirrors the local+remote discovery ``coord sessions --remote`` renders
481
+ (#2228): local sessions via a plain :func:`list_coord_tmux_sessions`
482
+ call, remote sessions via one SSH probe per non-local configured
483
+ machine, run in parallel — bounded by :func:`list_coord_tmux_sessions`'s
484
+ own 5s per-host subprocess timeout so one unreachable host cannot stall
485
+ the caller.
486
+
487
+ Returns ``(sessions, probe_errors)``:
488
+
489
+ * ``sessions`` — one dict per tmux session found (dead or alive; the
490
+ caller filters), each carrying ``session_name``/``pane_dead``/
491
+ ``attached`` (see :func:`list_coord_tmux_sessions`) plus ``machine``
492
+ — the ``coordinator.yml`` machine name the session was found on. A
493
+ local session whose host has no ``coordinator.yml`` entry gets
494
+ ``machine=None``: there is no name to pin it to, and no configured
495
+ host it could block either.
496
+ * ``probe_errors`` — machine names whose remote probe *raised* (as
497
+ opposed to returning "no sessions", which is what an unreachable
498
+ host or a dead tmux server already look like —
499
+ :func:`list_coord_tmux_sessions` collapses both into ``[]`` with no
500
+ way to tell them apart). Callers must treat this the same as an
501
+ empty result for that host — never as a reason to defer everything
502
+ — but should still log it: an unreadable session list failing open
503
+ and failing *silently* are two different things (#2228).
504
+ """
505
+ import concurrent.futures as _cf # noqa: PLC0415
506
+
507
+ local_hn = _get_local_short_hostname()
508
+
509
+ def _is_local(machine: "Machine") -> bool:
510
+ return (
511
+ machine.name.lower() == local_hn
512
+ or machine.host.split(".")[0].lower() == local_hn
513
+ )
514
+
515
+ local_machine = next((m.name for m in config.machines if _is_local(m)), None)
516
+
517
+ sessions: list[dict] = [
518
+ {**s, "machine": local_machine} for s in list_coord_tmux_sessions()
519
+ ]
520
+
521
+ remotes = [m for m in config.machines if not _is_local(m)]
522
+ errors: list[str] = []
523
+ if remotes:
524
+ def _probe(machine: "Machine") -> tuple[str, list[dict], BaseException | None]:
525
+ try:
526
+ found = list_coord_tmux_sessions(
527
+ host=TmuxHost(ssh_target=machine.host, batch=True)
528
+ )
529
+ return machine.name, found, None
530
+ except Exception as exc: # noqa: BLE001 — reported via probe_errors
531
+ return machine.name, [], exc
532
+
533
+ with _cf.ThreadPoolExecutor(max_workers=min(max_workers, len(remotes))) as ex:
534
+ for mname, found, err in ex.map(_probe, remotes):
535
+ if err is not None:
536
+ errors.append(mname)
537
+ continue
538
+ sessions.extend({**s, "machine": mname} for s in found)
539
+
540
+ return sessions, errors
541
+
542
+
472
543
  def _inject_briefing_into_tmux_session(
473
544
  session_name: str,
474
545
  briefing: str,
@@ -720,6 +720,10 @@ def assess_quiescence(
720
720
  ``extra_busy`` is the seam for host-local signals the board cannot see
721
721
  (an interactive tmux session, a machine paused by an operator); the
722
722
  shell passes them in rather than this module growing a way to look.
723
+ #2228: the interactive-session half is wired from
724
+ ``coord.commands.release._interactive_session_busy``, fed by the same
725
+ fleet-wide tmux sweep ``coord sessions --remote`` renders — until then
726
+ this half of the seam existed but nothing ever fed it.
723
727
 
724
728
  #2110: a ``running`` queue row is not, on its own, proof of anything —
725
729
  the reconciler that would have moved it to ``done`` lives inside
@@ -253,6 +253,54 @@ is now "plus the next quiescent window".
253
253
  units, which must themselves be installed by hand **once**, on the daemon
254
254
  host, to bootstrap the loop.
255
255
 
256
+ ## INVARIANT: every remote agent's `~/.coord-venv` is a PyPI install, never editable
257
+
258
+ Moved here from `CLAUDE.md` by #2195 so it sits with the rest of the install runbook. **Read
259
+ this section end-to-end before touching any agent install — don't re-derive it.**
260
+
261
+ This is the single most-recurring fleet failure.
262
+
263
+ - **PyPI install** → `coord agent update` runs `pip install --upgrade` and a released
264
+ `vX.Y.Z` lands cleanly.
265
+ - **Editable install** → the update silently `git pull`s a local checkout instead, so version
266
+ bumps never propagate and the agent often "did not come back."
267
+
268
+ **Root cause:** someone ran `pip install -e .` into `~/.coord-venv`. The editable **install**
269
+ is the problem, **not** the `~/src/<repo>` checkout. #402's PATH-strip only stops *workers'*
270
+ bare-pip, not a deliberate editable install.
271
+
272
+ ### DO NOT delete `~/src/<repo>` to "fix" drift
273
+
274
+ It is the **worker worktree base** — `git worktree add` runs from it, and the worktrees in
275
+ `~/.coord/worktrees/` are worktrees *of* it. Deleting it breaks every task for that repo on
276
+ that machine. Fix **only the install**.
277
+
278
+ ### Detect
279
+
280
+ ```bash
281
+ ssh <host> '~/.coord-venv/bin/pip show code-coordinator | grep -i "editable\|location"'
282
+ ```
283
+
284
+ Any `Editable project location:` line ⇒ drift. A PyPI install shows only a site-packages
285
+ `Location:`.
286
+
287
+ ### Fix (keeping the checkout)
288
+
289
+ ```bash
290
+ # in ~/.coord-venv on the affected host
291
+ pip uninstall -y code-coordinator && pip install --upgrade code-coordinator
292
+ XDG_RUNTIME_DIR=/run/user/$(id -u) systemctl --user restart coord-agent
293
+ ```
294
+
295
+ The restart is not optional: the `/update` endpoint's `os.execv` self-restart does **not**
296
+ take under systemd (#404 — it leaves the same PID and a stale version).
297
+
298
+ ### `✗ did not come back` is usually a FALSE NEGATIVE
299
+
300
+ The agent is generally online and the restart simply didn't take. Check the running
301
+ version/PID first, then choose between a drift-fix and a plain
302
+ `systemctl --user restart coord-agent`.
303
+
256
304
  ## Install a new agent (first time)
257
305
 
258
306
  On the target machine: