code-coordinator 0.5.92__tar.gz → 0.5.93__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 (839) hide show
  1. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/code_coordinator.egg-info/SOURCES.txt +1 -0
  4. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/code_coordinator.egg-info/scm_file_list.json +1 -0
  5. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/commands/release.py +32 -6
  7. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/release_cordon.py +110 -7
  8. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/release_propagate.py +8 -0
  9. code_coordinator-0.5.93/tests/test_release_cordon_daemon_leads_2176.py +313 -0
  10. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_release_cordon_deadlock_2240.py +10 -2
  11. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_release_verify.py +115 -0
  12. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/.claude/commands/board.md +0 -0
  13. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/.claude/commands/complete-session.md +0 -0
  14. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/.claude/commands/coordinator.md +0 -0
  15. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/.githooks/_lib.sh +0 -0
  16. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/.githooks/post-checkout +0 -0
  17. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/.githooks/post-commit +0 -0
  18. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/.githooks/post-merge +0 -0
  19. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  20. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/.github/coord-ci-acceptance.yml +0 -0
  21. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/.github/workflows/auto-release.yml +0 -0
  22. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/.github/workflows/cargo-test.yml +0 -0
  23. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/.github/workflows/publish.yml +0 -0
  24. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/.github/workflows/release-tui.yml +0 -0
  25. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/.github/workflows/test.yml +0 -0
  26. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/.gitignore +0 -0
  27. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/CLAUDE.md +0 -0
  28. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/GOAL.md +0 -0
  29. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/LICENSE +0 -0
  30. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/MANIFEST.in +0 -0
  31. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/README.md +0 -0
  32. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/code_coordinator.egg-info/dependency_links.txt +0 -0
  33. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/code_coordinator.egg-info/entry_points.txt +0 -0
  34. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/code_coordinator.egg-info/requires.txt +0 -0
  35. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/code_coordinator.egg-info/top_level.txt +0 -0
  36. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/__init__.py +0 -0
  37. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/_board_mapping.py +0 -0
  38. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/acceptance.py +0 -0
  39. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/acceptance_drivers.py +0 -0
  40. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/agent.py +0 -0
  41. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/agent_app.py +0 -0
  42. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/agent_update.py +0 -0
  43. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/agents/opencode/.gitignore +0 -0
  44. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/agents/opencode/agents/work.md +0 -0
  45. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/agents/opencode/routing.jsonc +0 -0
  46. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/audit.py +0 -0
  47. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/auto_loop.py +0 -0
  48. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/block_log.py +0 -0
  49. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/board_bool_guard.py +0 -0
  50. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/board_service.py +0 -0
  51. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/board_wire.py +0 -0
  52. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/brain.py +0 -0
  53. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/branch_model.py +0 -0
  54. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/bug_intake.py +0 -0
  55. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/cargo_cache.py +0 -0
  56. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/ci_github.py +0 -0
  57. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/ci_store.py +0 -0
  58. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/claim.py +0 -0
  59. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/cli.py +0 -0
  60. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/client.py +0 -0
  61. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/commands/__init__.py +0 -0
  62. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/commands/_common.py +0 -0
  63. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/commands/acceptance.py +0 -0
  64. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/commands/agent_ops.py +0 -0
  65. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/commands/audit.py +0 -0
  66. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/commands/chat.py +0 -0
  67. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/commands/dispatch.py +0 -0
  68. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/commands/dispatch_workers.py +0 -0
  69. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/commands/drive.py +0 -0
  70. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/commands/drive_queue.py +0 -0
  71. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/commands/gate_a.py +0 -0
  72. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/commands/gates.py +0 -0
  73. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/commands/issues.py +0 -0
  74. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/commands/lifecycle.py +0 -0
  75. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/commands/merge.py +0 -0
  76. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/commands/milestone.py +0 -0
  77. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/commands/plan_followup.py +0 -0
  78. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/commands/plans.py +0 -0
  79. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/commands/portal.py +0 -0
  80. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/commands/repo.py +0 -0
  81. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/commands/report.py +0 -0
  82. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/commands/review.py +0 -0
  83. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/commands/scorecard.py +0 -0
  84. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/commands/sessions.py +0 -0
  85. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/commands/setup.py +0 -0
  86. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/commands/status.py +0 -0
  87. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/commands/terminal.py +0 -0
  88. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/commands/test_gate.py +0 -0
  89. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/commands/tui.py +0 -0
  90. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/comments.py +0 -0
  91. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/config.py +0 -0
  92. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/conflict_fix.py +0 -0
  93. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dao.py +0 -0
  94. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/__init__.py +0 -0
  95. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/fixture.py +0 -0
  96. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/index.html +0 -0
  97. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/server.py +0 -0
  98. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/terminal.py +0 -0
  99. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/.gitignore +0 -0
  100. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/components.json +0 -0
  101. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/dist/assets/Gallery-Cq84itDE.js +0 -0
  102. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  103. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/dist/assets/Terminal-DOXLcMue.js +0 -0
  104. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/dist/assets/index-DHn-RIJ8.js +0 -0
  105. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  106. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  107. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  108. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  109. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  110. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/dist/index.html +0 -0
  111. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  112. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/dist/sw.js +0 -0
  113. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  114. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  115. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  116. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  117. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  118. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  119. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  120. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  121. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  122. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  123. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/eslint.config.js +0 -0
  124. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/index.html +0 -0
  125. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  126. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/package-lock.json +0 -0
  127. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/package.json +0 -0
  128. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  129. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/playwright.config.ts +0 -0
  130. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/postcss.config.js +0 -0
  131. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  132. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  133. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  134. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/App.tsx +0 -0
  135. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/api/client.ts +0 -0
  136. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  137. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  138. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  139. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  140. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  141. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  142. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  143. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  144. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  145. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  146. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  147. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  148. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  149. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  150. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  151. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  152. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  153. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  154. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  155. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  156. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  157. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  158. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  159. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  160. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  161. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  162. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  163. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  164. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  165. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  166. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  167. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  168. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  169. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  170. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  171. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/index.css +0 -0
  172. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  173. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  174. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/main.tsx +0 -0
  175. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  176. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  177. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  178. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  179. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  180. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  181. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  182. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  183. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  184. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  185. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  186. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  187. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  188. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  189. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  190. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  191. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  192. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  193. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  194. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  195. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  196. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  197. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  198. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/tailwind.config.js +0 -0
  199. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/tsconfig.json +0 -0
  200. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  201. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dashboard/webapp/vite.config.ts +0 -0
  202. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/db.py +0 -0
  203. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dead_end.py +0 -0
  204. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/deploy/README.md +0 -0
  205. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/deploy/coord-agent.service +0 -0
  206. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/deploy/coord-db-backup.service +0 -0
  207. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/deploy/coord-db-backup.sh +0 -0
  208. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/deploy/coord-db-backup.timer +0 -0
  209. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/deploy/coord-drive-queue.service +0 -0
  210. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/deploy/coord-drive-queue.timer +0 -0
  211. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/deploy/coord-notify.service +0 -0
  212. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/deploy/coord-notify.timer +0 -0
  213. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/deploy/coord-release-propagate.service +0 -0
  214. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/deploy/coord-release-propagate.timer +0 -0
  215. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/deploy/coord-release-window.service +0 -0
  216. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/deploy/coord-release-window.timer +0 -0
  217. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/deploy/coord-serve.service +0 -0
  218. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/deploy/coord-web-dist-build.service +0 -0
  219. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/deploy/coord-web-dist-build.timer +0 -0
  220. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/deploy/coord-web.service +0 -0
  221. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/deploy_manifest.py +0 -0
  222. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/deploy_units.py +0 -0
  223. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/deps.py +0 -0
  224. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/diagnose.py +0 -0
  225. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dispatch.py +0 -0
  226. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/dist_name.py +0 -0
  227. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/drive.py +0 -0
  228. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/drive_queue.py +0 -0
  229. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/drive_state.py +0 -0
  230. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/events.py +0 -0
  231. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/failure_class.py +0 -0
  232. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/filelock.py +0 -0
  233. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/fleet_config_health.py +0 -0
  234. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/freshness.py +0 -0
  235. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/gate_a.py +0 -0
  236. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/gate_b.py +0 -0
  237. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/gate_snapshot.py +0 -0
  238. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/gates.py +0 -0
  239. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/github_ops.py +0 -0
  240. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/goal.py +0 -0
  241. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/graph_health.py +0 -0
  242. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/health/__init__.py +0 -0
  243. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/health/aggregate.py +0 -0
  244. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/health/checks/__init__.py +0 -0
  245. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/health/checks/agent_install.py +0 -0
  246. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/health/checks/cargo_targets.py +0 -0
  247. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/health/checks/claude_binary.py +0 -0
  248. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/health/checks/deploy_lane_facts.py +0 -0
  249. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/health/checks/disk.py +0 -0
  250. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/health/checks/fleet_board.py +0 -0
  251. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  252. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/health/checks/fleet_phantom.py +0 -0
  253. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/health/checks/fleet_unit_drift.py +0 -0
  254. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/health/checks/graph.py +0 -0
  255. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/health/checks/graphify_cli.py +0 -0
  256. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/health/checks/index_lock.py +0 -0
  257. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/health/checks/plan_usage.py +0 -0
  258. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/health/checks/repo_state.py +0 -0
  259. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/health/checks/spawned_coord.py +0 -0
  260. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/health/checks/timer_active.py +0 -0
  261. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/health/checks/toolchain.py +0 -0
  262. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/health/checks/unit_drift.py +0 -0
  263. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/health/checks/unit_enablement.py +0 -0
  264. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/health/checks/worktrees.py +0 -0
  265. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/health/cli.py +0 -0
  266. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/health/context.py +0 -0
  267. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/health/fleet_snapshot.py +0 -0
  268. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/health/models.py +0 -0
  269. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/health/pypi.py +0 -0
  270. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/health/registry.py +0 -0
  271. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/health/render.py +0 -0
  272. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/health/units.py +0 -0
  273. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/hooks.py +0 -0
  274. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/housekeeping.py +0 -0
  275. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/interactive.py +0 -0
  276. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/issue_store.py +0 -0
  277. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/liveness_auditor.py +0 -0
  278. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/machine_pause.py +0 -0
  279. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/merge_queue.py +0 -0
  280. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/milestone_chat.py +0 -0
  281. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/milestone_dispatch.py +0 -0
  282. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/milestone_gate.py +0 -0
  283. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/milestone_order.py +0 -0
  284. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/mock_author.py +0 -0
  285. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/models.py +0 -0
  286. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/network.py +0 -0
  287. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/new_issue_chat.py +0 -0
  288. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/notifier/__init__.py +0 -0
  289. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/notifier/baseline.py +0 -0
  290. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/notifier/cli.py +0 -0
  291. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/notifier/collect.py +0 -0
  292. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/notifier/digest.py +0 -0
  293. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/notifier/models.py +0 -0
  294. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/notifier/predicate.py +0 -0
  295. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/notifier/service.py +0 -0
  296. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/notifier/store.py +0 -0
  297. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/notifier/transport.py +0 -0
  298. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/notify.py +0 -0
  299. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/openapi.py +0 -0
  300. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/overlap_fence.py +0 -0
  301. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/overlap_predict.py +0 -0
  302. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/parentage.py +0 -0
  303. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/parentage_github.py +0 -0
  304. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/pipeline.py +0 -0
  305. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/plan_parser.py +0 -0
  306. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/plans.py +0 -0
  307. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/platform_paths.py +0 -0
  308. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/portal_bridge.py +0 -0
  309. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/portal_store.py +0 -0
  310. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/portal_sync.py +0 -0
  311. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/pr_body_lint.py +0 -0
  312. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/prereqs.py +0 -0
  313. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/progress.py +0 -0
  314. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/providers/__init__.py +0 -0
  315. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/providers/base.py +0 -0
  316. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/providers/claude.py +0 -0
  317. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/providers/claude_pty.py +0 -0
  318. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/providers/opencode.py +0 -0
  319. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/reconcile.py +0 -0
  320. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/refine_chat.py +0 -0
  321. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/release_verify.py +0 -0
  322. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/release_window.py +0 -0
  323. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/repo_edit.py +0 -0
  324. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/repo_onboard.py +0 -0
  325. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/reports.py +0 -0
  326. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/revalidate.py +0 -0
  327. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/review.py +0 -0
  328. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/scorecard.py +0 -0
  329. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/serve_app.py +0 -0
  330. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/skills/update-issue/SKILL.md +0 -0
  331. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/smoke.py +0 -0
  332. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/spend_ceiling.py +0 -0
  333. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/split_work.py +0 -0
  334. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/stage_projection.py +0 -0
  335. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/state.py +0 -0
  336. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/test_author.py +0 -0
  337. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/test_chat.py +0 -0
  338. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/test_orchestrator.py +0 -0
  339. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/test_report.py +0 -0
  340. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/tui_release.py +0 -0
  341. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/usage.py +0 -0
  342. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/usage_limits.py +0 -0
  343. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/usage_rollup.py +0 -0
  344. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coord/worker_events.py +0 -0
  345. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/coordinator.example.yml +0 -0
  346. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/deploy/coord-agent.service +0 -0
  347. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/deploy/coord-db-backup.service +0 -0
  348. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/deploy/coord-db-backup.sh +0 -0
  349. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/deploy/coord-db-backup.timer +0 -0
  350. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/deploy/coord-drive-queue.service +0 -0
  351. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/deploy/coord-drive-queue.timer +0 -0
  352. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/deploy/coord-notify.service +0 -0
  353. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/deploy/coord-notify.timer +0 -0
  354. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/deploy/coord-release-propagate.service +0 -0
  355. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/deploy/coord-release-propagate.timer +0 -0
  356. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/deploy/coord-release-window.service +0 -0
  357. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/deploy/coord-release-window.timer +0 -0
  358. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/deploy/coord-serve.service +0 -0
  359. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/deploy/coord-web-dist-build.service +0 -0
  360. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/deploy/coord-web-dist-build.sh +0 -0
  361. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/deploy/coord-web-dist-build.timer +0 -0
  362. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/deploy/coord-web-rollback.sh +0 -0
  363. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/deploy/coord-web.service +0 -0
  364. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/deploy/node-shim.sh +0 -0
  365. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/docs/AGENT_OPERATIONS.md +0 -0
  366. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/docs/ARCHITECTURE.md +0 -0
  367. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/docs/ARCH_SECURITY_GATES.md +0 -0
  368. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/docs/COCKPIT.md +0 -0
  369. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/docs/CONTROL_CENTER.md +0 -0
  370. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/docs/COST_DISCIPLINE.md +0 -0
  371. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/docs/CROSS_PLATFORM.md +0 -0
  372. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/docs/CUSTOMER_PORTAL.md +0 -0
  373. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/docs/DRIVE_QUEUE.md +0 -0
  374. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/docs/EPHEMERAL_WORKERS.md +0 -0
  375. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/docs/FORGE_MIGRATION.md +0 -0
  376. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/docs/GRAPHIFY_SETUP.md +0 -0
  377. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/docs/ISSUE_GUIDANCE.md +0 -0
  378. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/docs/MAC_MINI.md +0 -0
  379. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  380. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/docs/NOTIFIER.md +0 -0
  381. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/docs/OPENCODE_VERIFICATION.md +0 -0
  382. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/docs/OPERATING_GOTCHAS.md +0 -0
  383. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/docs/ORACLE_LOOP.md +0 -0
  384. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/docs/PHONE_WEBAPP.md +0 -0
  385. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/docs/PIPELINE_V2.md +0 -0
  386. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/docs/PLATFORM_EVOLUTION.md +0 -0
  387. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/docs/SECOND_BACKEND.md +0 -0
  388. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/docs/STORE_SERVICE.md +0 -0
  389. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  390. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/docs/WEB_CONTROL_CENTER.md +0 -0
  391. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/docs/mocks/web/README.md +0 -0
  392. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/docs/mocks/web/_tokens.css +0 -0
  393. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/docs/mocks/web/issue-detail.html +0 -0
  394. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/docs/mocks/web/pipeline-narrow.html +0 -0
  395. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/docs/mocks/web/pipeline-wide.html +0 -0
  396. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/graphify-out/.gitignore +0 -0
  397. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/install-agent.sh +0 -0
  398. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/pyproject.toml +0 -0
  399. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/scripts/audit_review_verdict_overrides.py +0 -0
  400. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  401. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/scripts/azure-workers/build-worker-image.sh +0 -0
  402. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/scripts/azure-workers/coordinator-machine.py +0 -0
  403. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/scripts/azure-workers/epic-down.sh +0 -0
  404. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/scripts/azure-workers/epic-up.sh +0 -0
  405. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/scripts/azure-workers/preflight.sh +0 -0
  406. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/scripts/azure-workers/provision-worker.sh +0 -0
  407. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  408. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  409. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/scripts/azure-workers/verify-github-token.sh +0 -0
  410. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/scripts/codegen.py +0 -0
  411. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/scripts/coord-test-runner.sh +0 -0
  412. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/scripts/drive-batch.sh +0 -0
  413. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/scripts/gen_board_fixture.py +0 -0
  414. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/scripts/next_release_tag.py +0 -0
  415. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/scripts/run_tests_in_populated_home.sh +0 -0
  416. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/scripts/run_tests_without_gh.sh +0 -0
  417. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/scripts/smoke_437_interactive.py +0 -0
  418. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/scripts/verify_878_review_capture.py +0 -0
  419. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/scripts/verify_release_published.py +0 -0
  420. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/scripts/verify_release_wheel.py +0 -0
  421. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/setup.cfg +0 -0
  422. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/SMOKE_SET.md +0 -0
  423. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/__init__.py +0 -0
  424. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  425. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/acceptance/ms-33/contract.md +0 -0
  426. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/acceptance/ms-33/manifest.yml +0 -0
  427. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  428. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  429. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  430. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  431. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/acceptance/ms-37/conftest.py +0 -0
  432. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/acceptance/ms-37/contract.md +0 -0
  433. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/acceptance/ms-37/manifest.yml +0 -0
  434. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  435. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  436. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/acceptance/ms-38/contract.md +0 -0
  437. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/acceptance/ms-38/manifest.yml +0 -0
  438. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  439. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  440. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  441. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  442. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  443. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  444. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  445. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  446. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  447. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  448. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/acceptance/ms-51/contract.md +0 -0
  449. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  450. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  451. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/acceptance/ms-51/manifest.yml +0 -0
  452. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  453. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/acceptance/ms-51/tsconfig.json +0 -0
  454. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  455. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/conftest.py +0 -0
  456. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/fixtures/board-pipeline-basic.json +0 -0
  457. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  458. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  459. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  460. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/fixtures/playwright/all_pass.json +0 -0
  461. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  462. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/fixtures/playwright/mixed_fail.json +0 -0
  463. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  464. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  465. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/fixtures/playwright/skip.json +0 -0
  466. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/fixtures/playwright/truncated.json +0 -0
  467. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  468. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  469. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  470. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  471. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  472. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  473. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  474. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  475. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_acceptance.py +0 -0
  476. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_acceptance_drivers.py +0 -0
  477. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_agent.py +0 -0
  478. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_agent_api_error.py +0 -0
  479. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_agent_app.py +0 -0
  480. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_agent_branch_base.py +0 -0
  481. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_agent_branch_capture.py +0 -0
  482. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_agent_config_free_1712.py +0 -0
  483. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_agent_deploy_units_endpoint.py +0 -0
  484. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_agent_dirty_worktree.py +0 -0
  485. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_agent_graph_self_heal.py +0 -0
  486. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_agent_health_h3.py +0 -0
  487. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_agent_idle_restart.py +0 -0
  488. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_agent_push_failure.py +0 -0
  489. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_agent_reap.py +0 -0
  490. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_agent_repos_and_pull.py +0 -0
  491. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_agent_restart_services_endpoint.py +0 -0
  492. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_agent_startup_diagnostics.py +0 -0
  493. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_agent_update.py +0 -0
  494. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_agent_update_bluegreen.py +0 -0
  495. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_agent_usage_limit.py +0 -0
  496. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_agent_zero_commit.py +0 -0
  497. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_ambient_home_isolation.py +0 -0
  498. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_approve_reject_plan.py +0 -0
  499. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_approve_usage_gate.py +0 -0
  500. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_assignment_already_recorded_daemon.py +0 -0
  501. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_audit_log.py +0 -0
  502. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_audit_outcome.py +0 -0
  503. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_audit_query.py +0 -0
  504. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_auto_loop.py +0 -0
  505. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_auto_release_publish_2035.py +0 -0
  506. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_base_checkout_restore.py +0 -0
  507. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_block_log.py +0 -0
  508. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_board_cap_762.py +0 -0
  509. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_board_fixture.py +0 -0
  510. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_board_read_path.py +0 -0
  511. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_board_service.py +0 -0
  512. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_board_state.py +0 -0
  513. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_board_wire.py +0 -0
  514. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_brain.py +0 -0
  515. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_branch_model.py +0 -0
  516. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_bug_intake.py +0 -0
  517. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_build_worker_image_env_update.py +0 -0
  518. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cargo_cache.py +0 -0
  519. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_ci_acceptance_gate_1950.py +0 -0
  520. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_ci_parity_2091.py +0 -0
  521. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_ci_store.py +0 -0
  522. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_claim.py +0 -0
  523. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_acceptance.py +0 -0
  524. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_assign.py +0 -0
  525. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  526. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_assign_interactive_remote.py +0 -0
  527. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_assign_provider.py +0 -0
  528. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  529. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_audit.py +0 -0
  530. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_chat_continue.py +0 -0
  531. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_diagnose_config_provenance.py +0 -0
  532. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_diagnose_graph.py +0 -0
  533. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_doctor.py +0 -0
  534. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_doctor_config_free_1801.py +0 -0
  535. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  536. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_drive.py +0 -0
  537. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_drive_queue.py +0 -0
  538. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_escalate.py +0 -0
  539. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_fix_headless_review.py +0 -0
  540. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_gate_a.py +0 -0
  541. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_install_drift.py +0 -0
  542. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_install_skills.py +0 -0
  543. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_issue_create_label.py +0 -0
  544. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_issue_reopen.py +0 -0
  545. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_merge.py +0 -0
  546. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_milestone_assign.py +0 -0
  547. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_milestone_capture.py +0 -0
  548. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_milestone_chat_add_child.py +0 -0
  549. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_milestone_dispatch.py +0 -0
  550. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_milestone_gate_b.py +0 -0
  551. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_milestone_gate_c.py +0 -0
  552. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_milestone_order.py +0 -0
  553. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  554. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_milestone_ship.py +0 -0
  555. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_network.py +0 -0
  556. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_new_issue_chat.py +0 -0
  557. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_plans.py +0 -0
  558. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_portal.py +0 -0
  559. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_pull_artifact.py +0 -0
  560. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_queue.py +0 -0
  561. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_reattach_sessions.py +0 -0
  562. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_refine_board.py +0 -0
  563. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_release_preflight.py +0 -0
  564. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_release_propagate.py +0 -0
  565. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_release_window.py +0 -0
  566. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_repo_2220.py +0 -0
  567. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_scorecard.py +0 -0
  568. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_set_review_findings.py +0 -0
  569. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_status_advisory_terminal.py +0 -0
  570. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_status_merge_queue.py +0 -0
  571. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_status_provider.py +0 -0
  572. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_status_review_finalizing.py +0 -0
  573. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_status_test_failed_tag.py +0 -0
  574. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_status_usage_limit.py +0 -0
  575. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_sync_comments_873.py +0 -0
  576. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_test_plan.py +0 -0
  577. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_track.py +0 -0
  578. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_tui_update.py +0 -0
  579. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cli_wait.py +0 -0
  580. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_client_base_install.py +0 -0
  581. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_comments.py +0 -0
  582. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_completion_summary.py +0 -0
  583. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_config.py +0 -0
  584. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_config_acceptance.py +0 -0
  585. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_config_audit.py +0 -0
  586. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_config_pricing.py +0 -0
  587. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_config_usage_gate.py +0 -0
  588. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_conflict_fix.py +0 -0
  589. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_conflict_fix_semantic.py +0 -0
  590. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_coord_test.py +0 -0
  591. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_coord_test_runner_baseline.py +0 -0
  592. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_coord_test_runner_routing.py +0 -0
  593. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_coord_test_runner_toolchain.py +0 -0
  594. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_coord_web_sse_restart_live.py +0 -0
  595. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_coordinator_machine.py +0 -0
  596. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_cross_platform_imports.py +0 -0
  597. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_dashboard.py +0 -0
  598. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_dashboard_fixture.py +0 -0
  599. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_dashboard_terminal.py +0 -0
  600. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_dashboard_terminal_live.py +0 -0
  601. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_db.py +0 -0
  602. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_dead_end.py +0 -0
  603. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_deploy_coord_db_backup.py +0 -0
  604. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_deploy_coord_web_dist.py +0 -0
  605. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_deploy_coord_web_rollback.py +0 -0
  606. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_deploy_drive_queue_unit.py +0 -0
  607. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_deploy_manifest.py +0 -0
  608. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_deploy_units_lane.py +0 -0
  609. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_deploy_web_unit.py +0 -0
  610. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_deps.py +0 -0
  611. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_diagnose.py +0 -0
  612. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_dispatch.py +0 -0
  613. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_dispatch_target_validation.py +0 -0
  614. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_dist_name.py +0 -0
  615. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_done_housekeeping.py +0 -0
  616. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_drive.py +0 -0
  617. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_drive_queue.py +0 -0
  618. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_drive_state.py +0 -0
  619. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_drive_tmux.py +0 -0
  620. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_epic_up_capability_detection.py +0 -0
  621. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  622. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_epic_up_image_provenance.py +0 -0
  623. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_errors.py +0 -0
  624. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_events.py +0 -0
  625. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_failure_class.py +0 -0
  626. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_filelock.py +0 -0
  627. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  628. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_fix_of_force_override.py +0 -0
  629. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_fleet_config_health.py +0 -0
  630. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_fleet_health_probes.py +0 -0
  631. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_fleet_health_snapshot.py +0 -0
  632. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_freshness.py +0 -0
  633. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_gate_a.py +0 -0
  634. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_gate_b.py +0 -0
  635. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_gate_snapshot_staleness.py +0 -0
  636. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_gates.py +0 -0
  637. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  638. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_generated_types_fixture.py +0 -0
  639. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_github_ops.py +0 -0
  640. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_goal.py +0 -0
  641. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_graph_health.py +0 -0
  642. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_graph_selfheal_absent_2237.py +0 -0
  643. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_handoff.py +0 -0
  644. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_health_checks.py +0 -0
  645. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_health_cli.py +0 -0
  646. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_health_cli_graph.py +0 -0
  647. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_health_config.py +0 -0
  648. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_health_context.py +0 -0
  649. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_health_deploy_lane_facts.py +0 -0
  650. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_health_incident_regression.py +0 -0
  651. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_health_pypi.py +0 -0
  652. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_health_registry.py +0 -0
  653. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_health_timer_active.py +0 -0
  654. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_health_toolchain.py +0 -0
  655. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_health_unit_drift.py +0 -0
  656. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_health_unit_enablement.py +0 -0
  657. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_hooks.py +0 -0
  658. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_human_attended_437.py +0 -0
  659. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_init.py +0 -0
  660. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_integration.py +0 -0
  661. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_interactive_briefing_echo.py +0 -0
  662. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_interactive_prefill_state.py +0 -0
  663. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_interactive_session_relaunch.py +0 -0
  664. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_interactive_test_verdict_backstop.py +0 -0
  665. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_interactive_token_attribution.py +0 -0
  666. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_interactive_worktree.py +0 -0
  667. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_issue_store_seam.py +0 -0
  668. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_liveness_auditor.py +0 -0
  669. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_liveness_notify.py +0 -0
  670. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_machine_pause.py +0 -0
  671. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_merge_queue.py +0 -0
  672. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_merge_verify.py +0 -0
  673. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_milestone_chat.py +0 -0
  674. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_milestone_dispatch.py +0 -0
  675. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_milestone_gate.py +0 -0
  676. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_milestone_order.py +0 -0
  677. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_milestone_seam.py +0 -0
  678. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_mock_author.py +0 -0
  679. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_model_tiering.py +0 -0
  680. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_models.py +0 -0
  681. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_models_config_labels.py +0 -0
  682. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_needs_attention.py +0 -0
  683. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_network.py +0 -0
  684. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_new_issue_chat.py +0 -0
  685. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_next_release_tag.py +0 -0
  686. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_no_direct_gh_calls.py +0 -0
  687. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_node_shim.py +0 -0
  688. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_notifier_baseline.py +0 -0
  689. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_notifier_cli.py +0 -0
  690. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_notifier_collect.py +0 -0
  691. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_notifier_config.py +0 -0
  692. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_notifier_drive_seam.py +0 -0
  693. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_notifier_isolation.py +0 -0
  694. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_notifier_predicate.py +0 -0
  695. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_notifier_quiet_hours.py +0 -0
  696. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_notifier_service.py +0 -0
  697. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_notify.py +0 -0
  698. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_notify_drain.py +0 -0
  699. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_openapi.py +0 -0
  700. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_operational_defaults.py +0 -0
  701. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_overlap_fence.py +0 -0
  702. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_overlap_predict.py +0 -0
  703. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_packaged_deploy_units.py +0 -0
  704. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_parentage.py +0 -0
  705. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_paste_landed.py +0 -0
  706. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_pipeline.py +0 -0
  707. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_plan_followup_approve_plan_command.py +0 -0
  708. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_plan_followup_pr_command.py +0 -0
  709. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_plan_followup_review_command.py +0 -0
  710. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_plan_only.py +0 -0
  711. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_plan_parser.py +0 -0
  712. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_platform_paths.py +0 -0
  713. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_portal_bridge.py +0 -0
  714. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_portal_config.py +0 -0
  715. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_portal_sync.py +0 -0
  716. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_pr_body_lint.py +0 -0
  717. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_prereqs.py +0 -0
  718. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_production_db_guard.py +0 -0
  719. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_progress.py +0 -0
  720. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_provider_seam.py +0 -0
  721. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_providers.py +0 -0
  722. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_providers_config_labels.py +0 -0
  723. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_providers_pty.py +0 -0
  724. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_quiet_hours.py +0 -0
  725. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_quiet_hours_store_2146.py +0 -0
  726. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_reap_merged_sessions.py +0 -0
  727. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_reap_stale_interactive_tick.py +0 -0
  728. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_reconcile_branch.py +0 -0
  729. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_reconcile_completions.py +0 -0
  730. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_reconcile_merges.py +0 -0
  731. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_reconcile_usage_limit_done.py +0 -0
  732. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_refine_chat.py +0 -0
  733. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_release_cordon_2101.py +0 -0
  734. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_release_propagate.py +0 -0
  735. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_release_unified_1242.py +0 -0
  736. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_release_window.py +0 -0
  737. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_remote_auto_prune.py +0 -0
  738. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_remote_interactive_reaper.py +0 -0
  739. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_repo_edit_2220.py +0 -0
  740. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_repo_graph_fleet_2237.py +0 -0
  741. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_repo_onboard_2220.py +0 -0
  742. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_report_result_push.py +0 -0
  743. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_reports.py +0 -0
  744. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_retry.py +0 -0
  745. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_retry_advisory_1606.py +0 -0
  746. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_retry_type_1636.py +0 -0
  747. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_revalidate.py +0 -0
  748. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_review.py +0 -0
  749. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_review_end_review_without_verdict.py +0 -0
  750. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_review_parse_failure_diagnostic.py +0 -0
  751. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_review_reaffirm.py +0 -0
  752. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_review_state.py +0 -0
  753. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_review_verdict_backstop.py +0 -0
  754. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_review_verdict_override_audit.py +0 -0
  755. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_review_verdict_relay.py +0 -0
  756. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_review_zero_commits.py +0 -0
  757. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_scoped_review_wiring.py +0 -0
  758. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_scorecard.py +0 -0
  759. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_serve.py +0 -0
  760. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_serve_app_board_trim.py +0 -0
  761. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_session.py +0 -0
  762. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_slice_issue_attribution.py +0 -0
  763. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_smoke.py +0 -0
  764. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_smoke_live_checkout_restore.py +0 -0
  765. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_smoke_workflow.py +0 -0
  766. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_spend_ceiling.py +0 -0
  767. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_spend_ceiling_coordinator.py +0 -0
  768. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_split.py +0 -0
  769. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_split_work.py +0 -0
  770. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_stage_projection.py +0 -0
  771. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_stalled_pipeline.py +0 -0
  772. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_state.py +0 -0
  773. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_state_review_findings_daemon.py +0 -0
  774. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_status_fleet_footer.py +0 -0
  775. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_stop_1567.py +0 -0
  776. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_stuck.py +0 -0
  777. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_terminal_command.py +0 -0
  778. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_test_author.py +0 -0
  779. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_test_chat.py +0 -0
  780. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_test_orchestrator.py +0 -0
  781. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_test_report.py +0 -0
  782. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_test_verdict_parsing.py +0 -0
  783. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_test_verdict_transcript_floor.py +0 -0
  784. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_thin_client_board_audit.py +0 -0
  785. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_thin_client_config_load_1080.py +0 -0
  786. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_thin_client_daemon_routing_906.py +0 -0
  787. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_tmux_host.py +0 -0
  788. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_tmux_session.py +0 -0
  789. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_transcript_floor.py +0 -0
  790. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_usage.py +0 -0
  791. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_usage_limits.py +0 -0
  792. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_usage_rollup.py +0 -0
  793. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_venv_live_install_2121.py +0 -0
  794. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_version_single_source.py +0 -0
  795. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_watch.py +0 -0
  796. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_worker_events.py +0 -0
  797. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_worker_image_pin_sync.py +0 -0
  798. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_worker_safety.py +0 -0
  799. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_worker_test_scoping.py +0 -0
  800. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_worktree.py +0 -0
  801. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  802. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/Cargo.lock +0 -0
  803. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/Cargo.toml +0 -0
  804. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/cargo-config-local-quadraui.toml.example +0 -0
  805. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/app/audit.rs +0 -0
  806. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/app/chat.rs +0 -0
  807. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/app/data.rs +0 -0
  808. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/app/dialogs.rs +0 -0
  809. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/app/drive.rs +0 -0
  810. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/app/drive_queue.rs +0 -0
  811. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/app/escalation.rs +0 -0
  812. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/app/events.rs +0 -0
  813. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/app/fixtures.rs +0 -0
  814. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/app/fleet_health.rs +0 -0
  815. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/app/fleet_sessions.rs +0 -0
  816. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/app/fleet_terminals.rs +0 -0
  817. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/app/format.rs +0 -0
  818. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/app/milestone_dag.rs +0 -0
  819. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/app/mod.rs +0 -0
  820. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/app/msv.rs +0 -0
  821. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/app/pipeline.rs +0 -0
  822. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/app/plans.rs +0 -0
  823. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/app/render.rs +0 -0
  824. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/app/reports.rs +0 -0
  825. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/app/sessions.rs +0 -0
  826. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/app/settings_ui.rs +0 -0
  827. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/app/sidebar.rs +0 -0
  828. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/app/terminal.rs +0 -0
  829. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/app/tests.rs +0 -0
  830. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/app/types.rs +0 -0
  831. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/app/workspace.rs +0 -0
  832. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/bin/gtk.rs +0 -0
  833. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/commands.rs +0 -0
  834. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/lib.rs +0 -0
  835. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/main.rs +0 -0
  836. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/src/settings.rs +0 -0
  837. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/tests/acceptance.rs +0 -0
  838. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/tui/tests/cli.rs +0 -0
  839. {code_coordinator-0.5.92 → code_coordinator-0.5.93}/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.92
