code-coordinator 0.5.124__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.124 → code_coordinator-0.5.126}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/block_log.py +104 -1
  5. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/ci_store.py +27 -4
  6. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/commands/drive_queue.py +291 -13
  7. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/db.py +10 -1
  8. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/drive.py +22 -2
  9. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/drive_queue.py +168 -2
  10. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/drive_state.py +8 -0
  11. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/merge_queue.py +215 -8
  12. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/scripts/coord-test-runner.sh +13 -2
  13. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_block_log.py +50 -0
  14. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_ci_store.py +12 -2
  15. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_drive_queue.py +197 -0
  16. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_drive.py +93 -0
  17. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_drive_queue.py +242 -0
  18. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_merge_queue.py +281 -0
  19. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_thin_client_board_audit.py +14 -0
  20. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/tests/fixtures/board_sample.json +1 -0
  21. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/.claude/commands/board.md +0 -0
  22. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/.claude/commands/complete-session.md +0 -0
  23. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/.claude/commands/coordinator.md +0 -0
  24. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/.githooks/_lib.sh +0 -0
  25. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/.githooks/post-checkout +0 -0
  26. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/.githooks/post-commit +0 -0
  27. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/.githooks/post-merge +0 -0
  28. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  29. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/.github/coord-ci-acceptance.yml +0 -0
  30. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/.github/workflows/auto-release.yml +0 -0
  31. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/.github/workflows/cargo-test.yml +0 -0
  32. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/.github/workflows/publish.yml +0 -0
  33. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/.github/workflows/release-tui.yml +0 -0
  34. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/.github/workflows/test.yml +0 -0
  35. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/.gitignore +0 -0
  36. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/CLAUDE.md +0 -0
  37. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/GOAL.md +0 -0
  38. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/LICENSE +0 -0
  39. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/MANIFEST.in +0 -0
  40. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/README.md +0 -0
  41. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/code_coordinator.egg-info/SOURCES.txt +0 -0
  42. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/code_coordinator.egg-info/dependency_links.txt +0 -0
  43. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/code_coordinator.egg-info/entry_points.txt +0 -0
  44. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/code_coordinator.egg-info/requires.txt +0 -0
  45. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/code_coordinator.egg-info/scm_file_list.json +0 -0
  46. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/code_coordinator.egg-info/top_level.txt +0 -0
  47. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/__init__.py +0 -0
  48. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/_board_mapping.py +0 -0
  49. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/acceptance.py +0 -0
  50. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/acceptance_drivers.py +0 -0
  51. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/agent.py +0 -0
  52. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/agent_app.py +0 -0
  53. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/agent_update.py +0 -0
  54. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/agents/opencode/.gitignore +0 -0
  55. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/agents/opencode/agents/work.md +0 -0
  56. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/agents/opencode/routing.jsonc +0 -0
  57. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/audit.py +0 -0
  58. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/auto_loop.py +0 -0
  59. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/board_bool_guard.py +0 -0
  60. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/board_service.py +0 -0
  61. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/board_wire.py +0 -0
  62. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/brain.py +0 -0
  63. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/branch_model.py +0 -0
  64. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/bug_intake.py +0 -0
  65. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/cargo_cache.py +0 -0
  66. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/ci_github.py +0 -0
  67. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/claim.py +0 -0
  68. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/cli.py +0 -0
  69. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/client.py +0 -0
  70. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/commands/__init__.py +0 -0
  71. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/commands/_common.py +0 -0
  72. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/commands/acceptance.py +0 -0
  73. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/commands/agent_ops.py +0 -0
  74. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/commands/audit.py +0 -0
  75. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/commands/chat.py +0 -0
  76. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/commands/dispatch.py +0 -0
  77. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/commands/dispatch_workers.py +0 -0
  78. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/commands/drive.py +0 -0
  79. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/commands/gate_a.py +0 -0
  80. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/commands/gates.py +0 -0
  81. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/commands/issues.py +0 -0
  82. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/commands/lifecycle.py +0 -0
  83. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/commands/merge.py +0 -0
  84. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/commands/milestone.py +0 -0
  85. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/commands/plan_followup.py +0 -0
  86. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/commands/plans.py +0 -0
  87. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/commands/portal.py +0 -0
  88. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/commands/release.py +0 -0
  89. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/commands/repo.py +0 -0
  90. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/commands/report.py +0 -0
  91. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/commands/review.py +0 -0
  92. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/commands/scorecard.py +0 -0
  93. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/commands/sessions.py +0 -0
  94. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/commands/setup.py +0 -0
  95. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/commands/status.py +0 -0
  96. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/commands/terminal.py +0 -0
  97. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/commands/test_gate.py +0 -0
  98. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/commands/tui.py +0 -0
  99. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/comments.py +0 -0
  100. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/config.py +0 -0
  101. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/config_reload.py +0 -0
  102. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/conflict_fix.py +0 -0
  103. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dao.py +0 -0
  104. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/__init__.py +0 -0
  105. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/fixture.py +0 -0
  106. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/index.html +0 -0
  107. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/server.py +0 -0
  108. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/terminal.py +0 -0
  109. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/.gitignore +0 -0
  110. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/components.json +0 -0
  111. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/assets/Gallery-BoKs3mpY.js +0 -0
  112. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  113. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/assets/Terminal-CEsP08iX.js +0 -0
  114. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/assets/index-CDHPlB6k.js +0 -0
  115. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  116. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  117. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  118. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  119. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  120. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/index.html +0 -0
  121. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  122. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/sw.js +0 -0
  123. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  124. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  125. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  126. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  127. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  128. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  129. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  130. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  131. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  132. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  133. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/eslint.config.js +0 -0
  134. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/index.html +0 -0
  135. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  136. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/package-lock.json +0 -0
  137. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/package.json +0 -0
  138. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  139. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/playwright.config.ts +0 -0
  140. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/postcss.config.js +0 -0
  141. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  142. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  143. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  144. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/App.tsx +0 -0
  145. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/api/client.ts +0 -0
  146. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  147. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  148. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  149. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  150. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  151. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  152. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  153. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  154. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  155. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  156. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  157. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  158. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  159. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  160. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  161. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  162. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  163. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  164. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  165. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  166. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  167. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  168. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  169. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  170. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  171. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  172. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  173. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  174. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  175. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  176. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  177. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  178. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  179. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  180. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  181. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/index.css +0 -0
  182. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  183. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  184. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/main.tsx +0 -0
  185. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  186. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  187. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  188. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  189. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  190. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  191. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  192. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  193. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  194. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  195. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  196. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  197. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  198. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  199. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  200. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  201. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  202. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  203. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  204. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  205. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  206. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  207. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  208. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/tailwind.config.js +0 -0
  209. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/tsconfig.json +0 -0
  210. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  211. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dashboard/webapp/vite.config.ts +0 -0
  212. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dead_end.py +0 -0
  213. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/deploy/README.md +0 -0
  214. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/deploy/coord-agent.service +0 -0
  215. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/deploy/coord-db-backup.service +0 -0
  216. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/deploy/coord-db-backup.sh +0 -0
  217. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/deploy/coord-db-backup.timer +0 -0
  218. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/deploy/coord-drive-queue.service +0 -0
  219. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/deploy/coord-drive-queue.timer +0 -0
  220. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/deploy/coord-notify.service +0 -0
  221. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/deploy/coord-notify.timer +0 -0
  222. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/deploy/coord-release-propagate.service +0 -0
  223. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/deploy/coord-release-propagate.timer +0 -0
  224. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/deploy/coord-release-window.service +0 -0
  225. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/deploy/coord-release-window.timer +0 -0
  226. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/deploy/coord-serve.service +0 -0
  227. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/deploy/coord-web-dist-build.service +0 -0
  228. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/deploy/coord-web-dist-build.timer +0 -0
  229. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/deploy/coord-web.service +0 -0
  230. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/deploy_manifest.py +0 -0
  231. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/deploy_units.py +0 -0
  232. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/deps.py +0 -0
  233. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/diagnose.py +0 -0
  234. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dispatch.py +0 -0
  235. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/dist_name.py +0 -0
  236. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/events.py +0 -0
  237. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/failure_class.py +0 -0
  238. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/filelock.py +0 -0
  239. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/fleet_config_health.py +0 -0
  240. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/freshness.py +0 -0
  241. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/gate_a.py +0 -0
  242. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/gate_b.py +0 -0
  243. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/gate_snapshot.py +0 -0
  244. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/gates.py +0 -0
  245. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/github_ops.py +0 -0
  246. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/goal.py +0 -0
  247. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/graph_health.py +0 -0
  248. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/health/__init__.py +0 -0
  249. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/health/aggregate.py +0 -0
  250. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/health/checks/__init__.py +0 -0
  251. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/health/checks/agent_install.py +0 -0
  252. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/health/checks/cargo_targets.py +0 -0
  253. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/health/checks/claude_binary.py +0 -0
  254. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/health/checks/deploy_lane_facts.py +0 -0
  255. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/health/checks/disk.py +0 -0
  256. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/health/checks/fleet_board.py +0 -0
  257. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  258. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/health/checks/fleet_phantom.py +0 -0
  259. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/health/checks/fleet_unit_drift.py +0 -0
  260. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/health/checks/graph.py +0 -0
  261. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/health/checks/graphify_cli.py +0 -0
  262. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/health/checks/index_lock.py +0 -0
  263. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/health/checks/plan_usage.py +0 -0
  264. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/health/checks/repo_state.py +0 -0
  265. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/health/checks/spawned_coord.py +0 -0
  266. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/health/checks/timer_active.py +0 -0
  267. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/health/checks/toolchain.py +0 -0
  268. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/health/checks/unit_drift.py +0 -0
  269. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/health/checks/unit_enablement.py +0 -0
  270. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/health/checks/worktrees.py +0 -0
  271. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/health/cli.py +0 -0
  272. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/health/context.py +0 -0
  273. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/health/fleet_snapshot.py +0 -0
  274. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/health/models.py +0 -0
  275. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/health/pypi.py +0 -0
  276. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/health/registry.py +0 -0
  277. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/health/render.py +0 -0
  278. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/health/units.py +0 -0
  279. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/hooks.py +0 -0
  280. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/housekeeping.py +0 -0
  281. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/interactive.py +0 -0
  282. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/issue_store.py +0 -0
  283. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/liveness_auditor.py +0 -0
  284. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/machine_pause.py +0 -0
  285. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/milestone_chat.py +0 -0
  286. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/milestone_dispatch.py +0 -0
  287. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/milestone_gate.py +0 -0
  288. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/milestone_order.py +0 -0
  289. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/mock_author.py +0 -0
  290. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/models.py +0 -0
  291. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/network.py +0 -0
  292. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/new_issue_chat.py +0 -0
  293. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/notifier/__init__.py +0 -0
  294. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/notifier/baseline.py +0 -0
  295. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/notifier/cli.py +0 -0
  296. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/notifier/collect.py +0 -0
  297. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/notifier/digest.py +0 -0
  298. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/notifier/models.py +0 -0
  299. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/notifier/predicate.py +0 -0
  300. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/notifier/service.py +0 -0
  301. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/notifier/store.py +0 -0
  302. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/notifier/transport.py +0 -0
  303. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/notify.py +0 -0
  304. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/openapi.py +0 -0
  305. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/overlap_fence.py +0 -0
  306. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/overlap_predict.py +0 -0
  307. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/parentage.py +0 -0
  308. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/parentage_github.py +0 -0
  309. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/pipeline.py +0 -0
  310. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/plan_parser.py +0 -0
  311. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/plans.py +0 -0
  312. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/platform_paths.py +0 -0
  313. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/portal_bridge.py +0 -0
  314. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/portal_store.py +0 -0
  315. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/portal_sync.py +0 -0
  316. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/pr_body_lint.py +0 -0
  317. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/prereqs.py +0 -0
  318. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/progress.py +0 -0
  319. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/providers/__init__.py +0 -0
  320. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/providers/base.py +0 -0
  321. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/providers/claude.py +0 -0
  322. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/providers/claude_pty.py +0 -0
  323. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/providers/opencode.py +0 -0
  324. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/queue_diagnose.py +0 -0
  325. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/reconcile.py +0 -0
  326. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/refine_chat.py +0 -0
  327. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/release_cordon.py +0 -0
  328. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/release_propagate.py +0 -0
  329. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/release_verify.py +0 -0
  330. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/release_window.py +0 -0
  331. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/repo_edit.py +0 -0
  332. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/repo_onboard.py +0 -0
  333. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/reports.py +0 -0
  334. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/revalidate.py +0 -0
  335. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/review.py +0 -0
  336. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/scorecard.py +0 -0
  337. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/serve_app.py +0 -0
  338. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/skills/portal-followup/SKILL.md +0 -0
  339. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/skills/update-issue/SKILL.md +0 -0
  340. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/smoke.py +0 -0
  341. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/spend_ceiling.py +0 -0
  342. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/split_work.py +0 -0
  343. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/stage_projection.py +0 -0
  344. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/state.py +0 -0
  345. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/test_author.py +0 -0
  346. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/test_chat.py +0 -0
  347. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/test_orchestrator.py +0 -0
  348. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/test_report.py +0 -0
  349. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/tui_release.py +0 -0
  350. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/usage.py +0 -0
  351. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/usage_limits.py +0 -0
  352. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/usage_rollup.py +0 -0
  353. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coord/worker_events.py +0 -0
  354. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/coordinator.example.yml +0 -0
  355. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/deploy/coord-agent.service +0 -0
  356. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/deploy/coord-db-backup.service +0 -0
  357. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/deploy/coord-db-backup.sh +0 -0
  358. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/deploy/coord-db-backup.timer +0 -0
  359. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/deploy/coord-drive-queue.service +0 -0
  360. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/deploy/coord-drive-queue.timer +0 -0
  361. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/deploy/coord-notify.service +0 -0
  362. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/deploy/coord-notify.timer +0 -0
  363. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/deploy/coord-release-propagate.service +0 -0
  364. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/deploy/coord-release-propagate.timer +0 -0
  365. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/deploy/coord-release-window.service +0 -0
  366. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/deploy/coord-release-window.timer +0 -0
  367. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/deploy/coord-serve.service +0 -0
  368. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/deploy/coord-web-dist-build.service +0 -0
  369. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/deploy/coord-web-dist-build.sh +0 -0
  370. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/deploy/coord-web-dist-build.timer +0 -0
  371. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/deploy/coord-web-rollback.sh +0 -0
  372. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/deploy/coord-web.service +0 -0
  373. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/deploy/node-shim.sh +0 -0
  374. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/docs/AGENT_OPERATIONS.md +0 -0
  375. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/docs/ARCHITECTURE.md +0 -0
  376. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/docs/ARCH_SECURITY_GATES.md +0 -0
  377. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/docs/COCKPIT.md +0 -0
  378. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/docs/CONTROL_CENTER.md +0 -0
  379. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/docs/COST_DISCIPLINE.md +0 -0
  380. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/docs/CROSS_PLATFORM.md +0 -0
  381. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/docs/CUSTOMER_PORTAL.md +0 -0
  382. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/docs/DRIVE_QUEUE.md +0 -0
  383. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/docs/EPHEMERAL_WORKERS.md +0 -0
  384. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/docs/FORGE_MIGRATION.md +0 -0
  385. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/docs/GRAPHIFY_SETUP.md +0 -0
  386. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/docs/ISSUE_GUIDANCE.md +0 -0
  387. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/docs/MAC_MINI.md +0 -0
  388. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  389. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/docs/NOTIFIER.md +0 -0
  390. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/docs/OPENCODE_VERIFICATION.md +0 -0
  391. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/docs/OPERATING_GOTCHAS.md +0 -0
  392. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/docs/ORACLE_LOOP.md +0 -0
  393. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/docs/PHONE_WEBAPP.md +0 -0
  394. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/docs/PIPELINE_V2.md +0 -0
  395. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/docs/PLATFORM_EVOLUTION.md +0 -0
  396. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/docs/SECOND_BACKEND.md +0 -0
  397. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/docs/STORE_SERVICE.md +0 -0
  398. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  399. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/docs/WEB_CONTROL_CENTER.md +0 -0
  400. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/docs/mocks/web/README.md +0 -0
  401. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/docs/mocks/web/_tokens.css +0 -0
  402. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/docs/mocks/web/issue-detail.html +0 -0
  403. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/docs/mocks/web/pipeline-narrow.html +0 -0
  404. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/docs/mocks/web/pipeline-wide.html +0 -0
  405. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/graphify-out/.gitignore +0 -0
  406. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/install-agent.sh +0 -0
  407. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/pyproject.toml +0 -0
  408. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/scripts/audit_review_verdict_overrides.py +0 -0
  409. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  410. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/scripts/azure-workers/build-worker-image.sh +0 -0
  411. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/scripts/azure-workers/coordinator-machine.py +0 -0
  412. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/scripts/azure-workers/epic-down.sh +0 -0
  413. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/scripts/azure-workers/epic-up.sh +0 -0
  414. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/scripts/azure-workers/preflight.sh +0 -0
  415. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/scripts/azure-workers/provision-worker.sh +0 -0
  416. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  417. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  418. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/scripts/azure-workers/verify-github-token.sh +0 -0
  419. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/scripts/codegen.py +0 -0
  420. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/scripts/drive-batch.sh +0 -0
  421. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/scripts/gen_board_fixture.py +0 -0
  422. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/scripts/next_release_tag.py +0 -0
  423. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/scripts/run_tests_in_populated_home.sh +0 -0
  424. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/scripts/run_tests_without_gh.sh +0 -0
  425. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/scripts/smoke_437_interactive.py +0 -0
  426. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/scripts/verify_878_review_capture.py +0 -0
  427. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/scripts/verify_release_published.py +0 -0
  428. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/scripts/verify_release_wheel.py +0 -0
  429. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/setup.cfg +0 -0
  430. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/SMOKE_SET.md +0 -0
  431. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/__init__.py +0 -0
  432. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  433. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-33/contract.md +0 -0
  434. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-33/manifest.yml +0 -0
  435. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  436. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  437. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  438. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  439. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-37/conftest.py +0 -0
  440. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-37/contract.md +0 -0
  441. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-37/manifest.yml +0 -0
  442. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  443. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  444. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-38/contract.md +0 -0
  445. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-38/manifest.yml +0 -0
  446. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  447. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  448. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  449. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  450. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  451. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  452. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  453. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  454. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  455. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  456. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-51/contract.md +0 -0
  457. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  458. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  459. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-51/manifest.yml +0 -0
  460. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  461. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-51/tsconfig.json +0 -0
  462. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  463. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-65/contract.md +0 -0
  464. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-65/manifest.yml +0 -0
  465. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  466. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  467. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  468. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  469. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  470. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  471. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  472. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  473. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  474. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/conftest.py +0 -0
  475. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/fixtures/board-pipeline-basic.json +0 -0
  476. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  477. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  478. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  479. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  480. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/fixtures/playwright/all_pass.json +0 -0
  481. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  482. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/fixtures/playwright/mixed_fail.json +0 -0
  483. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  484. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  485. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/fixtures/playwright/skip.json +0 -0
  486. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/fixtures/playwright/truncated.json +0 -0
  487. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  488. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  489. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  490. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  491. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  492. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  493. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  494. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  495. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_acceptance.py +0 -0
  496. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_acceptance_drivers.py +0 -0
  497. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_agent.py +0 -0
  498. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_agent_api_error.py +0 -0
  499. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_agent_app.py +0 -0
  500. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_agent_branch_base.py +0 -0
  501. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_agent_branch_capture.py +0 -0
  502. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_agent_config_free_1712.py +0 -0
  503. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_agent_deploy_units_endpoint.py +0 -0
  504. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_agent_dirty_worktree.py +0 -0
  505. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_agent_graph_self_heal.py +0 -0
  506. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_agent_health_h3.py +0 -0
  507. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_agent_idle_restart.py +0 -0
  508. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_agent_push_failure.py +0 -0
  509. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_agent_reap.py +0 -0
  510. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_agent_repos_and_pull.py +0 -0
  511. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_agent_restart_services_endpoint.py +0 -0
  512. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_agent_startup_diagnostics.py +0 -0
  513. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_agent_update.py +0 -0
  514. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_agent_update_bluegreen.py +0 -0
  515. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_agent_usage_limit.py +0 -0
  516. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_agent_zero_commit.py +0 -0
  517. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_ambient_home_isolation.py +0 -0
  518. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_approve_reject_plan.py +0 -0
  519. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_approve_usage_gate.py +0 -0
  520. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_assignment_already_recorded_daemon.py +0 -0
  521. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_audit_log.py +0 -0
  522. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_audit_outcome.py +0 -0
  523. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_audit_query.py +0 -0
  524. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_auto_loop.py +0 -0
  525. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_auto_release_publish_2035.py +0 -0
  526. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_base_checkout_restore.py +0 -0
  527. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_board_cap_762.py +0 -0
  528. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_board_fixture.py +0 -0
  529. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_board_read_path.py +0 -0
  530. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_board_service.py +0 -0
  531. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_board_state.py +0 -0
  532. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_board_wire.py +0 -0
  533. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_brain.py +0 -0
  534. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_branch_model.py +0 -0
  535. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_bug_intake.py +0 -0
  536. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_build_worker_image_env_update.py +0 -0
  537. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cargo_cache.py +0 -0
  538. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_ci_acceptance_gate_1950.py +0 -0
  539. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_ci_parity_2091.py +0 -0
  540. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_claim.py +0 -0
  541. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_acceptance.py +0 -0
  542. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_assign.py +0 -0
  543. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  544. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_assign_interactive_remote.py +0 -0
  545. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_assign_provider.py +0 -0
  546. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  547. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_audit.py +0 -0
  548. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_chat_continue.py +0 -0
  549. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_diagnose_config_provenance.py +0 -0
  550. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_diagnose_graph.py +0 -0
  551. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_doctor.py +0 -0
  552. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_doctor_config_free_1801.py +0 -0
  553. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  554. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_drive.py +0 -0
  555. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_escalate.py +0 -0
  556. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_fix_headless_review.py +0 -0
  557. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_gate_a.py +0 -0
  558. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_install_drift.py +0 -0
  559. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_install_skills.py +0 -0
  560. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_issue_create_label.py +0 -0
  561. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_issue_reopen.py +0 -0
  562. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_merge.py +0 -0
  563. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_milestone_assign.py +0 -0
  564. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_milestone_capture.py +0 -0
  565. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_milestone_chat_add_child.py +0 -0
  566. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_milestone_dispatch.py +0 -0
  567. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_milestone_gate_b.py +0 -0
  568. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_milestone_gate_c.py +0 -0
  569. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_milestone_order.py +0 -0
  570. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  571. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_milestone_ship.py +0 -0
  572. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_network.py +0 -0
  573. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_new_issue_chat.py +0 -0
  574. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_plans.py +0 -0
  575. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_portal.py +0 -0
  576. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_pull_artifact.py +0 -0
  577. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_queue.py +0 -0
  578. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_reattach_sessions.py +0 -0
  579. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_refine_board.py +0 -0
  580. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_release_preflight.py +0 -0
  581. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_release_propagate.py +0 -0
  582. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_release_window.py +0 -0
  583. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_repo_2220.py +0 -0
  584. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_scorecard.py +0 -0
  585. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_set_review_findings.py +0 -0
  586. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_status_advisory_terminal.py +0 -0
  587. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_status_merge_queue.py +0 -0
  588. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_status_provider.py +0 -0
  589. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_status_review_finalizing.py +0 -0
  590. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_status_test_failed_tag.py +0 -0
  591. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_status_usage_limit.py +0 -0
  592. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_sync_comments_873.py +0 -0
  593. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_test_plan.py +0 -0
  594. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_track.py +0 -0
  595. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_tui_update.py +0 -0
  596. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cli_wait.py +0 -0
  597. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_client_base_install.py +0 -0
  598. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_comments.py +0 -0
  599. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_completion_summary.py +0 -0
  600. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_config.py +0 -0
  601. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_config_acceptance.py +0 -0
  602. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_config_audit.py +0 -0
  603. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_config_pricing.py +0 -0
  604. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  605. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_config_usage_gate.py +0 -0
  606. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_conflict_fix.py +0 -0
  607. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_conflict_fix_semantic.py +0 -0
  608. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_coord_test.py +0 -0
  609. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_coord_test_runner_baseline.py +0 -0
  610. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_coord_test_runner_routing.py +0 -0
  611. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_coord_test_runner_toolchain.py +0 -0
  612. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_coord_web_sse_restart_live.py +0 -0
  613. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_coordinator_machine.py +0 -0
  614. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_cross_platform_imports.py +0 -0
  615. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_dashboard.py +0 -0
  616. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_dashboard_fixture.py +0 -0
  617. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_dashboard_terminal.py +0 -0
  618. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_dashboard_terminal_live.py +0 -0
  619. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_db.py +0 -0
  620. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_dead_end.py +0 -0
  621. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_deploy_coord_db_backup.py +0 -0
  622. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_deploy_coord_web_dist.py +0 -0
  623. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_deploy_coord_web_rollback.py +0 -0
  624. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_deploy_drive_queue_unit.py +0 -0
  625. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_deploy_manifest.py +0 -0
  626. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_deploy_units_lane.py +0 -0
  627. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_deploy_web_unit.py +0 -0
  628. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_deps.py +0 -0
  629. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_diagnose.py +0 -0
  630. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_dispatch.py +0 -0
  631. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_dispatch_target_validation.py +0 -0
  632. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_dist_name.py +0 -0
  633. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_done_housekeeping.py +0 -0
  634. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_drive_state.py +0 -0
  635. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_drive_tmux.py +0 -0
  636. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_epic_up_capability_detection.py +0 -0
  637. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  638. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_epic_up_image_provenance.py +0 -0
  639. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_errors.py +0 -0
  640. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_events.py +0 -0
  641. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_failure_class.py +0 -0
  642. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_filelock.py +0 -0
  643. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  644. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_fix_of_force_override.py +0 -0
  645. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_fleet_config_health.py +0 -0
  646. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_fleet_health_probes.py +0 -0
  647. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_fleet_health_snapshot.py +0 -0
  648. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_freshness.py +0 -0
  649. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_gate_a.py +0 -0
  650. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_gate_b.py +0 -0
  651. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_gate_snapshot_staleness.py +0 -0
  652. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_gates.py +0 -0
  653. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  654. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_generated_types_fixture.py +0 -0
  655. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_github_ops.py +0 -0
  656. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_goal.py +0 -0
  657. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_graph_health.py +0 -0
  658. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_graph_selfheal_absent_2237.py +0 -0
  659. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_handoff.py +0 -0
  660. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_health_checks.py +0 -0
  661. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_health_cli.py +0 -0
  662. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_health_cli_graph.py +0 -0
  663. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_health_config.py +0 -0
  664. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_health_context.py +0 -0
  665. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_health_deploy_lane_facts.py +0 -0
  666. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_health_incident_regression.py +0 -0
  667. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_health_pypi.py +0 -0
  668. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_health_registry.py +0 -0
  669. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_health_timer_active.py +0 -0
  670. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_health_toolchain.py +0 -0
  671. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_health_unit_drift.py +0 -0
  672. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_health_unit_enablement.py +0 -0
  673. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_hooks.py +0 -0
  674. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_human_attended_437.py +0 -0
  675. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_init.py +0 -0
  676. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_integration.py +0 -0
  677. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_interactive_briefing_echo.py +0 -0
  678. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_interactive_prefill_state.py +0 -0
  679. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_interactive_session_relaunch.py +0 -0
  680. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_interactive_test_verdict_backstop.py +0 -0
  681. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_interactive_token_attribution.py +0 -0
  682. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_interactive_worktree.py +0 -0
  683. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_issue_store_seam.py +0 -0
  684. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_liveness_auditor.py +0 -0
  685. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_liveness_notify.py +0 -0
  686. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_machine_pause.py +0 -0
  687. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_merge_verify.py +0 -0
  688. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_milestone_chat.py +0 -0
  689. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_milestone_dispatch.py +0 -0
  690. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_milestone_gate.py +0 -0
  691. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_milestone_order.py +0 -0
  692. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_milestone_seam.py +0 -0
  693. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_mock_author.py +0 -0
  694. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_model_tiering.py +0 -0
  695. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_models.py +0 -0
  696. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_models_config_labels.py +0 -0
  697. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_needs_attention.py +0 -0
  698. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_network.py +0 -0
  699. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_new_issue_chat.py +0 -0
  700. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_next_release_tag.py +0 -0
  701. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_no_direct_gh_calls.py +0 -0
  702. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_node_shim.py +0 -0
  703. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_notifier_baseline.py +0 -0
  704. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_notifier_cli.py +0 -0
  705. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_notifier_collect.py +0 -0
  706. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_notifier_config.py +0 -0
  707. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_notifier_drive_seam.py +0 -0
  708. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_notifier_isolation.py +0 -0
  709. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_notifier_predicate.py +0 -0
  710. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_notifier_quiet_hours.py +0 -0
  711. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_notifier_service.py +0 -0
  712. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_notify.py +0 -0
  713. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_notify_drain.py +0 -0
  714. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_openapi.py +0 -0
  715. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_operational_defaults.py +0 -0
  716. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_overlap_fence.py +0 -0
  717. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_overlap_predict.py +0 -0
  718. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_packaged_deploy_units.py +0 -0
  719. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_parentage.py +0 -0
  720. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_paste_landed.py +0 -0
  721. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_pipeline.py +0 -0
  722. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_plan_followup_approve_plan_command.py +0 -0
  723. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_plan_followup_pr_command.py +0 -0
  724. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_plan_followup_review_command.py +0 -0
  725. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_plan_only.py +0 -0
  726. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_plan_parser.py +0 -0
  727. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_platform_paths.py +0 -0
  728. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_portal_bridge.py +0 -0
  729. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_portal_config.py +0 -0
  730. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_portal_sync.py +0 -0
  731. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_pr_body_lint.py +0 -0
  732. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_prereqs.py +0 -0
  733. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_production_db_guard.py +0 -0
  734. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_progress.py +0 -0
  735. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_provider_seam.py +0 -0
  736. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_providers.py +0 -0
  737. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_providers_config_labels.py +0 -0
  738. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_providers_pty.py +0 -0
  739. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_quiet_hours.py +0 -0
  740. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_quiet_hours_store_2146.py +0 -0
  741. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_reap_merged_sessions.py +0 -0
  742. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_reap_stale_interactive_tick.py +0 -0
  743. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_reconcile.py +0 -0
  744. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_reconcile_branch.py +0 -0
  745. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_reconcile_completions.py +0 -0
  746. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_reconcile_merges.py +0 -0
  747. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_reconcile_no_agent_record.py +0 -0
  748. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_reconcile_usage_limit_done.py +0 -0
  749. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_refine_chat.py +0 -0
  750. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_release_cordon_2101.py +0 -0
  751. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  752. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_release_cordon_deadlock_2240.py +0 -0
  753. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_release_propagate.py +0 -0
  754. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_release_unified_1242.py +0 -0
  755. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_release_verify.py +0 -0
  756. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_release_window.py +0 -0
  757. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_remote_auto_prune.py +0 -0
  758. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_remote_interactive_reaper.py +0 -0
  759. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_repo_edit_2220.py +0 -0
  760. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_repo_graph_fleet_2237.py +0 -0
  761. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_repo_onboard_2220.py +0 -0
  762. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_report_result_push.py +0 -0
  763. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_reports.py +0 -0
  764. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_retry.py +0 -0
  765. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_retry_advisory_1606.py +0 -0
  766. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_retry_type_1636.py +0 -0
  767. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_revalidate.py +0 -0
  768. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_review.py +0 -0
  769. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_review_end_review_without_verdict.py +0 -0
  770. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_review_parse_failure_diagnostic.py +0 -0
  771. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_review_reaffirm.py +0 -0
  772. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_review_state.py +0 -0
  773. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_review_verdict_backstop.py +0 -0
  774. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_review_verdict_override_audit.py +0 -0
  775. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_review_verdict_relay.py +0 -0
  776. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_review_zero_commits.py +0 -0
  777. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_scoped_review_wiring.py +0 -0
  778. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_scorecard.py +0 -0
  779. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_serve.py +0 -0
  780. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_serve_app_board_trim.py +0 -0
  781. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_session.py +0 -0
  782. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_slice_issue_attribution.py +0 -0
  783. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_smoke.py +0 -0
  784. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_smoke_live_checkout_restore.py +0 -0
  785. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_smoke_workflow.py +0 -0
  786. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_spend_ceiling.py +0 -0
  787. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_spend_ceiling_coordinator.py +0 -0
  788. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_split.py +0 -0
  789. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_split_work.py +0 -0
  790. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_stage_projection.py +0 -0
  791. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_stalled_pipeline.py +0 -0
  792. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_state.py +0 -0
  793. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_state_review_findings_daemon.py +0 -0
  794. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_status_fleet_footer.py +0 -0
  795. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_stop_1567.py +0 -0
  796. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_stuck.py +0 -0
  797. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_terminal_command.py +0 -0
  798. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_test_author.py +0 -0
  799. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_test_chat.py +0 -0
  800. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_test_orchestrator.py +0 -0
  801. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_test_report.py +0 -0
  802. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_test_verdict_parsing.py +0 -0
  803. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_test_verdict_transcript_floor.py +0 -0
  804. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_thin_client_config_load_1080.py +0 -0
  805. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_thin_client_daemon_routing_906.py +0 -0
  806. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_tmux_host.py +0 -0
  807. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_tmux_session.py +0 -0
  808. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_transcript_floor.py +0 -0
  809. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_usage.py +0 -0
  810. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_usage_limits.py +0 -0
  811. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_usage_rollup.py +0 -0
  812. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_venv_live_install_2121.py +0 -0
  813. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_version_single_source.py +0 -0
  814. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_watch.py +0 -0
  815. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  816. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_worker_events.py +0 -0
  817. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_worker_image_pin_sync.py +0 -0
  818. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_worker_safety.py +0 -0
  819. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_worker_test_scoping.py +0 -0
  820. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_worktree.py +0 -0
  821. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  822. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/Cargo.lock +0 -0
  823. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/Cargo.toml +0 -0
  824. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/cargo-config-local-quadraui.toml.example +0 -0
  825. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/app/audit.rs +0 -0
  826. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/app/chat.rs +0 -0
  827. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/app/data.rs +0 -0
  828. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/app/dialogs.rs +0 -0
  829. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/app/drive.rs +0 -0
  830. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/app/drive_queue.rs +0 -0
  831. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/app/escalation.rs +0 -0
  832. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/app/events.rs +0 -0
  833. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/app/fixtures.rs +0 -0
  834. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/app/fleet_health.rs +0 -0
  835. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/app/fleet_sessions.rs +0 -0
  836. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/app/fleet_terminals.rs +0 -0
  837. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/app/format.rs +0 -0
  838. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/app/milestone_dag.rs +0 -0
  839. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/app/mod.rs +0 -0
  840. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/app/msv.rs +0 -0
  841. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/app/pipeline.rs +0 -0
  842. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/app/plans.rs +0 -0
  843. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/app/render.rs +0 -0
  844. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/app/reports.rs +0 -0
  845. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/app/sessions.rs +0 -0
  846. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/app/settings_ui.rs +0 -0
  847. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/app/sidebar.rs +0 -0
  848. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/app/terminal.rs +0 -0
  849. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/app/tests.rs +0 -0
  850. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/app/types.rs +0 -0
  851. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/app/workspace.rs +0 -0
  852. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/bin/gtk.rs +0 -0
  853. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/commands.rs +0 -0
  854. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/lib.rs +0 -0
  855. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/main.rs +0 -0
  856. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/src/settings.rs +0 -0
  857. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/tests/acceptance.rs +0 -0
  858. {code_coordinator-0.5.124 → code_coordinator-0.5.126}/tui/tests/cli.rs +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.124
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.124
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.124",
2
+ "tag": "0.5.126",
3
3
  "distance": 0,
