code-coordinator 0.5.128__tar.gz → 0.5.129__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 (860) hide show
  1. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/milestone.py +99 -57
  5. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/milestone_dispatch.py +75 -1
  6. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/serve_app.py +5 -2
  7. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/ARCHITECTURE.md +1 -1
  8. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_milestone_dispatch.py +81 -38
  9. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_milestone_dispatch.py +41 -0
  10. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/.claude/commands/board.md +0 -0
  11. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/.claude/commands/complete-session.md +0 -0
  12. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/.claude/commands/coordinator.md +0 -0
  13. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/.githooks/_lib.sh +0 -0
  14. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/.githooks/post-checkout +0 -0
  15. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/.githooks/post-commit +0 -0
  16. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/.githooks/post-merge +0 -0
  17. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  18. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/.github/coord-ci-acceptance.yml +0 -0
  19. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/.github/workflows/auto-release.yml +0 -0
  20. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/.github/workflows/cargo-test.yml +0 -0
  21. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/.github/workflows/publish.yml +0 -0
  22. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/.github/workflows/release-tui.yml +0 -0
  23. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/.github/workflows/test.yml +0 -0
  24. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/.gitignore +0 -0
  25. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/CLAUDE.md +0 -0
  26. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/GOAL.md +0 -0
  27. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/LICENSE +0 -0
  28. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/MANIFEST.in +0 -0
  29. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/README.md +0 -0
  30. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/code_coordinator.egg-info/SOURCES.txt +0 -0
  31. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/code_coordinator.egg-info/dependency_links.txt +0 -0
  32. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/code_coordinator.egg-info/entry_points.txt +0 -0
  33. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/code_coordinator.egg-info/requires.txt +0 -0
  34. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/code_coordinator.egg-info/scm_file_list.json +0 -0
  35. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/code_coordinator.egg-info/top_level.txt +0 -0
  36. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/__init__.py +0 -0
  37. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/_board_mapping.py +0 -0
  38. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/acceptance.py +0 -0
  39. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/acceptance_drivers.py +0 -0
  40. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/agent.py +0 -0
  41. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/agent_app.py +0 -0
  42. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/agent_update.py +0 -0
  43. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/agents/opencode/.gitignore +0 -0
  44. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/agents/opencode/agents/work.md +0 -0
  45. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/agents/opencode/routing.jsonc +0 -0
  46. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/audit.py +0 -0
  47. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/auto_loop.py +0 -0
  48. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/block_log.py +0 -0
  49. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/board_bool_guard.py +0 -0
  50. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/board_service.py +0 -0
  51. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/board_wire.py +0 -0
  52. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/brain.py +0 -0
  53. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/branch_model.py +0 -0
  54. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/bug_intake.py +0 -0
  55. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/cargo_cache.py +0 -0
  56. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/ci_github.py +0 -0
  57. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/ci_store.py +0 -0
  58. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/claim.py +0 -0
  59. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/cli.py +0 -0
  60. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/client.py +0 -0
  61. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/__init__.py +0 -0
  62. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/_common.py +0 -0
  63. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/acceptance.py +0 -0
  64. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/agent_ops.py +0 -0
  65. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/audit.py +0 -0
  66. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/chat.py +0 -0
  67. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/dispatch.py +0 -0
  68. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/dispatch_workers.py +0 -0
  69. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/drive.py +0 -0
  70. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/drive_queue.py +0 -0
  71. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/gate_a.py +0 -0
  72. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/gates.py +0 -0
  73. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/issues.py +0 -0
  74. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/lifecycle.py +0 -0
  75. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/merge.py +0 -0
  76. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/plan_followup.py +0 -0
  77. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/plans.py +0 -0
  78. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/portal.py +0 -0
  79. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/release.py +0 -0
  80. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/repo.py +0 -0
  81. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/report.py +0 -0
  82. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/review.py +0 -0
  83. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/scorecard.py +0 -0
  84. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/sessions.py +0 -0
  85. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/setup.py +0 -0
  86. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/status.py +0 -0
  87. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/terminal.py +0 -0
  88. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/test_gate.py +0 -0
  89. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/commands/tui.py +0 -0
  90. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/comments.py +0 -0
  91. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/config.py +0 -0
  92. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/config_reload.py +0 -0
  93. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/conflict_fix.py +0 -0
  94. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dao.py +0 -0
  95. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/__init__.py +0 -0
  96. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/fixture.py +0 -0
  97. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/index.html +0 -0
  98. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/server.py +0 -0
  99. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/terminal.py +0 -0
  100. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/.gitignore +0 -0
  101. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/components.json +0 -0
  102. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/dist/assets/Gallery-BoKs3mpY.js +0 -0
  103. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  104. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/dist/assets/Terminal-CEsP08iX.js +0 -0
  105. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/dist/assets/index-CDHPlB6k.js +0 -0
  106. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  107. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  108. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  109. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  110. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  111. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/dist/index.html +0 -0
  112. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  113. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/dist/sw.js +0 -0
  114. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  115. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  116. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  117. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  118. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  119. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  120. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  121. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  122. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  123. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  124. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/eslint.config.js +0 -0
  125. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/index.html +0 -0
  126. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  127. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/package-lock.json +0 -0
  128. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/package.json +0 -0
  129. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  130. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/playwright.config.ts +0 -0
  131. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/postcss.config.js +0 -0
  132. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  133. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  134. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  135. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/App.tsx +0 -0
  136. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/api/client.ts +0 -0
  137. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  138. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  139. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  140. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  141. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  142. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  143. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  144. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  145. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  146. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  147. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  148. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  149. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  150. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  151. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  152. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  153. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  154. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  155. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  156. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  157. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  158. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  159. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  160. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  161. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  162. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  163. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  164. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  165. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  166. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  167. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  168. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  169. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  170. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  171. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  172. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/index.css +0 -0
  173. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  174. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  175. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/main.tsx +0 -0
  176. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  177. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  178. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  179. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  180. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  181. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  182. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  183. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  184. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  185. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  186. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  187. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  188. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  189. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  190. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  191. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  192. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  193. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  194. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  195. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  196. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  197. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  198. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  199. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/tailwind.config.js +0 -0
  200. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/tsconfig.json +0 -0
  201. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  202. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dashboard/webapp/vite.config.ts +0 -0
  203. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/db.py +0 -0
  204. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dead_end.py +0 -0
  205. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/README.md +0 -0
  206. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-agent.service +0 -0
  207. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-db-backup.service +0 -0
  208. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-db-backup.sh +0 -0
  209. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-db-backup.timer +0 -0
  210. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-drive-queue.service +0 -0
  211. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-drive-queue.timer +0 -0
  212. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-notify.service +0 -0
  213. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-notify.timer +0 -0
  214. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-release-propagate.service +0 -0
  215. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-release-propagate.timer +0 -0
  216. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-release-window.service +0 -0
  217. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-release-window.timer +0 -0
  218. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-serve.service +0 -0
  219. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-web-dist-build.service +0 -0
  220. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-web-dist-build.timer +0 -0
  221. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy/coord-web.service +0 -0
  222. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy_manifest.py +0 -0
  223. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deploy_units.py +0 -0
  224. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/deps.py +0 -0
  225. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/diagnose.py +0 -0
  226. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dispatch.py +0 -0
  227. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/dist_name.py +0 -0
  228. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/drive.py +0 -0
  229. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/drive_queue.py +0 -0
  230. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/drive_state.py +0 -0
  231. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/events.py +0 -0
  232. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/failure_class.py +0 -0
  233. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/filelock.py +0 -0
  234. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/fleet_config_health.py +0 -0
  235. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/freshness.py +0 -0
  236. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/gate_a.py +0 -0
  237. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/gate_b.py +0 -0
  238. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/gate_snapshot.py +0 -0
  239. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/gates.py +0 -0
  240. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/github_ops.py +0 -0
  241. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/goal.py +0 -0
  242. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/graph_health.py +0 -0
  243. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/__init__.py +0 -0
  244. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/aggregate.py +0 -0
  245. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/__init__.py +0 -0
  246. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/agent_install.py +0 -0
  247. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/cargo_targets.py +0 -0
  248. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/claude_binary.py +0 -0
  249. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/deploy_lane_facts.py +0 -0
  250. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/disk.py +0 -0
  251. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/fleet_board.py +0 -0
  252. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  253. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/fleet_phantom.py +0 -0
  254. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/fleet_unit_drift.py +0 -0
  255. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/graph.py +0 -0
  256. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/graphify_cli.py +0 -0
  257. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/index_lock.py +0 -0
  258. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/plan_usage.py +0 -0
  259. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/repo_state.py +0 -0
  260. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/spawned_coord.py +0 -0
  261. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/timer_active.py +0 -0
  262. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/toolchain.py +0 -0
  263. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/unit_drift.py +0 -0
  264. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/unit_enablement.py +0 -0
  265. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/checks/worktrees.py +0 -0
  266. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/cli.py +0 -0
  267. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/context.py +0 -0
  268. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/fleet_snapshot.py +0 -0
  269. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/models.py +0 -0
  270. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/pypi.py +0 -0
  271. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/registry.py +0 -0
  272. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/render.py +0 -0
  273. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/health/units.py +0 -0
  274. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/hooks.py +0 -0
  275. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/housekeeping.py +0 -0
  276. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/interactive.py +0 -0
  277. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/issue_store.py +0 -0
  278. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/liveness_auditor.py +0 -0
  279. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/machine_pause.py +0 -0
  280. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/merge_queue.py +0 -0
  281. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/milestone_chat.py +0 -0
  282. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/milestone_gate.py +0 -0
  283. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/milestone_order.py +0 -0
  284. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/mock_author.py +0 -0
  285. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/models.py +0 -0
  286. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/network.py +0 -0
  287. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/new_issue_chat.py +0 -0
  288. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/notifier/__init__.py +0 -0
  289. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/notifier/baseline.py +0 -0
  290. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/notifier/cli.py +0 -0
  291. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/notifier/collect.py +0 -0
  292. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/notifier/digest.py +0 -0
  293. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/notifier/models.py +0 -0
  294. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/notifier/predicate.py +0 -0
  295. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/notifier/service.py +0 -0
  296. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/notifier/store.py +0 -0
  297. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/notifier/transport.py +0 -0
  298. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/notify.py +0 -0
  299. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/openapi.py +0 -0
  300. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/overlap_fence.py +0 -0
  301. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/overlap_predict.py +0 -0
  302. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/parentage.py +0 -0
  303. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/parentage_github.py +0 -0
  304. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/pipeline.py +0 -0
  305. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/plan_parser.py +0 -0
  306. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/plans.py +0 -0
  307. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/platform_paths.py +0 -0
  308. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/portal_bridge.py +0 -0
  309. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/portal_store.py +0 -0
  310. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/portal_sync.py +0 -0
  311. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/pr_body_lint.py +0 -0
  312. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/prereqs.py +0 -0
  313. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/progress.py +0 -0
  314. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/providers/__init__.py +0 -0
  315. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/providers/base.py +0 -0
  316. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/providers/claude.py +0 -0
  317. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/providers/claude_pty.py +0 -0
  318. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/providers/opencode.py +0 -0
  319. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/queue_diagnose.py +0 -0
  320. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/reconcile.py +0 -0
  321. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/refine_chat.py +0 -0
  322. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/release_cordon.py +0 -0
  323. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/release_propagate.py +0 -0
  324. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/release_verify.py +0 -0
  325. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/release_window.py +0 -0
  326. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/repo_edit.py +0 -0
  327. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/repo_onboard.py +0 -0
  328. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/reports.py +0 -0
  329. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/revalidate.py +0 -0
  330. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/review.py +0 -0
  331. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/scorecard.py +0 -0
  332. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/skills/portal-followup/SKILL.md +0 -0
  333. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/skills/update-issue/SKILL.md +0 -0
  334. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/smoke.py +0 -0
  335. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/spend_ceiling.py +0 -0
  336. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/split_work.py +0 -0
  337. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/stage_projection.py +0 -0
  338. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/state.py +0 -0
  339. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/test_author.py +0 -0
  340. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/test_chat.py +0 -0
  341. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/test_orchestrator.py +0 -0
  342. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/test_report.py +0 -0
  343. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/tui_release.py +0 -0
  344. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/usage.py +0 -0
  345. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/usage_limits.py +0 -0
  346. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/usage_rollup.py +0 -0
  347. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coord/worker_events.py +0 -0
  348. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/coordinator.example.yml +0 -0
  349. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-agent.service +0 -0
  350. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-db-backup.service +0 -0
  351. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-db-backup.sh +0 -0
  352. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-db-backup.timer +0 -0
  353. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-drive-queue.service +0 -0
  354. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-drive-queue.timer +0 -0
  355. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-notify.service +0 -0
  356. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-notify.timer +0 -0
  357. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-release-propagate.service +0 -0
  358. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-release-propagate.timer +0 -0
  359. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-release-window.service +0 -0
  360. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-release-window.timer +0 -0
  361. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-serve.service +0 -0
  362. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-web-dist-build.service +0 -0
  363. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-web-dist-build.sh +0 -0
  364. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-web-dist-build.timer +0 -0
  365. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-web-rollback.sh +0 -0
  366. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/coord-web.service +0 -0
  367. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/deploy/node-shim.sh +0 -0
  368. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/AGENT_OPERATIONS.md +0 -0
  369. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/ARCH_SECURITY_GATES.md +0 -0
  370. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/COCKPIT.md +0 -0
  371. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/CONTROL_CENTER.md +0 -0
  372. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/COST_DISCIPLINE.md +0 -0
  373. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/CROSS_PLATFORM.md +0 -0
  374. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/CUSTOMER_PORTAL.md +0 -0
  375. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/DRIVE_QUEUE.md +0 -0
  376. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/EPHEMERAL_WORKERS.md +0 -0
  377. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/FORGE_MIGRATION.md +0 -0
  378. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/GRAPHIFY_SETUP.md +0 -0
  379. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/ISSUE_GUIDANCE.md +0 -0
  380. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/MAC_MINI.md +0 -0
  381. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  382. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/NOTIFIER.md +0 -0
  383. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/OPENCODE_VERIFICATION.md +0 -0
  384. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/OPERATING_GOTCHAS.md +0 -0
  385. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/ORACLE_LOOP.md +0 -0
  386. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/PHONE_WEBAPP.md +0 -0
  387. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/PIPELINE_V2.md +0 -0
  388. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/PLATFORM_EVOLUTION.md +0 -0
  389. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/SECOND_BACKEND.md +0 -0
  390. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/STORE_SERVICE.md +0 -0
  391. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  392. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/WEB_CONTROL_CENTER.md +0 -0
  393. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/WSL_WINDOWS_WORKER.md +0 -0
  394. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/mocks/web/README.md +0 -0
  395. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/mocks/web/_tokens.css +0 -0
  396. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/mocks/web/issue-detail.html +0 -0
  397. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/mocks/web/pipeline-narrow.html +0 -0
  398. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/docs/mocks/web/pipeline-wide.html +0 -0
  399. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/graphify-out/.gitignore +0 -0
  400. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/install-agent.sh +0 -0
  401. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/pyproject.toml +0 -0
  402. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/audit_review_verdict_overrides.py +0 -0
  403. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  404. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/azure-workers/build-worker-image.sh +0 -0
  405. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/azure-workers/coordinator-machine.py +0 -0
  406. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/azure-workers/epic-down.sh +0 -0
  407. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/azure-workers/epic-up.sh +0 -0
  408. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/azure-workers/preflight.sh +0 -0
  409. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/azure-workers/provision-worker.sh +0 -0
  410. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  411. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  412. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/azure-workers/verify-github-token.sh +0 -0
  413. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/codegen.py +0 -0
  414. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/coord-test-runner.sh +0 -0
  415. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/drive-batch.sh +0 -0
  416. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/gen_board_fixture.py +0 -0
  417. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/next_release_tag.py +0 -0
  418. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/run_tests_in_populated_home.sh +0 -0
  419. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/run_tests_without_gh.sh +0 -0
  420. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/smoke_437_interactive.py +0 -0
  421. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/verify_878_review_capture.py +0 -0
  422. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/verify_release_published.py +0 -0
  423. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/scripts/verify_release_wheel.py +0 -0
  424. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/setup.cfg +0 -0
  425. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/SMOKE_SET.md +0 -0
  426. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/__init__.py +0 -0
  427. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  428. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-33/contract.md +0 -0
  429. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-33/manifest.yml +0 -0
  430. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  431. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  432. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  433. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  434. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-37/conftest.py +0 -0
  435. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-37/contract.md +0 -0
  436. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-37/manifest.yml +0 -0
  437. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  438. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  439. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-38/contract.md +0 -0
  440. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-38/manifest.yml +0 -0
  441. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  442. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  443. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  444. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  445. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  446. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  447. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  448. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  449. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  450. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  451. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-51/contract.md +0 -0
  452. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  453. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  454. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-51/manifest.yml +0 -0
  455. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  456. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-51/tsconfig.json +0 -0
  457. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  458. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-65/contract.md +0 -0
  459. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-65/manifest.yml +0 -0
  460. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  461. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  462. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  463. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  464. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  465. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  466. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  467. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  468. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  469. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/conftest.py +0 -0
  470. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/board-pipeline-basic.json +0 -0
  471. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  472. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  473. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  474. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  475. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/playwright/all_pass.json +0 -0
  476. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  477. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/playwright/mixed_fail.json +0 -0
  478. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  479. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  480. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/playwright/skip.json +0 -0
  481. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/playwright/truncated.json +0 -0
  482. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  483. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  484. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  485. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  486. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  487. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  488. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  489. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  490. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_acceptance.py +0 -0
  491. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_acceptance_drivers.py +0 -0
  492. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent.py +0 -0
  493. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_api_error.py +0 -0
  494. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_app.py +0 -0
  495. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_branch_base.py +0 -0
  496. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_branch_capture.py +0 -0
  497. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_config_free_1712.py +0 -0
  498. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_deploy_units_endpoint.py +0 -0
  499. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_dirty_worktree.py +0 -0
  500. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_graph_self_heal.py +0 -0
  501. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_health_h3.py +0 -0
  502. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_idle_restart.py +0 -0
  503. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_push_failure.py +0 -0
  504. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_reap.py +0 -0
  505. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_repos_and_pull.py +0 -0
  506. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_restart_services_endpoint.py +0 -0
  507. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_startup_diagnostics.py +0 -0
  508. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_update.py +0 -0
  509. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_update_bluegreen.py +0 -0
  510. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_usage_limit.py +0 -0
  511. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_agent_zero_commit.py +0 -0
  512. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_ambient_home_isolation.py +0 -0
  513. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_approve_reject_plan.py +0 -0
  514. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_approve_usage_gate.py +0 -0
  515. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_assignment_already_recorded_daemon.py +0 -0
  516. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_audit_log.py +0 -0
  517. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_audit_outcome.py +0 -0
  518. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_audit_query.py +0 -0
  519. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_auto_loop.py +0 -0
  520. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_auto_release_publish_2035.py +0 -0
  521. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_base_checkout_restore.py +0 -0
  522. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_block_log.py +0 -0
  523. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_board_cap_762.py +0 -0
  524. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_board_fixture.py +0 -0
  525. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_board_read_path.py +0 -0
  526. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_board_service.py +0 -0
  527. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_board_state.py +0 -0
  528. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_board_wire.py +0 -0
  529. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_brain.py +0 -0
  530. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_branch_model.py +0 -0
  531. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_bug_intake.py +0 -0
  532. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_build_worker_image_env_update.py +0 -0
  533. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cargo_cache.py +0 -0
  534. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_ci_acceptance_gate_1950.py +0 -0
  535. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_ci_parity_2091.py +0 -0
  536. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_ci_store.py +0 -0
  537. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_claim.py +0 -0
  538. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_acceptance.py +0 -0
  539. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_assign.py +0 -0
  540. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  541. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_assign_interactive_remote.py +0 -0
  542. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_assign_provider.py +0 -0
  543. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  544. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_audit.py +0 -0
  545. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_chat_continue.py +0 -0
  546. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_diagnose_config_provenance.py +0 -0
  547. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_diagnose_graph.py +0 -0
  548. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_doctor.py +0 -0
  549. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_doctor_config_free_1801.py +0 -0
  550. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  551. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_drive.py +0 -0
  552. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_drive_queue.py +0 -0
  553. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_escalate.py +0 -0
  554. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_fix_headless_review.py +0 -0
  555. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_gate_a.py +0 -0
  556. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_install_drift.py +0 -0
  557. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_install_skills.py +0 -0
  558. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_issue_create_label.py +0 -0
  559. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_issue_reopen.py +0 -0
  560. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_merge.py +0 -0
  561. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_milestone_assign.py +0 -0
  562. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_milestone_capture.py +0 -0
  563. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_milestone_chat_add_child.py +0 -0
  564. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_milestone_gate_b.py +0 -0
  565. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_milestone_gate_c.py +0 -0
  566. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_milestone_order.py +0 -0
  567. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  568. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_milestone_ship.py +0 -0
  569. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_network.py +0 -0
  570. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_new_issue_chat.py +0 -0
  571. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_plans.py +0 -0
  572. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_portal.py +0 -0
  573. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_pull_artifact.py +0 -0
  574. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_queue.py +0 -0
  575. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_reattach_sessions.py +0 -0
  576. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_refine_board.py +0 -0
  577. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_release_preflight.py +0 -0
  578. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_release_propagate.py +0 -0
  579. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_release_window.py +0 -0
  580. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_repo_2220.py +0 -0
  581. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_scorecard.py +0 -0
  582. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_set_review_findings.py +0 -0
  583. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_status_advisory_terminal.py +0 -0
  584. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_status_merge_queue.py +0 -0
  585. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_status_provider.py +0 -0
  586. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_status_review_finalizing.py +0 -0
  587. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_status_test_failed_tag.py +0 -0
  588. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_status_usage_limit.py +0 -0
  589. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_sync_comments_873.py +0 -0
  590. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_test_plan.py +0 -0
  591. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_track.py +0 -0
  592. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_tui_update.py +0 -0
  593. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cli_wait.py +0 -0
  594. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_client_base_install.py +0 -0
  595. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_comments.py +0 -0
  596. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_completion_summary.py +0 -0
  597. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_config.py +0 -0
  598. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_config_acceptance.py +0 -0
  599. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_config_audit.py +0 -0
  600. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_config_pricing.py +0 -0
  601. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  602. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_config_usage_gate.py +0 -0
  603. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_conflict_fix.py +0 -0
  604. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_conflict_fix_semantic.py +0 -0
  605. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_coord_test.py +0 -0
  606. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_coord_test_runner_baseline.py +0 -0
  607. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_coord_test_runner_routing.py +0 -0
  608. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_coord_test_runner_toolchain.py +0 -0
  609. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_coord_web_sse_restart_live.py +0 -0
  610. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_coordinator_machine.py +0 -0
  611. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_cross_platform_imports.py +0 -0
  612. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_dashboard.py +0 -0
  613. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_dashboard_fixture.py +0 -0
  614. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_dashboard_terminal.py +0 -0
  615. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_dashboard_terminal_live.py +0 -0
  616. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_db.py +0 -0
  617. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_dead_end.py +0 -0
  618. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_deploy_coord_db_backup.py +0 -0
  619. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_deploy_coord_web_dist.py +0 -0
  620. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_deploy_coord_web_rollback.py +0 -0
  621. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_deploy_drive_queue_unit.py +0 -0
  622. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_deploy_manifest.py +0 -0
  623. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_deploy_units_lane.py +0 -0
  624. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_deploy_web_unit.py +0 -0
  625. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_deps.py +0 -0
  626. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_diagnose.py +0 -0
  627. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_dispatch.py +0 -0
  628. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_dispatch_target_validation.py +0 -0
  629. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_dist_name.py +0 -0
  630. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_done_housekeeping.py +0 -0
  631. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_drive.py +0 -0
  632. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_drive_queue.py +0 -0
  633. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_drive_state.py +0 -0
  634. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_drive_tmux.py +0 -0
  635. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_epic_up_capability_detection.py +0 -0
  636. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  637. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_epic_up_image_provenance.py +0 -0
  638. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_errors.py +0 -0
  639. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_events.py +0 -0
  640. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_failure_class.py +0 -0
  641. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_filelock.py +0 -0
  642. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  643. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_fix_of_force_override.py +0 -0
  644. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_fleet_config_health.py +0 -0
  645. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_fleet_health_probes.py +0 -0
  646. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_fleet_health_snapshot.py +0 -0
  647. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_freshness.py +0 -0
  648. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_gate_a.py +0 -0
  649. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_gate_b.py +0 -0
  650. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_gate_snapshot_staleness.py +0 -0
  651. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_gates.py +0 -0
  652. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  653. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_generated_types_fixture.py +0 -0
  654. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_github_ops.py +0 -0
  655. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_goal.py +0 -0
  656. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_graph_health.py +0 -0
  657. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_graph_selfheal_absent_2237.py +0 -0
  658. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_handoff.py +0 -0
  659. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_health_checks.py +0 -0
  660. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_health_cli.py +0 -0
  661. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_health_cli_graph.py +0 -0
  662. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_health_config.py +0 -0
  663. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_health_context.py +0 -0
  664. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_health_deploy_lane_facts.py +0 -0
  665. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_health_incident_regression.py +0 -0
  666. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_health_pypi.py +0 -0
  667. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_health_registry.py +0 -0
  668. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_health_timer_active.py +0 -0
  669. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_health_toolchain.py +0 -0
  670. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_health_unit_drift.py +0 -0
  671. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_health_unit_enablement.py +0 -0
  672. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_hooks.py +0 -0
  673. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_human_attended_437.py +0 -0
  674. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_init.py +0 -0
  675. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_integration.py +0 -0
  676. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_interactive_briefing_echo.py +0 -0
  677. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_interactive_prefill_state.py +0 -0
  678. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_interactive_session_relaunch.py +0 -0
  679. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_interactive_test_verdict_backstop.py +0 -0
  680. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_interactive_token_attribution.py +0 -0
  681. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_interactive_worktree.py +0 -0
  682. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_issue_store_seam.py +0 -0
  683. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_liveness_auditor.py +0 -0
  684. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_liveness_notify.py +0 -0
  685. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_machine_pause.py +0 -0
  686. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_merge_queue.py +0 -0
  687. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_merge_verify.py +0 -0
  688. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_milestone_chat.py +0 -0
  689. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_milestone_gate.py +0 -0
  690. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_milestone_order.py +0 -0
  691. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_milestone_seam.py +0 -0
  692. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_mock_author.py +0 -0
  693. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_model_tiering.py +0 -0
  694. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_models.py +0 -0
  695. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_models_config_labels.py +0 -0
  696. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_needs_attention.py +0 -0
  697. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_network.py +0 -0
  698. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_new_issue_chat.py +0 -0
  699. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_next_release_tag.py +0 -0
  700. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_no_direct_gh_calls.py +0 -0
  701. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_node_shim.py +0 -0
  702. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_notifier_baseline.py +0 -0
  703. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_notifier_cli.py +0 -0
  704. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_notifier_collect.py +0 -0
  705. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_notifier_config.py +0 -0
  706. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_notifier_drive_seam.py +0 -0
  707. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_notifier_isolation.py +0 -0
  708. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_notifier_predicate.py +0 -0
  709. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_notifier_quiet_hours.py +0 -0
  710. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_notifier_service.py +0 -0
  711. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_notify.py +0 -0
  712. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_notify_drain.py +0 -0
  713. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_openapi.py +0 -0
  714. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_operational_defaults.py +0 -0
  715. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_overlap_fence.py +0 -0
  716. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_overlap_predict.py +0 -0
  717. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_packaged_deploy_units.py +0 -0
  718. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_parentage.py +0 -0
  719. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_paste_landed.py +0 -0
  720. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_pipeline.py +0 -0
  721. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_plan_followup_approve_plan_command.py +0 -0
  722. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_plan_followup_pr_command.py +0 -0
  723. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_plan_followup_review_command.py +0 -0
  724. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_plan_only.py +0 -0
  725. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_plan_parser.py +0 -0
  726. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_platform_paths.py +0 -0
  727. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_portal_bridge.py +0 -0
  728. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_portal_config.py +0 -0
  729. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_portal_sync.py +0 -0
  730. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_pr_body_lint.py +0 -0
  731. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_prereqs.py +0 -0
  732. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_production_db_guard.py +0 -0
  733. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_progress.py +0 -0
  734. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_provider_seam.py +0 -0
  735. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_providers.py +0 -0
  736. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_providers_config_labels.py +0 -0
  737. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_providers_pty.py +0 -0
  738. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_quiet_hours.py +0 -0
  739. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_quiet_hours_store_2146.py +0 -0
  740. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_reap_merged_sessions.py +0 -0
  741. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_reap_stale_interactive_tick.py +0 -0
  742. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_reconcile.py +0 -0
  743. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_reconcile_branch.py +0 -0
  744. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_reconcile_completions.py +0 -0
  745. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_reconcile_merges.py +0 -0
  746. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_reconcile_no_agent_record.py +0 -0
  747. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_reconcile_usage_limit_done.py +0 -0
  748. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_refine_chat.py +0 -0
  749. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_release_cordon_2101.py +0 -0
  750. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  751. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_release_cordon_deadlock_2240.py +0 -0
  752. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_release_propagate.py +0 -0
  753. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_release_unified_1242.py +0 -0
  754. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_release_verify.py +0 -0
  755. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_release_window.py +0 -0
  756. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_remote_auto_prune.py +0 -0
  757. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_remote_interactive_reaper.py +0 -0
  758. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_repo_edit_2220.py +0 -0
  759. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_repo_graph_fleet_2237.py +0 -0
  760. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_repo_onboard_2220.py +0 -0
  761. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_report_result_push.py +0 -0
  762. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_reports.py +0 -0
  763. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_retry.py +0 -0
  764. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_retry_advisory_1606.py +0 -0
  765. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_retry_type_1636.py +0 -0
  766. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_revalidate.py +0 -0
  767. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_review.py +0 -0
  768. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_review_end_review_without_verdict.py +0 -0
  769. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_review_parse_failure_diagnostic.py +0 -0
  770. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_review_reaffirm.py +0 -0
  771. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_review_state.py +0 -0
  772. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_review_verdict_backstop.py +0 -0
  773. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_review_verdict_override_audit.py +0 -0
  774. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_review_verdict_relay.py +0 -0
  775. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_review_zero_commits.py +0 -0
  776. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_scoped_review_wiring.py +0 -0
  777. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_scorecard.py +0 -0
  778. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_serve.py +0 -0
  779. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_serve_app_board_trim.py +0 -0
  780. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_session.py +0 -0
  781. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_slice_issue_attribution.py +0 -0
  782. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_smoke.py +0 -0
  783. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_smoke_live_checkout_restore.py +0 -0
  784. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_smoke_workflow.py +0 -0
  785. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_spend_ceiling.py +0 -0
  786. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_spend_ceiling_coordinator.py +0 -0
  787. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_split.py +0 -0
  788. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_split_work.py +0 -0
  789. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_stage_projection.py +0 -0
  790. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_stalled_pipeline.py +0 -0
  791. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_state.py +0 -0
  792. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_state_review_findings_daemon.py +0 -0
  793. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_status_fleet_footer.py +0 -0
  794. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_stop_1567.py +0 -0
  795. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_stuck.py +0 -0
  796. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_terminal_command.py +0 -0
  797. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_test_author.py +0 -0
  798. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_test_chat.py +0 -0
  799. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_test_orchestrator.py +0 -0
  800. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_test_report.py +0 -0
  801. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_test_verdict_parsing.py +0 -0
  802. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_test_verdict_transcript_floor.py +0 -0
  803. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_thin_client_board_audit.py +0 -0
  804. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_thin_client_config_load_1080.py +0 -0
  805. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_thin_client_daemon_routing_906.py +0 -0
  806. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_tmux_host.py +0 -0
  807. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_tmux_session.py +0 -0
  808. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_transcript_floor.py +0 -0
  809. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_usage.py +0 -0
  810. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_usage_limits.py +0 -0
  811. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_usage_rollup.py +0 -0
  812. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_venv_live_install_2121.py +0 -0
  813. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_version_single_source.py +0 -0
  814. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_watch.py +0 -0
  815. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  816. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_worker_events.py +0 -0
  817. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_worker_image_pin_sync.py +0 -0
  818. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_worker_safety.py +0 -0
  819. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_worker_test_scoping.py +0 -0
  820. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_worktree.py +0 -0
  821. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  822. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/Cargo.lock +0 -0
  823. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/Cargo.toml +0 -0
  824. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/cargo-config-local-quadraui.toml.example +0 -0
  825. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/audit.rs +0 -0
  826. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/chat.rs +0 -0
  827. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/data.rs +0 -0
  828. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/dialogs.rs +0 -0
  829. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/doc_tabs.rs +0 -0
  830. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/drive.rs +0 -0
  831. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/drive_queue.rs +0 -0
  832. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/escalation.rs +0 -0
  833. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/events.rs +0 -0
  834. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/fixtures.rs +0 -0
  835. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/fleet_health.rs +0 -0
  836. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/fleet_sessions.rs +0 -0
  837. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/fleet_terminals.rs +0 -0
  838. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/format.rs +0 -0
  839. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/milestone_dag.rs +0 -0
  840. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/mod.rs +0 -0
  841. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/msv.rs +0 -0
  842. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/pipeline.rs +0 -0
  843. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/plans.rs +0 -0
  844. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/render.rs +0 -0
  845. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/reports.rs +0 -0
  846. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/sessions.rs +0 -0
  847. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/settings_ui.rs +0 -0
  848. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/sidebar.rs +0 -0
  849. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/terminal.rs +0 -0
  850. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/tests.rs +0 -0
  851. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/types.rs +0 -0
  852. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/app/workspace.rs +0 -0
  853. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/bin/gtk.rs +0 -0
  854. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/commands.rs +0 -0
  855. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/lib.rs +0 -0
  856. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/main.rs +0 -0
  857. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/src/settings.rs +0 -0
  858. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/tests/acceptance.rs +0 -0
  859. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/tui/tests/cli.rs +0 -0
  860. {code_coordinator-0.5.128 → code_coordinator-0.5.129}/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.128