3
+ Version: 0.5.93
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.92
3
+ Version: 0.5.93
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
@@ -676,6 +676,7 @@ tests/test_reconcile_merges.py
676
676
  tests/test_reconcile_usage_limit_done.py
677
677
  tests/test_refine_chat.py
678
678
  tests/test_release_cordon_2101.py
679
+ tests/test_release_cordon_daemon_leads_2176.py
679
680
  tests/test_release_cordon_deadlock_2240.py
680
681
  tests/test_release_propagate.py
681
682
  tests/test_release_unified_1242.py
@@ -706,6 +706,7 @@
706
706
  "tests/test_reconcile_usage_limit_done.py",
707
707
  "tests/test_refine_chat.py",
708
708
  "tests/test_release_cordon_2101.py",
709
+ "tests/test_release_cordon_daemon_leads_2176.py",
709
710
  "tests/test_release_cordon_deadlock_2240.py",
710
711
  "tests/test_release_propagate.py",
711
712
  "tests/test_release_unified_1242.py",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.92",
2
+ "tag": "0.5.93",
3
3
  "distance": 0,
4
- "node": "g7d880a1fd7fca3a73143f80edb90e5e9ebffef63",
4
+ "node": "g827590698265fe1d05e3d77e84c364f63d767405",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-15"
@@ -694,11 +694,25 @@ def release_propagate( # noqa: PLR0912, PLR0915 — a pipeline; the decisions a
694
694
  )