4
- "node": "g6db81a3b5b4ce09b2be4da91abbbe348a1fdebc7",
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
  *,
@@ -324,7 +324,7 @@ CI_RERUN_POLL_INTERVAL_SECONDS = 10.0
324
324
  CI_RERUN_MAX_WAIT_SECONDS = 360.0
325
325
 
326
326
 
327
- def _is_unreadable_check(check) -> bool:
327
+ def is_unreadable_check(check) -> bool:
328
328
  """True for the #1525 synthetic "could not read CI status" / "gh too
329
329
  old" stand-ins (``coord.ci_github._unreadable_check`` /
330
330
  ``_gh_too_old_check``) — the read itself failed, so this says nothing
@@ -332,10 +332,33 @@ def _is_unreadable_check(check) -> bool:
332
332
  importing ``coord.ci_github`` — this module must stay backend-agnostic,
333
333
  and every stub/fake ``CheckRun``-alike in the test suite already has
334
334
  both attributes.
335
+
336
+ Public (#2347) — :mod:`coord.merge_queue` reuses this directly to
337
+ classify a ``checks_failed`` block whose failures are ALL this stand-in
338
+ as a bare check-list *fetch* failure (``CI_UNREADABLE_PREFIX``), distinct
339
+ from both a real "still running" and a real "ran and failed" verdict; see
340
+ that module's docstring for the classification this feeds.
341
+
342
+ Deliberately narrower than "any ``coord: ``-named synthetic check with
343
+ ``conclusion == "unknown"``": :class:`coord.gate_snapshot.GateSnapshot`
344
+ (the board *read* path's ``CiStore`` — :mod:`coord.merge_queue`'s
345
+ ``_entry_gate_status`` can be, and in production is, called with one —
346
+ see ``coord.serve_app``'s ``/board`` handler) emits its OWN such
347
+ stand-in, ``_stale_check`` (``"coord: gate snapshot stale (...)"``), for
348
+ a completely different local condition — the daemon's own refresh loop
349
+ fell behind, not a GitHub read failure — and #2347's classification must
350
+ not relabel that as "GitHub unreachable". Both `coord.ci_github` stand-ins
351
+ share the phrase "read CI status" in their name; `_stale_check` does not,
352
+ so requiring it is what keeps the two apart without this module having
353
+ to import `coord.gate_snapshot` (which itself imports `coord.ci_store` —
354
+ the reverse import would cycle) or duck-type on anything less stable
355
+ than the prose these three call sites already commit to.
335
356
  """