3
+ Version: 0.5.129
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.128
3
+ Version: 0.5.129
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,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.128",
2
+ "tag": "0.5.129",
3
3
  "distance": 0,
4
- "node": "gdb3e5a50ffe1a0bb743d2cc2f791188761858441",
4
+ "node": "g35ed648ce7ee944d0c954c511918f971ef413bef",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-17"
@@ -3,10 +3,11 @@
3
3
 
4
4
  Thin CLI glue around ``coord/milestone_order.py`` (the pure DAG/frontier
5
5
  parser) and ``coord/milestone_dispatch.py`` (Phase 1's machine-picking +
6
- dispatch): fetches the tracking issue + milestone membership + issue
7
- terminal state from GitHub via ``coord.milestone_dispatch.
8
- fetch_milestone_context`` (shared by both subcommands so they see identical
9
- inputs), then hands that data to the pure functions and prints the result.
6
+ dispatch, and #2335's work-order -> drive-queue translation): fetches the
7
+ tracking issue + milestone membership + issue terminal state from GitHub via
8
+ ``coord.milestone_dispatch.fetch_milestone_context`` (shared by both
9
+ subcommands so they see identical inputs), then hands that data to the pure
10
+ functions and prints the result.
10
11
  """
11
12
 
12
13
  from __future__ import annotations
@@ -21,7 +22,6 @@ import httpx
21
22
  from coord.commands._common import _CONFIG_OPTION, _load_config
22
23
  from coord.milestone_dispatch import (
23
24
  DispatchOutcome,
24
- MachinePick,
25
25
  MilestoneDispatchError,
26
26
  dispatch_entry,
27
27
  fetch_milestone_context,
@@ -29,6 +29,7 @@ from coord.milestone_dispatch import (
29
29
  is_milestone_complete,
30
30
  pick_machine,
31
31
  plan_dispatch,
32
+ plan_queue,
32
33
  )
33
34
  from coord.milestone_order import (
34
35
  TRACKING_ISSUE_LABEL,
@@ -859,11 +860,6 @@ def milestone_order_cmd(repo: str, tracking_issue: int, config_path: Path) -> No
859
860
  click.echo(f" #{b.issue_number}: {b.reason}")
860
861
 
861
862
 
862
- def _echo_pick(pick: MachinePick) -> None:
863
- suffix = f" (group {pick.entry.group})" if pick.entry.group else ""
864
- click.echo(f" #{pick.entry.issue_number} -> {pick.machine.name}{suffix}")
865
-
866
-
867
863
  def _echo_outcome(outcome: DispatchOutcome) -> None:
868
864
  if outcome.ok:
869
865
  click.echo(
@@ -883,13 +879,18 @@ def _echo_outcome(outcome: DispatchOutcome) -> None:
883
879
  @milestone_group.command(
884
880
  "dispatch",
885
881
  help=(
886
- "Promote a milestone into the pipeline: dispatch its ready frontier "
887
- "in parallel (up to idle/capable machines), then keep draining it as "
888
- "declared-order dependencies complete. REPO is the local repo name "
889
- "from coordinator.yml; TRACKING_ISSUE is the GH issue number of the "
890
- "tracking issue (its body holds the `## Work order` block). This is "
891
- "the single explicit approval for the whole declared work order — "
892
- "it does not expand scope beyond what `## Work order` lists."
882
+ "Promote a milestone into the pipeline: derive the dependency order "
883
+ "from the `## Work order` DAG and queue every still-open issue into "
884
+ "the drive-queue (`coord drive-queue add --after ...`) in that order "
885
+ "(#2335) the DQ-4 tick then launches each issue as its pre-reqs "
886
+ "land, with #2247 file-overlap prediction, durable board-backed "
887
+ "state, and `coord drive-queue list/status` observability. `--next` "
888
+ "keeps the lighter direct single-dispatch path. REPO is the local "
889
+ "repo name from coordinator.yml; TRACKING_ISSUE is the GH issue "
890
+ "number of the tracking issue (its body holds the `## Work order` "
891
+ "block). This is the single explicit approval for the whole declared "
892
+ "work order — it does not expand scope beyond what `## Work order` "
893
+ "lists."
893
894
  ),
894
895
  )
895
896
  @click.argument("repo")
@@ -902,8 +903,9 @@ def _echo_outcome(outcome: DispatchOutcome) -> None:
902
903
  "--next", "next_", is_flag=True,
903
904
  help=(
904
905
  "Single-pick mode: show up to 3 ready-frontier items and dispatch "
905
- "only the one you choose. Lighter-weight than draining the whole "
906
- "milestone does not register for daemon auto-drain."
906
+ "only the one you choose directly, not via the drive-queue. "
907
+ "Lighter-weight than bulk mode's whole-DAG drive-queue enqueue "
908
+ "(#2335)."
907
909
  ),
908
910
  )
909
911
  @click.option(
@@ -1003,14 +1005,15 @@ def milestone_dispatch_cmd(
1003
1005
  click.echo(f"#{tracking_issue}: no `## Work order` block found")
1004
1006
  return
1005
1007
 
1006
- board = board_service.read_board()
1007
- plan = plan_dispatch(ctx.work_order, board, cfg, repo_entry, ctx.terminal_issues)
1008
-
1009
1008
  click.echo(
1010
1009
  f"Work order for #{tracking_issue} (milestone #{ctx.milestone_number}):"
1011
1010
  )
1012
1011
 
1013
1012
  if next_:
1013
+ board = board_service.read_board()
1014
+ plan = plan_dispatch(
1015
+ ctx.work_order, board, cfg, repo_entry, ctx.terminal_issues
1016
+ )
1014
1017
  if not plan.to_dispatch:
1015
1018
  click.echo("No ready frontier item can dispatch right now.")
1016
1019
  if plan.skipped:
@@ -1075,54 +1078,93 @@ def milestone_dispatch_cmd(
1075
1078
  sys.exit(1)
1076
1079
  return
1077
1080
 
1078
- # Bulk mode: dispatch the entire current ready frontier.
1079
- click.echo("Will dispatch now:")
1080
- if plan.to_dispatch:
1081
- for pick in plan.to_dispatch:
1082
- _echo_pick(pick)
1083
- else:
1084
- click.echo(" (none)")
1085
-
1086
- if plan.skipped:
1087
- click.echo()
1088
- click.echo("Ready but no idle machine:")
1089
- for s in plan.skipped:
1090
- click.echo(f" #{s.entry.issue_number}: {s.reason}")
1081
+ # Bulk mode (#2335): queue the whole declared work order into the
1082
+ # drive-queue rather than dispatching the ready frontier directly. Before
1083
+ # #2335 this path called `dispatch_entry` per frontier pick and registered
1084
+ # the milestone for daemon auto-drain — bypassing the drive-queue
1085
+ # entirely: no #2247 overlap prediction, no durable queue entry surviving
1086
+ # a coordinator restart, nothing in `coord drive-queue list/status`. The
1087
+ # queue's `after=` edges now carry the DAG, so the DQ-4 tick launches each
1088
+ # issue as its pre-reqs land; that also makes `register_milestone_drain`
1089
+ # redundant here (the queue IS the durable drain, and registering would
1090
+ # have the daemon's direct-dispatch drain racing it).
1091
+ queue_plan = plan_queue(ctx.work_order, ctx.terminal_issues, repo_entry.name)
1092
+
1093
+ if not queue_plan:
1094
+ click.echo("Nothing to queue — every work-order node is already closed.")
1095
+ return
1091
1096
 
1092
- if plan.waiting:
1093
- click.echo()
1094
- click.echo("Waiting:")
1095
- for b in plan.waiting:
1096
- click.echo(f" #{b.issue_number}: {b.reason}")
1097
+ click.echo("Will queue (drive-queue), in dependency order:")
1098
+ for qe in queue_plan:
1099
+ bits = []
1100
+ if qe.group:
1101
+ bits.append(f"group {qe.group}")
1102
+ if qe.after:
1103
+ bits.append("after " + ", ".join(qe.after))
1104
+ suffix = f" ({'; '.join(bits)})" if bits else ""
1105
+ click.echo(f" #{qe.issue_number}{suffix}")
1097
1106
 
1098
1107
  if dry_run:
1099
1108
  click.echo()
1100
- click.echo("(dry run — not dispatched)")
1109
+ click.echo("(dry run — nothing queued)")
1101
1110
  return
1102
1111
 
1103
- if not plan.to_dispatch:
1104
- click.echo()
1105
- click.echo("Nothing to dispatch right now.")
1106
- return
1112
+ # Reuse `coord drive-queue add`'s own helpers so a milestone enqueue is
1113
+ # byte-identical to N manual `add` calls: same pre-write validation, same
1114
+ # #2247 overlap prediction (auto-`after` edges recorded to the audit log),
1115
+ # same upsert semantics for an issue already queued.
1116
+ from coord.commands.drive_queue import ( # noqa: PLC0415
1117
+ _applicable_auto_after,
1118
+ _predict_overlap,
1119
+ _record_overlap_prediction,
1120
+ )
1121
+ from coord.drive_queue import ( # noqa: PLC0415
1122
+ QueueError,
1123
+ entries_from_rows,
1124
+ entry_key,
1125
+ validate_enqueue,
1126
+ )
1127
+ from coord.state import enqueue_drive_queue, list_drive_queue # noqa: PLC0415
1107
1128
 
1108
1129
  click.echo()
1109
1130
  failures = 0
1110
- for pick in plan.to_dispatch:
1111
- outcome = dispatch_entry(pick, repo_entry, cfg, board, tracking_issue=tracking_issue)
1112
- _echo_outcome(outcome)
1113
- if not outcome.ok:
1131
+ queued = 0
1132
+ for qe in queue_plan:
1133
+ # Re-read per entry so each add validates (and overlap-predicts)
1134
+ # against the queue as its just-added siblings left it.
1135
+ existing = entries_from_rows(list_drive_queue())
1136
+ after = list(qe.after)
1137
+ key = entry_key(repo_entry.name, qe.issue_number)
1138
+ try:
1139
+ validate_enqueue(existing, repo_entry.name, qe.issue_number, after)
1140
+ except QueueError as exc:
1141
+ click.echo(f" {key}: not queued: {exc}", err=True)
1114
1142
  failures += 1
1143
+ continue
1144
+ prediction = _predict_overlap(
1145
+ config_path, repo_entry.name, qe.issue_number, existing
1146
+ )
1147
+ auto_after = _applicable_auto_after(
1148
+ existing, repo_entry.name, qe.issue_number, after, prediction
1149
+ )
1150
+ after = [*after, *auto_after]
1151
+ enqueue_drive_queue(repo_entry.name, qe.issue_number, after=after)
1152
+ if auto_after:
1153
+ _record_overlap_prediction(
1154
+ repo_entry.name, qe.issue_number, prediction, auto_after
1155
+ )
1156
+ suffix = f" after {', '.join(after)}" if after else ""
1157
+ overlap_note = f"\n {prediction.reason}" if auto_after else ""
1158
+ click.echo(f" queued {key}{suffix}{overlap_note}")
1159
+ queued += 1
1115
1160
 
1116
- if not is_milestone_complete(ctx):
1117
- from coord.state import register_milestone_drain
1118
-
1119
- register_milestone_drain(repo_name=repo_entry.name, tracking_issue=tracking_issue)
1161
+ if queued:
1120
1162
  click.echo()
1121
1163
  click.echo(
1122
- f"Milestone #{tracking_issue} registered for daemon auto-drain "
1123
- "(requires `milestone.auto_dispatch: true` in coordinator.yml + a "
1124
- "daemon restart to activate; `coord milestone dispatch` still "
1125
- "works as a manual re-drain either way)."
1164
+ f"{queued} issue(s) queued `coord drive-queue tick` (the DQ-4 "
1165
+ "timer, or run it manually) launches them in dependency order; "
1166
+ "`coord drive-queue list` shows the queue. Entries are durable "
1167
+ "across coordinator restarts."
1126
1168
  )
1127
1169
 
1128
1170
  if failures:
@@ -16,7 +16,10 @@ not an LLM judgment call like ``coord.brain.propose``.
16
16
  Three call sites share this module:
17
17
 
18
18
  - ``coord milestone dispatch`` (``coord/commands/milestone.py``) — the
19
- one-shot CLI dispatch (bulk or ``--next`` single-pick).
19
+ ``--next`` single-pick still dispatches directly through
20
+ :func:`plan_dispatch`/:func:`dispatch_entry`; bulk mode instead derives
21
+ drive-queue enqueues from the work order via :func:`plan_queue` (#2335),
22
+ so the DQ-4 tick owns the actual launches.
20
23
  - The daemon's auto-drain tick (``coord.serve_app._milestone_drain_tick``,
21
24
  opt-in via ``coordinator.yml`` ``milestone.auto_dispatch``) — re-runs the
22
25
  same fetch → plan → dispatch sequence for milestones registered via a
@@ -38,6 +41,7 @@ from coord.milestone_order import (
38
41
  FrontierEntry,
39
42
  WorkOrder,
40
43
  WorkOrderError,
44
+ WorkOrderNode,
41
45
  parse_work_order,
42
46
  ready_frontier,
43
47
  validate_milestone_membership,
@@ -64,6 +68,8 @@ __all__ = [
64
68
  "NoMachineAvailable",
65
69
  "MilestonePlan",
66
70
  "plan_dispatch",
71
+ "QueuePlanEntry",
72
+ "plan_queue",
67
73
  "DispatchOutcome",
68
74
  "dispatch_entry",
69
75
  "is_milestone_complete",
@@ -684,6 +690,74 @@ def plan_dispatch(
684
690
  )
685
691
 
686
692
 
693
+ @dataclass(frozen=True)
694
+ class QueuePlanEntry:
695
+ """One drive-queue enqueue derived from a work-order node (#2335)."""
696
+
697
+ issue_number: int
698
+ #: Fully-qualified pre-req keys (``"repo#N"``) for the drive-queue's
699
+ #: ``after=`` edge list — the node's declared ``{after: #N}`` targets,
700
+ #: minus any that are already terminal (closed issues never enter the
701
+ #: queue, so an edge at one would read as unsatisfiable to the tick's
702
+ #: ``_resolve_prereqs`` rather than as "already done").
703
+ after: tuple[str, ...] = ()
704
+ group: str | None = None
705
+
706
+
707
+ def plan_queue(
708
+ work_order: WorkOrder,
709
+ terminal_issues: frozenset[int] | set[int],
710
+ repo_name: str,
711
+ ) -> tuple[QueuePlanEntry, ...]:
712
+ """Translate the work order's DAG into drive-queue enqueues (#2335).
713
+
714
+ Pure — no GitHub, no board, no side effects. One entry per non-terminal
715
+ node, in dependency order: a stable topological sort seeded by declared
716
+ order, so independent nodes keep the operator's declared sequence while a
717
+ node declared *before* its own pre-req still queues after it (queue
718
+ position is the tick's tie-break among eligible entries; the ``after``
719
+ edges are what actually gate launches).
720
+
721
+ Each entry's ``after`` carries the node's declared ``{after: #N}`` edges
722
+ as fully-qualified ``repo#N`` keys — the same format ``coord drive-queue
723
+ add --after`` parses — filtered to pre-reqs that are still open.
724
+ :func:`~coord.milestone_order.parse_work_order` already refused cycles,
725
+ self-edges, and edges to undeclared nodes, so the sort always terminates;
726
+ the defensive tail below only fires on inputs constructed outside it.
727
+ """
728
+ from coord.drive_queue import entry_key # noqa: PLC0415
729
+
730
+ terminal = set(terminal_issues)
731
+ remaining: dict[int, WorkOrderNode] = {
732
+ n.issue_number: n for n in work_order.nodes if n.issue_number not in terminal
733
+ }
734
+ open_set = set(remaining)
735
+ placed: set[int] = set()
736
+ ordered: list[WorkOrderNode] = []
737
+ while remaining:
738
+ progressed = False
739
+ for number, node in list(remaining.items()):
740
+ if any(d in open_set and d not in placed for d in node.after):
741
+ continue
742
+ ordered.append(node)
743
+ placed.add(number)
744
+ del remaining[number]
745
+ progressed = True
746
+ if not progressed: # cycle — unreachable via parse_work_order; see above
747
+ ordered.extend(remaining.values())
748
+ break
749
+ return tuple(
750
+ QueuePlanEntry(
751
+ issue_number=n.issue_number,
752
+ after=tuple(
753
+ entry_key(repo_name, d) for d in n.after if d not in terminal
754
+ ),
755
+ group=n.group,
756
+ )
757
+ for n in ordered
758
+ )
759
+
760
+
687
761
  @dataclass(frozen=True)
688
762
  class DispatchOutcome:
689
763
  """The result of one :func:`dispatch_entry` call."""
@@ -1283,8 +1283,11 @@ def _milestone_drain_tick(config: Config) -> list:
1283
1283
 
1284
1284
  Called by ``_tick_loop`` when ``milestone.auto_dispatch: true`` is set in
1285
1285
  ``coordinator.yml`` (default-off). For each ``(repo_name, tracking_issue)``
1286
- registered via a non-dry-run ``coord milestone dispatch`` (``coord.state.
1287
- register_milestone_drain``), re-fetches the tracking issue, recomputes the
1286
+ registered via ``coord.state.register_milestone_drain`` (historically the
1287
+ non-dry-run ``coord milestone dispatch`` bulk path since #2335 that
1288
+ path enqueues the work order into the drive-queue instead and registers
1289
+ nothing, so only pre-#2335 registrations feed this tick), re-fetches the
1290
+ tracking issue, recomputes the
1288
1291
  ready frontier (:func:`coord.milestone_dispatch.plan_dispatch`), and
1289
1292
  dispatches any newly-unblocked entries — the same mechanism a manual
1290
1293
  ``coord milestone dispatch`` uses, so a fix that lands and merges for one
@@ -167,7 +167,7 @@ The auto-loop above sequences a *single* issue. For work that spans many issues,
167
167
 
168
168
  Layering is deliberate: `evaluate_gate(gate, probes)` is **pure** (gate name + a `GateProbes` value in, one `GateStep` out — no board, no GitHub, no clock), so every edge in the machine is decided in exactly one place and any edge is testable without I/O; `probe_milestone()` is the I/O half and reuses the *existing* readers (`milestone_dispatch.gate_a_status`, `gate_b.latest_gate_b_verdict`) so the gate walk and the manual CLI can never disagree about whether a gate is satisfied. `work` is the only state with a side effect, and it delegates to `plan_dispatch` + `dispatch_entry` rather than adding a second dispatch path. Every other edge is currently an explicit, logged **hold** — the machine reports why it cannot advance and stays put. There is no silent fall-through anywhere in the module; that is the failure mode that produced the 240-minute advisory spin in the per-issue driver.
169
169
 
170
- **`drive` vs. `milestone.auto_dispatch` — mutually exclusive per milestone, gate driving wins.** `milestone.auto_dispatch` gates the *legacy standalone drain* (`_milestone_drain_tick`): a milestone registered by `coord milestone dispatch` whose frontier the daemon re-drains with no gate walk around it. A milestone with a gate record is driven by `_milestone_gate_tick` instead, which owns the drain as its `work` state — so `_milestone_drain_tick` **skips** any `(repo_name, tracking_issue)` that has a gate record. Without that exclusion a milestone parked at Gate A could still have its frontier dispatched by the independently-gated drain path. Gate driving is consequently its own per-milestone opt-in (`coord milestone drive`) and `_milestone_gate_tick` is *not* behind the global flag — hiding it there would make `drive` silently no-op.
170
+ **`drive` vs. `milestone.auto_dispatch` — mutually exclusive per milestone, gate driving wins.** `milestone.auto_dispatch` gates the *legacy standalone drain* (`_milestone_drain_tick`): a milestone registered by a pre-#2335 `coord milestone dispatch` whose frontier the daemon re-drains with no gate walk around it. (Since #2335 the bulk `coord milestone dispatch` path enqueues the whole `## Work order` DAG into the drive-queue — `after=` edges carry the dependencies, the DQ-4 tick launches, and nothing new registers for this drain.) A milestone with a gate record is driven by `_milestone_gate_tick` instead, which owns the drain as its `work` state — so `_milestone_drain_tick` **skips** any `(repo_name, tracking_issue)` that has a gate record. Without that exclusion a milestone parked at Gate A could still have its frontier dispatched by the independently-gated drain path. Gate driving is consequently its own per-milestone opt-in (`coord milestone drive`) and `_milestone_gate_tick` is *not* behind the global flag — hiding it there would make `drive` silently no-op.
171
171
 
172
172
  **Exactly one overseer, structurally (#1930).** The gate tick is the sole owner of a gate-controlled milestone's `work` drain. `coord milestone drive` only ever writes/re-persists the `GateRecord` — it never calls `apply_step` or dispatches, so running it twice (any operator, any machine) is inert, not a race. `coord milestone dispatch`, the manual non-gate CLI, now refuses outright against a milestone with a gate record — before #1930 it had no way to know one existed and would dispatch the same frontier the gate tick's `work` state owns, the same "two gates disagreeing about whether work may start" shape #1870 fixed for the drive queue, reached from an operator's keyboard instead of a second host's timer.
173
173
 
@@ -104,8 +104,10 @@ class TestMilestoneDispatchValidation:
104
104
 
105
105
 
106
106
  class TestMilestoneDispatchDryRun:
107
- def test_cohort_dispatches_now_and_gated_node_waits(self, config_file: Path) -> None:
108
- """#769 acceptance criteria (first half)."""
107
+ def test_dry_run_shows_queue_plan_with_after_edges(self, config_file: Path) -> None:
108
+ """#2335: bulk dry-run previews the drive-queue enqueue plan — the
109
+ whole DAG, with the gated node's `after` edges spelled out — and
110
+ writes/dispatches nothing."""
109
111
  open_issues = [
110
112
  {"number": 762, "milestone": {"number": 9}},
111
113
  {"number": 763, "milestone": {"number": 9}},
@@ -122,17 +124,18 @@ class TestMilestoneDispatchDryRun:
122
124
  assert result.exit_code == 0, result.output
123
125
  disp.assert_not_called()
124
126
 
125
- will_dispatch = result.output.split("Will dispatch now:")[1].split("Waiting:")[0]
126
- assert "#762" in will_dispatch
127
- assert "#763" in will_dispatch
128
- waiting_section = result.output.split("Waiting:")[1]
129
- assert "#765" in waiting_section
130
- assert "waiting on #762, #763" in waiting_section
127
+ plan_section = result.output.split("Will queue (drive-queue), in dependency order:")[1]
128
+ assert "#762" in plan_section
129
+ assert "#763" in plan_section
130
+ assert "#765 (after api#762, api#763)" in plan_section
131
131
  assert "dry run" in result.output
132
+ # Nothing written — the dry run leaves the queue untouched.
133
+ assert state_mod.list_drive_queue() == []
132
134
 
133
- def test_cohort_merging_unblocks_gated_node(self, config_file: Path) -> None:
134
- """#769 acceptance criteria (second half): simulate #762/#763 merged ->
135
- #765 enters the ready frontier."""
135
+ def test_terminal_prereqs_are_dropped_from_after_edges(self, config_file: Path) -> None:
136
+ """#2335: #762/#763 already closed -> only #765 queues, with no
137
+ `after` edges (a closed issue never enters the queue, so an edge at
138
+ it would read as unsatisfiable to the tick)."""
136
139
  open_issues = [{"number": 765, "milestone": {"number": 9}}]
137
140
 
138
141
  def get_issue(repo, number):
@@ -149,9 +152,10 @@ class TestMilestoneDispatchDryRun:
149
152
  assert result.exit_code == 0, result.output
150
153
  disp.assert_not_called()
151
154
 
152
- will_dispatch = result.output.split("Will dispatch now:")[1]
153
- assert "#765" in will_dispatch
154
- assert "Waiting:" not in result.output
155
+ plan_section = result.output.split("Will queue (drive-queue), in dependency order:")[1]
156
+ assert "#765" in plan_section
157
+ assert "after" not in plan_section
158
+ assert "#762" not in plan_section
155
159
 
156
160
  def test_no_work_order_block_reports_and_exits_zero(self, config_file: Path) -> None:
157
161
  def get_issue_no_block(repo, number):
@@ -170,7 +174,12 @@ class TestMilestoneDispatchDryRun:
170
174
 
171
175
 
172
176
  class TestMilestoneDispatchBulk:
173
- def test_dispatches_ready_frontier_and_registers_drain(self, config_file: Path) -> None:
177
+ def test_enqueues_whole_dag_into_drive_queue(self, config_file: Path) -> None:
178
+ """#2335: bulk mode queues every open work-order node into the
179
+ drive-queue with `after=` edges carrying the DAG — it never calls
180
+ `coord.dispatch.dispatch` directly, and it no longer registers the
181
+ milestone for the daemon's direct-dispatch auto-drain (the queue IS
182
+ the durable drain)."""
174
183
  open_issues = [
175
184
  {"number": 762, "milestone": {"number": 9}},
176
185
  {"number": 763, "milestone": {"number": 9}},
@@ -179,36 +188,69 @@ class TestMilestoneDispatchBulk:
179
188
  with patch("coord.github_ops.get_issue", side_effect=_get_issue), \
180
189
  patch("coord.github_ops.get_open_issues", return_value=open_issues), \
181
190
  patch("coord.board_service.read_board", return_value=Board()), \
182
- patch("coord.dispatch.dispatch", side_effect=[{"id": "a1"}, {"id": "a2"}]) as disp, \
183
- patch("coord.github_ops.post_issue_comment"), \
184
- patch("coord.github_ops.check_branch_exists", return_value=False):
191
+ patch("coord.dispatch.dispatch") as disp:
185
192
  result = CliRunner().invoke(
186
193
  main,
187
194
  ["milestone", "dispatch", "api", "100", "--config", str(config_file)],
188
195
  )
189
196
  assert result.exit_code == 0, result.output
190
- assert disp.call_count == 2
191
- assert "a1" in result.output
192
- assert "a2" in result.output
197
+ disp.assert_not_called()
198
+
199
+ rows = state_mod.list_drive_queue()
200
+ assert [(r["repo_name"], r["issue_number"]) for r in rows] == [
201
+ ("api", 762), ("api", 763), ("api", 765),
202
+ ]
203
+ by_issue = {r["issue_number"]: r for r in rows}
204
+ assert by_issue[762]["after_json"] == []
205
+ assert by_issue[763]["after_json"] == []
206
+ assert by_issue[765]["after_json"] == ["api#762", "api#763"]
207
+
208
+ assert "queued api#762" in result.output
209
+ assert "queued api#765 after api#762, api#763" in result.output
210
+ assert "3 issue(s) queued" in result.output
211
+ assert "coord drive-queue tick" in result.output
212
+
213
+ # No direct dispatch happened, so nothing was recorded as dispatched
214
+ # and no daemon auto-drain registration is needed or wanted.
215
+ assert state_mod.load_dispatched() == []
216
+ assert state_mod.list_milestone_drains() == []
217
+ assert "registered for daemon auto-drain" not in result.output
193
218
 
194
- # Both cohort issues fanned out to distinct machines.
195
- machine_names = {c.args[0].machine_name for c in disp.call_args_list}
196
- assert machine_names == {"laptop", "server"}
219
+ def test_dependent_declared_first_still_queues_after_its_prereq(
220
+ self, config_file: Path
221
+ ) -> None:
222
+ """#2335: declared order is not necessarily topological — a node
223
+ declared before its own pre-req still queues after it, so queue
224
+ positions read in dependency order."""
225
+ body = "## Work order\n- [ ] #765 {after: #762}\n- [ ] #762\n"
226
+ open_issues = [
227
+ {"number": 762, "milestone": {"number": 9}},
228
+ {"number": 765, "milestone": {"number": 9}},
229
+ ]
197
230
 
198
- records = state_mod.load_dispatched()
199
- assert len(records) == 2
231
+ def get_issue(repo, number):
232
+ return _get_issue(repo, number, bodies={100: body})
233
+
234
+ with patch("coord.github_ops.get_issue", side_effect=get_issue), \
235
+ patch("coord.github_ops.get_open_issues", return_value=open_issues), \
236
+ patch("coord.board_service.read_board", return_value=Board()), \
237
+ patch("coord.dispatch.dispatch") as disp:
238
+ result = CliRunner().invoke(
239
+ main,
240
+ ["milestone", "dispatch", "api", "100", "--config", str(config_file)],
241
+ )
242
+ assert result.exit_code == 0, result.output
243
+ disp.assert_not_called()
200
244
 
201
- # #765 still open (not terminal) -> the milestone registers for
202
- # daemon auto-drain.
203
- drains = state_mod.list_milestone_drains()
204
- assert drains == [{"repo_name": "api", "tracking_issue": 100}]
205
- assert "registered for daemon auto-drain" in result.output
245
+ rows = state_mod.list_drive_queue()
246
+ assert [r["issue_number"] for r in rows] == [762, 765]
247
+ assert rows[1]["after_json"] == ["api#762"]
206
248
 
207
- def test_already_complete_milestone_dispatches_nothing_and_does_not_register(
249
+ def test_already_complete_milestone_queues_nothing_and_does_not_register(
208
250
  self, config_file: Path
209
251
  ) -> None:
210
- """Every node already terminal at fetch time -> empty ready frontier,
211
- nothing dispatched, no daemon auto-drain registration needed."""
252
+ """Every node already terminal at fetch time -> nothing to queue,
253
+ nothing dispatched, no daemon auto-drain registration."""
212
254
  body = "## Work order\n- [ ] #762\n"
213
255
  open_issues: list[dict] = []
214
256
 
@@ -225,7 +267,8 @@ class TestMilestoneDispatchBulk:
225
267
  )
226
268
  assert result.exit_code == 0, result.output
227
269
  disp.assert_not_called()
228
- assert "Nothing to dispatch right now." in result.output
270
+ assert "Nothing to queue" in result.output
271
+ assert state_mod.list_drive_queue() == []
229
272
  assert state_mod.list_milestone_drains() == []
230
273
 
231
274
 
@@ -429,9 +472,9 @@ class TestMilestoneDispatchGateA:
429
472
  )
430
473
  assert result.exit_code == 0, result.output
431
474
  assert "Gate A" not in result.output
432
- will_dispatch = result.output.split("Will dispatch now:")[1].split("Waiting:")[0]
433
- assert "#762" in will_dispatch
434
- assert "#763" in will_dispatch
475
+ plan_section = result.output.split("Will queue (drive-queue), in dependency order:")[1]
476
+ assert "#762" in plan_section
477
+ assert "#763" in plan_section
435
478
 
436
479
  def test_repo_without_acceptance_driver_is_unaffected(self, config_file: Path) -> None:
437
480
  """No `acceptance.drivers` entry for this repo -> Gate A is a no-op,
@@ -27,6 +27,7 @@ from coord.milestone_dispatch import (
27
27
  issue_oracle_ready,
28
28
  pick_machine,
29
29
  plan_dispatch,
30
+ plan_queue,
30
31
  )
31
32
  from coord.milestone_order import WorkOrder, WorkOrderNode
32
33
  from coord.models import Assignment, Board, Machine, Repo
@@ -168,6 +169,46 @@ class TestPlanDispatch:
168
169
  assert plan.waiting == ()
169
170
 
170
171
 
172
+ # ── plan_queue (#2335) ───────────────────────────────────────────────────────
173
+
174
+
175
+ class TestPlanQueue:
176
+ def test_whole_dag_in_declared_order_with_qualified_after_keys(self) -> None:
177
+ plan = plan_queue(WORK_ORDER, terminal_issues=set(), repo_name="api")
178
+ assert [q.issue_number for q in plan] == [762, 763, 765]
179
+ assert plan[0].after == ()
180
+ assert plan[0].group == "A"
181
+ assert plan[1].after == ()
182
+ assert plan[2].after == ("api#762", "api#763")
183
+ assert plan[2].group is None
184
+
185
+ def test_terminal_nodes_are_dropped_and_their_edges_filtered(self) -> None:
186
+ plan = plan_queue(WORK_ORDER, terminal_issues={762}, repo_name="api")
187
+ assert [q.issue_number for q in plan] == [763, 765]
188
+ # The closed pre-req never enters the queue, so its edge is dropped;
189
+ # the still-open one is kept.
190
+ assert plan[1].after == ("api#763",)
191
+
192
+ def test_all_terminal_yields_empty_plan(self) -> None:
193
+ plan = plan_queue(WORK_ORDER, terminal_issues={762, 763, 765}, repo_name="api")
194
+ assert plan == ()
195
+
196
+ def test_dependent_declared_before_prereq_sorts_topologically(self) -> None:
197
+ order = WorkOrder(
198
+ nodes=(WorkOrderNode(765, after=(762,)), WorkOrderNode(762))
199
+ )
200
+ plan = plan_queue(order, terminal_issues=set(), repo_name="api")
201
+ assert [q.issue_number for q in plan] == [762, 765]
202
+ assert plan[1].after == ("api#762",)
203
+
204
+ def test_independent_nodes_keep_declared_order(self) -> None:
205
+ order = WorkOrder(
206
+ nodes=(WorkOrderNode(3), WorkOrderNode(1), WorkOrderNode(2))
207
+ )
208
+ plan = plan_queue(order, terminal_issues=set(), repo_name="api")
209
+ assert [q.issue_number for q in plan] == [3, 1, 2]
210
+
211
+
171
212
  # ── is_milestone_complete ────────────────────────────────────────────────────
172
213
 
173
214