695
695
  current = rp.hosts_already_current(_lane_versions_by_host(before), record.target_version)
696
696
 
697
+ # #2176: resolved here, ahead of cordoning, so the cordon plan can honour
698
+ # the same daemon-leads invariant the roll itself is bound by (see below).
699
+ # Purely a derivation from data already in hand (`machine_health`) — this
700
+ # does not move the "unorderable fleet" REFUSAL, which stays below the
701
+ # deferral branch on purpose (see its own comment).
702
+ daemon_name = _daemon_machine_name(config, daemon_host_override, machine_health)
703
+
697
704
  # ── 3b. cordon the hosts that are behind, so they DRAIN (#2101) ──────
698
705
  #
699
706
  # Before the deferral return below, on purpose: cordoning is the thing
700
707
  # that turns "no window" into "a window in a few minutes". A run that
701
708
  # defers without cordoning has changed nothing about why it deferred.
709
+ #
710
+ # #2176: a non-daemon host with no busy signal of its own is exempted
711
+ # while the daemon host is itself busy and behind — see `plan_cordons`'s
712
+ # `daemon_host` handling. It cannot roll ahead of a busy daemon host
713
+ # regardless of its own drain state (the daemon-leads invariant below),
714
+ # so cordoning it protects nothing and just spends fleet capacity for an
715
+ # unbounded wait.
702
716
  record.cordons = _apply_cordons(
703
717
  hosts=hosts,
704
718
  report=before,
@@ -712,6 +726,7 @@ def release_propagate( # noqa: PLR0912, PLR0915 — a pipeline; the decisions a
712
726
  state_dir=state_dir,
713
727
  max_deferrals=cordon_max_deferrals,
714
728
  release_cooldown=cordon_cooldown,
729
+ daemon_host=daemon_name,
715
730
  )
716
731
 
717
732
  if fully_busy and not force:
@@ -722,12 +737,12 @@ def release_propagate( # noqa: PLR0912, PLR0915 — a pipeline; the decisions a
722
737
  # meets a fleet that is actually draining.
723
738
  _finish(rp.STATUS_DEFERRED, 0)
724
739
 
725
- # #2101: resolved AFTER the deferral above, deliberately. This refusal is
726
- # about the ORDER a roll happens in; a run that is going to roll nothing
727
- # has no order to get wrong, and turning "the fleet is busy" into a
728
- # `failed` record (exit 1, systemd marks the unit failed) would teach an
729
- # operator to ignore the one signal that matters.
730
- daemon_name = _daemon_machine_name(config, daemon_host_override, machine_health)
740
+ # #2101: this refusal is checked AFTER the deferral above, deliberately.
741
+ # This refusal is about the ORDER a roll happens in; a run that is going
742
+ # to roll nothing has no order to get wrong, and turning "the fleet is
743
+ # busy" into a `failed` record (exit 1, systemd marks the unit failed)
744
+ # would teach an operator to ignore the one signal that matters.
745
+ # (`daemon_name` itself was resolved earlier, before cordoning — #2176.)
731
746
  if daemon_name is None and len(hosts) > 1:
732
747
  # #2052 fault 2: this used to warn and roll in coordinator.yml order.
733
748
  # It then briefly put the daemon host BEHIND both its callers during a
@@ -1082,6 +1097,7 @@ def _apply_cordons( # noqa: PLR0912 — one linear apply-the-plan pass
1082
1097
  state_dir: Path | None = None,
1083
1098
  max_deferrals: int | None = None,
1084
1099
  release_cooldown: float | None = None,
1100
+ daemon_host: str | None = None,
1085
1101
  ) -> dict:
1086
1102
  """Plan and apply this run's cordons. Returns the journal fragment.
1087
1103
 
@@ -1090,6 +1106,13 @@ def _apply_cordons( # noqa: PLR0912 — one linear apply-the-plan pass
1090
1106
  Failing the whole propagation because the cordon could not be renewed
1091
1107
  would make #2101's fix strictly worse than not having it.
1092
1108
 
1109
+ *daemon_host* (#2176) lets :func:`~coord.release_cordon.plan_cordons`
1110
+ exempt a non-daemon host with no busy signal of its own from cordoning
1111
+ while the daemon host is itself busy and behind — see that function's
1112
+ docstring for the reasoning. ``None`` (an unorderable fleet) disables
1113
+ the exemption and falls back to cordoning every behind host, same as
1114
+ before #2176.
1115
+
1093
1116
  #2240: *state_dir* is where the propagation journal lives, and the journal
1094
1117
  is where "how many runs in a row has this cordon now deferred?" is stored
1095
1118
  — the process holding the answer in memory is restarted by the roll it is
@@ -1162,10 +1185,13 @@ def _apply_cordons( # noqa: PLR0912 — one linear apply-the-plan pass
1162
1185
  if release_cooldown is None
1163
1186
  else release_cooldown
1164
1187
  ),
1188
+ daemon_host=daemon_host,
1165
1189
  )
1166
1190
  for line in plan.render():
1167
1191
  click.echo(line)
1168
1192
  outcome.cooling_seconds = plan.cooling_seconds
1193
+ outcome.collateral_spared = list(plan.collateral_spared)
1194
+ outcome.blocked_behind = plan.blocked_behind
1169
1195
  if plan.released is not None:
1170
1196
  outcome.released = plan.released.to_dict()
1171
1197
  # stderr as well as stdout: on the timer host this line IS the
@@ -142,6 +142,35 @@ and #2082 is the cost of tolerating that. The threshold is a knob
142
142
  (``coord release propagate --cordon-after N``) precisely so a future cadence
143
143
  change does not need a code change. Trap F.
144
144
 
145
+ CORDON-EVERY-BEHIND-HOST DOES NOT COVER A HOST THAT CANNOT ROLL EITHER WAY
146
+ ----------------------------------------------------------------------------
147
+ Observed 2026-08-13 00:18 UTC: one busy signal, on dellserver, and the fleet
148
+ cordoned all three machines anyway. elitebook and precision reported
149
+ ``online • idle`` throughout and stayed cordoned — launch-blocked — for
150
+ 34+ minutes, unable to accept the very review dispatch #2240 needed.
151
+
152
+ The cordon-every-behind-host rule above is correct for a host whose OWN
153
+ draining is what a run is waiting on: skip it and it never drains, and a run
154
+ that defers without cordoning defers again in 20 minutes for the same
155
+ reason. It does not cover a host that has no busy signal against it AND is
156
+ blocked from rolling by the daemon-leads invariant (see
157
+ :mod:`coord.release_propagate`'s LANE ORDER section) rather than by its own
158
+ work — nothing may roll ahead of a busy daemon host, so such a host cannot
159
+ roll regardless of how drained it gets. Cordoning it protects nothing: its
160
+ drained state cannot be consumed until the daemon host rolls first, which
161
+ may be unbounded (any drive on the daemon host reproduces this, not just a
162
+ wedged one).
163
+
164
+ :func:`plan_cordons`'s *daemon_host* parameter is the fix: while the daemon
165
+ host is itself busy and behind, only it (and any host with its own busy
166
+ signal) is cordoned. Everyone else stays uncordoned and dispatchable —
167
+ released immediately if a previous run already cordoned them — until the
168
+ daemon host becomes rollable, at which point ordinary drain-everyone-behind
169
+ resumes. :attr:`CordonPlan.collateral_spared` /
170
+ :attr:`CordonPlan.blocked_behind` name exactly who was spared and why, so
171
+ the next puzzle like this one is one line of output, not a 40-minute read of
172
+ `/board`.
173
+
145
174
  PURITY
146
175
  ------
147
176
  Nothing here reads the clock, the filesystem, the network or the DB — same
@@ -618,6 +647,17 @@ class CordonPlan:
618
647
  #: recorded rather than silent, because "no cordons planned" and "cordons
619
648
  #: suppressed on purpose" are the same output otherwise.
620
649
  cooling_seconds: float = 0.0
650
+ #: #2176: behind hosts this run deliberately did NOT cordon (and, if
651
+ #: already cordoned, released) because they have no busy signal of their
652
+ #: own and cannot roll ahead of `blocked_behind` anyway. Reported
653
+ #: separately from `uncordon` (which is "proven current") so the journal
654
+ #: and CLI output can name them as collateral rather than as a drain that
655
+ #: completed.
656
+ collateral_spared: tuple[str, ...] = ()
657
+ #: #2176: the daemon host these hosts are spared on account of — set
658
+ #: exactly when `collateral_spared` is non-empty. The single fact that
659
+ #: would have turned a 40-minute puzzle into one line of output.
660
+ blocked_behind: str | None = None
621
661
 
622
662
  @property
623
663
  def empty(self) -> bool:
@@ -627,6 +667,7 @@ class CordonPlan:
627
667
  or self.escalations
628
668
  or self.expired
629
669
  or self.released
670
+ or self.collateral_spared
630
671
  )
631
672
 
632
673
  def to_dict(self) -> dict:
@@ -638,6 +679,8 @@ class CordonPlan:
638
679
  "unknown": list(self.unknown),
639
680
  "released": self.released.to_dict() if self.released else None,
640
681
  "cooling_seconds": self.cooling_seconds,
682
+ "collateral_spared": list(self.collateral_spared),
683
+ "blocked_behind": self.blocked_behind,
641
684
  }
642
685
 
643
686
  def render(self) -> list[str]:
@@ -645,6 +688,14 @@ class CordonPlan:
645
688
  lines: list[str] = []
646
689
  for item in self.cordon:
647
690
  lines.append(f" ⊘ cordon {item.machine}: {item.describe()}")
691
+ if self.collateral_spared:
692
+ lines.append(
693
+ " · "
694
+ + ", ".join(sorted(self.collateral_spared))
695
+ + f": left uncordoned — blocked behind daemon host "
696
+ f"{self.blocked_behind} either way, cordoning would not help "
697
+ "(#2176)"
698
+ )
648
699
  for name in self.uncordon:
649
700
  lines.append(f" ✓ uncordon {name}: up to date, work may resume")
650
701
  for name in self.expired:
@@ -748,12 +799,15 @@ def plan_cordons(
748
799
  pressure: DeferralPressure | None = None,
749
800
  max_deferrals: int = DEFAULT_MAX_DEFERRALS,
750
801
  release_cooldown: float = DEFAULT_RELEASE_COOLDOWN_SECONDS,
802
+ daemon_host: str | None = None,
751
803
  ) -> CordonPlan:
752
804
  """Decide this run's cordon writes. Pure.
753
805
 
754
806
  *existing* is the store as read (expired records included — this function
755
807
  is what notices they lapsed). *busy_reasons* maps a host to why it is not
756
- yet drained, purely so an escalation can say what is holding it.
808
+ yet drained, purely so an escalation can say what is holding it — and
809
+ (#2176) so this function can tell a genuinely busy host from an idle one
810
+ when deciding who is collateral.
757
811
 
758
812
  ``enabled=False`` (``coord release propagate --no-cordon``) plans no new
759
813
  cordons but STILL clears the ones this owner already set: turning the
@@ -772,6 +826,21 @@ def plan_cordons(
772
826
  Proven-current hosts are uncordoned in every one of these branches: that
773
827
  is never the wrong move, and skipping it during a cooldown would leave a
774
828
  rolled host cordoned for the length of the cooldown.
829
+
830
+ *daemon_host* (#2176) is the machine `coord release propagate` will roll
831
+ first (see `coord.release_propagate`'s LANE ORDER section) — the
832
+ daemon-leads invariant means no OTHER host's python lane may roll ahead
833
+ of it while it is itself busy and behind. A behind host with no busy
834
+ signal of its own is therefore collateral, not protected, by a cordon
835
+ while that holds: it cannot roll either way, so draining it buys nothing
836
+ and just spends fleet capacity for a wait that is unbounded from its own
837
+ perspective (#2067 made quiescence per-host; this closes the cordon's
838
+ matching gap). Such a host is left uncordoned — and released immediately
839
+ if a previous run already cordoned it — until the daemon host is
840
+ rollable (quiescent, or already on the target), at which point ordinary
841
+ drain-everyone-behind resumes exactly as before #2176. A host that is
842
+ itself busy is cordoned regardless: its own drain is still the thing
843
+ being waited on, whatever the daemon host is doing.
775
844
  """
776
845
  records = _as_records(existing)
777
846
  live = {name: c for name, c in records.items() if c.active(now)}
@@ -782,11 +851,30 @@ def plan_cordons(
782
851
  if not enabled:
783
852
  return CordonPlan(uncordon=tuple(sorted(live)), expired=expired)
784
853
 
785
- # Uncordon: PROVEN current, and nothing else. A host whose version could
786
- # not be read keeps whatever cordon it has until that cordon EXPIRES —
787
- # clearing on "we couldn't read the version" would open the fleet up
788
- # mid-roll on the strength of one failed HTTP call.
789
- to_uncordon = tuple(sorted(name for name in live if name in drift.current))
854
+ # ── #2176: who is collateral to a busy, behind daemon host ────────────
855
+ daemon_blocked = bool(
856
+ daemon_host
857
+ and (busy_reasons or {}).get(daemon_host)
858
+ and daemon_host not in drift.current
859
+ )
860
+ collateral = frozenset(
861
+ host
862
+ for host in drift.behind
863
+ if daemon_blocked and host != daemon_host and not (busy_reasons or {}).get(host)
864
+ )
865
+ blocked_behind = daemon_host if collateral else None
866
+
867
+ # Uncordon: PROVEN current, plus (#2176) any collateral host a previous
868
+ # run already cordoned — "spared" means dispatchable now, not "merely not
869
+ # renewed". A host whose version could not be read otherwise keeps
870
+ # whatever cordon it has until that cordon EXPIRES — clearing on "we
871
+ # couldn't read the version" would open the fleet up mid-roll on the
872
+ # strength of one failed HTTP call.
873
+ to_uncordon = tuple(
874
+ sorted(
875
+ {name for name in live if name in drift.current} | (collateral & set(live))
876
+ )
877
+ )
790
878
 
791
879
  # ── #2240: the deadlock bound ────────────────────────────────────────
792
880
  pressure = pressure or DeferralPressure()
@@ -797,6 +885,8 @@ def plan_cordons(
797
885
  expired=expired,
798
886
  cooling_seconds=cooling,
799
887
  unknown=tuple(sorted(drift.undecided & set(live))),
888
+ collateral_spared=tuple(sorted(collateral)),
889
+ blocked_behind=blocked_behind,
800
890
  )
801
891
  if max_deferrals > 0 and pressure.consecutive >= max_deferrals:
802
892
  return CordonPlan(
@@ -809,11 +899,13 @@ def plan_cordons(
809
899
  cooldown_seconds=release_cooldown,
810
900
  target_version=target_version,
811
901
  ),
902
+ collateral_spared=tuple(sorted(collateral)),
903
+ blocked_behind=blocked_behind,
812
904
  )
813
905
 
814
906
  to_cordon: list[Cordon] = []
815
907
  escalations: list[DrainEscalation] = []
816
- for host in sorted(drift.behind):
908
+ for host in sorted(drift.behind - collateral):
817
909
  previous = live.get(host)
818
910
  created = previous.created_at if previous and previous.created_at else now
819
911
  to_cordon.append(
@@ -844,6 +936,8 @@ def plan_cordons(
844
936
  escalations=tuple(escalations),
845
937
  expired=expired,
846
938
  unknown=tuple(sorted(drift.undecided & set(live))),
939
+ collateral_spared=tuple(sorted(collateral)),
940
+ blocked_behind=blocked_behind,
847
941
  )
848
942
 
849
943
 
@@ -883,6 +977,13 @@ class CordonOutcome:
883
977
  #: out of the newest record instead of every caller of
884
978
  #: :func:`describe_deferral_pressure` assuming the default.
885
979
  max_deferrals: int = DEFAULT_MAX_DEFERRALS
980
+ #: #2176: behind hosts this run spared (or actively released) because
981
+ #: they have no busy signal of their own and cannot roll ahead of a busy,
982
+ #: behind daemon host anyway. Mirrors `CordonPlan.collateral_spared`.
983
+ collateral_spared: list[str] = field(default_factory=list)
984
+ #: #2176: the daemon host `collateral_spared` was spared on account of.
985
+ #: Mirrors `CordonPlan.blocked_behind`.
986
+ blocked_behind: str | None = None
886
987
 
887
988
  def to_dict(self) -> dict:
888
989
  return {
@@ -896,4 +997,6 @@ class CordonOutcome:
896
997
  "cooling_seconds": self.cooling_seconds,
897
998
  "pressure": dict(self.pressure),
898
999
  "max_deferrals": self.max_deferrals,
1000
+ "collateral_spared": list(self.collateral_spared),
1001
+ "blocked_behind": self.blocked_behind,
899
1002
  }
@@ -1247,6 +1247,14 @@ def render_record(record: PropagationRecord | Mapping[str, Any]) -> list[str]:
1247
1247
  )
1248
1248
  if cordons.get("uncordoned"):
1249
1249
  lines.append(" uncordoned: " + ", ".join(cordons["uncordoned"]))
1250
+ # #2176: name the collateral hosts AND the single host they're collateral
1251
+ # to — the fact that would have turned a 40-minute puzzle into one line.
1252
+ if cordons.get("collateral_spared"):
1253
+ lines.append(
1254
+ " spared (blocked behind daemon host "
1255
+ f"{cordons.get('blocked_behind')} anyway): "
1256
+ + ", ".join(cordons["collateral_spared"])
1257
+ )
1250
1258
  if cordons.get("expired"):
1251
1259
  lines.append(
1252
1260
  " cordons that lapsed on their own: " + ", ".join(cordons["expired"])
@@ -0,0 +1,313 @@
1
+ """#2176: the release cordon must not take out hosts the daemon-leads
2
+ invariant already forbids from rolling.
3
+
4
+ `coord release propagate` cordons every host that is behind the target so it
5
+ drains (#2101). That is correct when a host's OWN draining is the thing being
6
+ waited on. It is not correct for a host that is idle, behind, and blocked
7
+ from rolling anyway because the daemon host itself is busy — the daemon-leads
8
+ invariant (`coord/release_propagate.py`'s module docstring) forbids ANY other
9
+ host's python lane from rolling ahead of a busy daemon host, so cordoning an
10
+ idle non-daemon host protects nothing: its drained state cannot be consumed
11
+ until the daemon host rolls first.
12
+
13
+ Evidence, 2026-08-13 00:18 UTC: dellserver (the daemon host) had a drive
14
+ running and was cordoned correctly. elitebook and precision had no busy
15
+ signal against them, were also cordoned, and stayed that way for 34+ minutes
16
+ — launch-blocked while unable to roll regardless of their own drain state,
17
+ because they could never roll ahead of dellserver.
18
+
19
+ Every test here fails against the pre-fix code, where `plan_cordons` had no
20
+ `daemon_host` parameter and cordoned every behind host unconditionally.
21
+ """
22
+
23
+ from __future__ import annotations
24
+
25
+ from pathlib import Path
26
+
27
+ import pytest
28
+ from click.testing import CliRunner
29
+
30
+ from coord import machine_pause as mp
31
+ from coord import release_cordon as rc
32
+ from coord.cli import main
33
+ from coord.commands import release as release_cmd
34
+ from coord.drive_queue import STATE_RUNNING
35
+
36
+
37
+ # ══════════════════════════════════════════════════════════════════════════
38
+ # Pure `plan_cordons` tests — fast, and precise about which host is which.
39
+ # ══════════════════════════════════════════════════════════════════════════
40
+
41
+
42
+ def test_a_busy_behind_daemon_host_spares_idle_behind_hosts_from_cordon():
43
+ """The exact incident shape: dellserver busy and behind, elitebook and
44
+ precision idle and behind. Only dellserver may be cordoned."""
45
+ plan = rc.plan_cordons(
46
+ target_version="0.5.48",
47
+ host_versions={
48
+ "dellserver": "0.5.40", "elitebook": "0.5.40", "precision": "0.5.40",
49
+ },
50
+ now=0.0,
51
+ busy_reasons={"dellserver": "drive-queue entry running: claude-coordinator#2164"},
52
+ daemon_host="dellserver",
53
+ )
54
+ assert [c.machine for c in plan.cordon] == ["dellserver"]
55
+ assert plan.collateral_spared == ("elitebook", "precision")
56
+ assert plan.blocked_behind == "dellserver"
57
+
58
+
59
+ def test_a_quiescent_daemon_host_cordons_every_behind_host_as_before():
60
+ """Once the daemon host is not itself busy, the existing drain guarantee
61
+ is unchanged — every behind host is cordoned, same as pre-#2176."""
62
+ plan = rc.plan_cordons(
63
+ target_version="0.5.48",
64
+ host_versions={
65
+ "dellserver": "0.5.40", "elitebook": "0.5.40", "precision": "0.5.40",
66
+ },
67
+ now=0.0,
68
+ busy_reasons={},
69
+ daemon_host="dellserver",
70
+ )
71
+ assert sorted(c.machine for c in plan.cordon) == ["dellserver", "elitebook", "precision"]
72
+ assert plan.collateral_spared == ()
73
+ assert plan.blocked_behind is None
74
+
75
+
76
+ def test_a_daemon_host_already_on_target_cordons_every_behind_host():
77
+ """A daemon host busy but already ON the target version is rollable (it
78
+ needs no roll at all), so it does not block anyone — collateral sparing
79
+ must not fire."""
80
+ plan = rc.plan_cordons(
81
+ target_version="0.5.48",
82
+ host_versions={
83
+ "dellserver": "0.5.48", "elitebook": "0.5.40", "precision": "0.5.40",
84
+ },
85
+ now=0.0,
86
+ busy_reasons={"dellserver": "drive-queue entry running: claude-coordinator#2164"},
87
+ daemon_host="dellserver",
88
+ )
89
+ assert sorted(c.machine for c in plan.cordon) == ["elitebook", "precision"]
90
+ assert plan.collateral_spared == ()
91
+
92
+
93
+ def test_a_busy_behind_host_is_still_cordoned_regardless_of_daemon_state():
94
+ """A host that is itself busy is never collateral — its own drain is
95
+ still the thing being waited on, whatever the daemon host is doing."""
96
+ plan = rc.plan_cordons(
97
+ target_version="0.5.48",
98
+ host_versions={
99
+ "dellserver": "0.5.40", "elitebook": "0.5.40", "precision": "0.5.40",
100
+ },
101
+ now=0.0,
102
+ busy_reasons={
103
+ "dellserver": "drive-queue entry running: claude-coordinator#2164",
104
+ "elitebook": "drive-queue entry running: acme/other#3",
105
+ },
106
+ daemon_host="dellserver",
107
+ )
108
+ assert sorted(c.machine for c in plan.cordon) == ["dellserver", "elitebook"]
109
+ assert plan.collateral_spared == ("precision",)
110
+
111
+
112
+ def test_a_previously_cordoned_collateral_host_is_released_not_just_left():
113
+ """A host cordoned by an EARLIER run, before the daemon host went busy,
114
+ must be actively released — "spared" means dispatchable now, not merely
115
+ "not renewed until it expires"."""
116
+ existing = {
117
+ "dellserver": rc.Cordon(machine="dellserver", expires_at=1e12),
118
+ "elitebook": rc.Cordon(machine="elitebook", expires_at=1e12),
119
+ }
120
+ plan = rc.plan_cordons(
121
+ target_version="0.5.48",
122
+ host_versions={"dellserver": "0.5.40", "elitebook": "0.5.40"},
123
+ existing=existing,
124
+ now=0.0,
125
+ busy_reasons={"dellserver": "drive-queue entry running: claude-coordinator#2164"},
126
+ daemon_host="dellserver",
127
+ )
128
+ assert [c.machine for c in plan.cordon] == ["dellserver"]
129
+ assert "elitebook" in plan.uncordon
130
+
131
+
132
+ def test_no_daemon_host_falls_back_to_cordoning_every_behind_host():
133
+ """`daemon_host=None` (an unorderable fleet, or a caller that predates
134
+ #2176) disables the exemption entirely — the safe default."""
135
+ plan = rc.plan_cordons(
136
+ target_version="0.5.48",
137
+ host_versions={"dellserver": "0.5.40", "elitebook": "0.5.40"},
138
+ now=0.0,
139
+ busy_reasons={"dellserver": "drive-queue entry running: claude-coordinator#2164"},
140
+ daemon_host=None,
141
+ )
142
+ assert sorted(c.machine for c in plan.cordon) == ["dellserver", "elitebook"]
143
+ assert plan.collateral_spared == ()
144
+
145
+
146
+ # ══════════════════════════════════════════════════════════════════════════
147
+ # CLI black-box test — the acceptance criterion, end to end.
148
+ # ══════════════════════════════════════════════════════════════════════════
149
+
150
+ THREE_HOST_CONFIG = """\
151
+ repos:
152
+ - name: api
153
+ github: acme/api
154
+
155
+ machines:
156
+ - name: dellserver
157
+ host: dellserver.tailnet
158
+ capabilities: [python]
159
+ repos: [api]
160
+ - name: elitebook
161
+ host: elitebook.tailnet
162
+ capabilities: [python]
163
+ repos: [api]
164
+ - name: precision
165
+ host: precision.tailnet
166
+ capabilities: [python]
167
+ repos: [api]
168
+ """
169
+
170
+
171
+ @pytest.fixture()
172
+ def tmp_home(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> Path:
173
+ """Isolate the cordon store — it lives at $HOME/.coord/."""
174
+ monkeypatch.setenv("HOME", str(tmp_path))
175
+ (tmp_path / ".coord").mkdir()
176
+ return tmp_path
177
+
178
+
179
+ @pytest.fixture()
180
+ def three_host_config_path(tmp_path: Path) -> Path:
181
+ p = tmp_path / "coordinator.yml"
182
+ p.write_text(THREE_HOST_CONFIG)
183
+ return p
184
+
185
+
186
+ def _stub_state_dir(monkeypatch, tmp_path):
187
+ d = tmp_path / "propagation-state"
188
+ d.mkdir(exist_ok=True)
189
+ monkeypatch.setattr(release_cmd, "_state_dir", lambda: d)
190
+ return d
191
+
192
+
193
+ def _stub_board(monkeypatch, *, drive_queue=()):
194
+ monkeypatch.setattr(
195
+ release_cmd,
196
+ "_fetch_board",
197
+ lambda: (
198
+ {"drive_queue": list(drive_queue), "assignments": [], "issues": []},
199
+ None,
200
+ ),
201
+ )
202
+
203
+
204
+ def _serve_health():
205
+ """A ``/health`` body whose ``spawned_coord`` row names a live
206
+ coord-serve — how the daemon host is DERIVED rather than guessed."""
207
+ return {
208
+ "version": "0.5.40",
209
+ "health": {"schema": 1, "results": [
210
+ {"check_id": "spawned_coord", "subject": "coord-serve",
211
+ "severity": "ok",
212
+ "values": {"unit": "coord-serve", "pid": 1, "version": "0.5.40"}},
213
+ ]},
214
+ }
215
+
216
+
217
+ def _stub_verify(monkeypatch, *, versions: dict[str, str], daemon: str):
218
+ from coord import release_verify as rv
219
+
220
+ lanes = [
221
+ rv.Lane(host=host, lane="~/.coord-venv", version=version)
222
+ for host, version in versions.items()
223
+ ]
224
+ machine_health = {daemon: _serve_health()}
225
+ monkeypatch.setattr(
226
+ rv, "gather", lambda *a, **k: (machine_health, {}, None, daemon)
227
+ )
228
+ monkeypatch.setattr(
229
+ rv,
230
+ "verify",
231
+ lambda **kwargs: rv.VerifyReport(
232
+ expected=kwargs.get("expected"), lanes=lanes, findings=[]
233
+ ),
234
+ )
235
+
236
+
237
+ def test_propagate_cordons_only_the_busy_daemon_host_and_spares_idle_behind_hosts(
238
+ tmp_home, three_host_config_path, monkeypatch, tmp_path
239
+ ):
240
+ """#2176's exact regression, reproduced through the real CLI command: a
241
+ drive is running on dellserver (the daemon host), which is also behind.
242
+ elitebook and precision are behind too, but report nothing busy.
243
+
244
+ Pre-fix, this cordoned all three and held elitebook/precision launch-
245
+ blocked for the entire time dellserver stayed busy — capacity spent on
246
+ hosts that could not have rolled regardless. Post-fix, only dellserver
247
+ is cordoned; the other two stay dispatchable.
248
+ """
249
+ _stub_state_dir(monkeypatch, tmp_path)
250
+ _stub_board(
251
+ monkeypatch,
252
+ drive_queue=[{"repo_name": "claude-coordinator", "issue_number": 2164,
253
+ "state": STATE_RUNNING, "machine": "dellserver",
254
+ "launch_host": "dellserver"}],
255
+ )
256
+ _stub_verify(
257
+ monkeypatch,
258
+ versions={"dellserver": "0.5.40", "elitebook": "0.5.40", "precision": "0.5.40"},
259
+ daemon="dellserver",
260
+ )
261
+
262
+ result = CliRunner().invoke(
263
+ main,
264
+ ["release", "propagate", "--config", str(three_host_config_path),
265
+ "--target", "0.5.48"],
266
+ )
267
+ assert result.exit_code == 0, result.output
268
+
269
+ # This is the regression: pre-fix, all three of these lines were
270
+ # "⊘ cordon <host>: draining for v0.5.48".
271
+ assert "cordon dellserver" in result.output
272
+ assert "cordon elitebook" not in result.output
273
+ assert "cordon precision" not in result.output
274
+ # Item 3 — the blast radius is named, not just absent.
275
+ assert "elitebook, precision" in result.output
276
+ assert "blocked behind daemon host dellserver" in result.output
277
+
278
+ # And the cordon store itself agrees: elitebook/precision are actually
279
+ # dispatchable, not merely un-mentioned in the printed plan.
280
+ assert mp.cordoned_names() == {"dellserver"}
281
+
282
+
283
+ def test_once_the_daemon_host_is_idle_the_other_behind_hosts_cordon_as_today(
284
+ tmp_home, three_host_config_path, monkeypatch, tmp_path
285
+ ):
286
+ """The existing drain guarantee, unchanged: with NOTHING busy anywhere,
287
+ every behind host is cordoned exactly as it was before #2176.
288
+
289
+ `--dry-run`, like the regression test above: it changes nothing in the
290
+ cordon store, but the plan it prints is exactly what a real run would
291
+ write, and using it here means this test does not need to stub the roll
292
+ executors to keep a successful run from reaching real network I/O (a
293
+ successful roll uncordons its own host immediately — see 4b below —
294
+ which would otherwise make "was it cordoned at all" unobservable here).
295
+ """
296
+ _stub_state_dir(monkeypatch, tmp_path)
297
+ _stub_board(monkeypatch, drive_queue=[])
298
+ _stub_verify(
299
+ monkeypatch,
300
+ versions={"dellserver": "0.5.40", "elitebook": "0.5.40", "precision": "0.5.40"},
301
+ daemon="dellserver",
302
+ )
303
+
304
+ result = CliRunner().invoke(
305
+ main,
306
+ ["release", "propagate", "--config", str(three_host_config_path),
307
+ "--target", "0.5.48", "--dry-run"],
308
+ )
309
+ assert result.exit_code == 0, result.output
310
+ assert "cordon dellserver" in result.output
311
+ assert "cordon elitebook" in result.output
312
+ assert "cordon precision" in result.output
313
+ assert "spared" not in result.output