357
+ name = str(getattr(check, "name", ""))
336
358
  return (
337
359
  getattr(check, "conclusion", None) == "unknown"
338
- and str(getattr(check, "name", "")).startswith("coord: ")
360
+ and name.startswith("coord: ")
361
+ and "read CI status" in name
339
362
  )
340
363
 
341
364
 
@@ -381,7 +404,7 @@ def wait_for_ci_settle(
381
404
 
382
405
  A "registering" read — no checks at all yet, or every check present is
383
406
  one of the #1525 synthetic unreadable stand-ins (see
384
- :func:`_is_unreadable_check`) — never counts as settled, however many
407
+ :func:`is_unreadable_check`) — never counts as settled, however many
385
408
  times it's observed; only real, resolved checks do. Genuinely in-flight
386
409
  real checks (a run that registered and is now actually executing) also
387
410
  keep polling — that's the ordinary "wait for CI to finish" case this
@@ -409,7 +432,7 @@ def wait_for_ci_settle(
409
432
  except Exception: # noqa: BLE001 — best-effort cache-bust only
410
433
  pass
411
434
  checks = ci_store.list_checks_for_pr(repo, number)
412
- registering = not checks or all(_is_unreadable_check(c) for c in checks)
435
+ registering = not checks or all(is_unreadable_check(c) for c in checks)
413
436
  if not registering and not in_flight_checks(checks):
414
437
  return CiSettleResult(
415
438
  settled=True, checks=checks, waited_seconds=clock() - start,
@@ -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"
@@ -1837,11 +1865,21 @@ def _fetch_gate_a_pending(entries: list) -> dict[str, bool]:
1837
1865
 
1838
1866
  def _fetch_live_ci_gate(
1839
1867
  entries: list, config_path: Path | None
1840
- ) -> dict[str, bool]:
1841
- """``{entry_key: still_blocked}`` for every ``parked`` entry whose OWN
1842
- park reason is CI-shaped (#1891/#1892) — a FRESH, single-entry
1843
- re-derivation of the SAME gate ``coord merge --plan`` computes, taken
1844
- live, right now, this tick (#2182).
1868
+ ) -> tuple[dict[str, bool], dict[str, str]]:
1869
+ """``({entry_key: still_blocked}, {entry_key: reason})`` for every
1870
+ ``parked`` entry whose OWN park reason is CI-shaped
1871
+ (#1891/#1892/#2347) — a FRESH, single-entry re-derivation of the SAME
1872
+ gate ``coord merge --plan`` computes, taken live, right now, this tick
1873
+ (#2182).
1874
+
1875
+ The second dict (#2347) carries the reason text
1876
+ :func:`coord.merge_queue.entry_gate_status` returned alongside each
1877
+ still-blocked verdict — used ONLY to let :func:`coord.drive_queue.
1878
+ plan_tick` rewrite a still-``parked`` entry's ``last_reason`` when the
1879
+ fresh reading is specifically "GitHub unreachable"
1880
+ (``is_ci_unreadable_reason``) and differs from what is currently stored;
1881
+ see that function's ``live_ci_gate_reason`` parameter. Never consulted
1882
+ to decide whether to resume — that remains the first dict's job alone.
1845
1883
 
1846
1884
  THE GAP THIS CLOSES. On the daemon host — the only machine that ever
1847
1885
  runs this tick (``docs/AGENT_OPERATIONS.md``) — ``_fetch_board_view``
@@ -1887,7 +1925,11 @@ def _fetch_live_ci_gate(
1887
1925
  have nothing to add — worse, ``coord.state.load_board()`` guards against
1888
1926
  being called from a thin client at all (#615).
1889
1927
  """
1890
- from coord.merge_queue import is_ci_infra_reason, is_ci_pending_reason # noqa: PLC0415
1928
+ from coord.merge_queue import ( # noqa: PLC0415
1929
+ is_ci_infra_reason,
1930
+ is_ci_pending_reason,
1931
+ is_ci_unreadable_reason,
1932
+ )
1891
1933
 
1892
1934
  targets = [
1893
1935
  e for e in entries
@@ -1895,15 +1937,16 @@ def _fetch_live_ci_gate(
1895
1937
  and (
1896
1938
  is_ci_pending_reason(getattr(e, "last_reason", "") or "")
1897
1939
  or is_ci_infra_reason(getattr(e, "last_reason", "") or "")
1940
+ or is_ci_unreadable_reason(getattr(e, "last_reason", "") or "")
1898
1941
  )
1899
1942
  ]
1900
1943
  if not targets:
1901
- return {}
1944
+ return {}, {}
1902
1945
 
1903
1946
  from coord.board_service import resolve as resolve_board_service # noqa: PLC0415
1904
1947
 
1905
1948
  if resolve_board_service() is not None:
1906
- return {}
1949
+ return {}, {}
1907
1950
 
1908
1951
  try:
1909
1952
  from coord import github_ops as _gh_ops # noqa: PLC0415
@@ -1919,19 +1962,22 @@ def _fetch_live_ci_gate(
1919
1962
  entry_key(q.repo_name, q.issue_number): q for q in _mq.load_queue()
1920
1963
  }
1921
1964
  except Exception: # noqa: BLE001 — see the fail-soft note above
1922
- return {}
1965
+ return {}, {}
1923
1966
 
1924
1967
  overrides: dict[str, bool] = {}
1968
+ reasons: dict[str, str] = {}
1925
1969
  for e in targets:
1926
1970
  q = queue_by_key.get(e.key)
1927
1971
  if q is None or not q.pr_number:
1928
1972
  continue
1929
1973
  try:
1930
- status, _reason = _mq.entry_gate_status(q, board, cfg, ci_store, _gh_ops)
1974
+ status, reason = _mq.entry_gate_status(q, board, cfg, ci_store, _gh_ops)
1931
1975
  except Exception: # noqa: BLE001 — leave this one entry to the ceiling
1932
1976
  continue
1933
1977
  overrides[e.key] = status != _mq.PLAN_READY
1934
- return overrides
1978
+ if reason:
1979
+ reasons[e.key] = reason
1980
+ return overrides, reasons
1935
1981
 
1936
1982
 
1937
1983
  def _fetch_live_blocked_gate(
@@ -2019,6 +2065,82 @@ def _fetch_live_blocked_gate(
2019
2065
  return overrides
2020
2066
 
2021
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
+
2022
2144
  def _launch_argv(entry: QueueEntry, config_path: Path | None) -> list[str]:
2023
2145
  """The ``coord drive --tmux`` argv for *entry*.
2024
2146
 
@@ -2050,6 +2172,136 @@ def _launch_argv(entry: QueueEntry, config_path: Path | None) -> list[str]:
2050
2172
  return argv
2051
2173
 
2052
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
+
2053
2305
  def _run_resume_probe(entry: QueueEntry) -> ProbeResult:
2054
2306
  """Run one entry's ``--resume-when`` probe with a hard timeout.
2055
2307
 
@@ -2201,7 +2453,8 @@ def _requeue_command(entry: QueueEntry | None, key: str) -> str:
2201
2453
  "Update the queue's view of reality and launch nothing (#2110). "
2202
2454
  "Every `running` entry is still checked against the board "
2203
2455
  "(done/blocked/parked/retry, exactly as a normal tick would), but no "
2204
- "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 "
2205
2458
  "`--max-parallel 0`. This is the missing primitive for the "
2206
2459
  "stop-the-timer-to-roll-the-fleet sequence: with the timer stopped, "
2207
2460
  "nothing reconciles a finished drive's `running` row, and that stale "
@@ -2337,7 +2590,11 @@ def drive_queue_tick(
2337
2590
  # on the daemon-host tick could previously be released only by the
2338
2591
  # #2158 45-minute ceiling, never by CI actually reporting, because
2339
2592
  # this tick's board read never computes a live `merge_plan`).
2340
- live_ci_gate = _fetch_live_ci_gate(entries, config_path)
2593
+ # #2347: the reason half — lets a still-parked entry's `last_reason`
2594
+ # be rewritten when the real cause is "GitHub unreachable" rather
2595
+ # than whatever it originally parked on; see `plan_tick`'s
2596
+ # `live_ci_gate_reason` parameter.
2597
+ live_ci_gate, live_ci_gate_reason = _fetch_live_ci_gate(entries, config_path)
2341
2598
 
2342
2599
  # #2230: the same live re-derivation, for RE-EVALUABLE `blocked`
2343
2600
  # entries — see `_fetch_live_blocked_gate`'s docstring for the gap
@@ -2345,6 +2602,15 @@ def drive_queue_tick(
2345
2602
  # landable for most of that window, and nothing ever looked again).
2346
2603
  live_blocked_gate = _fetch_live_blocked_gate(entries, config_path)
2347
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
+
2348
2614
  # #2101: release cordons. THIS is the hole the issue names — the
2349
2615
  # queue's launcher had zero pause awareness (`coord/drive.py` checks
2350
2616
  # pause only when routing a *worker*), so a cordoned host kept getting
@@ -2384,8 +2650,10 @@ def drive_queue_tick(
2384
2650
  gate_a_pending=gate_a_pending,
2385
2651
  cordons=cordons,
2386
2652
  live_ci_gate=live_ci_gate,
2653
+ live_ci_gate_reason=live_ci_gate_reason,
2387
2654
  live_blocked_gate=live_blocked_gate,
2388
2655
  editable_drift=editable_drift,
2656
+ merge_only_ready=merge_only_ready,
2389
2657
  )
2390
2658
 
2391
2659
  if reconcile_only:
@@ -2404,6 +2672,16 @@ def drive_queue_tick(
2404
2672
 
2405
2673
  _apply_writes(plan)
2406
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
+
2407
2685
  # #2235 Phase 0: record every entry this tick moved INTO or OUT OF
2408
2686
  # `blocked`/`parked`, with the reason the queue stated and — for a
2409
2687
  # release — what the release itself reveals about the true cause.
@@ -191,7 +191,8 @@ def _ensure_schema(conn: sqlite3.Connection) -> None:
191
191
  ci_infra_reruns INTEGER NOT NULL DEFAULT 0,
192
192
  ci_stale_reruns INTEGER NOT NULL DEFAULT 0,
193
193
  ci_flaky_reruns INTEGER NOT NULL DEFAULT 0,
194
- ci_flaky_pending TEXT NOT NULL DEFAULT ''
194
+ ci_flaky_pending TEXT NOT NULL DEFAULT '',
195
+ ci_unreadable_reruns INTEGER NOT NULL DEFAULT 0
195
196
  );
196
197
 
197
198
  CREATE TABLE IF NOT EXISTS plans (
@@ -909,6 +910,14 @@ def _migrate_add_columns(conn: sqlite3.Connection) -> None:
909
910
  # row predating this migration and for a non-stream-json / PTY
910
911
  # worker whose log carries no such field.
911
912
  "ALTER TABLE assignments ADD COLUMN stop_reason TEXT",
913
+ # #2347: count of automatic checks `merge_queue.process()` has made
914
+ # against this entry's CURRENT streak of bare check-list FETCH
915
+ # failures (GitHub unreachable, not a real CI verdict) — see
916
+ # `coord.merge_queue.MAX_CI_UNREADABLE_RERUNS` and
917
+ # `QueuedMerge.ci_unreadable_reruns`'s docstring. 0 for every row
918
+ # predating this column, same as the column's own default for a
919
+ # freshly-enqueued entry.
920
+ "ALTER TABLE merge_queue ADD COLUMN ci_unreadable_reruns INTEGER NOT NULL DEFAULT 0",
912
921
  ]
913
922
  for sql in migrations:
914
923
  try: