code-coordinator 0.5.125__tar.gz → 0.5.126__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 (858) hide show
  1. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/block_log.py +104 -1
  5. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/drive_queue.py +256 -1
  6. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/drive_queue.py +97 -2
  7. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/merge_queue.py +36 -0
  8. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_block_log.py +50 -0
  9. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_drive_queue.py +151 -0
  10. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_drive_queue.py +115 -0
  11. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_merge_queue.py +57 -0
  12. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_thin_client_board_audit.py +14 -0
  13. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/.claude/commands/board.md +0 -0
  14. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/.claude/commands/complete-session.md +0 -0
  15. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/.claude/commands/coordinator.md +0 -0
  16. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/.githooks/_lib.sh +0 -0
  17. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/.githooks/post-checkout +0 -0
  18. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/.githooks/post-commit +0 -0
  19. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/.githooks/post-merge +0 -0
  20. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  21. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/.github/coord-ci-acceptance.yml +0 -0
  22. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/.github/workflows/auto-release.yml +0 -0
  23. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/.github/workflows/cargo-test.yml +0 -0
  24. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/.github/workflows/publish.yml +0 -0
  25. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/.github/workflows/release-tui.yml +0 -0
  26. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/.github/workflows/test.yml +0 -0
  27. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/.gitignore +0 -0
  28. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/CLAUDE.md +0 -0
  29. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/GOAL.md +0 -0
  30. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/LICENSE +0 -0
  31. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/MANIFEST.in +0 -0
  32. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/README.md +0 -0
  33. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/code_coordinator.egg-info/SOURCES.txt +0 -0
  34. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/code_coordinator.egg-info/dependency_links.txt +0 -0
  35. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/code_coordinator.egg-info/entry_points.txt +0 -0
  36. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/code_coordinator.egg-info/requires.txt +0 -0
  37. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/code_coordinator.egg-info/scm_file_list.json +0 -0
  38. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/code_coordinator.egg-info/top_level.txt +0 -0
  39. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/__init__.py +0 -0
  40. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/_board_mapping.py +0 -0
  41. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/acceptance.py +0 -0
  42. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/acceptance_drivers.py +0 -0
  43. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/agent.py +0 -0
  44. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/agent_app.py +0 -0
  45. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/agent_update.py +0 -0
  46. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/agents/opencode/.gitignore +0 -0
  47. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/agents/opencode/agents/work.md +0 -0
  48. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/agents/opencode/routing.jsonc +0 -0
  49. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/audit.py +0 -0
  50. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/auto_loop.py +0 -0
  51. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/board_bool_guard.py +0 -0
  52. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/board_service.py +0 -0
  53. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/board_wire.py +0 -0
  54. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/brain.py +0 -0
  55. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/branch_model.py +0 -0
  56. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/bug_intake.py +0 -0
  57. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/cargo_cache.py +0 -0
  58. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/ci_github.py +0 -0
  59. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/ci_store.py +0 -0
  60. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/claim.py +0 -0
  61. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/cli.py +0 -0
  62. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/client.py +0 -0
  63. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/__init__.py +0 -0
  64. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/_common.py +0 -0
  65. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/acceptance.py +0 -0
  66. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/agent_ops.py +0 -0
  67. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/audit.py +0 -0
  68. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/chat.py +0 -0
  69. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/dispatch.py +0 -0
  70. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/dispatch_workers.py +0 -0
  71. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/drive.py +0 -0
  72. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/gate_a.py +0 -0
  73. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/gates.py +0 -0
  74. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/issues.py +0 -0
  75. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/lifecycle.py +0 -0
  76. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/merge.py +0 -0
  77. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/milestone.py +0 -0
  78. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/plan_followup.py +0 -0
  79. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/plans.py +0 -0
  80. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/portal.py +0 -0
  81. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/release.py +0 -0
  82. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/repo.py +0 -0
  83. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/report.py +0 -0
  84. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/review.py +0 -0
  85. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/scorecard.py +0 -0
  86. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/sessions.py +0 -0
  87. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/setup.py +0 -0
  88. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/status.py +0 -0
  89. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/terminal.py +0 -0
  90. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/test_gate.py +0 -0
  91. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/commands/tui.py +0 -0
  92. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/comments.py +0 -0
  93. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/config.py +0 -0
  94. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/config_reload.py +0 -0
  95. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/conflict_fix.py +0 -0
  96. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dao.py +0 -0
  97. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/__init__.py +0 -0
  98. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/fixture.py +0 -0
  99. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/index.html +0 -0
  100. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/server.py +0 -0
  101. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/terminal.py +0 -0
  102. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/.gitignore +0 -0
  103. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/components.json +0 -0
  104. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/assets/Gallery-BoKs3mpY.js +0 -0
  105. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  106. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/assets/Terminal-CEsP08iX.js +0 -0
  107. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/assets/index-CDHPlB6k.js +0 -0
  108. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  109. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  110. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  111. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  112. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  113. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/index.html +0 -0
  114. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  115. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/sw.js +0 -0
  116. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  117. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  118. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  119. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  120. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  121. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  122. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  123. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  124. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  125. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  126. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/eslint.config.js +0 -0
  127. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/index.html +0 -0
  128. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  129. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/package-lock.json +0 -0
  130. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/package.json +0 -0
  131. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  132. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/playwright.config.ts +0 -0
  133. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/postcss.config.js +0 -0
  134. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  135. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  136. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  137. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/App.tsx +0 -0
  138. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/api/client.ts +0 -0
  139. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  140. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  141. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  142. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  143. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  144. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  145. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  146. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  147. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  148. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  149. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  150. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  151. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  152. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  153. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  154. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  155. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  156. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  157. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  158. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  159. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  160. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  161. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  162. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  163. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  164. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  165. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  166. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  167. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  168. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  169. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  170. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  171. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  172. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  173. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  174. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/index.css +0 -0
  175. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  176. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  177. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/main.tsx +0 -0
  178. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  179. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  180. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  181. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  182. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  183. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  184. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  185. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  186. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  187. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  188. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  189. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  190. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  191. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  192. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  193. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  194. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  195. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  196. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  197. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  198. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  199. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  200. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  201. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/tailwind.config.js +0 -0
  202. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/tsconfig.json +0 -0
  203. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  204. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dashboard/webapp/vite.config.ts +0 -0
  205. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/db.py +0 -0
  206. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dead_end.py +0 -0
  207. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/README.md +0 -0
  208. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-agent.service +0 -0
  209. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-db-backup.service +0 -0
  210. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-db-backup.sh +0 -0
  211. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-db-backup.timer +0 -0
  212. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-drive-queue.service +0 -0
  213. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-drive-queue.timer +0 -0
  214. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-notify.service +0 -0
  215. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-notify.timer +0 -0
  216. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-release-propagate.service +0 -0
  217. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-release-propagate.timer +0 -0
  218. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-release-window.service +0 -0
  219. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-release-window.timer +0 -0
  220. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-serve.service +0 -0
  221. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-web-dist-build.service +0 -0
  222. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-web-dist-build.timer +0 -0
  223. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy/coord-web.service +0 -0
  224. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy_manifest.py +0 -0
  225. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deploy_units.py +0 -0
  226. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/deps.py +0 -0
  227. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/diagnose.py +0 -0
  228. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dispatch.py +0 -0
  229. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/dist_name.py +0 -0
  230. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/drive.py +0 -0
  231. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/drive_state.py +0 -0
  232. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/events.py +0 -0
  233. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/failure_class.py +0 -0
  234. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/filelock.py +0 -0
  235. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/fleet_config_health.py +0 -0
  236. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/freshness.py +0 -0
  237. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/gate_a.py +0 -0
  238. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/gate_b.py +0 -0
  239. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/gate_snapshot.py +0 -0
  240. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/gates.py +0 -0
  241. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/github_ops.py +0 -0
  242. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/goal.py +0 -0
  243. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/graph_health.py +0 -0
  244. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/__init__.py +0 -0
  245. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/aggregate.py +0 -0
  246. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/__init__.py +0 -0
  247. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/agent_install.py +0 -0
  248. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/cargo_targets.py +0 -0
  249. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/claude_binary.py +0 -0
  250. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/deploy_lane_facts.py +0 -0
  251. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/disk.py +0 -0
  252. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/fleet_board.py +0 -0
  253. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  254. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/fleet_phantom.py +0 -0
  255. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/fleet_unit_drift.py +0 -0
  256. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/graph.py +0 -0
  257. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/graphify_cli.py +0 -0
  258. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/index_lock.py +0 -0
  259. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/plan_usage.py +0 -0
  260. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/repo_state.py +0 -0
  261. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/spawned_coord.py +0 -0
  262. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/timer_active.py +0 -0
  263. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/toolchain.py +0 -0
  264. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/unit_drift.py +0 -0
  265. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/unit_enablement.py +0 -0
  266. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/checks/worktrees.py +0 -0
  267. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/cli.py +0 -0
  268. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/context.py +0 -0
  269. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/fleet_snapshot.py +0 -0
  270. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/models.py +0 -0
  271. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/pypi.py +0 -0
  272. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/registry.py +0 -0
  273. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/render.py +0 -0
  274. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/health/units.py +0 -0
  275. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/hooks.py +0 -0
  276. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/housekeeping.py +0 -0
  277. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/interactive.py +0 -0
  278. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/issue_store.py +0 -0
  279. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/liveness_auditor.py +0 -0
  280. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/machine_pause.py +0 -0
  281. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/milestone_chat.py +0 -0
  282. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/milestone_dispatch.py +0 -0
  283. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/milestone_gate.py +0 -0
  284. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/milestone_order.py +0 -0
  285. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/mock_author.py +0 -0
  286. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/models.py +0 -0
  287. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/network.py +0 -0
  288. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/new_issue_chat.py +0 -0
  289. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/notifier/__init__.py +0 -0
  290. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/notifier/baseline.py +0 -0
  291. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/notifier/cli.py +0 -0
  292. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/notifier/collect.py +0 -0
  293. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/notifier/digest.py +0 -0
  294. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/notifier/models.py +0 -0
  295. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/notifier/predicate.py +0 -0
  296. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/notifier/service.py +0 -0
  297. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/notifier/store.py +0 -0
  298. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/notifier/transport.py +0 -0
  299. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/notify.py +0 -0
  300. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/openapi.py +0 -0
  301. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/overlap_fence.py +0 -0
  302. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/overlap_predict.py +0 -0
  303. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/parentage.py +0 -0
  304. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/parentage_github.py +0 -0
  305. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/pipeline.py +0 -0
  306. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/plan_parser.py +0 -0
  307. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/plans.py +0 -0
  308. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/platform_paths.py +0 -0
  309. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/portal_bridge.py +0 -0
  310. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/portal_store.py +0 -0
  311. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/portal_sync.py +0 -0
  312. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/pr_body_lint.py +0 -0
  313. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/prereqs.py +0 -0
  314. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/progress.py +0 -0
  315. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/providers/__init__.py +0 -0
  316. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/providers/base.py +0 -0
  317. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/providers/claude.py +0 -0
  318. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/providers/claude_pty.py +0 -0
  319. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/providers/opencode.py +0 -0
  320. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/queue_diagnose.py +0 -0
  321. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/reconcile.py +0 -0
  322. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/refine_chat.py +0 -0
  323. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/release_cordon.py +0 -0
  324. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/release_propagate.py +0 -0
  325. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/release_verify.py +0 -0
  326. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/release_window.py +0 -0
  327. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/repo_edit.py +0 -0
  328. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/repo_onboard.py +0 -0
  329. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/reports.py +0 -0
  330. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/revalidate.py +0 -0
  331. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/review.py +0 -0
  332. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/scorecard.py +0 -0
  333. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/serve_app.py +0 -0
  334. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/skills/portal-followup/SKILL.md +0 -0
  335. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/skills/update-issue/SKILL.md +0 -0
  336. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/smoke.py +0 -0
  337. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/spend_ceiling.py +0 -0
  338. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/split_work.py +0 -0
  339. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/stage_projection.py +0 -0
  340. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/state.py +0 -0
  341. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/test_author.py +0 -0
  342. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/test_chat.py +0 -0
  343. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/test_orchestrator.py +0 -0
  344. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/test_report.py +0 -0
  345. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/tui_release.py +0 -0
  346. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/usage.py +0 -0
  347. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/usage_limits.py +0 -0
  348. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/usage_rollup.py +0 -0
  349. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coord/worker_events.py +0 -0
  350. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/coordinator.example.yml +0 -0
  351. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-agent.service +0 -0
  352. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-db-backup.service +0 -0
  353. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-db-backup.sh +0 -0
  354. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-db-backup.timer +0 -0
  355. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-drive-queue.service +0 -0
  356. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-drive-queue.timer +0 -0
  357. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-notify.service +0 -0
  358. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-notify.timer +0 -0
  359. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-release-propagate.service +0 -0
  360. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-release-propagate.timer +0 -0
  361. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-release-window.service +0 -0
  362. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-release-window.timer +0 -0
  363. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-serve.service +0 -0
  364. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-web-dist-build.service +0 -0
  365. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-web-dist-build.sh +0 -0
  366. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-web-dist-build.timer +0 -0
  367. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-web-rollback.sh +0 -0
  368. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/coord-web.service +0 -0
  369. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/deploy/node-shim.sh +0 -0
  370. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/AGENT_OPERATIONS.md +0 -0
  371. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/ARCHITECTURE.md +0 -0
  372. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/ARCH_SECURITY_GATES.md +0 -0
  373. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/COCKPIT.md +0 -0
  374. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/CONTROL_CENTER.md +0 -0
  375. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/COST_DISCIPLINE.md +0 -0
  376. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/CROSS_PLATFORM.md +0 -0
  377. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/CUSTOMER_PORTAL.md +0 -0
  378. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/DRIVE_QUEUE.md +0 -0
  379. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/EPHEMERAL_WORKERS.md +0 -0
  380. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/FORGE_MIGRATION.md +0 -0
  381. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/GRAPHIFY_SETUP.md +0 -0
  382. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/ISSUE_GUIDANCE.md +0 -0
  383. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/MAC_MINI.md +0 -0
  384. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  385. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/NOTIFIER.md +0 -0
  386. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/OPENCODE_VERIFICATION.md +0 -0
  387. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/OPERATING_GOTCHAS.md +0 -0
  388. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/ORACLE_LOOP.md +0 -0
  389. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/PHONE_WEBAPP.md +0 -0
  390. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/PIPELINE_V2.md +0 -0
  391. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/PLATFORM_EVOLUTION.md +0 -0
  392. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/SECOND_BACKEND.md +0 -0
  393. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/STORE_SERVICE.md +0 -0
  394. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  395. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/WEB_CONTROL_CENTER.md +0 -0
  396. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/mocks/web/README.md +0 -0
  397. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/mocks/web/_tokens.css +0 -0
  398. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/mocks/web/issue-detail.html +0 -0
  399. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/mocks/web/pipeline-narrow.html +0 -0
  400. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/docs/mocks/web/pipeline-wide.html +0 -0
  401. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/graphify-out/.gitignore +0 -0
  402. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/install-agent.sh +0 -0
  403. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/pyproject.toml +0 -0
  404. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/audit_review_verdict_overrides.py +0 -0
  405. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  406. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/azure-workers/build-worker-image.sh +0 -0
  407. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/azure-workers/coordinator-machine.py +0 -0
  408. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/azure-workers/epic-down.sh +0 -0
  409. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/azure-workers/epic-up.sh +0 -0
  410. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/azure-workers/preflight.sh +0 -0
  411. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/azure-workers/provision-worker.sh +0 -0
  412. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  413. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  414. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/azure-workers/verify-github-token.sh +0 -0
  415. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/codegen.py +0 -0
  416. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/coord-test-runner.sh +0 -0
  417. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/drive-batch.sh +0 -0
  418. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/gen_board_fixture.py +0 -0
  419. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/next_release_tag.py +0 -0
  420. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/run_tests_in_populated_home.sh +0 -0
  421. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/run_tests_without_gh.sh +0 -0
  422. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/smoke_437_interactive.py +0 -0
  423. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/verify_878_review_capture.py +0 -0
  424. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/verify_release_published.py +0 -0
  425. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/scripts/verify_release_wheel.py +0 -0
  426. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/setup.cfg +0 -0
  427. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/SMOKE_SET.md +0 -0
  428. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/__init__.py +0 -0
  429. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  430. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-33/contract.md +0 -0
  431. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-33/manifest.yml +0 -0
  432. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  433. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  434. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  435. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  436. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-37/conftest.py +0 -0
  437. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-37/contract.md +0 -0
  438. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-37/manifest.yml +0 -0
  439. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  440. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  441. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-38/contract.md +0 -0
  442. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-38/manifest.yml +0 -0
  443. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  444. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  445. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  446. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  447. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  448. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  449. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  450. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  451. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  452. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  453. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-51/contract.md +0 -0
  454. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  455. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  456. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-51/manifest.yml +0 -0
  457. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  458. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-51/tsconfig.json +0 -0
  459. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  460. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-65/contract.md +0 -0
  461. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-65/manifest.yml +0 -0
  462. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  463. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  464. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  465. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  466. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  467. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  468. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  469. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  470. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  471. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/conftest.py +0 -0
  472. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/board-pipeline-basic.json +0 -0
  473. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  474. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  475. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  476. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  477. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/playwright/all_pass.json +0 -0
  478. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  479. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/playwright/mixed_fail.json +0 -0
  480. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  481. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  482. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/playwright/skip.json +0 -0
  483. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/playwright/truncated.json +0 -0
  484. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  485. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  486. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  487. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  488. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  489. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  490. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  491. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  492. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_acceptance.py +0 -0
  493. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_acceptance_drivers.py +0 -0
  494. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent.py +0 -0
  495. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_api_error.py +0 -0
  496. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_app.py +0 -0
  497. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_branch_base.py +0 -0
  498. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_branch_capture.py +0 -0
  499. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_config_free_1712.py +0 -0
  500. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_deploy_units_endpoint.py +0 -0
  501. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_dirty_worktree.py +0 -0
  502. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_graph_self_heal.py +0 -0
  503. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_health_h3.py +0 -0
  504. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_idle_restart.py +0 -0
  505. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_push_failure.py +0 -0
  506. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_reap.py +0 -0
  507. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_repos_and_pull.py +0 -0
  508. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_restart_services_endpoint.py +0 -0
  509. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_startup_diagnostics.py +0 -0
  510. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_update.py +0 -0
  511. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_update_bluegreen.py +0 -0
  512. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_usage_limit.py +0 -0
  513. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_agent_zero_commit.py +0 -0
  514. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_ambient_home_isolation.py +0 -0
  515. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_approve_reject_plan.py +0 -0
  516. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_approve_usage_gate.py +0 -0
  517. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_assignment_already_recorded_daemon.py +0 -0
  518. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_audit_log.py +0 -0
  519. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_audit_outcome.py +0 -0
  520. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_audit_query.py +0 -0
  521. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_auto_loop.py +0 -0
  522. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_auto_release_publish_2035.py +0 -0
  523. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_base_checkout_restore.py +0 -0
  524. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_board_cap_762.py +0 -0
  525. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_board_fixture.py +0 -0
  526. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_board_read_path.py +0 -0
  527. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_board_service.py +0 -0
  528. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_board_state.py +0 -0
  529. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_board_wire.py +0 -0
  530. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_brain.py +0 -0
  531. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_branch_model.py +0 -0
  532. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_bug_intake.py +0 -0
  533. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_build_worker_image_env_update.py +0 -0
  534. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cargo_cache.py +0 -0
  535. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_ci_acceptance_gate_1950.py +0 -0
  536. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_ci_parity_2091.py +0 -0
  537. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_ci_store.py +0 -0
  538. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_claim.py +0 -0
  539. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_acceptance.py +0 -0
  540. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_assign.py +0 -0
  541. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  542. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_assign_interactive_remote.py +0 -0
  543. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_assign_provider.py +0 -0
  544. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  545. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_audit.py +0 -0
  546. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_chat_continue.py +0 -0
  547. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_diagnose_config_provenance.py +0 -0
  548. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_diagnose_graph.py +0 -0
  549. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_doctor.py +0 -0
  550. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_doctor_config_free_1801.py +0 -0
  551. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  552. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_drive.py +0 -0
  553. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_escalate.py +0 -0
  554. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_fix_headless_review.py +0 -0
  555. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_gate_a.py +0 -0
  556. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_install_drift.py +0 -0
  557. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_install_skills.py +0 -0
  558. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_issue_create_label.py +0 -0
  559. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_issue_reopen.py +0 -0
  560. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_merge.py +0 -0
  561. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_milestone_assign.py +0 -0
  562. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_milestone_capture.py +0 -0
  563. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_milestone_chat_add_child.py +0 -0
  564. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_milestone_dispatch.py +0 -0
  565. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_milestone_gate_b.py +0 -0
  566. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_milestone_gate_c.py +0 -0
  567. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_milestone_order.py +0 -0
  568. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  569. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_milestone_ship.py +0 -0
  570. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_network.py +0 -0
  571. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_new_issue_chat.py +0 -0
  572. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_plans.py +0 -0
  573. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_portal.py +0 -0
  574. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_pull_artifact.py +0 -0
  575. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_queue.py +0 -0
  576. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_reattach_sessions.py +0 -0
  577. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_refine_board.py +0 -0
  578. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_release_preflight.py +0 -0
  579. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_release_propagate.py +0 -0
  580. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_release_window.py +0 -0
  581. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_repo_2220.py +0 -0
  582. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_scorecard.py +0 -0
  583. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_set_review_findings.py +0 -0
  584. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_status_advisory_terminal.py +0 -0
  585. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_status_merge_queue.py +0 -0
  586. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_status_provider.py +0 -0
  587. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_status_review_finalizing.py +0 -0
  588. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_status_test_failed_tag.py +0 -0
  589. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_status_usage_limit.py +0 -0
  590. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_sync_comments_873.py +0 -0
  591. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_test_plan.py +0 -0
  592. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_track.py +0 -0
  593. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_tui_update.py +0 -0
  594. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cli_wait.py +0 -0
  595. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_client_base_install.py +0 -0
  596. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_comments.py +0 -0
  597. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_completion_summary.py +0 -0
  598. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_config.py +0 -0
  599. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_config_acceptance.py +0 -0
  600. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_config_audit.py +0 -0
  601. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_config_pricing.py +0 -0
  602. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  603. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_config_usage_gate.py +0 -0
  604. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_conflict_fix.py +0 -0
  605. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_conflict_fix_semantic.py +0 -0
  606. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_coord_test.py +0 -0
  607. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_coord_test_runner_baseline.py +0 -0
  608. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_coord_test_runner_routing.py +0 -0
  609. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_coord_test_runner_toolchain.py +0 -0
  610. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_coord_web_sse_restart_live.py +0 -0
  611. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_coordinator_machine.py +0 -0
  612. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_cross_platform_imports.py +0 -0
  613. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_dashboard.py +0 -0
  614. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_dashboard_fixture.py +0 -0
  615. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_dashboard_terminal.py +0 -0
  616. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_dashboard_terminal_live.py +0 -0
  617. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_db.py +0 -0
  618. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_dead_end.py +0 -0
  619. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_deploy_coord_db_backup.py +0 -0
  620. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_deploy_coord_web_dist.py +0 -0
  621. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_deploy_coord_web_rollback.py +0 -0
  622. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_deploy_drive_queue_unit.py +0 -0
  623. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_deploy_manifest.py +0 -0
  624. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_deploy_units_lane.py +0 -0
  625. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_deploy_web_unit.py +0 -0
  626. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_deps.py +0 -0
  627. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_diagnose.py +0 -0
  628. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_dispatch.py +0 -0
  629. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_dispatch_target_validation.py +0 -0
  630. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_dist_name.py +0 -0
  631. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_done_housekeeping.py +0 -0
  632. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_drive.py +0 -0
  633. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_drive_state.py +0 -0
  634. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_drive_tmux.py +0 -0
  635. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_epic_up_capability_detection.py +0 -0
  636. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  637. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_epic_up_image_provenance.py +0 -0
  638. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_errors.py +0 -0
  639. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_events.py +0 -0
  640. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_failure_class.py +0 -0
  641. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_filelock.py +0 -0
  642. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  643. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_fix_of_force_override.py +0 -0
  644. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_fleet_config_health.py +0 -0
  645. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_fleet_health_probes.py +0 -0
  646. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_fleet_health_snapshot.py +0 -0
  647. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_freshness.py +0 -0
  648. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_gate_a.py +0 -0
  649. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_gate_b.py +0 -0
  650. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_gate_snapshot_staleness.py +0 -0
  651. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_gates.py +0 -0
  652. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  653. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_generated_types_fixture.py +0 -0
  654. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_github_ops.py +0 -0
  655. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_goal.py +0 -0
  656. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_graph_health.py +0 -0
  657. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_graph_selfheal_absent_2237.py +0 -0
  658. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_handoff.py +0 -0
  659. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_health_checks.py +0 -0
  660. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_health_cli.py +0 -0
  661. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_health_cli_graph.py +0 -0
  662. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_health_config.py +0 -0
  663. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_health_context.py +0 -0
  664. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_health_deploy_lane_facts.py +0 -0
  665. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_health_incident_regression.py +0 -0
  666. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_health_pypi.py +0 -0
  667. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_health_registry.py +0 -0
  668. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_health_timer_active.py +0 -0
  669. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_health_toolchain.py +0 -0
  670. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_health_unit_drift.py +0 -0
  671. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_health_unit_enablement.py +0 -0
  672. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_hooks.py +0 -0
  673. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_human_attended_437.py +0 -0
  674. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_init.py +0 -0
  675. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_integration.py +0 -0
  676. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_interactive_briefing_echo.py +0 -0
  677. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_interactive_prefill_state.py +0 -0
  678. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_interactive_session_relaunch.py +0 -0
  679. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_interactive_test_verdict_backstop.py +0 -0
  680. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_interactive_token_attribution.py +0 -0
  681. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_interactive_worktree.py +0 -0
  682. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_issue_store_seam.py +0 -0
  683. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_liveness_auditor.py +0 -0
  684. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_liveness_notify.py +0 -0
  685. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_machine_pause.py +0 -0
  686. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_merge_verify.py +0 -0
  687. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_milestone_chat.py +0 -0
  688. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_milestone_dispatch.py +0 -0
  689. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_milestone_gate.py +0 -0
  690. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_milestone_order.py +0 -0
  691. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_milestone_seam.py +0 -0
  692. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_mock_author.py +0 -0
  693. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_model_tiering.py +0 -0
  694. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_models.py +0 -0
  695. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_models_config_labels.py +0 -0
  696. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_needs_attention.py +0 -0
  697. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_network.py +0 -0
  698. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_new_issue_chat.py +0 -0
  699. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_next_release_tag.py +0 -0
  700. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_no_direct_gh_calls.py +0 -0
  701. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_node_shim.py +0 -0
  702. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_notifier_baseline.py +0 -0
  703. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_notifier_cli.py +0 -0
  704. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_notifier_collect.py +0 -0
  705. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_notifier_config.py +0 -0
  706. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_notifier_drive_seam.py +0 -0
  707. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_notifier_isolation.py +0 -0
  708. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_notifier_predicate.py +0 -0
  709. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_notifier_quiet_hours.py +0 -0
  710. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_notifier_service.py +0 -0
  711. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_notify.py +0 -0
  712. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_notify_drain.py +0 -0
  713. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_openapi.py +0 -0
  714. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_operational_defaults.py +0 -0
  715. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_overlap_fence.py +0 -0
  716. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_overlap_predict.py +0 -0
  717. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_packaged_deploy_units.py +0 -0
  718. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_parentage.py +0 -0
  719. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_paste_landed.py +0 -0
  720. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_pipeline.py +0 -0
  721. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_plan_followup_approve_plan_command.py +0 -0
  722. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_plan_followup_pr_command.py +0 -0
  723. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_plan_followup_review_command.py +0 -0
  724. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_plan_only.py +0 -0
  725. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_plan_parser.py +0 -0
  726. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_platform_paths.py +0 -0
  727. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_portal_bridge.py +0 -0
  728. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_portal_config.py +0 -0
  729. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_portal_sync.py +0 -0
  730. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_pr_body_lint.py +0 -0
  731. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_prereqs.py +0 -0
  732. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_production_db_guard.py +0 -0
  733. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_progress.py +0 -0
  734. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_provider_seam.py +0 -0
  735. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_providers.py +0 -0
  736. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_providers_config_labels.py +0 -0
  737. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_providers_pty.py +0 -0
  738. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_quiet_hours.py +0 -0
  739. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_quiet_hours_store_2146.py +0 -0
  740. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_reap_merged_sessions.py +0 -0
  741. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_reap_stale_interactive_tick.py +0 -0
  742. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_reconcile.py +0 -0
  743. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_reconcile_branch.py +0 -0
  744. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_reconcile_completions.py +0 -0
  745. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_reconcile_merges.py +0 -0
  746. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_reconcile_no_agent_record.py +0 -0
  747. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_reconcile_usage_limit_done.py +0 -0
  748. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_refine_chat.py +0 -0
  749. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_release_cordon_2101.py +0 -0
  750. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  751. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_release_cordon_deadlock_2240.py +0 -0
  752. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_release_propagate.py +0 -0
  753. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_release_unified_1242.py +0 -0
  754. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_release_verify.py +0 -0
  755. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_release_window.py +0 -0
  756. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_remote_auto_prune.py +0 -0
  757. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_remote_interactive_reaper.py +0 -0
  758. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_repo_edit_2220.py +0 -0
  759. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_repo_graph_fleet_2237.py +0 -0
  760. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_repo_onboard_2220.py +0 -0
  761. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_report_result_push.py +0 -0
  762. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_reports.py +0 -0
  763. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_retry.py +0 -0
  764. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_retry_advisory_1606.py +0 -0
  765. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_retry_type_1636.py +0 -0
  766. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_revalidate.py +0 -0
  767. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_review.py +0 -0
  768. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_review_end_review_without_verdict.py +0 -0
  769. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_review_parse_failure_diagnostic.py +0 -0
  770. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_review_reaffirm.py +0 -0
  771. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_review_state.py +0 -0
  772. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_review_verdict_backstop.py +0 -0
  773. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_review_verdict_override_audit.py +0 -0
  774. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_review_verdict_relay.py +0 -0
  775. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_review_zero_commits.py +0 -0
  776. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_scoped_review_wiring.py +0 -0
  777. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_scorecard.py +0 -0
  778. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_serve.py +0 -0
  779. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_serve_app_board_trim.py +0 -0
  780. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_session.py +0 -0
  781. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_slice_issue_attribution.py +0 -0
  782. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_smoke.py +0 -0
  783. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_smoke_live_checkout_restore.py +0 -0
  784. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_smoke_workflow.py +0 -0
  785. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_spend_ceiling.py +0 -0
  786. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_spend_ceiling_coordinator.py +0 -0
  787. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_split.py +0 -0
  788. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_split_work.py +0 -0
  789. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_stage_projection.py +0 -0
  790. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_stalled_pipeline.py +0 -0
  791. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_state.py +0 -0
  792. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_state_review_findings_daemon.py +0 -0
  793. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_status_fleet_footer.py +0 -0
  794. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_stop_1567.py +0 -0
  795. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_stuck.py +0 -0
  796. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_terminal_command.py +0 -0
  797. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_test_author.py +0 -0
  798. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_test_chat.py +0 -0
  799. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_test_orchestrator.py +0 -0
  800. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_test_report.py +0 -0
  801. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_test_verdict_parsing.py +0 -0
  802. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_test_verdict_transcript_floor.py +0 -0
  803. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_thin_client_config_load_1080.py +0 -0
  804. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_thin_client_daemon_routing_906.py +0 -0
  805. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_tmux_host.py +0 -0
  806. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_tmux_session.py +0 -0
  807. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_transcript_floor.py +0 -0
  808. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_usage.py +0 -0
  809. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_usage_limits.py +0 -0
  810. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_usage_rollup.py +0 -0
  811. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_venv_live_install_2121.py +0 -0
  812. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_version_single_source.py +0 -0
  813. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_watch.py +0 -0
  814. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  815. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_worker_events.py +0 -0
  816. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_worker_image_pin_sync.py +0 -0
  817. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_worker_safety.py +0 -0
  818. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_worker_test_scoping.py +0 -0
  819. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_worktree.py +0 -0
  820. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  821. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/Cargo.lock +0 -0
  822. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/Cargo.toml +0 -0
  823. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/cargo-config-local-quadraui.toml.example +0 -0
  824. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/audit.rs +0 -0
  825. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/chat.rs +0 -0
  826. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/data.rs +0 -0
  827. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/dialogs.rs +0 -0
  828. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/drive.rs +0 -0
  829. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/drive_queue.rs +0 -0
  830. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/escalation.rs +0 -0
  831. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/events.rs +0 -0
  832. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/fixtures.rs +0 -0
  833. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/fleet_health.rs +0 -0
  834. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/fleet_sessions.rs +0 -0
  835. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/fleet_terminals.rs +0 -0
  836. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/format.rs +0 -0
  837. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/milestone_dag.rs +0 -0
  838. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/mod.rs +0 -0
  839. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/msv.rs +0 -0
  840. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/pipeline.rs +0 -0
  841. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/plans.rs +0 -0
  842. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/render.rs +0 -0
  843. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/reports.rs +0 -0
  844. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/sessions.rs +0 -0
  845. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/settings_ui.rs +0 -0
  846. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/sidebar.rs +0 -0
  847. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/terminal.rs +0 -0
  848. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/tests.rs +0 -0
  849. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/types.rs +0 -0
  850. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/app/workspace.rs +0 -0
  851. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/bin/gtk.rs +0 -0
  852. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/commands.rs +0 -0
  853. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/lib.rs +0 -0
  854. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/main.rs +0 -0
  855. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/src/settings.rs +0 -0
  856. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/tests/acceptance.rs +0 -0
  857. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/tui/tests/cli.rs +0 -0
  858. {code_coordinator-0.5.125 → code_coordinator-0.5.126}/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.125
3
+ Version: 0.5.126
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.125
3
+ Version: 0.5.126
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.125",
2
+ "tag": "0.5.126",
3
3
  "distance": 0,
4
- "node": "g45b284e5f4bdc6047cbd9db9e0a0d4f1c11ca154",
4
+ "node": "gd69faff040adaad7a346ab65c483934e1eca4c66",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-17"
@@ -70,7 +70,9 @@ from typing import Any
70
70
 
71
71
  from coord.drive_queue import (
72
72
  STATE_BLOCKED,
73
+ STATE_DONE,
73
74
  STATE_PARKED,
75
+ STATE_WAITING,
74
76
  QueueEntry,
75
77
  TickPlan,
76
78
  )
@@ -107,6 +109,8 @@ __all__ = [
107
109
  "episodes",
108
110
  "is_by_design",
109
111
  "log_location",
112
+ "merge_only_event",
113
+ "merge_only_fallback_event",
110
114
  "operator_resolution_event",
111
115
  "plan_events",
112
116
  "read_events",
@@ -221,6 +225,20 @@ _LANDED_CAUSE = (
221
225
  "already-landed — the work merged or closed while the entry sat in this "
222
226
  "state, so the stated reason had outlived the thing it described"
223
227
  )
228
+ #: #2350: distinct from `_LANDED_CAUSE` on purpose — that one means "the entry
229
+ #: sat here and something ELSE finished it while nobody was looking" (a human,
230
+ #: an unrelated branch merge, `coord reconcile-merges`); this one means the
231
+ #: QUEUE ITSELF, this same tick, ran `coord merge --only` and landed it —
232
+ #: see `coord.commands.drive_queue._run_merge_only_candidates`'s success
233
+ #: branch, the ONLY writer of the `outcome == "merged"` `_resolve_record`
234
+ #: reads to pick this cause. Conflating the two into one `auto-released`-style
235
+ #: bucket is exactly what #2350 was written to stop: #2235's corpus needs to
236
+ #: tell "the mechanism did this" apart from "the state flipped and something
237
+ #: unrelated did it".
238
+ _AUTO_MERGED_CAUSE = (
239
+ "auto-merged — the queue completed the merge directly from the tick "
240
+ "(#2350), Test/Review already satisfied; Merge was the only gate left"
241
+ )
224
242
  _OPERATOR_CAUSE = (
225
243
  "operator-intervened — no automatic release fired; a human cleared it by "
226
244
  "hand, and what they actually fixed is NOT recorded here"
@@ -405,7 +423,17 @@ def _resolve_record(
405
423
  now: float,
406
424
  outcome: str,
407
425
  ) -> dict[str, Any]:
408
- if outcome == "done" or new_state == "done":
426
+ if outcome == "merged":
427
+ # #2350: checked BEFORE the "done" branch below — a successful
428
+ # Merge-only fast-path attempt also lands `new_state == "done"` (it
429
+ # skips the `waiting`/relaunch cycle entirely), so without this
430
+ # ordering the generic landed check would win the match and this
431
+ # episode would be indistinguishable from "something else merged it
432
+ # while it sat here" — exactly the conflation #2350 exists to split
433
+ # out of #2230's `auto-released`/#2055's `already-landed`.
434
+ true_cause, human = _AUTO_MERGED_CAUSE, False
435
+ resolution = "auto_merged"
436
+ elif outcome == "done" or new_state == "done":
409
437
  true_cause, human = _LANDED_CAUSE, False
410
438
  resolution = "landed"
411
439
  elif outcome == "resumed":
@@ -471,6 +499,81 @@ def enter_event(
471
499
  return record
472
500
 
473
501
 
502
+ def merge_only_event(
503
+ entry: QueueEntry,
504
+ *,
505
+ host: str = "",
506
+ now: float | None = None,
507
+ ) -> dict[str, Any]:
508
+ """The ``resolve`` record for #2350's Merge-only fast path.
509
+
510
+ The other caller-constructed record besides :func:`enter_event`, and for
511
+ the identical structural reason: the transition happens OUTSIDE
512
+ :func:`plan_events`'s view. A `merge_only` :class:`~coord.drive_queue.
513
+ Reconcile` deliberately writes no `state` (see its docstring), so
514
+ `plan.writes()` never carries the `parked`/`blocked` → `done` move this
515
+ function records — it only happens once the shell's own live
516
+ ``coord merge --only`` attempt reports success, strictly after
517
+ ``_apply_writes`` has already run for the rest of the tick. *entry* is
518
+ the PRE-tick snapshot (its ``state`` is still `parked`/`blocked`); the
519
+ entry has already landed by the time this is called, so `new_state` is
520
+ unconditionally :data:`~coord.drive_queue.STATE_DONE`.
521
+ """
522
+ stamp = time.time() if now is None else now
523
+ record = _resolve_record(
524
+ entry.key,
525
+ entry.state,
526
+ STATE_DONE,
527
+ "",
528
+ entry,
529
+ host=host,
530
+ now=stamp,
531
+ outcome="merged",
532
+ )
533
+ record["source"] = "tick"
534
+ return record
535
+
536
+
537
+ def merge_only_fallback_event(
538
+ entry: QueueEntry,
539
+ *,
540
+ reason: str,
541
+ host: str = "",
542
+ now: float | None = None,
543
+ ) -> dict[str, Any]:
544
+ """The ``resolve`` record for #2350's Merge-only fast path RACE case:
545
+ the live gate read clear enough to attempt a direct merge, but the
546
+ attempt itself did not confirm a landed merge, so
547
+ ``coord.commands.drive_queue._run_merge_only_candidates`` falls back to
548
+ exactly the pre-#2350 ``resumed`` shape (``STATE_WAITING``) — OUTSIDE
549
+ ``plan.writes()``, the same reason :func:`merge_only_event` exists for
550
+ the success case: without this, the episode :func:`plan_events` already
551
+ opened for *entry* would never see a matching close, and
552
+ ``coord drive-queue block-log`` would show it stuck ``(unresolved)``
553
+ forever even though the entry plainly left `parked`/`blocked` this tick.
554
+
555
+ Classified as an ordinary ``resumed`` outcome — not a new #2350 cause —
556
+ on purpose: unlike the success case, this genuinely IS "state flipped,
557
+ cause a plain gate re-clear" (:func:`_resume_cause`'s fallback,
558
+ ``auto-released``), the same honest non-answer a bare board-signal
559
+ resume already gets. #2350's distinct cause is reserved for the tick
560
+ actually landing the merge itself.
561
+ """
562
+ stamp = time.time() if now is None else now
563
+ record = _resolve_record(
564
+ entry.key,
565
+ entry.state,
566
+ STATE_WAITING,
567
+ reason,
568
+ entry,
569
+ host=host,
570
+ now=stamp,
571
+ outcome="resumed",
572
+ )
573
+ record["source"] = "tick"
574
+ return record
575
+
576
+
474
577
  def operator_resolution_event(
475
578
  entry: QueueEntry,
476
579
  *,
@@ -53,6 +53,7 @@ from coord.drive_queue import (
53
53
  QUEUE_ALERT_STAGE,
54
54
  RESUME_PROBE_TIMEOUT_SECONDS,
55
55
  STATE_BLOCKED,
56
+ STATE_DONE,
56
57
  STATE_FAILED,
57
58
  STATE_PARKED,
58
59
  STATE_RUNNING,
@@ -98,6 +99,33 @@ from coord.overlap_predict import (
98
99
  # budget.
99
100
  _LAUNCH_TIMEOUT_SECONDS = 120.0
100
101
 
102
+ # Wall-clock ceiling for the tick's own `coord merge --only` attempt
103
+ # (#2350's fast path, `_run_merge_only_candidates`). Deliberately its OWN
104
+ # constant, not a reuse of `_LAUNCH_TIMEOUT_SECONDS` above: that one is
105
+ # scoped to a `coord drive --tmux` launch, which only ever blocks on #1606's
106
+ # bounded liveness check, so 120s is already generous there. `coord merge
107
+ # --only` is a different animal — elsewhere in the codebase
108
+ # (`Driver._spawn` in `coord/drive.py`) the SAME subcommand runs under NO
109
+ # subprocess timeout at all, nested inside up to a 1800s merge-lock
110
+ # acquisition, i.e. the existing precedent treats its runtime as
111
+ # unbounded/long, not launch-fast. This call site does still want a
112
+ # backstop — unlike `_spawn`'s fire-and-forget, this one runs synchronously
113
+ # inside `drive_queue_tick`, in a loop over every `merge_only` candidate
114
+ # this tick found (typically 0-2, see `_fetch_merge_only_ready`, but not
115
+ # hard-capped), and a wedge here stalls the whole tick — so it gets a wider
116
+ # ceiling than the launch check instead of no ceiling at all, without going
117
+ # fully unbounded: `coord-drive-queue.service` (the deployed timer unit)
118
+ # gives the ENTIRE `coord drive-queue tick` invocation only 300s
119
+ # (`TimeoutStartSec`) before systemd kills it outright, which is a harder
120
+ # and less graceful stop than this subprocess's own SIGKILL. 240s leaves
121
+ # room for one slow `gh pr merge`/git round trip on a bad network day
122
+ # without letting a single candidate alone consume the whole tick's outer
123
+ # budget (this PR's invocation never passes `--revalidate`, so
124
+ # `wait_for_ci_settle`'s up to 360s doesn't even apply today, but the argv
125
+ # could grow that flag later — revisit this ceiling together with
126
+ # `coord-drive-queue.service`'s `TimeoutStartSec` if it does).
127
+ _MERGE_ONLY_TIMEOUT_SECONDS = 240.0
128
+
101
129
  # Counts are rendered in pipeline order, not alphabetically, so
102
130
  # `coord drive-queue status` reads as "1 running · 1 waiting". `parked`
103
131
  # (#1891) sits between `waiting` and `blocked` — closer to "nothing wrong"
@@ -2037,6 +2065,82 @@ def _fetch_live_blocked_gate(
2037
2065
  return overrides
2038
2066
 
2039
2067
 
2068
+ def _fetch_merge_only_ready(
2069
+ entries: list,
2070
+ live_ci_gate: Mapping[str, bool],
2071
+ live_blocked_gate: Mapping[str, bool],
2072
+ ) -> dict[str, bool]:
2073
+ """``{entry_key: True}`` for #2350's Merge-only fast path: every entry
2074
+ THIS tick's live gate re-check just found clear — a `parked` entry with
2075
+ ``live_ci_gate[key] is False``, a `blocked` one with
2076
+ ``live_blocked_gate[key] is False`` — whose board-recorded pipeline
2077
+ state ALSO shows Test already `passed` and Review already `approve`,
2078
+ meaning Merge was the only gate that was ever still shut.
2079
+
2080
+ Scoped to exactly the entries about to reconcile `resumed` this tick —
2081
+ typically 0-2, the same bound :func:`_fetch_live_ci_gate`/
2082
+ :func:`_fetch_live_blocked_gate` already keep — so this never re-derives
2083
+ a gate reading of its own (that authority stays with *live_ci_gate*/
2084
+ *live_blocked_gate*, computed moments earlier in the same tick): it only
2085
+ adds two board-only reads (:func:`coord.merge_queue.has_approved_review`,
2086
+ :func:`coord.merge_queue.has_passed_test`) against the SAME local board
2087
+ those callers already loaded. Almost always cheap and I/O-free — but not
2088
+ unconditionally: ``has_approved_review`` can fall through to
2089
+ ``scan_approved_reviews``'s ``_backfill_branch_patch_id``, which does a
2090
+ live ``gh api compare`` round trip via *_gh_ops* when a stale-SHA review
2091
+ needs its patch-id computed on demand. That path is exception-guarded
2092
+ below and fails closed to the pre-#2350 `resumed` path like everything
2093
+ else here, so it is not unsafe — just not the zero-I/O read the rest of
2094
+ this docstring describes.
2095
+
2096
+ Takes no *config_path*, unlike both siblings: neither board-only read
2097
+ needs a :class:`~coord.config.Config` (no ``ci_store``, no live gate
2098
+ re-derivation), so there is nothing to load here.
2099
+
2100
+ Same fail-open-per-entry, fail-closed-overall contract as its siblings:
2101
+ a key ABSENT from the result (no queue row, an unreadable board or
2102
+ merge queue, any exception) simply takes the pre-#2350 `resumed` path —
2103
+ never a wrongly skipped relaunch.
2104
+ """
2105
+ targets = [
2106
+ e for e in entries
2107
+ if (e.state == STATE_PARKED and live_ci_gate.get(e.key) is False)
2108
+ or (e.state == STATE_BLOCKED and live_blocked_gate.get(e.key) is False)
2109
+ ]
2110
+ if not targets:
2111
+ return {}
2112
+
2113
+ from coord.board_service import resolve as resolve_board_service # noqa: PLC0415
2114
+
2115
+ if resolve_board_service() is not None:
2116
+ return {}
2117
+
2118
+ try:
2119
+ from coord import github_ops as _gh_ops # noqa: PLC0415
2120
+ from coord import merge_queue as _mq # noqa: PLC0415
2121
+ from coord.state import load_board as _load_board # noqa: PLC0415
2122
+
2123
+ board = _load_board()
2124
+ queue_by_key = {
2125
+ entry_key(q.repo_name, q.issue_number): q for q in _mq.load_queue()
2126
+ }
2127
+ except Exception: # noqa: BLE001 — see the fail-soft note above
2128
+ return {}
2129
+
2130
+ ready: dict[str, bool] = {}
2131
+ for e in targets:
2132
+ q = queue_by_key.get(e.key)
2133
+ if q is None:
2134
+ continue
2135
+ try:
2136
+ ready[e.key] = _mq.has_approved_review(
2137
+ q, board, _gh_ops
2138
+ ) and _mq.has_passed_test(q, board)
2139
+ except Exception: # noqa: BLE001 — leave this one entry to the ordinary path
2140
+ continue
2141
+ return ready
2142
+
2143
+
2040
2144
  def _launch_argv(entry: QueueEntry, config_path: Path | None) -> list[str]:
2041
2145
  """The ``coord drive --tmux`` argv for *entry*.
2042
2146
 
@@ -2068,6 +2172,136 @@ def _launch_argv(entry: QueueEntry, config_path: Path | None) -> list[str]:
2068
2172
  return argv
2069
2173
 
2070
2174
 
2175
+ def _merge_only_argv(entry: QueueEntry, config_path: Path | None) -> list[str]:
2176
+ """The ``coord merge --only <repo>#<issue>`` argv for *entry* (#2350).
2177
+
2178
+ Mirrors :func:`_launch_argv`'s exact shape — same ``coord_argv()`` base,
2179
+ same ``--config`` passthrough — for the direct-merge fast path instead
2180
+ of a fresh drive session. ``--only`` accepts the durable ``repo#issue``
2181
+ form (#1477), which is exactly ``entry.key``, so no assignment_id lookup
2182
+ is needed here.
2183
+ """
2184
+ from coord.drive import coord_argv # noqa: PLC0415
2185
+
2186
+ argv = coord_argv() + ["merge", "--only", entry.key]
2187
+ if config_path:
2188
+ argv += ["--config", str(config_path)]
2189
+ return argv
2190
+
2191
+
2192
+ def _merge_only_landed(entry: QueueEntry) -> bool:
2193
+ """Did *entry* actually MERGE, per the merge-queue's own row — the one
2194
+ ground truth ``coord merge --only``'s exit code alone cannot supply.
2195
+
2196
+ #2350: a ``--only`` run against an already-PENDING entry exits 0
2197
+ whether the attempt landed it, left it blocked on a gate, or routed it
2198
+ into a conflict-fix — see ``coord.commands.merge``'s ``--only`` handler,
2199
+ which prints a summary and returns unconditionally once ``process()``
2200
+ has run. Exit code alone is therefore not evidence of a landed merge;
2201
+ the queue row's own resulting state is.
2202
+ """
2203
+ from coord import merge_queue as _mq # noqa: PLC0415
2204
+
2205
+ try:
2206
+ rows = _mq.load_queue()
2207
+ except Exception: # noqa: BLE001 — unreadable queue is not proof of a landed merge
2208
+ return False
2209
+ for q in rows:
2210
+ if entry_key(q.repo_name, q.issue_number) == entry.key:
2211
+ return q.state == _mq.MERGED
2212
+ return False
2213
+
2214
+
2215
+ def _run_merge_only_candidates(plan: TickPlan, config_path: Path | None) -> None:
2216
+ """#2350: attempt ``coord merge --only`` directly, THIS tick, for every
2217
+ entry :func:`coord.drive_queue.plan_tick` marked ``merge_only`` — no
2218
+ relaunch, no capacity slot spent. Called AFTER ``_apply_writes(plan)``,
2219
+ same posture as the launch subprocess below it: the entry's real next
2220
+ state is decided from the live outcome of THIS attempt, not from
2221
+ anything ``plan_tick`` could have known when it returned — see
2222
+ :class:`~coord.drive_queue.Reconcile`'s ``merge_only`` outcome for why
2223
+ that Reconcile itself writes nothing.
2224
+
2225
+ On success (the queue's own row now reads ``MERGED`` — see
2226
+ :func:`_merge_only_landed`): writes ``STATE_DONE`` directly, skipping
2227
+ the ``waiting``/relaunch cycle a NEXT tick's ordinary ``landed``
2228
+ re-check would otherwise need, and records a distinct #2350 block-log
2229
+ ``resolve`` (:func:`coord.block_log.merge_only_event`) so #2235's corpus
2230
+ can tell "the queue itself finished this" apart from "the state flipped
2231
+ and something else finished it" (``already-landed``/``auto-released``).
2232
+
2233
+ On failure (the gate flipped shut again between the read and the
2234
+ attempt — a genuine race, not the common case; or the attempt itself hit
2235
+ something a single bounded try cannot resolve): falls back to EXACTLY
2236
+ the pre-#2350 ``resumed`` shape — ``STATE_WAITING``, ``attempts`` reset
2237
+ to 0, ``resumes`` bumped for a ``blocked``-origin entry (mirroring
2238
+ ``_reconcile_blocked``'s own formula, so the #2230 oscillation ceiling
2239
+ still sees every chance this entry got, fast-path or not) — never worse
2240
+ than the status quo, and never a `coord drive --tmux` launch attempt
2241
+ spent retrying a race this bounded attempt already ruled out.
2242
+ """
2243
+ if not plan.merge_only:
2244
+ return
2245
+
2246
+ from coord.block_log import merge_only_event, merge_only_fallback_event # noqa: PLC0415
2247
+ from coord.state import update_drive_queue_entry # noqa: PLC0415
2248
+
2249
+ for target in plan.merge_only:
2250
+ argv = _merge_only_argv(target, config_path)
2251
+ try:
2252
+ result = subprocess.run( # noqa: S603 — argv built from coord_argv + typed row
2253
+ argv,
2254
+ capture_output=True,
2255
+ text=True,
2256
+ timeout=_MERGE_ONLY_TIMEOUT_SECONDS,
2257
+ )
2258
+ returncode = result.returncode
2259
+ detail = (result.stderr or result.stdout or "").strip().splitlines()
2260
+ message = detail[-1] if detail else ""
2261
+ except (subprocess.SubprocessError, OSError) as exc:
2262
+ returncode, message = 1, str(exc)
2263
+
2264
+ if returncode == 0 and _merge_only_landed(target):
2265
+ update_drive_queue_entry(
2266
+ target.repo,
2267
+ target.issue,
2268
+ state=STATE_DONE,
2269
+ last_reason=(
2270
+ "merged directly from the tick — Test/Review were "
2271
+ "already satisfied, Merge was the only gate left (#2350)"
2272
+ ),
2273
+ session_name=None,
2274
+ )
2275
+ _record_block_log([merge_only_event(target, host=_local_host_id())])
2276
+ click.echo(f"merge-only: {target.key} merged directly from the tick")
2277
+ continue
2278
+
2279
+ # #2350: the race case — fall back to exactly today's `resumed`
2280
+ # shape, never a consumed drive-queue attempt (this was never a
2281
+ # `coord drive --tmux` launch).
2282
+ reason = f"merge-only attempt for {target.key} did not land it this tick"
2283
+ if message:
2284
+ reason += f" ({message})"
2285
+ reason += " — falling back to an ordinary relaunch (#2350)"
2286
+ updates: dict[str, Any] = {
2287
+ "state": STATE_WAITING,
2288
+ "attempts": 0,
2289
+ "last_reason": reason,
2290
+ }
2291
+ if target.state == STATE_BLOCKED:
2292
+ updates["resumes"] = target.resumes + 1
2293
+ update_drive_queue_entry(target.repo, target.issue, **updates)
2294
+ # #2350: this write bypassed `plan.writes()` entirely, so the
2295
+ # `plan_events` call below (keyed off the ORIGINAL plan) can never
2296
+ # see it — without recording it here, the episode `plan_events`
2297
+ # already opened for `target` when it first went `parked`/`blocked`
2298
+ # would never see a matching close.
2299
+ _record_block_log(
2300
+ [merge_only_fallback_event(target, reason=reason, host=_local_host_id())]
2301
+ )
2302
+ click.echo(f"merge-only: {reason}")
2303
+
2304
+
2071
2305
  def _run_resume_probe(entry: QueueEntry) -> ProbeResult:
2072
2306
  """Run one entry's ``--resume-when`` probe with a hard timeout.
2073
2307
 
@@ -2219,7 +2453,8 @@ def _requeue_command(entry: QueueEntry | None, key: str) -> str:
2219
2453
  "Update the queue's view of reality and launch nothing (#2110). "
2220
2454
  "Every `running` entry is still checked against the board "
2221
2455
  "(done/blocked/parked/retry, exactly as a normal tick would), but no "
2222
- "new `coord drive` is ever started this run — equivalent to "
2456
+ "new `coord drive` is ever started this run, and no `coord merge "
2457
+ "--only` fast-path attempt (#2350) runs either — equivalent to "
2223
2458
  "`--max-parallel 0`. This is the missing primitive for the "
2224
2459
  "stop-the-timer-to-roll-the-fleet sequence: with the timer stopped, "
2225
2460
  "nothing reconciles a finished drive's `running` row, and that stale "
@@ -2367,6 +2602,15 @@ def drive_queue_tick(
2367
2602
  # landable for most of that window, and nothing ever looked again).
2368
2603
  live_blocked_gate = _fetch_live_blocked_gate(entries, config_path)
2369
2604
 
2605
+ # #2350: for every entry the two live re-checks above just found
2606
+ # clear, also confirm — from the board's own recorded Test/Review
2607
+ # verdicts — that Merge was the only gate ever still shut, so
2608
+ # `plan_tick` can attempt it directly this tick instead of spending
2609
+ # a relaunch. See `_fetch_merge_only_ready`'s docstring.
2610
+ merge_only_ready = _fetch_merge_only_ready(
2611
+ entries, live_ci_gate, live_blocked_gate
2612
+ )
2613
+
2370
2614
  # #2101: release cordons. THIS is the hole the issue names — the
2371
2615
  # queue's launcher had zero pause awareness (`coord/drive.py` checks
2372
2616
  # pause only when routing a *worker*), so a cordoned host kept getting
@@ -2409,6 +2653,7 @@ def drive_queue_tick(
2409
2653
  live_ci_gate_reason=live_ci_gate_reason,
2410
2654
  live_blocked_gate=live_blocked_gate,
2411
2655
  editable_drift=editable_drift,
2656
+ merge_only_ready=merge_only_ready,
2412
2657
  )
2413
2658
 
2414
2659
  if reconcile_only:
@@ -2427,6 +2672,16 @@ def drive_queue_tick(
2427
2672
 
2428
2673
  _apply_writes(plan)
2429
2674
 
2675
+ # #2350: attempt the direct merges `plan_tick` marked `merge_only`,
2676
+ # right after the rest of the plan's writes have landed. Skipped
2677
+ # under `--reconcile-only` (also forced by `--max-parallel 0`, see
2678
+ # `effective_capacity` above) — that mode's whole contract is
2679
+ # "update queue state, launch nothing", and a live `coord merge
2680
+ # --only` attempt is exactly the external action it promises not to
2681
+ # take, same posture as the launch subprocess further down.
2682
+ if not reconcile_only:
2683
+ _run_merge_only_candidates(plan, config_path)
2684
+
2430
2685
  # #2235 Phase 0: record every entry this tick moved INTO or OUT OF
2431
2686
  # `blocked`/`parked`, with the reason the queue stated and — for a
2432
2687
  # release — what the release itself reveals about the true cause.
@@ -1088,10 +1088,23 @@ class Reconcile:
1088
1088
  startup grace window. Costs one attempt.
1089
1089
  * ``exhausted`` — as ``retry``, but out of attempts; pairs with a
1090
1090
  :class:`Blocked`.
1091
+ * ``merge_only`` — #2350: a ``parked``/``blocked`` entry whose live gate
1092
+ re-check reads clear AND whose board-recorded Test/Review verdicts
1093
+ already show Merge is the only remaining gate (*merge_only_ready*).
1094
+ Writes NO state here — unlike ``resumed``, this does not fall through
1095
+ to step 4's launch walk at all. The key is instead carried on
1096
+ :attr:`TickPlan.merge_only` for the shell to attempt a direct
1097
+ ``coord merge --only`` from THIS tick, no relaunch, no capacity slot
1098
+ spent. The shell decides the entry's real next state from the live
1099
+ outcome of that attempt (straight to ``done`` on success; falls back
1100
+ to exactly today's ``resumed``-shaped ``STATE_WAITING`` on failure —
1101
+ see :func:`coord.commands.drive_queue._run_merge_only_candidates`),
1102
+ which is why this Reconcile's own ``updates`` stays empty: neither
1103
+ outcome is knowable at the moment :func:`plan_tick` returns.
1091
1104
  """
1092
1105
 
1093
1106
  key: str
1094
- outcome: str # alive | starting | held | unknown | done | refused | parked | retry | exhausted
1107
+ outcome: str # alive | starting | held | unknown | done | refused | parked | retry | exhausted | merge_only
1095
1108
  reason: str
1096
1109
  occupies: bool = False
1097
1110
  updates: Mapping[str, Any] = field(default_factory=dict)
@@ -1243,6 +1256,11 @@ class TickPlan:
1243
1256
 
1244
1257
  reconciles: tuple[Reconcile, ...] = ()
1245
1258
  launch: QueueEntry | None = None
1259
+ # #2350: entries the walk above marked ``merge_only`` — the shell attempts
1260
+ # `coord merge --only` for each directly, no relaunch, no capacity spent.
1261
+ # Unlike `launch` (one slot, one entry), every eligible entry gets one:
1262
+ # nothing here competes for capacity, so there is nothing to ration.
1263
+ merge_only: tuple[QueueEntry, ...] = ()
1246
1264
  blocked: tuple[Blocked, ...] = ()
1247
1265
  deferrals: tuple[Deferral, ...] = ()
1248
1266
  holds: tuple[Hold, ...] = ()
@@ -2226,6 +2244,7 @@ def _reconcile_blocked(
2226
2244
  entry: QueueEntry,
2227
2245
  facts: IssueFacts,
2228
2246
  live_blocked_gate: Mapping[str, bool] | None,
2247
+ merge_only_ready: Mapping[str, bool] | None = None,
2229
2248
  ) -> Reconcile | None:
2230
2249
  """Re-examine ONE `blocked` entry against the current gate reading.
2231
2250
 
@@ -2252,6 +2271,17 @@ def _reconcile_blocked(
2252
2271
  issue's explicit ask), which is also what feeds the oscillation signal
2253
2272
  into `coord drive-queue list`/`status` without inventing a second alert
2254
2273
  channel for it.
2274
+
2275
+ *merge_only_ready* (#2350) is consulted only once a confirmed-clear
2276
+ reading has already survived the oscillation-ceiling check above — the
2277
+ ceiling's "stop giving this entry more chances" verdict applies whether
2278
+ the next chance would have been a relaunch or a direct merge attempt.
2279
+ A ``True`` entry there means Merge is the ONLY gate left (the board's
2280
+ own recorded Test/Review verdicts already show `passed`/`approve` — see
2281
+ :func:`coord.commands.drive_queue._fetch_merge_only_ready`), so this
2282
+ returns a ``merge_only`` :class:`Reconcile` instead of the ordinary
2283
+ ``resumed`` one below — see that outcome's docstring on :class:`Reconcile`
2284
+ for why it writes no state here.
2255
2285
  """
2256
2286
  if is_permanent_block_reason(entry.last_reason):
2257
2287
  return None
@@ -2276,6 +2306,16 @@ def _reconcile_blocked(
2276
2306
  updates={"last_reason": reason},
2277
2307
  )
2278
2308
 
2309
+ if (merge_only_ready or {}).get(entry.key):
2310
+ reason = (
2311
+ f"{entry.key}'s merge gate reads clear now "
2312
+ f"({facts.merge_gate_reason or facts.merge_ci_pending_reason or 'no gate objection'}) "
2313
+ "and the board already shows Test passed and Review approved — "
2314
+ "attempting `coord merge --only` directly from this tick instead "
2315
+ "of relaunching a fresh drive session (#2350)"
2316
+ )
2317
+ return Reconcile(entry.key, "merge_only", reason, occupies=False)
2318
+
2279
2319
  reason = (
2280
2320
  f"{entry.key}'s merge gate reads clear now "
2281
2321
  f"({facts.merge_gate_reason or facts.merge_ci_pending_reason or 'no gate objection'}) "
@@ -2556,6 +2596,7 @@ def plan_tick(
2556
2596
  live_ci_gate_reason: Mapping[str, str] | None = None,
2557
2597
  live_blocked_gate: Mapping[str, bool] | None = None,
2558
2598
  editable_drift: tuple[str, str] | None = None,
2599
+ merge_only_ready: Mapping[str, bool] | None = None,
2559
2600
  ) -> TickPlan:
2560
2601
  """Decide one tick. Pure; the caller executes the returned plan.
2561
2602
 
@@ -2686,6 +2727,22 @@ def plan_tick(
2686
2727
  beats the cached board's `IssueFacts.merge_gate_status`; absent falls
2687
2728
  through to it. See :func:`_blocked_gate_reading`.
2688
2729
 
2730
+ *merge_only_ready* (#2350) maps a key to whether — GIVEN this SAME tick
2731
+ already found its live gate clear (*live_ci_gate* reading `False` for a
2732
+ `parked` entry, *live_blocked_gate* reading `False` for a `blocked` one)
2733
+ — the board's own recorded pipeline state ALSO shows Test `passed` and
2734
+ Review `approve` already, i.e. Merge is the only gate that was ever
2735
+ still shut. `True` there swaps what would have been today's `resumed`
2736
+ reconcile (write `STATE_WAITING`, compete for next tick's launch slot)
2737
+ for a `merge_only` one instead (write nothing; the shell attempts
2738
+ `coord merge --only` directly, this tick, no relaunch, no capacity
2739
+ spent) — see :class:`Reconcile`'s `merge_only` outcome and
2740
+ :func:`coord.commands.drive_queue._fetch_merge_only_ready` for how the
2741
+ shell computes it. A key ABSENT or `False` changes nothing: the entry
2742
+ takes exactly the pre-#2350 `resumed` path, so an unreadable board, a
2743
+ missing PR, or Test/Review genuinely not both satisfied yet all degrade
2744
+ to today's behaviour, never to a wrongly-skipped relaunch.
2745
+
2689
2746
  The algorithm, from #1754, plus #1757's step 2, #1891's step 1b, #2055's
2690
2747
  extension of it, and #2230's further extension for `blocked`:
2691
2748
 
@@ -2787,6 +2844,9 @@ def plan_tick(
2787
2844
  reconciles: list[Reconcile] = []
2788
2845
  blocked: list[Blocked] = []
2789
2846
  deferrals: list[Deferral] = []
2847
+ # #2350: entries this tick decided to attempt `coord merge --only` on
2848
+ # directly rather than relaunch — see `Reconcile`'s `merge_only` outcome.
2849
+ merge_only_candidates: list[QueueEntry] = []
2790
2850
  occupied = 0
2791
2851
  # #1972: the same count, keyed by repo. Populated from the SAME
2792
2852
  # `reconcile.occupies` verdict as `occupied` above — one source of truth, so
@@ -2890,9 +2950,16 @@ def plan_tick(
2890
2950
  # gave-up entry via the CI-pending resume was explicitly not the
2891
2951
  # #2055 fix and is not this one either; see
2892
2952
  # :func:`_reconcile_blocked` for the full decision.
2893
- blocked_reconcile = _reconcile_blocked(entry, facts, live_blocked_gate)
2953
+ blocked_reconcile = _reconcile_blocked(
2954
+ entry, facts, live_blocked_gate, merge_only_ready
2955
+ )
2894
2956
  if blocked_reconcile is not None:
2895
2957
  reconciles.append(blocked_reconcile)
2958
+ if blocked_reconcile.outcome == "merge_only":
2959
+ # #2350: no state write — the shell decides the entry's
2960
+ # real next state from the live merge attempt's outcome.
2961
+ merge_only_candidates.append(entry)
2962
+ continue
2896
2963
  new_state = blocked_reconcile.updates.get("state")
2897
2964
  if new_state:
2898
2965
  states[entry.key] = str(new_state)
@@ -2954,6 +3021,24 @@ def plan_tick(
2954
3021
  )
2955
3022
  )
2956
3023
  continue
3024
+ if (merge_only_ready or {}).get(entry.key):
3025
+ # #2350: Merge is the only gate left — the board already
3026
+ # shows Test passed and Review approved. Attempt the merge
3027
+ # directly this tick instead of paying for a relaunch; see
3028
+ # `Reconcile`'s `merge_only` outcome for why no state is
3029
+ # written here.
3030
+ reason = (
3031
+ f"live re-check of {entry.key}'s gate this tick reads "
3032
+ "READY (coord merge --plan agrees) and the board already "
3033
+ "shows Test passed and Review approved — attempting "
3034
+ "`coord merge --only` directly from this tick instead of "
3035
+ "relaunching a fresh drive session (#2350)"
3036
+ )
3037
+ reconciles.append(
3038
+ Reconcile(entry.key, "merge_only", reason, occupies=False)
3039
+ )
3040
+ merge_only_candidates.append(entry)
3041
+ continue
2957
3042
  reason = (
2958
3043
  f"live re-check of {entry.key}'s gate this tick reads READY "
2959
3044
  "(coord merge --plan agrees) — resuming from parked without "
@@ -3099,6 +3184,11 @@ def plan_tick(
3099
3184
  # report the reading that `occupied` was taken from.
3100
3185
  "repo_occupied": dict(repo_occupied),
3101
3186
  "repo_capacity": repo_capacity,
3187
+ # #2350: fixed by the time reconciliation (steps 1/1b) finishes —
3188
+ # nothing below this point (holds, capacity, the launch walk) ever
3189
+ # adds to it — so, unlike `reconciles`, every return site can share
3190
+ # this one tuple via `**plan_base` instead of re-taking it fresh.
3191
+ "merge_only": tuple(merge_only_candidates),
3102
3192
  }
3103
3193
 
3104
3194
  # #2186: every currently-closed gate, keyed by the entry it was declared
@@ -3535,6 +3625,11 @@ def render_plan(plan: TickPlan, *, dry_run: bool = False) -> list[str]:
3535
3625
  )
3536
3626
  for item in plan.reconciles:
3537
3627
  lines.append(f" reconcile {item.key}: {item.outcome} — {item.reason}")
3628
+ # #2350: printed right after the reconciles, same reasoning as the hold
3629
+ # line below — "merge_only" and "attempting the merge directly" are one
3630
+ # thought, not two lines an operator has to correlate by key.
3631
+ for item in plan.merge_only:
3632
+ lines.append(f" {prefix}merge --only {item.key}")
3538
3633
  # #1757: the gate line goes directly under its reconcile, because "1753
3539
3634
  # done" immediately followed by "and therefore nothing launches" is the
3540
3635
  # sentence an operator reading a timer log needs to read as one thought.