code-coordinator 0.5.72__tar.gz → 0.5.73__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 (818) hide show
  1. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/code_coordinator.egg-info/SOURCES.txt +1 -0
  4. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/code_coordinator.egg-info/scm_file_list.json +1 -0
  5. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/commands/dispatch.py +98 -0
  7. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/commands/status.py +47 -0
  8. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/conftest.py +18 -0
  9. code_coordinator-0.5.73/tests/test_cli_assign_repo_drift_2219.py +240 -0
  10. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_doctor_config_mismatch_1712.py +100 -0
  11. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/.claude/commands/board.md +0 -0
  12. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/.claude/commands/complete-session.md +0 -0
  13. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/.claude/commands/coordinator.md +0 -0
  14. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/.githooks/_lib.sh +0 -0
  15. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/.githooks/post-checkout +0 -0
  16. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/.githooks/post-commit +0 -0
  17. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/.githooks/post-merge +0 -0
  18. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  19. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/.github/coord-ci-acceptance.yml +0 -0
  20. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/.github/workflows/auto-release.yml +0 -0
  21. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/.github/workflows/cargo-test.yml +0 -0
  22. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/.github/workflows/publish.yml +0 -0
  23. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/.github/workflows/release-tui.yml +0 -0
  24. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/.github/workflows/test.yml +0 -0
  25. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/.gitignore +0 -0
  26. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/CLAUDE.md +0 -0
  27. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/GOAL.md +0 -0
  28. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/LICENSE +0 -0
  29. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/MANIFEST.in +0 -0
  30. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/README.md +0 -0
  31. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/code_coordinator.egg-info/dependency_links.txt +0 -0
  32. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/code_coordinator.egg-info/entry_points.txt +0 -0
  33. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/code_coordinator.egg-info/requires.txt +0 -0
  34. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/code_coordinator.egg-info/top_level.txt +0 -0
  35. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/__init__.py +0 -0
  36. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/_board_mapping.py +0 -0
  37. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/acceptance.py +0 -0
  38. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/acceptance_drivers.py +0 -0
  39. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/agent.py +0 -0
  40. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/agent_app.py +0 -0
  41. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/agent_update.py +0 -0
  42. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/agents/opencode/.gitignore +0 -0
  43. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/agents/opencode/agents/work.md +0 -0
  44. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/agents/opencode/routing.jsonc +0 -0
  45. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/audit.py +0 -0
  46. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/auto_loop.py +0 -0
  47. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/board_bool_guard.py +0 -0
  48. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/board_service.py +0 -0
  49. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/board_wire.py +0 -0
  50. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/brain.py +0 -0
  51. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/branch_model.py +0 -0
  52. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/bug_intake.py +0 -0
  53. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/cargo_cache.py +0 -0
  54. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/ci_github.py +0 -0
  55. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/ci_store.py +0 -0
  56. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/claim.py +0 -0
  57. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/cli.py +0 -0
  58. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/client.py +0 -0
  59. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/commands/__init__.py +0 -0
  60. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/commands/_common.py +0 -0
  61. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/commands/acceptance.py +0 -0
  62. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/commands/agent_ops.py +0 -0
  63. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/commands/audit.py +0 -0
  64. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/commands/chat.py +0 -0
  65. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/commands/dispatch_workers.py +0 -0
  66. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/commands/drive.py +0 -0
  67. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/commands/drive_queue.py +0 -0
  68. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/commands/gate_a.py +0 -0
  69. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/commands/gates.py +0 -0
  70. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/commands/issues.py +0 -0
  71. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/commands/lifecycle.py +0 -0
  72. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/commands/merge.py +0 -0
  73. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/commands/milestone.py +0 -0
  74. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/commands/plan_followup.py +0 -0
  75. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/commands/plans.py +0 -0
  76. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/commands/portal.py +0 -0
  77. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/commands/release.py +0 -0
  78. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/commands/report.py +0 -0
  79. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/commands/review.py +0 -0
  80. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/commands/scorecard.py +0 -0
  81. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/commands/sessions.py +0 -0
  82. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/commands/setup.py +0 -0
  83. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/commands/terminal.py +0 -0
  84. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/commands/test_gate.py +0 -0
  85. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/commands/tui.py +0 -0
  86. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/comments.py +0 -0
  87. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/config.py +0 -0
  88. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/conflict_fix.py +0 -0
  89. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dao.py +0 -0
  90. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/__init__.py +0 -0
  91. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/fixture.py +0 -0
  92. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/index.html +0 -0
  93. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/server.py +0 -0
  94. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/terminal.py +0 -0
  95. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/.gitignore +0 -0
  96. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/components.json +0 -0
  97. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js +0 -0
  98. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  99. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js +0 -0
  100. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js +0 -0
  101. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  102. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  103. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  104. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  105. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  106. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/dist/index.html +0 -0
  107. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  108. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/dist/sw.js +0 -0
  109. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  110. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  111. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  112. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  113. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  114. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  115. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  116. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  117. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  118. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  119. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/eslint.config.js +0 -0
  120. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/index.html +0 -0
  121. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  122. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/package-lock.json +0 -0
  123. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/package.json +0 -0
  124. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  125. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/playwright.config.ts +0 -0
  126. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/postcss.config.js +0 -0
  127. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  128. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  129. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  130. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/App.tsx +0 -0
  131. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/api/client.ts +0 -0
  132. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  133. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  134. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  135. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  136. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  137. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  138. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  139. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  140. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  141. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  142. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  143. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  144. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  145. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  146. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  147. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  148. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  149. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  150. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  151. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  152. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  153. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  154. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  155. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  156. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  157. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  158. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  159. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  160. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  161. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  162. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  163. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  164. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  165. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  166. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  167. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/index.css +0 -0
  168. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  169. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  170. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/main.tsx +0 -0
  171. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  172. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  173. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  174. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  175. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  176. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  177. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  178. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  179. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  180. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  181. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  182. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  183. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  184. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  185. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  186. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  187. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  188. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  189. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  190. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  191. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  192. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  193. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  194. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/tailwind.config.js +0 -0
  195. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/tsconfig.json +0 -0
  196. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  197. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dashboard/webapp/vite.config.ts +0 -0
  198. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/db.py +0 -0
  199. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dead_end.py +0 -0
  200. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/deploy/README.md +0 -0
  201. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/deploy/coord-agent.service +0 -0
  202. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/deploy/coord-db-backup.service +0 -0
  203. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/deploy/coord-db-backup.sh +0 -0
  204. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/deploy/coord-db-backup.timer +0 -0
  205. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/deploy/coord-drive-queue.service +0 -0
  206. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/deploy/coord-drive-queue.timer +0 -0
  207. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/deploy/coord-notify.service +0 -0
  208. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/deploy/coord-notify.timer +0 -0
  209. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/deploy/coord-release-propagate.service +0 -0
  210. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/deploy/coord-release-propagate.timer +0 -0
  211. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/deploy/coord-release-window.service +0 -0
  212. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/deploy/coord-release-window.timer +0 -0
  213. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/deploy/coord-serve.service +0 -0
  214. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/deploy/coord-web-dist-build.service +0 -0
  215. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/deploy/coord-web-dist-build.timer +0 -0
  216. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/deploy/coord-web.service +0 -0
  217. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/deploy_manifest.py +0 -0
  218. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/deploy_units.py +0 -0
  219. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/deps.py +0 -0
  220. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/diagnose.py +0 -0
  221. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dispatch.py +0 -0
  222. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/dist_name.py +0 -0
  223. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/drive.py +0 -0
  224. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/drive_queue.py +0 -0
  225. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/drive_state.py +0 -0
  226. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/events.py +0 -0
  227. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/failure_class.py +0 -0
  228. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/filelock.py +0 -0
  229. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/fleet_config_health.py +0 -0
  230. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/freshness.py +0 -0
  231. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/gate_a.py +0 -0
  232. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/gate_b.py +0 -0
  233. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/gate_snapshot.py +0 -0
  234. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/gates.py +0 -0
  235. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/github_ops.py +0 -0
  236. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/goal.py +0 -0
  237. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/graph_health.py +0 -0
  238. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/health/__init__.py +0 -0
  239. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/health/aggregate.py +0 -0
  240. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/health/checks/__init__.py +0 -0
  241. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/health/checks/agent_install.py +0 -0
  242. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/health/checks/cargo_targets.py +0 -0
  243. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/health/checks/claude_binary.py +0 -0
  244. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/health/checks/deploy_lane_facts.py +0 -0
  245. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/health/checks/disk.py +0 -0
  246. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/health/checks/fleet_board.py +0 -0
  247. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  248. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/health/checks/fleet_phantom.py +0 -0
  249. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/health/checks/fleet_unit_drift.py +0 -0
  250. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/health/checks/graph.py +0 -0
  251. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/health/checks/plan_usage.py +0 -0
  252. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/health/checks/repo_state.py +0 -0
  253. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/health/checks/spawned_coord.py +0 -0
  254. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/health/checks/timer_active.py +0 -0
  255. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/health/checks/toolchain.py +0 -0
  256. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/health/checks/unit_drift.py +0 -0
  257. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/health/checks/unit_enablement.py +0 -0
  258. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/health/checks/worktrees.py +0 -0
  259. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/health/cli.py +0 -0
  260. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/health/context.py +0 -0
  261. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/health/fleet_snapshot.py +0 -0
  262. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/health/models.py +0 -0
  263. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/health/pypi.py +0 -0
  264. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/health/registry.py +0 -0
  265. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/health/render.py +0 -0
  266. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/health/units.py +0 -0
  267. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/hooks.py +0 -0
  268. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/housekeeping.py +0 -0
  269. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/interactive.py +0 -0
  270. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/issue_store.py +0 -0
  271. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/liveness_auditor.py +0 -0
  272. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/machine_pause.py +0 -0
  273. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/merge_queue.py +0 -0
  274. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/milestone_chat.py +0 -0
  275. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/milestone_dispatch.py +0 -0
  276. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/milestone_gate.py +0 -0
  277. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/milestone_order.py +0 -0
  278. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/mock_author.py +0 -0
  279. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/models.py +0 -0
  280. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/network.py +0 -0
  281. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/new_issue_chat.py +0 -0
  282. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/notifier/__init__.py +0 -0
  283. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/notifier/baseline.py +0 -0
  284. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/notifier/cli.py +0 -0
  285. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/notifier/collect.py +0 -0
  286. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/notifier/digest.py +0 -0
  287. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/notifier/models.py +0 -0
  288. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/notifier/predicate.py +0 -0
  289. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/notifier/service.py +0 -0
  290. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/notifier/store.py +0 -0
  291. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/notifier/transport.py +0 -0
  292. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/notify.py +0 -0
  293. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/openapi.py +0 -0
  294. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/overlap_fence.py +0 -0
  295. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/parentage.py +0 -0
  296. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/parentage_github.py +0 -0
  297. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/pipeline.py +0 -0
  298. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/plan_parser.py +0 -0
  299. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/plans.py +0 -0
  300. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/platform_paths.py +0 -0
  301. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/portal_bridge.py +0 -0
  302. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/pr_body_lint.py +0 -0
  303. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/prereqs.py +0 -0
  304. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/progress.py +0 -0
  305. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/providers/__init__.py +0 -0
  306. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/providers/base.py +0 -0
  307. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/providers/claude.py +0 -0
  308. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/providers/claude_pty.py +0 -0
  309. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/providers/opencode.py +0 -0
  310. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/reconcile.py +0 -0
  311. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/refine_chat.py +0 -0
  312. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/release_cordon.py +0 -0
  313. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/release_propagate.py +0 -0
  314. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/release_verify.py +0 -0
  315. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/release_window.py +0 -0
  316. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/reports.py +0 -0
  317. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/revalidate.py +0 -0
  318. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/review.py +0 -0
  319. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/scorecard.py +0 -0
  320. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/serve_app.py +0 -0
  321. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/skills/update-issue/SKILL.md +0 -0
  322. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/smoke.py +0 -0
  323. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/spend_ceiling.py +0 -0
  324. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/split_work.py +0 -0
  325. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/stage_projection.py +0 -0
  326. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/state.py +0 -0
  327. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/test_author.py +0 -0
  328. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/test_chat.py +0 -0
  329. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/test_orchestrator.py +0 -0
  330. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/test_report.py +0 -0
  331. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/tui_release.py +0 -0
  332. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/usage.py +0 -0
  333. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/usage_limits.py +0 -0
  334. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/usage_rollup.py +0 -0
  335. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coord/worker_events.py +0 -0
  336. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/coordinator.example.yml +0 -0
  337. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/deploy/coord-agent.service +0 -0
  338. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/deploy/coord-db-backup.service +0 -0
  339. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/deploy/coord-db-backup.sh +0 -0
  340. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/deploy/coord-db-backup.timer +0 -0
  341. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/deploy/coord-drive-queue.service +0 -0
  342. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/deploy/coord-drive-queue.timer +0 -0
  343. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/deploy/coord-notify.service +0 -0
  344. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/deploy/coord-notify.timer +0 -0
  345. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/deploy/coord-release-propagate.service +0 -0
  346. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/deploy/coord-release-propagate.timer +0 -0
  347. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/deploy/coord-release-window.service +0 -0
  348. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/deploy/coord-release-window.timer +0 -0
  349. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/deploy/coord-serve.service +0 -0
  350. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/deploy/coord-web-dist-build.service +0 -0
  351. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/deploy/coord-web-dist-build.sh +0 -0
  352. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/deploy/coord-web-dist-build.timer +0 -0
  353. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/deploy/coord-web-rollback.sh +0 -0
  354. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/deploy/coord-web.service +0 -0
  355. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/deploy/node-shim.sh +0 -0
  356. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/docs/AGENT_OPERATIONS.md +0 -0
  357. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/docs/ARCHITECTURE.md +0 -0
  358. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/docs/ARCH_SECURITY_GATES.md +0 -0
  359. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/docs/COCKPIT.md +0 -0
  360. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/docs/CONTROL_CENTER.md +0 -0
  361. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/docs/CROSS_PLATFORM.md +0 -0
  362. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/docs/CUSTOMER_PORTAL.md +0 -0
  363. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/docs/DRIVE_QUEUE.md +0 -0
  364. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/docs/EPHEMERAL_WORKERS.md +0 -0
  365. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/docs/FORGE_MIGRATION.md +0 -0
  366. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/docs/GRAPHIFY_SETUP.md +0 -0
  367. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/docs/ISSUE_GUIDANCE.md +0 -0
  368. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/docs/MAC_MINI.md +0 -0
  369. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  370. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/docs/NOTIFIER.md +0 -0
  371. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/docs/OPENCODE_VERIFICATION.md +0 -0
  372. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/docs/OPERATING_GOTCHAS.md +0 -0
  373. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/docs/ORACLE_LOOP.md +0 -0
  374. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/docs/PHONE_WEBAPP.md +0 -0
  375. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/docs/PIPELINE_V2.md +0 -0
  376. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/docs/PLATFORM_EVOLUTION.md +0 -0
  377. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/docs/SECOND_BACKEND.md +0 -0
  378. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/docs/STORE_SERVICE.md +0 -0
  379. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  380. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/docs/WEB_CONTROL_CENTER.md +0 -0
  381. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/docs/mocks/web/README.md +0 -0
  382. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/docs/mocks/web/_tokens.css +0 -0
  383. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/docs/mocks/web/issue-detail.html +0 -0
  384. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/docs/mocks/web/pipeline-narrow.html +0 -0
  385. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/docs/mocks/web/pipeline-wide.html +0 -0
  386. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/graphify-out/.gitignore +0 -0
  387. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/install-agent.sh +0 -0
  388. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/pyproject.toml +0 -0
  389. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/scripts/audit_review_verdict_overrides.py +0 -0
  390. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  391. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/scripts/azure-workers/build-worker-image.sh +0 -0
  392. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/scripts/azure-workers/coordinator-machine.py +0 -0
  393. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/scripts/azure-workers/epic-down.sh +0 -0
  394. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/scripts/azure-workers/epic-up.sh +0 -0
  395. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/scripts/azure-workers/preflight.sh +0 -0
  396. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/scripts/azure-workers/provision-worker.sh +0 -0
  397. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  398. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  399. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/scripts/azure-workers/verify-github-token.sh +0 -0
  400. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/scripts/codegen.py +0 -0
  401. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/scripts/coord-test-runner.sh +0 -0
  402. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/scripts/drive-batch.sh +0 -0
  403. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/scripts/gen_board_fixture.py +0 -0
  404. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/scripts/next_release_tag.py +0 -0
  405. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/scripts/run_tests_in_populated_home.sh +0 -0
  406. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/scripts/run_tests_without_gh.sh +0 -0
  407. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/scripts/smoke_437_interactive.py +0 -0
  408. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/scripts/verify_878_review_capture.py +0 -0
  409. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/scripts/verify_release_published.py +0 -0
  410. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/scripts/verify_release_wheel.py +0 -0
  411. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/setup.cfg +0 -0
  412. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/SMOKE_SET.md +0 -0
  413. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/__init__.py +0 -0
  414. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  415. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/acceptance/ms-33/contract.md +0 -0
  416. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/acceptance/ms-33/manifest.yml +0 -0
  417. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  418. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  419. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  420. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  421. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/acceptance/ms-37/conftest.py +0 -0
  422. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/acceptance/ms-37/contract.md +0 -0
  423. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/acceptance/ms-37/manifest.yml +0 -0
  424. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  425. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  426. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/acceptance/ms-38/contract.md +0 -0
  427. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/acceptance/ms-38/manifest.yml +0 -0
  428. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  429. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  430. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  431. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  432. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  433. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  434. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  435. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  436. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  437. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  438. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/acceptance/ms-51/contract.md +0 -0
  439. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  440. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  441. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/acceptance/ms-51/manifest.yml +0 -0
  442. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  443. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/acceptance/ms-51/tsconfig.json +0 -0
  444. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  445. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/fixtures/board-pipeline-basic.json +0 -0
  446. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  447. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  448. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  449. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/fixtures/playwright/all_pass.json +0 -0
  450. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  451. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/fixtures/playwright/mixed_fail.json +0 -0
  452. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  453. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  454. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/fixtures/playwright/skip.json +0 -0
  455. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/fixtures/playwright/truncated.json +0 -0
  456. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  457. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  458. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  459. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  460. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  461. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  462. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  463. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  464. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_acceptance.py +0 -0
  465. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_acceptance_drivers.py +0 -0
  466. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_agent.py +0 -0
  467. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_agent_api_error.py +0 -0
  468. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_agent_app.py +0 -0
  469. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_agent_branch_base.py +0 -0
  470. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_agent_branch_capture.py +0 -0
  471. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_agent_config_free_1712.py +0 -0
  472. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_agent_deploy_units_endpoint.py +0 -0
  473. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_agent_dirty_worktree.py +0 -0
  474. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_agent_graph_self_heal.py +0 -0
  475. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_agent_health_h3.py +0 -0
  476. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_agent_idle_restart.py +0 -0
  477. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_agent_push_failure.py +0 -0
  478. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_agent_reap.py +0 -0
  479. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_agent_repos_and_pull.py +0 -0
  480. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_agent_restart_services_endpoint.py +0 -0
  481. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_agent_startup_diagnostics.py +0 -0
  482. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_agent_update.py +0 -0
  483. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_agent_update_bluegreen.py +0 -0
  484. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_agent_usage_limit.py +0 -0
  485. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_agent_zero_commit.py +0 -0
  486. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_ambient_home_isolation.py +0 -0
  487. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_approve_reject_plan.py +0 -0
  488. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_approve_usage_gate.py +0 -0
  489. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_assignment_already_recorded_daemon.py +0 -0
  490. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_audit_log.py +0 -0
  491. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_audit_outcome.py +0 -0
  492. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_audit_query.py +0 -0
  493. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_auto_loop.py +0 -0
  494. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_auto_release_publish_2035.py +0 -0
  495. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_base_checkout_restore.py +0 -0
  496. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_board_cap_762.py +0 -0
  497. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_board_fixture.py +0 -0
  498. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_board_read_path.py +0 -0
  499. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_board_service.py +0 -0
  500. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_board_state.py +0 -0
  501. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_board_wire.py +0 -0
  502. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_brain.py +0 -0
  503. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_branch_model.py +0 -0
  504. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_bug_intake.py +0 -0
  505. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_build_worker_image_env_update.py +0 -0
  506. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cargo_cache.py +0 -0
  507. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_ci_acceptance_gate_1950.py +0 -0
  508. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_ci_parity_2091.py +0 -0
  509. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_ci_store.py +0 -0
  510. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_claim.py +0 -0
  511. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_acceptance.py +0 -0
  512. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_assign.py +0 -0
  513. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  514. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_assign_interactive_remote.py +0 -0
  515. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_assign_provider.py +0 -0
  516. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_audit.py +0 -0
  517. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_chat_continue.py +0 -0
  518. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_diagnose_config_provenance.py +0 -0
  519. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_diagnose_graph.py +0 -0
  520. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_doctor.py +0 -0
  521. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_doctor_config_free_1801.py +0 -0
  522. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_drive.py +0 -0
  523. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_drive_queue.py +0 -0
  524. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_escalate.py +0 -0
  525. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_fix_headless_review.py +0 -0
  526. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_gate_a.py +0 -0
  527. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_install_drift.py +0 -0
  528. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_install_skills.py +0 -0
  529. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_issue_create_label.py +0 -0
  530. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_issue_reopen.py +0 -0
  531. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_merge.py +0 -0
  532. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_milestone_assign.py +0 -0
  533. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_milestone_capture.py +0 -0
  534. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_milestone_chat_add_child.py +0 -0
  535. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_milestone_dispatch.py +0 -0
  536. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_milestone_gate_b.py +0 -0
  537. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_milestone_gate_c.py +0 -0
  538. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_milestone_order.py +0 -0
  539. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  540. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_milestone_ship.py +0 -0
  541. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_network.py +0 -0
  542. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_new_issue_chat.py +0 -0
  543. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_plans.py +0 -0
  544. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_portal.py +0 -0
  545. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_pull_artifact.py +0 -0
  546. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_queue.py +0 -0
  547. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_reattach_sessions.py +0 -0
  548. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_refine_board.py +0 -0
  549. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_release_preflight.py +0 -0
  550. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_release_propagate.py +0 -0
  551. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_release_window.py +0 -0
  552. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_scorecard.py +0 -0
  553. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_set_review_findings.py +0 -0
  554. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_status_advisory_terminal.py +0 -0
  555. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_status_merge_queue.py +0 -0
  556. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_status_provider.py +0 -0
  557. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_status_review_finalizing.py +0 -0
  558. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_status_test_failed_tag.py +0 -0
  559. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_status_usage_limit.py +0 -0
  560. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_sync_comments_873.py +0 -0
  561. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_test_plan.py +0 -0
  562. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_track.py +0 -0
  563. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_tui_update.py +0 -0
  564. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cli_wait.py +0 -0
  565. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_client_base_install.py +0 -0
  566. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_comments.py +0 -0
  567. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_completion_summary.py +0 -0
  568. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_config.py +0 -0
  569. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_config_acceptance.py +0 -0
  570. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_config_audit.py +0 -0
  571. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_config_pricing.py +0 -0
  572. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_config_usage_gate.py +0 -0
  573. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_conflict_fix.py +0 -0
  574. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_conflict_fix_semantic.py +0 -0
  575. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_coord_test.py +0 -0
  576. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_coord_test_runner_baseline.py +0 -0
  577. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_coord_test_runner_routing.py +0 -0
  578. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_coord_test_runner_toolchain.py +0 -0
  579. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_coord_web_sse_restart_live.py +0 -0
  580. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_coordinator_machine.py +0 -0
  581. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_cross_platform_imports.py +0 -0
  582. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_dashboard.py +0 -0
  583. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_dashboard_fixture.py +0 -0
  584. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_dashboard_terminal.py +0 -0
  585. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_dashboard_terminal_live.py +0 -0
  586. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_db.py +0 -0
  587. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_dead_end.py +0 -0
  588. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_deploy_coord_db_backup.py +0 -0
  589. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_deploy_coord_web_dist.py +0 -0
  590. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_deploy_coord_web_rollback.py +0 -0
  591. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_deploy_drive_queue_unit.py +0 -0
  592. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_deploy_manifest.py +0 -0
  593. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_deploy_units_lane.py +0 -0
  594. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_deploy_web_unit.py +0 -0
  595. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_deps.py +0 -0
  596. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_diagnose.py +0 -0
  597. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_dispatch.py +0 -0
  598. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_dispatch_target_validation.py +0 -0
  599. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_dist_name.py +0 -0
  600. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_done_housekeeping.py +0 -0
  601. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_drive.py +0 -0
  602. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_drive_queue.py +0 -0
  603. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_drive_state.py +0 -0
  604. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_drive_tmux.py +0 -0
  605. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_epic_up_capability_detection.py +0 -0
  606. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  607. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_epic_up_image_provenance.py +0 -0
  608. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_errors.py +0 -0
  609. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_events.py +0 -0
  610. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_failure_class.py +0 -0
  611. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_filelock.py +0 -0
  612. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  613. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_fix_of_force_override.py +0 -0
  614. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_fleet_config_health.py +0 -0
  615. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_fleet_health_probes.py +0 -0
  616. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_fleet_health_snapshot.py +0 -0
  617. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_freshness.py +0 -0
  618. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_gate_a.py +0 -0
  619. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_gate_b.py +0 -0
  620. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_gate_snapshot_staleness.py +0 -0
  621. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_gates.py +0 -0
  622. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_generated_types_fixture.py +0 -0
  623. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_github_ops.py +0 -0
  624. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_goal.py +0 -0
  625. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_graph_health.py +0 -0
  626. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_handoff.py +0 -0
  627. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_health_checks.py +0 -0
  628. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_health_cli.py +0 -0
  629. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_health_cli_graph.py +0 -0
  630. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_health_config.py +0 -0
  631. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_health_context.py +0 -0
  632. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_health_deploy_lane_facts.py +0 -0
  633. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_health_incident_regression.py +0 -0
  634. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_health_pypi.py +0 -0
  635. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_health_registry.py +0 -0
  636. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_health_timer_active.py +0 -0
  637. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_health_toolchain.py +0 -0
  638. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_health_unit_drift.py +0 -0
  639. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_health_unit_enablement.py +0 -0
  640. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_hooks.py +0 -0
  641. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_human_attended_437.py +0 -0
  642. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_init.py +0 -0
  643. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_integration.py +0 -0
  644. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_interactive_briefing_echo.py +0 -0
  645. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_interactive_prefill_state.py +0 -0
  646. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_interactive_session_relaunch.py +0 -0
  647. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_interactive_test_verdict_backstop.py +0 -0
  648. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_interactive_token_attribution.py +0 -0
  649. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_interactive_worktree.py +0 -0
  650. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_issue_store_seam.py +0 -0
  651. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_liveness_auditor.py +0 -0
  652. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_liveness_notify.py +0 -0
  653. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_machine_pause.py +0 -0
  654. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_merge_queue.py +0 -0
  655. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_merge_verify.py +0 -0
  656. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_milestone_chat.py +0 -0
  657. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_milestone_dispatch.py +0 -0
  658. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_milestone_gate.py +0 -0
  659. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_milestone_order.py +0 -0
  660. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_milestone_seam.py +0 -0
  661. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_mock_author.py +0 -0
  662. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_model_tiering.py +0 -0
  663. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_models.py +0 -0
  664. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_models_config_labels.py +0 -0
  665. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_needs_attention.py +0 -0
  666. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_network.py +0 -0
  667. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_new_issue_chat.py +0 -0
  668. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_next_release_tag.py +0 -0
  669. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_no_direct_gh_calls.py +0 -0
  670. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_node_shim.py +0 -0
  671. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_notifier_baseline.py +0 -0
  672. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_notifier_cli.py +0 -0
  673. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_notifier_collect.py +0 -0
  674. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_notifier_config.py +0 -0
  675. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_notifier_drive_seam.py +0 -0
  676. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_notifier_isolation.py +0 -0
  677. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_notifier_predicate.py +0 -0
  678. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_notifier_quiet_hours.py +0 -0
  679. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_notifier_service.py +0 -0
  680. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_notify.py +0 -0
  681. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_notify_drain.py +0 -0
  682. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_openapi.py +0 -0
  683. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_operational_defaults.py +0 -0
  684. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_overlap_fence.py +0 -0
  685. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_packaged_deploy_units.py +0 -0
  686. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_parentage.py +0 -0
  687. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_paste_landed.py +0 -0
  688. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_pipeline.py +0 -0
  689. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_plan_followup_approve_plan_command.py +0 -0
  690. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_plan_followup_pr_command.py +0 -0
  691. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_plan_followup_review_command.py +0 -0
  692. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_plan_only.py +0 -0
  693. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_plan_parser.py +0 -0
  694. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_platform_paths.py +0 -0
  695. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_portal_bridge.py +0 -0
  696. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_portal_config.py +0 -0
  697. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_pr_body_lint.py +0 -0
  698. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_prereqs.py +0 -0
  699. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_production_db_guard.py +0 -0
  700. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_progress.py +0 -0
  701. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_provider_seam.py +0 -0
  702. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_providers.py +0 -0
  703. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_providers_config_labels.py +0 -0
  704. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_providers_pty.py +0 -0
  705. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_quiet_hours.py +0 -0
  706. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_quiet_hours_store_2146.py +0 -0
  707. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_reap_merged_sessions.py +0 -0
  708. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_reap_stale_interactive_tick.py +0 -0
  709. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_reconcile_branch.py +0 -0
  710. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_reconcile_completions.py +0 -0
  711. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_reconcile_merges.py +0 -0
  712. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_reconcile_usage_limit_done.py +0 -0
  713. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_refine_chat.py +0 -0
  714. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_release_cordon_2101.py +0 -0
  715. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_release_propagate.py +0 -0
  716. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_release_unified_1242.py +0 -0
  717. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_release_verify.py +0 -0
  718. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_release_window.py +0 -0
  719. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_remote_auto_prune.py +0 -0
  720. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_remote_interactive_reaper.py +0 -0
  721. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_report_result_push.py +0 -0
  722. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_reports.py +0 -0
  723. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_retry.py +0 -0
  724. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_retry_advisory_1606.py +0 -0
  725. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_retry_type_1636.py +0 -0
  726. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_revalidate.py +0 -0
  727. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_review.py +0 -0
  728. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_review_end_review_without_verdict.py +0 -0
  729. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_review_parse_failure_diagnostic.py +0 -0
  730. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_review_reaffirm.py +0 -0
  731. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_review_state.py +0 -0
  732. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_review_verdict_backstop.py +0 -0
  733. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_review_verdict_override_audit.py +0 -0
  734. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_review_verdict_relay.py +0 -0
  735. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_review_zero_commits.py +0 -0
  736. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_scoped_review_wiring.py +0 -0
  737. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_scorecard.py +0 -0
  738. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_serve.py +0 -0
  739. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_serve_app_board_trim.py +0 -0
  740. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_session.py +0 -0
  741. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_slice_issue_attribution.py +0 -0
  742. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_smoke.py +0 -0
  743. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_smoke_live_checkout_restore.py +0 -0
  744. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_smoke_workflow.py +0 -0
  745. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_spend_ceiling.py +0 -0
  746. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_spend_ceiling_coordinator.py +0 -0
  747. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_split.py +0 -0
  748. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_split_work.py +0 -0
  749. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_stage_projection.py +0 -0
  750. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_stalled_pipeline.py +0 -0
  751. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_state.py +0 -0
  752. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_state_review_findings_daemon.py +0 -0
  753. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_status_fleet_footer.py +0 -0
  754. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_stop_1567.py +0 -0
  755. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_stuck.py +0 -0
  756. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_terminal_command.py +0 -0
  757. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_test_author.py +0 -0
  758. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_test_chat.py +0 -0
  759. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_test_orchestrator.py +0 -0
  760. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_test_report.py +0 -0
  761. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_test_verdict_parsing.py +0 -0
  762. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_test_verdict_transcript_floor.py +0 -0
  763. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_thin_client_board_audit.py +0 -0
  764. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_thin_client_config_load_1080.py +0 -0
  765. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_thin_client_daemon_routing_906.py +0 -0
  766. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_tmux_host.py +0 -0
  767. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_tmux_session.py +0 -0
  768. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_transcript_floor.py +0 -0
  769. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_usage.py +0 -0
  770. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_usage_limits.py +0 -0
  771. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_usage_rollup.py +0 -0
  772. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_venv_live_install_2121.py +0 -0
  773. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_version_single_source.py +0 -0
  774. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_watch.py +0 -0
  775. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_worker_events.py +0 -0
  776. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_worker_image_pin_sync.py +0 -0
  777. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_worker_safety.py +0 -0
  778. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_worker_test_scoping.py +0 -0
  779. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_worktree.py +0 -0
  780. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  781. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/Cargo.lock +0 -0
  782. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/Cargo.toml +0 -0
  783. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/cargo-config-local-quadraui.toml.example +0 -0
  784. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/app/audit.rs +0 -0
  785. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/app/chat.rs +0 -0
  786. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/app/data.rs +0 -0
  787. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/app/dialogs.rs +0 -0
  788. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/app/drive.rs +0 -0
  789. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/app/drive_queue.rs +0 -0
  790. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/app/escalation.rs +0 -0
  791. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/app/events.rs +0 -0
  792. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/app/fixtures.rs +0 -0
  793. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/app/fleet_health.rs +0 -0
  794. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/app/fleet_sessions.rs +0 -0
  795. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/app/fleet_terminals.rs +0 -0
  796. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/app/format.rs +0 -0
  797. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/app/milestone_dag.rs +0 -0
  798. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/app/mod.rs +0 -0
  799. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/app/msv.rs +0 -0
  800. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/app/pipeline.rs +0 -0
  801. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/app/plans.rs +0 -0
  802. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/app/render.rs +0 -0
  803. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/app/reports.rs +0 -0
  804. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/app/sessions.rs +0 -0
  805. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/app/settings_ui.rs +0 -0
  806. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/app/sidebar.rs +0 -0
  807. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/app/terminal.rs +0 -0
  808. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/app/tests.rs +0 -0
  809. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/app/types.rs +0 -0
  810. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/app/workspace.rs +0 -0
  811. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/bin/gtk.rs +0 -0
  812. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/commands.rs +0 -0
  813. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/lib.rs +0 -0
  814. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/main.rs +0 -0
  815. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/src/settings.rs +0 -0
  816. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/tests/acceptance.rs +0 -0
  817. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/tests/cli.rs +0 -0
  818. {code_coordinator-0.5.72 → code_coordinator-0.5.73}/tui/tests/fixtures/board_sample.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.72
3
+ Version: 0.5.73
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.72
3
+ Version: 0.5.73
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
@@ -459,6 +459,7 @@ tests/test_cli_assign.py
459
459
  tests/test_cli_assign_interactive_oracle_gate.py
460
460
  tests/test_cli_assign_interactive_remote.py
461
461
  tests/test_cli_assign_provider.py
462
+ tests/test_cli_assign_repo_drift_2219.py
462
463
  tests/test_cli_audit.py
463
464
  tests/test_cli_chat_continue.py
464
465
  tests/test_cli_diagnose_config_provenance.py
@@ -489,6 +489,7 @@
489
489
  "tests/test_cli_assign_interactive_oracle_gate.py",
490
490
  "tests/test_cli_assign_interactive_remote.py",
491
491
  "tests/test_cli_assign_provider.py",
492
+ "tests/test_cli_assign_repo_drift_2219.py",
492
493
  "tests/test_cli_audit.py",
493
494
  "tests/test_cli_chat_continue.py",
494
495
  "tests/test_cli_diagnose_config_provenance.py",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.72",
2
+ "tag": "0.5.73",
3
3
  "distance": 0,
4
- "node": "gf89a7326b4afe98af0d76d9cbafabea51928013f",
4
+ "node": "g14e77699382902c886b02c14ee83a233c166d4cb",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-14"
@@ -9,6 +9,7 @@ import dataclasses
9
9
  import socket
10
10
  import sys
11
11
  from pathlib import Path
12
+ from typing import TYPE_CHECKING
12
13
 
13
14
  import click
14
15
  import httpx
@@ -31,6 +32,9 @@ from coord.commands.dispatch_workers import (
31
32
  _dispatch_troubleshoot,
32
33
  )
33
34
 
35
+ if TYPE_CHECKING:
36
+ from coord.models import Machine
37
+
34
38
 
35
39
  def _stdin_is_tty() -> bool:
36
40
  """Seam over ``sys.stdin.isatty()`` — see ``_require_interactive_tty``
@@ -89,6 +93,88 @@ def _require_interactive_tty(dry_run: bool) -> None:
89
93
  )
90
94
 
91
95
 
96
+ def _repo_capability_refusal(
97
+ machine_obj: Machine, repo: str, *, timeout: float = 3.0
98
+ ) -> str | None:
99
+ """Cross-check *repo* against the target agent's LIVE ``/health`` repo
100
+ list, returning a refusal message when the two disagree — or ``None``
101
+ when they agree, the agent is unreachable, or the agent is config-free
102
+ (#2219).
103
+
104
+ ``assign()``'s ``machine_obj.can_work_on(repo)`` check (just above this
105
+ call site) only ever reads ``coordinator.yml`` — which the operator can
106
+ edit any time — never the agent process actually running on that
107
+ machine. A repo added to config after the agent started stays invisible
108
+ to it until a full ``systemctl --user restart coord-agent`` (there is no
109
+ partial re-read today). Every pre-flight surface an operator would
110
+ check before spending a dispatch reads config too: ``coord config``,
111
+ ``coord status``, and — worst of all — ``coord assign ... --dry-run``,
112
+ which is the documented way to sanity-check a dispatch before paying
113
+ for it. All three said this was fine while the live agent rejected it
114
+ outright, and a drive queue burned both retry attempts discovering that
115
+ by trial before landing terminally ``blocked`` (#2219). This is the
116
+ same ``/health`` read ``coord status``/``coord doctor`` already make
117
+ (``coord.network.check_machine``) — reused, not duplicated.
118
+
119
+ ``/health``'s ``repos`` field is NOT what ``AgentServer.assign()``
120
+ itself gates on, though — it's ``AgentServer._servable_repos()``'s
121
+ FILTERED list (``coord/agent.py``, #1527), which drops any repo with no
122
+ ``repo_paths`` entry or whose configured path is missing on disk.
123
+ ``assign()``'s own gate (``coord/agent.py``: ``if self.repos and
124
+ spec.repo_name not in self.repos``) checks the UNFILTERED
125
+ ``self.repos``. The two disagree exactly when a repo is configured on
126
+ that machine but degraded (``/health``'s ``degraded`` dict, #1527): in
127
+ that case ``assign()`` would NOT reject with "does not handle repo" —
128
+ it proceeds and fails later with the distinct "repo path does not
129
+ exist" — so this helper checks ``degraded`` FIRST and reports that
130
+ reason (with no restart advice, since restarting coord-agent cannot
131
+ repair a missing/misconfigured ``repo_paths`` entry) before ever
132
+ falling back to the "hasn't re-read config since *repo* was added"
133
+ story, which is only accurate when *repo* is absent from ``/health``
134
+ entirely — not merely degraded.
135
+
136
+ Deliberately narrow otherwise: only refuses when the agent is
137
+ reachable, ANSWERED with a real ``/health`` body, is not running
138
+ config-free (#1801 — a config-free agent's repos come from the dispatch
139
+ payload, not its own config, so an empty/mismatched list there is not a
140
+ capability gap), and either lists *repo* as degraded or published a
141
+ NON-empty repo list that plainly excludes it. Every other case
142
+ (offline, timeout, old agent with no ``repos`` key, empty list) falls
143
+ through to ``None`` — today's behavior, where the POST itself is left
144
+ to surface a real problem — so this never turns a transient network
145
+ hiccup into a new dispatch failure mode.
146
+ """
147
+ from coord.network import check_machine
148
+
149
+ status = check_machine(machine_obj, timeout=timeout)
150
+ if not status.is_online or status.health is None:
151
+ return None
152
+ health = status.health
153
+ if health.get("config_free"):
154
+ return None
155
+ degraded = health.get("degraded") or {}
156
+ if repo in degraded:
157
+ return (
158
+ f"{machine_obj.name!r} lists {repo!r} in coordinator.yml, and "
159
+ f"the live agent agrees it's configured, but the repo is "
160
+ f"DEGRADED there, not just unrefreshed: {degraded[repo]} "
161
+ f"(#1527). This is not the #2219 stale-config case — "
162
+ f"restarting coord-agent will not fix a missing or "
163
+ f"misconfigured repo_paths entry. Repair repo_paths[{repo!r}] "
164
+ f"on {machine_obj.name!r} instead, then retry."
165
+ )
166
+ live_repos = health.get("repos")
167
+ if not live_repos or repo in live_repos:
168
+ return None
169
+ return (
170
+ f"{machine_obj.name!r} rejected the assignment: this agent does "
171
+ f"not handle repo {repo!r} (supported: {live_repos}) — "
172
+ f"coordinator.yml lists it, but the live agent process hasn't "
173
+ f"re-read its config since {repo!r} was added (#2219). Restart "
174
+ f"coord-agent on {machine_obj.name!r} to pick it up, then retry."
175
+ )
176
+
177
+
92
178
  @click.command(help="Brain proposes assignments for idle machines.")
93
179
  @_CONFIG_OPTION
94
180
  @click.option("--dry-run", is_flag=True, help="Plan without saving proposals.")
@@ -951,6 +1037,18 @@ def assign(
951
1037
  )
952
1038
  sys.exit(2)
953
1039
 
1040
+ # #2219: config says this machine handles `repo` — but the LIVE agent
1041
+ # process may not (yet) agree, if `repo` was added to coordinator.yml
1042
+ # after that agent started. Refuse with the agent's real reason here,
1043
+ # before any claim/worktree/network work — including under --dry-run,
1044
+ # which is exactly the surface that used to green-light this. See
1045
+ # _repo_capability_refusal's docstring for the full rationale and what
1046
+ # it deliberately does NOT block on (offline/unreachable/config-free).
1047
+ capability_refusal = _repo_capability_refusal(machine_obj, repo)
1048
+ if capability_refusal is not None:
1049
+ click.echo(f"error: {capability_refusal}", err=True)
1050
+ sys.exit(2)
1051
+
954
1052
  # Refuse direct assignment to a paused machine — `coord pause` exists
955
1053
  # so the user can explicitly steer work away. If they meant to dispatch
956
1054
  # anyway they should `coord unpause` first. #1862: also refuses inside
@@ -765,6 +765,53 @@ def _health_vs_config_lines(machine, health: dict) -> list[tuple[bool, str]]:
765
765
  ))
766
766
  for repo, reason in sorted(degraded.items()):
767
767
  out.append((True, f" {repo}: {reason}"))
768
+ elif declared_repos and published_repos and not config_free:
769
+ # #2219: the ABOVE branch only fires when /health publishes NOTHING
770
+ # — it silently missed the partial-drift shape that actually bit
771
+ # stick-demo#1: a repo added to coordinator.yml after the agent
772
+ # process started stays off /health's list while everything ELSE
773
+ # the agent publishes (including all its OTHER repos) looks
774
+ # perfectly healthy. `coord config`/`coord status` both read
775
+ # config, so both still advertised it; only the live agent —
776
+ # and, at dispatch cost, the drive queue that burned both retry
777
+ # attempts on it — knew better.
778
+ #
779
+ # `published_repos` (``/health``'s ``repos``) is
780
+ # ``AgentServer._servable_repos()``'s FILTERED list (#1527) — it
781
+ # also drops any repo that IS configured on that machine but is
782
+ # DEGRADED (no ``repo_paths`` entry, or the configured path is
783
+ # missing on disk). A drifted repo that's actually degraded is not
784
+ # the #2219 stale-config story: `AgentServer.assign()` gates on the
785
+ # UNFILTERED `self.repos`, so it would still accept that repo and
786
+ # fail later with a distinct "repo path does not exist" error —
787
+ # restarting coord-agent cannot repair a missing/misconfigured
788
+ # `repo_paths` entry. Split on `degraded` so each drifted repo gets
789
+ # the accurate story and remedy.
790
+ drifted = [r for r in declared_repos if r not in published_repos]
791
+ stale = [r for r in drifted if r not in degraded]
792
+ if stale:
793
+ out.append((
794
+ True,
795
+ f" ✗ CRIT repos: coordinator.yml declares {declared_repos} "
796
+ f"but /health only advertises {published_repos} — {stale} "
797
+ "were added to config after this agent process started and "
798
+ "it hasn't re-read them; a dispatch to any of "
799
+ f"{stale} on this machine will be refused despite `coord "
800
+ "config`/`coord status` showing it as supported (#2219). "
801
+ "Restart coord-agent on this machine to pick it up.",
802
+ ))
803
+ for repo in drifted:
804
+ if repo in degraded:
805
+ out.append((
806
+ True,
807
+ f" ✗ CRIT repos: coordinator.yml declares {repo!r} for "
808
+ "this machine and the live agent agrees it's "
809
+ f"configured, but it's DEGRADED there, not just "
810
+ f"unrefreshed: {degraded[repo]} (#1527). This is not "
811
+ "the #2219 stale-config case — restarting coord-agent "
812
+ f"will not fix it; repair repo_paths[{repo!r}] on this "
813
+ "machine instead.",
814
+ ))
768
815
 
769
816
  return out
770
817
 
@@ -68,6 +68,24 @@ def _no_agent_health_probe(monkeypatch):
68
68
  )
69
69
 
70
70
 
71
+ @pytest.fixture(autouse=True)
72
+ def _no_assign_repo_drift_probe(monkeypatch):
73
+ """#2219: default `coord assign`'s live-agent repo-capability cross-check
74
+ (``coord.commands.dispatch._repo_capability_refusal``) to fail-open
75
+ (``None`` — never refuse) so tests that don't care about it don't make a
76
+ real ``httpx.get(".../health")`` call keyed off whatever bogus
77
+ ``host.tailnet`` hostnames the fixture configs use. Mirrors
78
+ ``_no_agent_health_probe`` (#904) for the same reason: the suite's
79
+ default behavior must not depend on network/DNS timing. Tests exercising
80
+ the drift check itself monkeypatch this function to return a message
81
+ (or call the real one against a stubbed ``coord.network.check_machine``),
82
+ which takes priority over this default and is unaffected by it.
83
+ """
84
+ monkeypatch.setattr(
85
+ "coord.commands.dispatch._repo_capability_refusal", lambda *a, **k: None
86
+ )
87
+
88
+
71
89
  @pytest.fixture(autouse=True)
72
90
  def _no_worktree_writable_deny_scan(monkeypatch):
73
91
  """#1445 review: keep `check_worktree_writable`'s deny-rule scan from
@@ -0,0 +1,240 @@
1
+ """#2219: `coord assign` (`--dry-run` especially) must refuse a dispatch the
2
+ LIVE agent will reject, not just one `coordinator.yml` happens to still list.
3
+
4
+ Before this, every pre-flight surface — `coord config`, `coord status`, and
5
+ `coord assign ... --dry-run` — read config only. A repo added to
6
+ coordinator.yml after the target agent process started stayed invisible to
7
+ that agent (no partial config re-read short of a full restart), so all three
8
+ said the dispatch was fine while the live `/health` repo list, and the
9
+ agent's own `assign()`, disagreed. `--dry-run` green-lit a dispatch that
10
+ could not succeed, and the drive queue burned both retry attempts
11
+ discovering that by trial before landing terminally `blocked`.
12
+
13
+ `_repo_capability_refusal` (coord/commands/dispatch.py) is the fix: a
14
+ pre-flight cross-check against the SAME `/health` read `coord doctor`/`coord
15
+ status` already make, reused via `coord.network.check_machine`. The autouse
16
+ `_no_assign_repo_drift_probe` fixture (tests/conftest.py) stubs it to `None`
17
+ by default for every other test in the suite; these tests exercise it
18
+ directly.
19
+ """
20
+
21
+ from __future__ import annotations
22
+
23
+ from pathlib import Path
24
+ from unittest.mock import patch
25
+
26
+ import pytest
27
+ from click.testing import CliRunner
28
+
29
+ from coord.cli import main
30
+ from coord.commands.dispatch import _repo_capability_refusal
31
+ from coord.models import Machine
32
+ from coord.network import ONLINE, OFFLINE, MachineStatus
33
+
34
+ CONFIG_YAML = """\
35
+ repos:
36
+ - name: api
37
+ github: acme/api
38
+ default_branch: main
39
+ - name: stick-demo
40
+ github: acme/stick-demo
41
+ default_branch: main
42
+ machines:
43
+ - name: dellserver
44
+ host: dellserver.tailnet
45
+ repos: [api, stick-demo]
46
+ repo_paths:
47
+ api: /tmp/api
48
+ stick-demo: /tmp/stick-demo
49
+ """
50
+
51
+
52
+ @pytest.fixture
53
+ def config_file(tmp_path: Path) -> Path:
54
+ p = tmp_path / "coordinator.yml"
55
+ p.write_text(CONFIG_YAML)
56
+ return p
57
+
58
+
59
+ @pytest.fixture
60
+ def coord_dir(tmp_path: Path, coord_db):
61
+ d = tmp_path / "state"
62
+ d.mkdir(parents=True, exist_ok=True)
63
+ return d
64
+
65
+
66
+ def _machine(**kwargs) -> Machine:
67
+ base = dict(
68
+ name="dellserver", host="dellserver.tailnet",
69
+ repos=["api", "stick-demo"],
70
+ )
71
+ base.update(kwargs)
72
+ return Machine(**base)
73
+
74
+
75
+ class TestRepoCapabilityRefusalUnit:
76
+ """Pure unit coverage of the cross-check helper (network mocked)."""
77
+
78
+ def test_refuses_when_live_repos_exclude_the_target(self, monkeypatch) -> None:
79
+ monkeypatch.setattr(
80
+ "coord.network.check_machine",
81
+ lambda *a, **k: MachineStatus(
82
+ machine=_machine(), state=ONLINE, latency_ms=5.0,
83
+ health={
84
+ "machine": "dellserver",
85
+ "repos": ["api"], # stick-demo missing — the #2219 shape
86
+ },
87
+ ),
88
+ )
89
+ reason = _repo_capability_refusal(_machine(), "stick-demo")
90
+ assert reason is not None
91
+ assert "stick-demo" in reason
92
+ assert "does not handle repo" in reason
93
+ assert "['api']" in reason
94
+
95
+ def test_none_when_live_repos_include_the_target(self, monkeypatch) -> None:
96
+ monkeypatch.setattr(
97
+ "coord.network.check_machine",
98
+ lambda *a, **k: MachineStatus(
99
+ machine=_machine(), state=ONLINE, latency_ms=5.0,
100
+ health={"machine": "dellserver", "repos": ["api", "stick-demo"]},
101
+ ),
102
+ )
103
+ assert _repo_capability_refusal(_machine(), "stick-demo") is None
104
+
105
+ def test_none_when_agent_is_offline(self, monkeypatch) -> None:
106
+ """A transient/unreachable agent must not become a NEW dispatch
107
+ failure mode — that's still left to the POST itself."""
108
+ monkeypatch.setattr(
109
+ "coord.network.check_machine",
110
+ lambda *a, **k: MachineStatus(
111
+ machine=_machine(), state=OFFLINE, reason="connection refused",
112
+ ),
113
+ )
114
+ assert _repo_capability_refusal(_machine(), "stick-demo") is None
115
+
116
+ def test_none_when_agent_publishes_no_repos_key(self, monkeypatch) -> None:
117
+ """An agent old enough to predate the `repos` field in /health."""
118
+ monkeypatch.setattr(
119
+ "coord.network.check_machine",
120
+ lambda *a, **k: MachineStatus(
121
+ machine=_machine(), state=ONLINE, latency_ms=5.0,
122
+ health={"machine": "dellserver"},
123
+ ),
124
+ )
125
+ assert _repo_capability_refusal(_machine(), "stick-demo") is None
126
+
127
+ def test_degraded_repo_gets_its_own_reason_not_the_stale_config_story(
128
+ self, monkeypatch
129
+ ) -> None:
130
+ """A repo missing from /health's `repos` because it's DEGRADED
131
+ (#1527 — no repo_path entry, or the configured path doesn't exist)
132
+ is not the #2219 stale-config shape: `AgentServer.assign()` gates
133
+ on the UNFILTERED `self.repos`, which still contains a degraded
134
+ repo, so it would NOT reject with "does not handle repo" — it
135
+ would proceed and fail later with a distinct "repo path does not
136
+ exist" error. The refusal message must say so and must not tell
137
+ the operator to restart coord-agent, which cannot fix a missing
138
+ repo_paths entry."""
139
+ monkeypatch.setattr(
140
+ "coord.network.check_machine",
141
+ lambda *a, **k: MachineStatus(
142
+ machine=_machine(), state=ONLINE, latency_ms=5.0,
143
+ health={
144
+ "machine": "dellserver",
145
+ "repos": ["api"],
146
+ "degraded": {
147
+ "stick-demo": "no repo_path configured for this machine",
148
+ },
149
+ },
150
+ ),
151
+ )
152
+ reason = _repo_capability_refusal(_machine(), "stick-demo")
153
+ assert reason is not None
154
+ assert "no repo_path configured for this machine" in reason
155
+ assert "does not handle repo" not in reason
156
+ assert "hasn't re-read its config" not in reason
157
+ assert "Restart coord-agent" not in reason
158
+
159
+ def test_none_when_agent_is_config_free(self, monkeypatch) -> None:
160
+ """#1801: a config-free agent's repos come from the dispatch
161
+ payload, not its own config — a mismatch there is not a capability
162
+ gap."""
163
+ monkeypatch.setattr(
164
+ "coord.network.check_machine",
165
+ lambda *a, **k: MachineStatus(
166
+ machine=_machine(), state=ONLINE, latency_ms=5.0,
167
+ health={
168
+ "machine": "dellserver", "repos": ["api"],
169
+ "config_free": "no local coordinator.yml and no board service",
170
+ },
171
+ ),
172
+ )
173
+ assert _repo_capability_refusal(_machine(), "stick-demo") is None
174
+
175
+
176
+ class TestAssignRefusesOnLiveDrift:
177
+ """CLI-level: `coord assign` (including --dry-run) must surface the
178
+ live refusal before any network/claim work."""
179
+
180
+ def test_dry_run_refuses_on_live_repo_drift(
181
+ self, config_file: Path, coord_dir: Path
182
+ ) -> None:
183
+ with patch(
184
+ "coord.commands.dispatch._repo_capability_refusal",
185
+ return_value=(
186
+ "'dellserver' rejected the assignment: this agent does not "
187
+ "handle repo 'stick-demo' (supported: ['api'])"
188
+ ),
189
+ ), patch("coord.github_ops.get_issue") as mock_get_issue:
190
+ result = CliRunner().invoke(
191
+ main,
192
+ [
193
+ "assign", "dellserver", "stick-demo", "1",
194
+ "--config", str(config_file), "--dry-run",
195
+ ],
196
+ )
197
+ assert result.exit_code == 2
198
+ assert "does not handle repo" in result.output
199
+ assert "stick-demo" in result.output
200
+ # #2219's whole point: refuse BEFORE spending the (harmless but
201
+ # unnecessary) GitHub round-trip a dry run would otherwise still make.
202
+ mock_get_issue.assert_not_called()
203
+
204
+ def test_real_dispatch_also_refuses_on_live_repo_drift(
205
+ self, config_file: Path, coord_dir: Path
206
+ ) -> None:
207
+ with patch(
208
+ "coord.commands.dispatch._repo_capability_refusal",
209
+ return_value=(
210
+ "'dellserver' rejected the assignment: this agent does not "
211
+ "handle repo 'stick-demo' (supported: ['api'])"
212
+ ),
213
+ ), patch("coord.github_ops.get_issue") as mock_get_issue, \
214
+ patch("coord.dispatch.dispatch") as mock_dispatch:
215
+ result = CliRunner().invoke(
216
+ main,
217
+ [
218
+ "assign", "dellserver", "stick-demo", "1",
219
+ "--config", str(config_file),
220
+ ],
221
+ )
222
+ assert result.exit_code == 2
223
+ mock_get_issue.assert_not_called()
224
+ mock_dispatch.assert_not_called()
225
+
226
+ def test_dry_run_proceeds_when_no_live_drift(
227
+ self, config_file: Path, coord_dir: Path
228
+ ) -> None:
229
+ """Sanity check: the default (autouse-stubbed) fail-open path still
230
+ lets a genuinely healthy dispatch through --dry-run."""
231
+ with patch("coord.github_ops.get_issue", return_value={"title": "t"}):
232
+ result = CliRunner().invoke(
233
+ main,
234
+ [
235
+ "assign", "dellserver", "stick-demo", "1",
236
+ "--config", str(config_file), "--dry-run",
237
+ ],
238
+ )
239
+ assert result.exit_code == 0
240
+ assert "dry run" in result.output
@@ -211,3 +211,103 @@ class TestHealthVsConfigLines:
211
211
  )
212
212
  == []
213
213
  )
214
+
215
+ def test_partial_repo_drift_is_a_problem_even_when_health_is_nonempty(self) -> None:
216
+ """#2219: stick-demo's actual shape — /health still publishes
217
+ something (unlike the all-repos-missing #1485 case above), just not
218
+ the ONE repo added to coordinator.yml after this agent process
219
+ started. The `not published_repos` branch above never fires here,
220
+ so this needs its own check."""
221
+ lines = _health_vs_config_lines(
222
+ self._machine(repos=["vimcode", "quadraui", "stick-demo"]),
223
+ {
224
+ "capabilities": ["gtk", "rust", "python"],
225
+ "repos": ["vimcode", "quadraui"],
226
+ },
227
+ )
228
+ assert any(is_problem for is_problem, _ in lines)
229
+ assert any(
230
+ "CRIT repos" in text and "stick-demo" in text for _, text in lines
231
+ )
232
+
233
+ def test_partial_repo_drift_is_degraded_not_stale_when_in_degraded_dict(
234
+ self,
235
+ ) -> None:
236
+ """#2219 follow-up: a repo missing from `/health`'s `repos` because
237
+ it's DEGRADED (#1527 — no repo_path entry, or the configured path
238
+ doesn't exist) is not the "hasn't re-read config" story —
239
+ `AgentServer.assign()` gates on the UNFILTERED `self.repos`, which
240
+ still contains a degraded repo, so it would NOT reject with "does
241
+ not handle repo"; it would proceed and fail later with a distinct
242
+ "repo path does not exist" error. `coord doctor` must say so and
243
+ must not tell the operator to restart coord-agent, which cannot fix
244
+ a missing/misconfigured repo_paths entry."""
245
+ lines = _health_vs_config_lines(
246
+ self._machine(repos=["vimcode", "quadraui", "stick-demo"]),
247
+ {
248
+ "capabilities": ["gtk", "rust", "python"],
249
+ "repos": ["vimcode", "quadraui"],
250
+ "degraded": {
251
+ "stick-demo": "no repo_path configured for this machine",
252
+ },
253
+ },
254
+ )
255
+ assert any(is_problem for is_problem, _ in lines)
256
+ assert any(
257
+ "stick-demo" in text and "no repo_path configured" in text
258
+ for _, text in lines
259
+ )
260
+ joined = "\n".join(text for _, text in lines)
261
+ assert "hasn't re-read them" not in joined
262
+ assert "Restart coord-agent" not in joined
263
+
264
+ def test_partial_repo_drift_mixed_stale_and_degraded_repos(self) -> None:
265
+ """One repo genuinely stale (missing from /health, not degraded)
266
+ and one degraded (missing from /health, present in `degraded`) —
267
+ each must get its own accurate story, not be lumped together."""
268
+ lines = _health_vs_config_lines(
269
+ self._machine(repos=["vimcode", "quadraui", "stick-demo", "tui"]),
270
+ {
271
+ "capabilities": ["gtk", "rust", "python"],
272
+ "repos": ["vimcode", "quadraui"],
273
+ "degraded": {
274
+ "tui": "repo_path /home/x/src/tui does not exist",
275
+ },
276
+ },
277
+ )
278
+ joined = "\n".join(text for _, text in lines)
279
+ assert "stick-demo" in joined and "hasn't re-read them" in joined
280
+ assert "tui" in joined and "repo_path /home/x/src/tui does not exist" in joined
281
+ # The stale-config CRIT's *drifted-repos* list — the part actually
282
+ # blamed on staleness — must name only the truly-stale repo, not
283
+ # the degraded one (which `declared_repos` also mentions, harmlessly,
284
+ # in the same line's leading "coordinator.yml declares [...]" clause).
285
+ stale_lines = [t for _, t in lines if "hasn't re-read them" in t]
286
+ assert len(stale_lines) == 1
287
+ assert "['stick-demo'] were added to config" in stale_lines[0]
288
+
289
+ def test_partial_repo_drift_is_silent_when_agent_is_config_free(self) -> None:
290
+ """A config-free agent's repos come from the dispatch payload, not
291
+ its own coordinator.yml (#1801) — a mismatch against the
292
+ coordinator's OWN machine entry for it is not a capability gap."""
293
+ lines = _health_vs_config_lines(
294
+ self._machine(repos=["vimcode", "quadraui", "stick-demo"]),
295
+ {
296
+ "capabilities": [],
297
+ "repos": ["vimcode", "quadraui"],
298
+ "config_free": "no local coordinator.yml and no board service",
299
+ },
300
+ )
301
+ assert not any("stick-demo" in text for _, text in lines)
302
+
303
+ def test_no_partial_drift_line_when_published_repos_match_declared(self) -> None:
304
+ assert (
305
+ _health_vs_config_lines(
306
+ self._machine(repos=["vimcode", "quadraui"]),
307
+ {
308
+ "capabilities": ["gtk", "rust", "python"],
309
+ "repos": ["vimcode", "quadraui", "extra-repo-agent-also-serves"],
310
+ },
311
+ )
312
+ == []
313
+ )