code-coordinator 0.5.76__tar.gz → 0.5.78__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 (826) hide show
  1. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/merge.py +68 -0
  5. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/drive.py +170 -14
  6. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/merge_queue.py +107 -0
  7. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/revalidate.py +59 -0
  8. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/DRIVE_QUEUE.md +13 -0
  9. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/OPERATING_GOTCHAS.md +57 -0
  10. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_drive.py +271 -0
  11. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_merge_queue.py +221 -0
  12. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_revalidate.py +271 -0
  13. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/.claude/commands/board.md +0 -0
  14. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/.claude/commands/complete-session.md +0 -0
  15. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/.claude/commands/coordinator.md +0 -0
  16. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/.githooks/_lib.sh +0 -0
  17. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/.githooks/post-checkout +0 -0
  18. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/.githooks/post-commit +0 -0
  19. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/.githooks/post-merge +0 -0
  20. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  21. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/.github/coord-ci-acceptance.yml +0 -0
  22. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/.github/workflows/auto-release.yml +0 -0
  23. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/.github/workflows/cargo-test.yml +0 -0
  24. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/.github/workflows/publish.yml +0 -0
  25. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/.github/workflows/release-tui.yml +0 -0
  26. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/.github/workflows/test.yml +0 -0
  27. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/.gitignore +0 -0
  28. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/CLAUDE.md +0 -0
  29. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/GOAL.md +0 -0
  30. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/LICENSE +0 -0
  31. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/MANIFEST.in +0 -0
  32. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/README.md +0 -0
  33. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/code_coordinator.egg-info/SOURCES.txt +0 -0
  34. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/code_coordinator.egg-info/dependency_links.txt +0 -0
  35. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/code_coordinator.egg-info/entry_points.txt +0 -0
  36. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/code_coordinator.egg-info/requires.txt +0 -0
  37. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/code_coordinator.egg-info/scm_file_list.json +0 -0
  38. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/code_coordinator.egg-info/top_level.txt +0 -0
  39. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/__init__.py +0 -0
  40. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/_board_mapping.py +0 -0
  41. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/acceptance.py +0 -0
  42. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/acceptance_drivers.py +0 -0
  43. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/agent.py +0 -0
  44. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/agent_app.py +0 -0
  45. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/agent_update.py +0 -0
  46. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/agents/opencode/.gitignore +0 -0
  47. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/agents/opencode/agents/work.md +0 -0
  48. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/agents/opencode/routing.jsonc +0 -0
  49. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/audit.py +0 -0
  50. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/auto_loop.py +0 -0
  51. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/board_bool_guard.py +0 -0
  52. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/board_service.py +0 -0
  53. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/board_wire.py +0 -0
  54. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/brain.py +0 -0
  55. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/branch_model.py +0 -0
  56. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/bug_intake.py +0 -0
  57. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/cargo_cache.py +0 -0
  58. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/ci_github.py +0 -0
  59. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/ci_store.py +0 -0
  60. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/claim.py +0 -0
  61. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/cli.py +0 -0
  62. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/client.py +0 -0
  63. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/__init__.py +0 -0
  64. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/_common.py +0 -0
  65. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/acceptance.py +0 -0
  66. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/agent_ops.py +0 -0
  67. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/audit.py +0 -0
  68. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/chat.py +0 -0
  69. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/dispatch.py +0 -0
  70. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/dispatch_workers.py +0 -0
  71. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/drive.py +0 -0
  72. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/drive_queue.py +0 -0
  73. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/gate_a.py +0 -0
  74. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/gates.py +0 -0
  75. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/issues.py +0 -0
  76. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/lifecycle.py +0 -0
  77. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/milestone.py +0 -0
  78. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/plan_followup.py +0 -0
  79. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/plans.py +0 -0
  80. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/portal.py +0 -0
  81. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/release.py +0 -0
  82. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/repo.py +0 -0
  83. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/report.py +0 -0
  84. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/review.py +0 -0
  85. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/scorecard.py +0 -0
  86. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/sessions.py +0 -0
  87. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/setup.py +0 -0
  88. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/status.py +0 -0
  89. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/terminal.py +0 -0
  90. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/test_gate.py +0 -0
  91. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/commands/tui.py +0 -0
  92. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/comments.py +0 -0
  93. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/config.py +0 -0
  94. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/conflict_fix.py +0 -0
  95. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dao.py +0 -0
  96. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/__init__.py +0 -0
  97. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/fixture.py +0 -0
  98. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/index.html +0 -0
  99. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/server.py +0 -0
  100. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/terminal.py +0 -0
  101. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/.gitignore +0 -0
  102. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/components.json +0 -0
  103. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js +0 -0
  104. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  105. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js +0 -0
  106. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js +0 -0
  107. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  108. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  109. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  110. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  111. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  112. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/index.html +0 -0
  113. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  114. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/sw.js +0 -0
  115. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  116. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  117. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  118. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  119. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  120. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  121. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  122. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  123. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  124. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  125. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/eslint.config.js +0 -0
  126. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/index.html +0 -0
  127. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  128. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/package-lock.json +0 -0
  129. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/package.json +0 -0
  130. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  131. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/playwright.config.ts +0 -0
  132. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/postcss.config.js +0 -0
  133. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  134. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  135. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  136. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/App.tsx +0 -0
  137. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/api/client.ts +0 -0
  138. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  139. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  140. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  141. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  142. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  143. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  144. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  145. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  146. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  147. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  148. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  149. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  150. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  151. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  152. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  153. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  154. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  155. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  156. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  157. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  158. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  159. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  160. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  161. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  162. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  163. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  164. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  165. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  166. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  167. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  168. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  169. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  170. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  171. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  172. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  173. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/index.css +0 -0
  174. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  175. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  176. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/main.tsx +0 -0
  177. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  178. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  179. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  180. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  181. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  182. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  183. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  184. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  185. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  186. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  187. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  188. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  189. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  190. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  191. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  192. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  193. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  194. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  195. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  196. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  197. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  198. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  199. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  200. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/tailwind.config.js +0 -0
  201. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/tsconfig.json +0 -0
  202. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  203. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dashboard/webapp/vite.config.ts +0 -0
  204. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/db.py +0 -0
  205. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dead_end.py +0 -0
  206. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/README.md +0 -0
  207. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-agent.service +0 -0
  208. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-db-backup.service +0 -0
  209. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-db-backup.sh +0 -0
  210. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-db-backup.timer +0 -0
  211. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-drive-queue.service +0 -0
  212. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-drive-queue.timer +0 -0
  213. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-notify.service +0 -0
  214. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-notify.timer +0 -0
  215. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-release-propagate.service +0 -0
  216. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-release-propagate.timer +0 -0
  217. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-release-window.service +0 -0
  218. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-release-window.timer +0 -0
  219. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-serve.service +0 -0
  220. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-web-dist-build.service +0 -0
  221. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-web-dist-build.timer +0 -0
  222. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy/coord-web.service +0 -0
  223. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy_manifest.py +0 -0
  224. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deploy_units.py +0 -0
  225. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/deps.py +0 -0
  226. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/diagnose.py +0 -0
  227. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dispatch.py +0 -0
  228. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/dist_name.py +0 -0
  229. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/drive_queue.py +0 -0
  230. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/drive_state.py +0 -0
  231. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/events.py +0 -0
  232. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/failure_class.py +0 -0
  233. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/filelock.py +0 -0
  234. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/fleet_config_health.py +0 -0
  235. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/freshness.py +0 -0
  236. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/gate_a.py +0 -0
  237. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/gate_b.py +0 -0
  238. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/gate_snapshot.py +0 -0
  239. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/gates.py +0 -0
  240. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/github_ops.py +0 -0
  241. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/goal.py +0 -0
  242. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/graph_health.py +0 -0
  243. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/__init__.py +0 -0
  244. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/aggregate.py +0 -0
  245. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/__init__.py +0 -0
  246. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/agent_install.py +0 -0
  247. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/cargo_targets.py +0 -0
  248. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/claude_binary.py +0 -0
  249. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/deploy_lane_facts.py +0 -0
  250. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/disk.py +0 -0
  251. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/fleet_board.py +0 -0
  252. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  253. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/fleet_phantom.py +0 -0
  254. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/fleet_unit_drift.py +0 -0
  255. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/graph.py +0 -0
  256. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/plan_usage.py +0 -0
  257. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/repo_state.py +0 -0
  258. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/spawned_coord.py +0 -0
  259. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/timer_active.py +0 -0
  260. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/toolchain.py +0 -0
  261. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/unit_drift.py +0 -0
  262. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/unit_enablement.py +0 -0
  263. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/checks/worktrees.py +0 -0
  264. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/cli.py +0 -0
  265. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/context.py +0 -0
  266. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/fleet_snapshot.py +0 -0
  267. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/models.py +0 -0
  268. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/pypi.py +0 -0
  269. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/registry.py +0 -0
  270. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/render.py +0 -0
  271. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/health/units.py +0 -0
  272. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/hooks.py +0 -0
  273. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/housekeeping.py +0 -0
  274. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/interactive.py +0 -0
  275. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/issue_store.py +0 -0
  276. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/liveness_auditor.py +0 -0
  277. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/machine_pause.py +0 -0
  278. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/milestone_chat.py +0 -0
  279. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/milestone_dispatch.py +0 -0
  280. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/milestone_gate.py +0 -0
  281. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/milestone_order.py +0 -0
  282. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/mock_author.py +0 -0
  283. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/models.py +0 -0
  284. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/network.py +0 -0
  285. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/new_issue_chat.py +0 -0
  286. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/notifier/__init__.py +0 -0
  287. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/notifier/baseline.py +0 -0
  288. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/notifier/cli.py +0 -0
  289. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/notifier/collect.py +0 -0
  290. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/notifier/digest.py +0 -0
  291. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/notifier/models.py +0 -0
  292. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/notifier/predicate.py +0 -0
  293. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/notifier/service.py +0 -0
  294. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/notifier/store.py +0 -0
  295. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/notifier/transport.py +0 -0
  296. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/notify.py +0 -0
  297. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/openapi.py +0 -0
  298. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/overlap_fence.py +0 -0
  299. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/parentage.py +0 -0
  300. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/parentage_github.py +0 -0
  301. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/pipeline.py +0 -0
  302. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/plan_parser.py +0 -0
  303. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/plans.py +0 -0
  304. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/platform_paths.py +0 -0
  305. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/portal_bridge.py +0 -0
  306. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/pr_body_lint.py +0 -0
  307. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/prereqs.py +0 -0
  308. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/progress.py +0 -0
  309. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/providers/__init__.py +0 -0
  310. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/providers/base.py +0 -0
  311. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/providers/claude.py +0 -0
  312. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/providers/claude_pty.py +0 -0
  313. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/providers/opencode.py +0 -0
  314. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/reconcile.py +0 -0
  315. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/refine_chat.py +0 -0
  316. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/release_cordon.py +0 -0
  317. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/release_propagate.py +0 -0
  318. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/release_verify.py +0 -0
  319. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/release_window.py +0 -0
  320. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/repo_edit.py +0 -0
  321. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/repo_onboard.py +0 -0
  322. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/reports.py +0 -0
  323. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/review.py +0 -0
  324. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/scorecard.py +0 -0
  325. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/serve_app.py +0 -0
  326. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/skills/update-issue/SKILL.md +0 -0
  327. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/smoke.py +0 -0
  328. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/spend_ceiling.py +0 -0
  329. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/split_work.py +0 -0
  330. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/stage_projection.py +0 -0
  331. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/state.py +0 -0
  332. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/test_author.py +0 -0
  333. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/test_chat.py +0 -0
  334. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/test_orchestrator.py +0 -0
  335. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/test_report.py +0 -0
  336. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/tui_release.py +0 -0
  337. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/usage.py +0 -0
  338. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/usage_limits.py +0 -0
  339. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/usage_rollup.py +0 -0
  340. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coord/worker_events.py +0 -0
  341. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/coordinator.example.yml +0 -0
  342. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-agent.service +0 -0
  343. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-db-backup.service +0 -0
  344. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-db-backup.sh +0 -0
  345. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-db-backup.timer +0 -0
  346. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-drive-queue.service +0 -0
  347. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-drive-queue.timer +0 -0
  348. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-notify.service +0 -0
  349. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-notify.timer +0 -0
  350. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-release-propagate.service +0 -0
  351. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-release-propagate.timer +0 -0
  352. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-release-window.service +0 -0
  353. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-release-window.timer +0 -0
  354. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-serve.service +0 -0
  355. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-web-dist-build.service +0 -0
  356. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-web-dist-build.sh +0 -0
  357. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-web-dist-build.timer +0 -0
  358. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-web-rollback.sh +0 -0
  359. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/coord-web.service +0 -0
  360. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/deploy/node-shim.sh +0 -0
  361. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/AGENT_OPERATIONS.md +0 -0
  362. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/ARCHITECTURE.md +0 -0
  363. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/ARCH_SECURITY_GATES.md +0 -0
  364. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/COCKPIT.md +0 -0
  365. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/CONTROL_CENTER.md +0 -0
  366. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/COST_DISCIPLINE.md +0 -0
  367. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/CROSS_PLATFORM.md +0 -0
  368. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/CUSTOMER_PORTAL.md +0 -0
  369. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/EPHEMERAL_WORKERS.md +0 -0
  370. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/FORGE_MIGRATION.md +0 -0
  371. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/GRAPHIFY_SETUP.md +0 -0
  372. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/ISSUE_GUIDANCE.md +0 -0
  373. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/MAC_MINI.md +0 -0
  374. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  375. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/NOTIFIER.md +0 -0
  376. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/OPENCODE_VERIFICATION.md +0 -0
  377. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/ORACLE_LOOP.md +0 -0
  378. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/PHONE_WEBAPP.md +0 -0
  379. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/PIPELINE_V2.md +0 -0
  380. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/PLATFORM_EVOLUTION.md +0 -0
  381. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/SECOND_BACKEND.md +0 -0
  382. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/STORE_SERVICE.md +0 -0
  383. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  384. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/WEB_CONTROL_CENTER.md +0 -0
  385. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/mocks/web/README.md +0 -0
  386. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/mocks/web/_tokens.css +0 -0
  387. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/mocks/web/issue-detail.html +0 -0
  388. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/mocks/web/pipeline-narrow.html +0 -0
  389. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/docs/mocks/web/pipeline-wide.html +0 -0
  390. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/graphify-out/.gitignore +0 -0
  391. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/install-agent.sh +0 -0
  392. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/pyproject.toml +0 -0
  393. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/audit_review_verdict_overrides.py +0 -0
  394. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  395. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/azure-workers/build-worker-image.sh +0 -0
  396. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/azure-workers/coordinator-machine.py +0 -0
  397. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/azure-workers/epic-down.sh +0 -0
  398. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/azure-workers/epic-up.sh +0 -0
  399. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/azure-workers/preflight.sh +0 -0
  400. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/azure-workers/provision-worker.sh +0 -0
  401. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  402. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  403. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/azure-workers/verify-github-token.sh +0 -0
  404. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/codegen.py +0 -0
  405. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/coord-test-runner.sh +0 -0
  406. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/drive-batch.sh +0 -0
  407. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/gen_board_fixture.py +0 -0
  408. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/next_release_tag.py +0 -0
  409. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/run_tests_in_populated_home.sh +0 -0
  410. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/run_tests_without_gh.sh +0 -0
  411. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/smoke_437_interactive.py +0 -0
  412. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/verify_878_review_capture.py +0 -0
  413. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/verify_release_published.py +0 -0
  414. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/scripts/verify_release_wheel.py +0 -0
  415. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/setup.cfg +0 -0
  416. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/SMOKE_SET.md +0 -0
  417. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/__init__.py +0 -0
  418. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  419. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-33/contract.md +0 -0
  420. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-33/manifest.yml +0 -0
  421. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  422. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  423. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  424. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  425. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-37/conftest.py +0 -0
  426. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-37/contract.md +0 -0
  427. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-37/manifest.yml +0 -0
  428. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  429. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  430. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-38/contract.md +0 -0
  431. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-38/manifest.yml +0 -0
  432. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  433. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  434. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  435. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  436. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  437. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  438. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  439. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  440. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  441. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  442. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-51/contract.md +0 -0
  443. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  444. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  445. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-51/manifest.yml +0 -0
  446. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  447. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-51/tsconfig.json +0 -0
  448. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  449. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/conftest.py +0 -0
  450. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/board-pipeline-basic.json +0 -0
  451. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  452. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  453. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  454. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/playwright/all_pass.json +0 -0
  455. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  456. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/playwright/mixed_fail.json +0 -0
  457. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  458. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  459. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/playwright/skip.json +0 -0
  460. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/playwright/truncated.json +0 -0
  461. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  462. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  463. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  464. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  465. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  466. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  467. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  468. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  469. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_acceptance.py +0 -0
  470. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_acceptance_drivers.py +0 -0
  471. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent.py +0 -0
  472. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_api_error.py +0 -0
  473. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_app.py +0 -0
  474. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_branch_base.py +0 -0
  475. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_branch_capture.py +0 -0
  476. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_config_free_1712.py +0 -0
  477. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_deploy_units_endpoint.py +0 -0
  478. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_dirty_worktree.py +0 -0
  479. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_graph_self_heal.py +0 -0
  480. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_health_h3.py +0 -0
  481. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_idle_restart.py +0 -0
  482. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_push_failure.py +0 -0
  483. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_reap.py +0 -0
  484. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_repos_and_pull.py +0 -0
  485. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_restart_services_endpoint.py +0 -0
  486. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_startup_diagnostics.py +0 -0
  487. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_update.py +0 -0
  488. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_update_bluegreen.py +0 -0
  489. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_usage_limit.py +0 -0
  490. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_agent_zero_commit.py +0 -0
  491. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_ambient_home_isolation.py +0 -0
  492. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_approve_reject_plan.py +0 -0
  493. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_approve_usage_gate.py +0 -0
  494. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_assignment_already_recorded_daemon.py +0 -0
  495. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_audit_log.py +0 -0
  496. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_audit_outcome.py +0 -0
  497. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_audit_query.py +0 -0
  498. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_auto_loop.py +0 -0
  499. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_auto_release_publish_2035.py +0 -0
  500. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_base_checkout_restore.py +0 -0
  501. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_board_cap_762.py +0 -0
  502. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_board_fixture.py +0 -0
  503. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_board_read_path.py +0 -0
  504. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_board_service.py +0 -0
  505. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_board_state.py +0 -0
  506. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_board_wire.py +0 -0
  507. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_brain.py +0 -0
  508. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_branch_model.py +0 -0
  509. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_bug_intake.py +0 -0
  510. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_build_worker_image_env_update.py +0 -0
  511. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cargo_cache.py +0 -0
  512. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_ci_acceptance_gate_1950.py +0 -0
  513. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_ci_parity_2091.py +0 -0
  514. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_ci_store.py +0 -0
  515. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_claim.py +0 -0
  516. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_acceptance.py +0 -0
  517. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_assign.py +0 -0
  518. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  519. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_assign_interactive_remote.py +0 -0
  520. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_assign_provider.py +0 -0
  521. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  522. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_audit.py +0 -0
  523. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_chat_continue.py +0 -0
  524. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_diagnose_config_provenance.py +0 -0
  525. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_diagnose_graph.py +0 -0
  526. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_doctor.py +0 -0
  527. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_doctor_config_free_1801.py +0 -0
  528. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  529. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_drive.py +0 -0
  530. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_drive_queue.py +0 -0
  531. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_escalate.py +0 -0
  532. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_fix_headless_review.py +0 -0
  533. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_gate_a.py +0 -0
  534. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_install_drift.py +0 -0
  535. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_install_skills.py +0 -0
  536. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_issue_create_label.py +0 -0
  537. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_issue_reopen.py +0 -0
  538. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_merge.py +0 -0
  539. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_milestone_assign.py +0 -0
  540. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_milestone_capture.py +0 -0
  541. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_milestone_chat_add_child.py +0 -0
  542. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_milestone_dispatch.py +0 -0
  543. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_milestone_gate_b.py +0 -0
  544. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_milestone_gate_c.py +0 -0
  545. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_milestone_order.py +0 -0
  546. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  547. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_milestone_ship.py +0 -0
  548. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_network.py +0 -0
  549. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_new_issue_chat.py +0 -0
  550. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_plans.py +0 -0
  551. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_portal.py +0 -0
  552. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_pull_artifact.py +0 -0
  553. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_queue.py +0 -0
  554. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_reattach_sessions.py +0 -0
  555. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_refine_board.py +0 -0
  556. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_release_preflight.py +0 -0
  557. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_release_propagate.py +0 -0
  558. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_release_window.py +0 -0
  559. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_repo_2220.py +0 -0
  560. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_scorecard.py +0 -0
  561. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_set_review_findings.py +0 -0
  562. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_status_advisory_terminal.py +0 -0
  563. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_status_merge_queue.py +0 -0
  564. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_status_provider.py +0 -0
  565. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_status_review_finalizing.py +0 -0
  566. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_status_test_failed_tag.py +0 -0
  567. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_status_usage_limit.py +0 -0
  568. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_sync_comments_873.py +0 -0
  569. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_test_plan.py +0 -0
  570. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_track.py +0 -0
  571. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_tui_update.py +0 -0
  572. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cli_wait.py +0 -0
  573. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_client_base_install.py +0 -0
  574. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_comments.py +0 -0
  575. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_completion_summary.py +0 -0
  576. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_config.py +0 -0
  577. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_config_acceptance.py +0 -0
  578. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_config_audit.py +0 -0
  579. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_config_pricing.py +0 -0
  580. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_config_usage_gate.py +0 -0
  581. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_conflict_fix.py +0 -0
  582. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_conflict_fix_semantic.py +0 -0
  583. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_coord_test.py +0 -0
  584. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_coord_test_runner_baseline.py +0 -0
  585. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_coord_test_runner_routing.py +0 -0
  586. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_coord_test_runner_toolchain.py +0 -0
  587. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_coord_web_sse_restart_live.py +0 -0
  588. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_coordinator_machine.py +0 -0
  589. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_cross_platform_imports.py +0 -0
  590. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_dashboard.py +0 -0
  591. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_dashboard_fixture.py +0 -0
  592. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_dashboard_terminal.py +0 -0
  593. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_dashboard_terminal_live.py +0 -0
  594. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_db.py +0 -0
  595. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_dead_end.py +0 -0
  596. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_deploy_coord_db_backup.py +0 -0
  597. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_deploy_coord_web_dist.py +0 -0
  598. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_deploy_coord_web_rollback.py +0 -0
  599. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_deploy_drive_queue_unit.py +0 -0
  600. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_deploy_manifest.py +0 -0
  601. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_deploy_units_lane.py +0 -0
  602. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_deploy_web_unit.py +0 -0
  603. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_deps.py +0 -0
  604. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_diagnose.py +0 -0
  605. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_dispatch.py +0 -0
  606. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_dispatch_target_validation.py +0 -0
  607. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_dist_name.py +0 -0
  608. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_done_housekeeping.py +0 -0
  609. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_drive_queue.py +0 -0
  610. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_drive_state.py +0 -0
  611. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_drive_tmux.py +0 -0
  612. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_epic_up_capability_detection.py +0 -0
  613. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  614. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_epic_up_image_provenance.py +0 -0
  615. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_errors.py +0 -0
  616. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_events.py +0 -0
  617. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_failure_class.py +0 -0
  618. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_filelock.py +0 -0
  619. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  620. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_fix_of_force_override.py +0 -0
  621. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_fleet_config_health.py +0 -0
  622. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_fleet_health_probes.py +0 -0
  623. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_fleet_health_snapshot.py +0 -0
  624. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_freshness.py +0 -0
  625. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_gate_a.py +0 -0
  626. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_gate_b.py +0 -0
  627. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_gate_snapshot_staleness.py +0 -0
  628. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_gates.py +0 -0
  629. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  630. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_generated_types_fixture.py +0 -0
  631. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_github_ops.py +0 -0
  632. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_goal.py +0 -0
  633. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_graph_health.py +0 -0
  634. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_handoff.py +0 -0
  635. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_health_checks.py +0 -0
  636. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_health_cli.py +0 -0
  637. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_health_cli_graph.py +0 -0
  638. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_health_config.py +0 -0
  639. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_health_context.py +0 -0
  640. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_health_deploy_lane_facts.py +0 -0
  641. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_health_incident_regression.py +0 -0
  642. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_health_pypi.py +0 -0
  643. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_health_registry.py +0 -0
  644. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_health_timer_active.py +0 -0
  645. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_health_toolchain.py +0 -0
  646. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_health_unit_drift.py +0 -0
  647. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_health_unit_enablement.py +0 -0
  648. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_hooks.py +0 -0
  649. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_human_attended_437.py +0 -0
  650. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_init.py +0 -0
  651. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_integration.py +0 -0
  652. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_interactive_briefing_echo.py +0 -0
  653. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_interactive_prefill_state.py +0 -0
  654. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_interactive_session_relaunch.py +0 -0
  655. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_interactive_test_verdict_backstop.py +0 -0
  656. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_interactive_token_attribution.py +0 -0
  657. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_interactive_worktree.py +0 -0
  658. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_issue_store_seam.py +0 -0
  659. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_liveness_auditor.py +0 -0
  660. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_liveness_notify.py +0 -0
  661. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_machine_pause.py +0 -0
  662. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_merge_verify.py +0 -0
  663. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_milestone_chat.py +0 -0
  664. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_milestone_dispatch.py +0 -0
  665. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_milestone_gate.py +0 -0
  666. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_milestone_order.py +0 -0
  667. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_milestone_seam.py +0 -0
  668. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_mock_author.py +0 -0
  669. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_model_tiering.py +0 -0
  670. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_models.py +0 -0
  671. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_models_config_labels.py +0 -0
  672. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_needs_attention.py +0 -0
  673. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_network.py +0 -0
  674. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_new_issue_chat.py +0 -0
  675. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_next_release_tag.py +0 -0
  676. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_no_direct_gh_calls.py +0 -0
  677. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_node_shim.py +0 -0
  678. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_notifier_baseline.py +0 -0
  679. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_notifier_cli.py +0 -0
  680. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_notifier_collect.py +0 -0
  681. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_notifier_config.py +0 -0
  682. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_notifier_drive_seam.py +0 -0
  683. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_notifier_isolation.py +0 -0
  684. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_notifier_predicate.py +0 -0
  685. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_notifier_quiet_hours.py +0 -0
  686. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_notifier_service.py +0 -0
  687. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_notify.py +0 -0
  688. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_notify_drain.py +0 -0
  689. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_openapi.py +0 -0
  690. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_operational_defaults.py +0 -0
  691. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_overlap_fence.py +0 -0
  692. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_packaged_deploy_units.py +0 -0
  693. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_parentage.py +0 -0
  694. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_paste_landed.py +0 -0
  695. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_pipeline.py +0 -0
  696. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_plan_followup_approve_plan_command.py +0 -0
  697. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_plan_followup_pr_command.py +0 -0
  698. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_plan_followup_review_command.py +0 -0
  699. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_plan_only.py +0 -0
  700. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_plan_parser.py +0 -0
  701. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_platform_paths.py +0 -0
  702. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_portal_bridge.py +0 -0
  703. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_portal_config.py +0 -0
  704. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_pr_body_lint.py +0 -0
  705. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_prereqs.py +0 -0
  706. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_production_db_guard.py +0 -0
  707. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_progress.py +0 -0
  708. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_provider_seam.py +0 -0
  709. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_providers.py +0 -0
  710. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_providers_config_labels.py +0 -0
  711. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_providers_pty.py +0 -0
  712. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_quiet_hours.py +0 -0
  713. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_quiet_hours_store_2146.py +0 -0
  714. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_reap_merged_sessions.py +0 -0
  715. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_reap_stale_interactive_tick.py +0 -0
  716. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_reconcile_branch.py +0 -0
  717. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_reconcile_completions.py +0 -0
  718. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_reconcile_merges.py +0 -0
  719. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_reconcile_usage_limit_done.py +0 -0
  720. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_refine_chat.py +0 -0
  721. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_release_cordon_2101.py +0 -0
  722. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_release_propagate.py +0 -0
  723. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_release_unified_1242.py +0 -0
  724. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_release_verify.py +0 -0
  725. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_release_window.py +0 -0
  726. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_remote_auto_prune.py +0 -0
  727. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_remote_interactive_reaper.py +0 -0
  728. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_repo_edit_2220.py +0 -0
  729. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_repo_onboard_2220.py +0 -0
  730. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_report_result_push.py +0 -0
  731. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_reports.py +0 -0
  732. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_retry.py +0 -0
  733. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_retry_advisory_1606.py +0 -0
  734. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_retry_type_1636.py +0 -0
  735. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_review.py +0 -0
  736. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_review_end_review_without_verdict.py +0 -0
  737. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_review_parse_failure_diagnostic.py +0 -0
  738. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_review_reaffirm.py +0 -0
  739. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_review_state.py +0 -0
  740. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_review_verdict_backstop.py +0 -0
  741. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_review_verdict_override_audit.py +0 -0
  742. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_review_verdict_relay.py +0 -0
  743. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_review_zero_commits.py +0 -0
  744. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_scoped_review_wiring.py +0 -0
  745. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_scorecard.py +0 -0
  746. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_serve.py +0 -0
  747. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_serve_app_board_trim.py +0 -0
  748. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_session.py +0 -0
  749. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_slice_issue_attribution.py +0 -0
  750. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_smoke.py +0 -0
  751. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_smoke_live_checkout_restore.py +0 -0
  752. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_smoke_workflow.py +0 -0
  753. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_spend_ceiling.py +0 -0
  754. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_spend_ceiling_coordinator.py +0 -0
  755. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_split.py +0 -0
  756. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_split_work.py +0 -0
  757. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_stage_projection.py +0 -0
  758. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_stalled_pipeline.py +0 -0
  759. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_state.py +0 -0
  760. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_state_review_findings_daemon.py +0 -0
  761. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_status_fleet_footer.py +0 -0
  762. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_stop_1567.py +0 -0
  763. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_stuck.py +0 -0
  764. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_terminal_command.py +0 -0
  765. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_test_author.py +0 -0
  766. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_test_chat.py +0 -0
  767. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_test_orchestrator.py +0 -0
  768. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_test_report.py +0 -0
  769. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_test_verdict_parsing.py +0 -0
  770. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_test_verdict_transcript_floor.py +0 -0
  771. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_thin_client_board_audit.py +0 -0
  772. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_thin_client_config_load_1080.py +0 -0
  773. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_thin_client_daemon_routing_906.py +0 -0
  774. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_tmux_host.py +0 -0
  775. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_tmux_session.py +0 -0
  776. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_transcript_floor.py +0 -0
  777. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_usage.py +0 -0
  778. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_usage_limits.py +0 -0
  779. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_usage_rollup.py +0 -0
  780. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_venv_live_install_2121.py +0 -0
  781. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_version_single_source.py +0 -0
  782. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_watch.py +0 -0
  783. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_worker_events.py +0 -0
  784. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_worker_image_pin_sync.py +0 -0
  785. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_worker_safety.py +0 -0
  786. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_worker_test_scoping.py +0 -0
  787. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_worktree.py +0 -0
  788. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  789. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/Cargo.lock +0 -0
  790. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/Cargo.toml +0 -0
  791. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/cargo-config-local-quadraui.toml.example +0 -0
  792. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/audit.rs +0 -0
  793. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/chat.rs +0 -0
  794. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/data.rs +0 -0
  795. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/dialogs.rs +0 -0
  796. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/drive.rs +0 -0
  797. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/drive_queue.rs +0 -0
  798. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/escalation.rs +0 -0
  799. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/events.rs +0 -0
  800. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/fixtures.rs +0 -0
  801. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/fleet_health.rs +0 -0
  802. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/fleet_sessions.rs +0 -0
  803. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/fleet_terminals.rs +0 -0
  804. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/format.rs +0 -0
  805. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/milestone_dag.rs +0 -0
  806. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/mod.rs +0 -0
  807. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/msv.rs +0 -0
  808. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/pipeline.rs +0 -0
  809. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/plans.rs +0 -0
  810. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/render.rs +0 -0
  811. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/reports.rs +0 -0
  812. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/sessions.rs +0 -0
  813. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/settings_ui.rs +0 -0
  814. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/sidebar.rs +0 -0
  815. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/terminal.rs +0 -0
  816. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/tests.rs +0 -0
  817. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/types.rs +0 -0
  818. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/app/workspace.rs +0 -0
  819. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/bin/gtk.rs +0 -0
  820. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/commands.rs +0 -0
  821. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/lib.rs +0 -0
  822. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/main.rs +0 -0
  823. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/src/settings.rs +0 -0
  824. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/tests/acceptance.rs +0 -0
  825. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/tests/cli.rs +0 -0
  826. {code_coordinator-0.5.76 → code_coordinator-0.5.78}/tui/tests/fixtures/board_sample.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.76
3
+ Version: 0.5.78
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.76
3
+ Version: 0.5.78
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.76",
2
+ "tag": "0.5.78",
3
3
  "distance": 0,
4
- "node": "gdd3b9581f5fd9462b2fb9a85757ee783e3b09911",
4
+ "node": "g8c83f30ecf95a0893142d13948ccbadef68524f8",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-14"
@@ -76,6 +76,7 @@ def _apply_revalidation(items, board, config, gh_ops, *, dry_run: bool):
76
76
 
77
77
  recorded_any = False
78
78
  total_runs = 0
79
+ conflicted: list = []
79
80
  groups = _rv.group_candidates(candidates)
80
81
  for (repo_name, target_branch), group in groups:
81
82
  click.echo(
@@ -85,6 +86,7 @@ def _apply_revalidation(items, board, config, gh_ops, *, dry_run: bool):
85
86
  batch = _rv.revalidate_group(group, config, echo=click.echo)
86
87
  total_runs += batch.suite_runs
87
88
  recorded_any = recorded_any or bool(batch.recorded)
89
+ conflicted.extend(batch.conflicted)
88
90
  if not batch.composite.ok:
89
91
  # The composite's own failure report — stderr, as before.
90
92
  for line in _rv.format_failure(batch.composite):
@@ -100,6 +102,13 @@ def _apply_revalidation(items, board, config, gh_ops, *, dry_run: bool):
100
102
  f"{len(candidates)} entry(ies)"
101
103
  )
102
104
 
105
+ # #2231: the composed run just PROVED these branches don't merge. That is
106
+ # not a staleness problem and re-testing can never resolve it — hand it to
107
+ # the mechanism built for it instead of formatting a diagnosis nobody acts
108
+ # on.
109
+ if conflicted:
110
+ _dispatch_revalidation_conflicts(conflicted, config, dry_run=dry_run)
111
+
103
112
  if not recorded_any:
104
113
  return board
105
114
 
@@ -249,6 +258,65 @@ def _reload_board_after_wait(board, *, dry_run: bool):
249
258
  return refreshed if refreshed is not None else _Board(active=[], completed=[])
250
259
 
251
260
 
261
+ def _dispatch_revalidation_conflicts(conflicted, config, *, dry_run: bool) -> None:
262
+ """#2231: turn ``--revalidate``'s conflict verdict into a #241 dispatch.
263
+
264
+ *conflicted* is :attr:`coord.revalidate.BatchRevalidationResult.conflicted`
265
+ — the candidates whose revalidation run died composing the branch onto its
266
+ current base. ``--revalidate`` already did the expensive, authoritative
267
+ part: it fetched, built a worktree at the live base, ran ``git merge`` and
268
+ watched it fail. That is strictly better evidence than the failed ``gh pr
269
+ merge`` that normally arms this path, and it was being spent on an
270
+ operator-facing paragraph and then discarded (quadraui #306/#309 sat 11h
271
+ each behind a "test verdict stale" gate whose real blocker was a content
272
+ conflict; a human eventually typed ``coord fix --force`` by hand, which is
273
+ #241's own job description).
274
+
275
+ Two things happen per entry, in this order:
276
+
277
+ 1. The entry is moved to ``CONFLICT`` with an ``entry.error`` that names
278
+ the conflict (:func:`coord.revalidate.compose_conflict_error`). This is
279
+ the reporting half: the gate reason stops reading (only) "stale
280
+ verdict", so ``coord drive``'s #1738 arm no longer sees a shape it
281
+ would answer with a re-test, and ``merge_queue.process()`` — which acts
282
+ only on ``PENDING`` — leaves the entry alone this pass instead of
283
+ re-deriving the same smoke block. The caller persists the mutation with
284
+ the rest of the queue; nothing is written here.
285
+ 2. The entry is handed to :func:`_dispatch_conflict_fixes` as a synthetic
286
+ ``conflict`` event, which is the SAME call the whole-queue and
287
+ ``--only`` paths make after a live merge attempt. Every guard it owns
288
+ still applies unchanged: :func:`coord.merge_queue.classify_conflict`
289
+ must read the error as ``rebaseable``, the #241/#784 retry cap still
290
+ flips a second failure to ``HUMAN_REQUIRED``, and
291
+ ``dispatch_conflict_fix``'s own in-flight check still refuses a
292
+ duplicate. Deliberately routed through that function rather than
293
+ calling ``dispatch_conflict_fix`` directly — a second dispatch site
294
+ with its own copy of those guards is how they drift apart.
295
+
296
+ Under ``--dry-run`` nothing is mutated and nothing is dispatched (the
297
+ revalidation itself never ran either — see :func:`_apply_revalidation`).
298
+ """
299
+ if dry_run or not conflicted:
300
+ return
301
+
302
+ from coord.merge_queue import CONFLICT, MergeEvent # noqa: PLC0415
303
+ from coord.revalidate import compose_conflict_error # noqa: PLC0415
304
+
305
+ events = []
306
+ for candidate, _result in conflicted:
307
+ entry = candidate.entry
308
+ entry.error = compose_conflict_error(entry)
309
+ entry.state = CONFLICT
310
+ click.echo(
311
+ f" --revalidate: {entry.repo_name} #{entry.issue_number}: "
312
+ "the blocker is a CONFLICT, not a stale verdict — the branch does "
313
+ "not compose onto its base. Routing to the conflict-fix path "
314
+ "(#241) instead of re-testing (#2231)."
315
+ )
316
+ events.append(MergeEvent(entry, "conflict", entry.error))
317
+ _dispatch_conflict_fixes(events, config, dry_run=False)
318
+
319
+
252
320
  def _dispatch_conflict_fixes(events, config, *, dry_run: bool) -> None:
253
321
  """#241: classify any conflict events and dispatch a conflict-fix worker
254
322
  for the eligible ones. Mutates each conflict event's ``ev.entry.state``
@@ -289,6 +289,21 @@ class DriveCounters:
289
289
  # capture deserves its own full budget of cheap waits before the next
290
290
  # forced retry.
291
291
  gate_wait_rounds: int = 0
292
+ # #2229: the value `merge_attempts` held when the #1738 stale-smoke
293
+ # re-test last fired off a reason read out of `last_merge_diagnostic`
294
+ # rather than off the board (`-1` = never). A de-duplication latch in the
295
+ # same spirit as `review_fix_dispatched_for` above, for the same reason:
296
+ # `coord diagnose --stage test --reset` clears `test_state`, but the board
297
+ # this driver polls needs a beat to show it, and until it does the state
298
+ # is byte-for-byte identical to the one that triggered the re-test —
299
+ # except that, unlike a board `merge_reason`, the captured diagnostic is
300
+ # frozen and CANNOT change on its own. Without the latch a lagging board
301
+ # would burn the whole `max_fix_rounds` budget re-testing off one stale
302
+ # snapshot. Releases when `merge_attempts` advances, i.e. when a real
303
+ # `coord merge --only` attempt has re-captured the diagnostic — which is
304
+ # #2149's rule (act on the snapshot, then go re-validate it for real)
305
+ # expressed as a latch rather than a wait counter.
306
+ stale_smoke_diagnostic_attempt: int = -1
292
307
  # #2199: bounded retry for the trust gate's OWN dispatch — distinct from
293
308
  # `fix_rounds` (which bounds "the work needs another round" once a
294
309
  # verdict, passed or failed, actually landed on the board). This counts
@@ -2377,19 +2392,112 @@ def _merge_gate_kind(reason: str) -> str | None:
2377
2392
  _STALE_SMOKE_MARKERS = _mq_stale_smoke_markers
2378
2393
  _is_stale_smoke_reason = _mq_is_stale_smoke_reason
2379
2394
 
2395
+ # #2229: `coord merge --only` prints a gate line per REFUSED gate, and the
2396
+ # same run prints a "waived by this run" variant of that line for a gate the
2397
+ # invocation's own `--skip-review`/`--skip-smoke` disarmed
2398
+ # (`coord.commands.merge`, the `_status` ternary). A waived gate did not
2399
+ # refuse anything, so its line must never be read back as a refusal.
2400
+ _GATE_WAIVED_MARKER = "waived by this run"
2401
+
2402
+
2403
+ def _extract_gate_refusal_reason(diagnostic: str | None) -> str:
2404
+ """The first smoke/review gate refusal named anywhere in a captured
2405
+ `coord merge --only` *diagnostic*, or ``""`` (#2229).
2406
+
2407
+ Unlike :func:`_extract_gate_block_reason` — which matches only
2408
+ `_explain_missing_only_entry`'s "enqueue blocked by <gate>" wording, i.e.
2409
+ the NOT-YET-ENQUEUED shape — this reads the refusal out of a run where
2410
+ the entry *did* resolve. `coord merge --only` echoes one
2411
+ `` gate <name>: <reason> — will block this merge`` line per failing gate
2412
+ before `process()` runs, and `process()`'s own events (``smoke_required
2413
+ — …``) name it again; both are ordinary lines carrying the same gate
2414
+ vocabulary :func:`_merge_gate_kind` already classifies, so this scans
2415
+ lines rather than pinning one exact format that would silently stop
2416
+ matching the day either message is reworded.
2417
+
2418
+ quadraui#309: that text is the ONLY place the refusal existed. The board
2419
+ plan reported ``READY`` with an empty reason (``merge_queue.plan()``'s
2420
+ `_entry_gate_status` degrades to a no-op without live SHA data — the
2421
+ #1640 door, the #1566 "plan says ready, ``--only`` refuses" split), so
2422
+ `_merge_gate_divergence` saw nothing to classify and the drive spent
2423
+ three blind retries and died — printing this very text in its own death
2424
+ message.
2425
+ """
2426
+ for line in (diagnostic or "").splitlines():
2427
+ if _GATE_WAIVED_MARKER in line.lower():
2428
+ continue
2429
+ if _merge_gate_kind(line) is not None:
2430
+ return line.strip()
2431
+ return ""
2432
+
2433
+
2434
+ def _effective_merge_gate_reason(
2435
+ state: IssueState, counters: DriveCounters
2436
+ ) -> tuple[str, bool]:
2437
+ """The reason to classify the merge gate from, and whether it came from
2438
+ the captured diagnostic rather than the board (#2229).
2439
+
2440
+ Prefers `state.merge_reason` — live, re-read on every poll. Falls back to
2441
+ `counters.last_merge_diagnostic` only when the board reason names no gate
2442
+ this module knows an action for, because that is exactly the quadraui#309
2443
+ shape: the board is silent while this driver's OWN last `coord merge
2444
+ --only` attempt already captured the refusal verbatim.
2445
+
2446
+ The fallback is a LAST resort, taken only when the board offers no
2447
+ competing live signal — a snapshot must never outrank something being
2448
+ re-read every poll. Three cases keep the board's own reading:
2449
+
2450
+ - ``merge_status == ""`` — "no queue entry at all" is #2078's shape, with
2451
+ its own `_extract_gate_block_reason` bounded-wait arm in
2452
+ :func:`_decide_merge`. #2229 is about the case #2078 skips wholesale:
2453
+ an entry that IS enqueued (READY, PENDING, …) whose refusal only a
2454
+ live attempt ever saw.
2455
+ - ``merge_status == "CONFLICT"`` — a live merge-mechanics block with its
2456
+ own resolution path (#1474/#241's conflict-fix dispatch, reached
2457
+ through the bounded retry below). A re-test does not rebase a branch,
2458
+ and diverting to one is the same stall this issue is about, inverted.
2459
+ - a CI reason (#1891/#1892) — `merge_reason` already carries a live,
2460
+ recognised signal whose only resolution is more real time. Those two
2461
+ bare waits sit right after the divergence check and must keep winning.
2462
+
2463
+ The bool is the caller's warning label: a diagnostic-derived reason is a
2464
+ SNAPSHOT of the last real attempt, refreshed by nothing but another
2465
+ attempt (#2149's lesson — coord-portal#50 waited 2h33m on a cached
2466
+ "review required" that had already cleared). It is strictly fresher than
2467
+ an empty board reason, but it must not be re-acted on indefinitely; see
2468
+ `DriveCounters.stale_smoke_diagnostic_attempt`.
2469
+ """
2470
+ if _merge_gate_kind(state.merge_reason) is not None:
2471
+ return state.merge_reason, False
2472
+ if state.merge_status == "" or state.merge_status.upper() == "CONFLICT":
2473
+ return state.merge_reason, False
2474
+ if is_ci_pending_reason(state.merge_reason) or is_ci_infra_reason(
2475
+ state.merge_reason
2476
+ ):
2477
+ return state.merge_reason, False
2478
+ fallback = _extract_gate_refusal_reason(counters.last_merge_diagnostic)
2479
+ if fallback:
2480
+ return fallback, True
2481
+ return state.merge_reason, False
2380
2482
 
2381
- def _merge_gate_divergence(state: IssueState) -> str | None:
2483
+
2484
+ def _merge_gate_divergence(state: IssueState, reason: str | None = None) -> str | None:
2382
2485
  """``"smoke"``/``"review"`` when *state* shows the #1526 divergence,
2383
2486
  else ``None``.
2384
2487
 
2385
- The divergence: `state.merge_reason` names a smoke/review block while
2386
- this SAME state's `work_test_state`/`review_verdict` says the opposite.
2387
- That contradiction can only come from `coord merge` checking something
2388
- this driver's view does not (freshness against the CURRENT branch/base,
2389
- not just the terminal verdict) — never from a retry, since neither
2390
- input changes by running `coord merge` again unchanged.
2488
+ The divergence: the merge gate's *reason* names a smoke/review block
2489
+ while this SAME state's `work_test_state`/`review_verdict` says the
2490
+ opposite. That contradiction can only come from `coord merge` checking
2491
+ something this driver's view does not (freshness against the CURRENT
2492
+ branch/base, not just the terminal verdict) — never from a retry, since
2493
+ neither input changes by running `coord merge` again unchanged.
2494
+
2495
+ *reason* (#2229) defaults to `state.merge_reason`, the board's own text.
2496
+ :func:`_decide_merge` passes :func:`_effective_merge_gate_reason`'s
2497
+ result instead so a refusal that exists ONLY in the last captured
2498
+ `coord merge --only` diagnostic still classifies.
2391
2499
  """
2392
- kind = _merge_gate_kind(state.merge_reason)
2500
+ kind = _merge_gate_kind(state.merge_reason if reason is None else reason)
2393
2501
  if kind == "smoke" and state.work_test_state in ("passed", "skipped"):
2394
2502
  return "smoke"
2395
2503
  if kind == "review" and state.review_verdict == "approve":
@@ -2398,7 +2506,11 @@ def _merge_gate_divergence(state: IssueState) -> str | None:
2398
2506
 
2399
2507
 
2400
2508
  def _escalate_merge(
2401
- state: IssueState, status: str, *, gate_kind: str | None = None
2509
+ state: IssueState,
2510
+ status: str,
2511
+ *,
2512
+ gate_kind: str | None = None,
2513
+ gate_reason: str | None = None,
2402
2514
  ) -> Action:
2403
2515
  """Build the EXIT action for a merge status retrying cannot fix (#1505).
2404
2516
 
@@ -2422,6 +2534,16 @@ def _escalate_merge(
2422
2534
  (re-confirm the test verdict, or a scoped/full re-review) rather than the
2423
2535
  generic "inspect the plan" fallback below.
2424
2536
 
2537
+ *gate_reason* (#2229) is the text that gate_kind was classified from,
2538
+ when it is NOT `state.merge_reason` — i.e. when the board carried no
2539
+ reason and :func:`_effective_merge_gate_reason` recovered the refusal
2540
+ from the last captured `coord merge --only` diagnostic instead. The
2541
+ escalation narrative quotes it, because ``reports ''`` is exactly the
2542
+ unactionable escalation quadraui#309 would otherwise have produced. The
2543
+ recorded ``--gate merge_reason=…`` pair still reports the BOARD's own
2544
+ (empty) value — the gates block is a snapshot of board state, and
2545
+ overwriting it here would hide the very divergence being escalated.
2546
+
2425
2547
  Otherwise, the proposed command mirrors the #1477 resolution this issue
2426
2548
  was opened over: when a PR is known, ``gh pr merge --rebase`` + ``coord
2427
2549
  reconcile-merges`` is the sanctioned escape hatch (also documented in
@@ -2468,9 +2590,10 @@ def _escalate_merge(
2468
2590
  if gate_kind == "smoke"
2469
2591
  else f"review_verdict={state.review_verdict!r}"
2470
2592
  )
2593
+ reported = state.merge_reason if gate_reason is None else gate_reason
2471
2594
  reason = (
2472
2595
  f"{gate_kind}_required — coord merge's own gate reports "
2473
- f"{state.merge_reason!r}, but this driver's OWN view already "
2596
+ f"{reported!r}, but this driver's OWN view already "
2474
2597
  f"shows {driver_view} — the two cannot converge by retrying the "
2475
2598
  "identical `coord merge` command (#1526); a human must "
2476
2599
  "reconcile them"
@@ -2562,8 +2685,30 @@ def _decide_merge(
2562
2685
  readings; retrying the identical ``coord merge`` command changes neither
2563
2686
  side of the disagreement.
2564
2687
  """
2565
- divergence = _merge_gate_divergence(state)
2566
- if divergence == "smoke" and _is_stale_smoke_reason(state.merge_reason):
2688
+ # #2229: classify from the board's `merge_reason` when it names a gate,
2689
+ # and otherwise from this driver's OWN last `coord merge --only` output.
2690
+ # quadraui#309 sat blocked for 11h on a merge that landed first try by
2691
+ # hand because the board reason was empty (#1566/#1640) while the
2692
+ # captured diagnostic said, in as many words, "smoke test verdict is
2693
+ # stale" — the exact string the #1738 auto-repair arm below keys on. It
2694
+ # was used for one thing: being printed into the give-up message.
2695
+ gate_reason, gate_reason_from_diagnostic = _effective_merge_gate_reason(
2696
+ state, counters
2697
+ )
2698
+ divergence = _merge_gate_divergence(state, reason=gate_reason)
2699
+ if (
2700
+ gate_reason_from_diagnostic
2701
+ and divergence == "smoke"
2702
+ and _is_stale_smoke_reason(gate_reason)
2703
+ and counters.stale_smoke_diagnostic_attempt == counters.merge_attempts
2704
+ ):
2705
+ # A re-test already fired off THIS snapshot and no real attempt has
2706
+ # re-captured it since, so re-firing would spend a second fix round
2707
+ # on evidence that literally cannot have changed. Drop to the bounded
2708
+ # retry below instead: that attempt refreshes the diagnostic, which
2709
+ # either lands the merge or re-arms this arm against fresh evidence.
2710
+ divergence = None
2711
+ if divergence == "smoke" and _is_stale_smoke_reason(gate_reason):
2567
2712
  # #1738: a STALE (not missing) smoke verdict has a safe, bounded
2568
2713
  # self-service fix this driver can take without a human — re-run the
2569
2714
  # Test stage against the current base via the same non-destructive
@@ -2575,8 +2720,17 @@ def _decide_merge(
2575
2720
  # going stale (e.g. a base that keeps moving under it) still
2576
2721
  # converges to an escalation instead of spinning forever.
2577
2722
  if counters.fix_rounds >= opts.max_fix_rounds:
2578
- return _escalate_merge(state, state.merge_status, gate_kind=divergence)
2723
+ return _escalate_merge(
2724
+ state,
2725
+ state.merge_status,
2726
+ gate_kind=divergence,
2727
+ gate_reason=gate_reason,
2728
+ )
2579
2729
  counters.fix_rounds += 1
2730
+ if gate_reason_from_diagnostic:
2731
+ # #2229: arm the latch above — one re-test per captured
2732
+ # diagnostic, then a real attempt has to re-validate it.
2733
+ counters.stale_smoke_diagnostic_attempt = counters.merge_attempts
2580
2734
  return Action(
2581
2735
  kind=RUN,
2582
2736
  label=(
@@ -2597,7 +2751,9 @@ def _decide_merge(
2597
2751
  ),
2598
2752
  )
2599
2753
  if divergence is not None:
2600
- return _escalate_merge(state, state.merge_status, gate_kind=divergence)
2754
+ return _escalate_merge(
2755
+ state, state.merge_status, gate_kind=divergence, gate_reason=gate_reason
2756
+ )
2601
2757
 
2602
2758
  # #1891: a CI verdict that has not arrived is not a CI verdict of "no" —
2603
2759
  # checked BEFORE the `status` switch below (and regardless of what
@@ -1906,6 +1906,67 @@ def evaluate_smoke_verdict(
1906
1906
  )
1907
1907
 
1908
1908
 
1909
+ def stale_smoke_conflict_reason(entry, smoke, gh_ops) -> str | None:
1910
+ """#2231: the conflict hiding behind a stale-verdict smoke block, if any.
1911
+
1912
+ Gate evaluation is ordered (review → smoke → CI → …) and every gate
1913
+ short-circuits, so an entry whose branch does not merge AT ALL never gets
1914
+ that far: it reports "test verdict stale", which invites exactly the one
1915
+ remedy that cannot work. Worse, the two mechanisms that could fix it are
1916
+ both downstream of a step that never runs — #1738's auto-repair answers a
1917
+ stale verdict (there wasn't one) and #241's conflict-fix is dispatched off
1918
+ a failed *merge attempt* (the smoke gate returned before one happened).
1919
+ quadraui #306/#309 spent 11h there apiece.
1920
+
1921
+ So: when the smoke gate is about to block on a **stale** verdict
1922
+ specifically, ask GitHub whether the PR merges at all. A confirmed
1923
+ ``mergeable: false`` means the stale verdict is not the blocker, and this
1924
+ returns a reason naming the conflict — the caller turns that into a
1925
+ ``conflict`` event, which is what arms :func:`classify_conflict` and #241.
1926
+
1927
+ Returns ``None`` — leaving today's stale-verdict block exactly as it was —
1928
+ whenever the answer isn't a definite yes:
1929
+
1930
+ * the verdict is MISSING rather than stale (the #1640 lost-write shape,
1931
+ deliberately out of scope here as in :func:`revalidation_candidates`);
1932
+ * there is no PR yet, so there is nothing to ask about;
1933
+ * ``gh_ops`` has no ``check_pr_mergeable`` — the same duck-typed probe the
1934
+ #1877 CI-absent branch uses, and for the same reason: this function also
1935
+ runs against a :class:`~coord.gate_snapshot.GateSnapshot` on the
1936
+ ``/board`` read path (#1336 Invariant 1, no third-party I/O), which
1937
+ doesn't implement it;
1938
+ * the probe returns ``None`` (GitHub still computing mergeability) or
1939
+ raises. An inconclusive read must never be upgraded to "conflict": that
1940
+ would replace a recoverable staleness block with one that dispatches a
1941
+ rebase worker at a branch which merges fine.
1942
+
1943
+ The wording is load-bearing in both directions — see
1944
+ :func:`coord.revalidate.compose_conflict_error`, whose docstring explains
1945
+ the same constraint for the local-compose variant of this fact.
1946
+ """
1947
+ if smoke is None or smoke.ok or smoke.kind != SMOKE_STALE:
1948
+ return None
1949
+ pr_number = getattr(entry, "pr_number", None)
1950
+ if not pr_number:
1951
+ return None
1952
+ probe = getattr(gh_ops, "check_pr_mergeable", None)
1953
+ if probe is None:
1954
+ return None
1955
+ try:
1956
+ conflicted = probe(entry.repo_github, pr_number) is False
1957
+ except Exception: # noqa: BLE001 — inconclusive, never a block upgrade
1958
+ return None
1959
+ if not conflicted:
1960
+ return None
1961
+ return (
1962
+ f"merge conflict: PR #{pr_number} does not merge into "
1963
+ f"{entry.target_branch} — GitHub reports it as not mergeable. Its "
1964
+ "test verdict is out of date against the current base too, but that "
1965
+ "is downstream: no re-test can clear a branch that will not merge "
1966
+ "(#2231)"
1967
+ )
1968
+
1969
+
1909
1970
  @dataclass(frozen=True)
1910
1971
  class RevalidationCandidate:
1911
1972
  """One queue entry that ``coord merge --revalidate`` may re-test (#1769).
@@ -3184,6 +3245,19 @@ def _entry_gate_status(
3184
3245
  # write instead of re-verifying against the moved base.
3185
3246
  smoke = evaluate_smoke_verdict(entry, board, gh_ops)
3186
3247
  if not smoke.ok:
3248
+ # #2231: name the conflict when there is one — the plan view
3249
+ # is where an operator (and `coord drive`, via the board's
3250
+ # `merge_reason`) reads WHY an entry is stuck, and "test
3251
+ # verdict stale" on a branch that doesn't compose sends both
3252
+ # of them at a remedy that cannot work. Costs one `gh` call,
3253
+ # only for an entry already blocked on a STALE verdict, and
3254
+ # only where a live probe exists (never on the `/board` read
3255
+ # path — see `stale_smoke_conflict_reason`).
3256
+ conflict_reason = stale_smoke_conflict_reason(
3257
+ entry, smoke, gh_ops,
3258
+ )
3259
+ if conflict_reason is not None:
3260
+ return PLAN_BLOCKED, conflict_reason
3187
3261
  return PLAN_BLOCKED, smoke.short_reason
3188
3262
  if ci_store is not None and ci_store.is_available and entry.pr_number:
3189
3263
  checks = ci_store.list_checks_for_pr(entry.repo_github, entry.pr_number)
@@ -4279,6 +4353,23 @@ def process(
4279
4353
  else evaluate_smoke_verdict(entry, board, gh_ops)
4280
4354
  )
4281
4355
  if _smoke is None or not _smoke.ok:
4356
+ # #2231: mirror the live path (line ~4689) — before
4357
+ # previewing a block on a stale verdict, check whether
4358
+ # the branch is actually conflicted. A dry run that
4359
+ # skips this reports the misleading "test verdict
4360
+ # stale" headline for an entry a real run (or
4361
+ # `--plan`) would already report/dispatch as
4362
+ # `conflict`, which is precisely the split-brain this
4363
+ # issue exists to fix.
4364
+ _conflict_msg = stale_smoke_conflict_reason(
4365
+ entry, _smoke, gh_ops,
4366
+ )
4367
+ if _conflict_msg is not None:
4368
+ events.append(MergeEvent(
4369
+ entry, "conflict",
4370
+ f"(dry run) {_conflict_msg}",
4371
+ ))
4372
+ continue
4282
4373
  _why = (
4283
4374
  "board unavailable to confirm smoke verdict"
4284
4375
  if _smoke is None
@@ -4606,6 +4697,22 @@ def process(
4606
4697
  None if board is None else evaluate_smoke_verdict(entry, board, gh_ops)
4607
4698
  )
4608
4699
  if smoke is None or not smoke.ok:
4700
+ # #2231: before parking this entry behind a gate whose
4701
+ # stated cause invites a re-test, check whether the branch
4702
+ # merges at all. A confirmed conflict is the real blocker
4703
+ # and a re-test can never clear it — emit the `conflict`
4704
+ # event so `_dispatch_conflict_fixes` arms #241's rebase
4705
+ # worker, exactly as a failed merge attempt would have.
4706
+ conflict_msg = stale_smoke_conflict_reason(
4707
+ entry, smoke, gh_ops,
4708
+ )
4709
+ if conflict_msg is not None:
4710
+ entry.state = CONFLICT
4711
+ entry.error = conflict_msg
4712
+ events.append(
4713
+ MergeEvent(entry, "conflict", conflict_msg)
4714
+ )
4715
+ continue
4609
4716
  msg = (
4610
4717
  "smoke test required but board unavailable to confirm verdict"
4611
4718
  if smoke is None
@@ -379,6 +379,15 @@ class BatchRevalidationResult:
379
379
  A red composite fills ``per_entry`` with one solo result per candidate.
380
380
  ``recorded`` then holds only the survivors' assignment ids, and
381
381
  ``culprits`` names the branches whose own run failed.
382
+
383
+ ``conflicted`` (#2231) is the subset of the culprits whose run died at
384
+ :data:`KIND_COMPOSE` — the branch does not merge onto its current base at
385
+ all. That is categorically different from every other culprit: no verdict
386
+ is wrong, no suite is red, and no amount of re-testing can change it. It
387
+ carries the *candidate* (not just its label) precisely so a caller can act
388
+ on it — see :func:`coord.commands.merge._dispatch_revalidation_conflicts`,
389
+ which turns it into #241's ``conflict-fix`` dispatch. Before #2231 this
390
+ diagnosis was formatted for a human and then dropped on the floor.
382
391
  """
383
392
 
384
393
  composite: RevalidationResult
@@ -386,6 +395,9 @@ class BatchRevalidationResult:
386
395
  recorded: list[str] = field(default_factory=list)
387
396
  culprits: list[str] = field(default_factory=list)
388
397
  suite_runs: int = 0
398
+ conflicted: list[tuple[RevalidationCandidate, RevalidationResult]] = field(
399
+ default_factory=list,
400
+ )
389
401
 
390
402
  @property
391
403
  def ok(self) -> bool:
@@ -1000,6 +1012,16 @@ def revalidate_group(
1000
1012
  )
1001
1013
 
1002
1014
  if composite.ok or len(candidates) == 1 or not composite.narrowable:
1015
+ # #2231: a single-candidate composite IS that candidate's own run, so
1016
+ # a COMPOSE failure here names it as surely as a solo run would. The
1017
+ # N>1 case is attributed in the per-entry loop below instead — the
1018
+ # composite stops at the FIRST branch that won't merge, which says
1019
+ # nothing about the ones after it.
1020
+ if (
1021
+ len(candidates) == 1
1022
+ and composite.kind == KIND_COMPOSE
1023
+ ):
1024
+ batch.conflicted.append((candidates[0], composite))
1003
1025
  return batch
1004
1026
 
1005
1027
  echo(
@@ -1027,6 +1049,12 @@ def revalidate_group(
1027
1049
  else:
1028
1050
  batch.culprits.append(label)
1029
1051
  echo(f" --revalidate: {label} FAILS alone — {solo.reason}")
1052
+ if solo.kind == KIND_COMPOSE:
1053
+ # #2231: not a verdict problem at all — this branch cannot
1054
+ # merge. Recorded structurally so the caller can dispatch
1055
+ # #241's conflict-fix instead of leaving the entry parked
1056
+ # behind a stale-verdict gate it can never clear.
1057
+ batch.conflicted.append((c, solo))
1030
1058
 
1031
1059
  if not batch.culprits:
1032
1060
  # Every branch is green by itself, yet together they are not. That is a
@@ -1046,6 +1074,36 @@ def revalidate_group(
1046
1074
  return batch
1047
1075
 
1048
1076
 
1077
+ def compose_conflict_error(entry) -> str:
1078
+ """The ``entry.error`` text for a branch that will not compose (#2231).
1079
+
1080
+ Deliberately worded to be classified correctly by the two consumers that
1081
+ read merge prose rather than structured state:
1082
+
1083
+ * :func:`coord.merge_queue.classify_conflict` must return ``"rebaseable"``
1084
+ — it is what decides whether ``coord merge`` dispatches #241's
1085
+ conflict-fix worker — so the text carries the ``merge conflict`` signal
1086
+ that function already keys on.
1087
+ * :func:`coord.merge_queue.is_stale_smoke_reason` (and ``coord drive``'s
1088
+ ``_SMOKE_GATE_MARKERS``) must NOT match, or the driver would read this
1089
+ as the #1738 stale-verdict shape and spend a fix round re-testing a
1090
+ branch that cannot merge — the exact loop #2231 reports. So the stale
1091
+ verdict is *described* here in wording that matches none of
1092
+ :data:`coord.merge_queue.STALE_SMOKE_MARKERS` (this module must not
1093
+ carry a copy of those strings either — see
1094
+ ``TestSingleStaleDetector``). ``tests/test_revalidate.py`` asserts both
1095
+ classifications directly, since the wording is load-bearing rather than
1096
+ cosmetic.
1097
+ """
1098
+ return (
1099
+ f"merge conflict: branch {entry.branch!r} does not compose onto "
1100
+ f"origin/{entry.target_branch} — `git merge` reported a content "
1101
+ "conflict when --revalidate composed it against the current base, so "
1102
+ "no test verdict (fresh or otherwise) can clear this entry until the "
1103
+ "branch is rebased (#2231)"
1104
+ )
1105
+
1106
+
1049
1107
  def format_batch(batch: BatchRevalidationResult) -> list[str]:
1050
1108
  """Operator-facing OUTCOME lines for one group's revalidation (#1715).
1051
1109
 
@@ -1201,6 +1259,7 @@ __all__ = [
1201
1259
  "BatchRevalidationResult",
1202
1260
  "RevalidationResult",
1203
1261
  "client_timeout_seconds",
1262
+ "compose_conflict_error",
1204
1263
  "describe_batches",
1205
1264
  "describe_candidates",
1206
1265
  "format_batch",
@@ -34,6 +34,19 @@ Three arms have since landed against it:
34
34
  * **#1738** — `coord drive` re-dispatches the Test stage once, automatically,
35
35
  on a STALE (not missing) verdict. Only fires while a **live drive** is
36
36
  watching the issue. Measured 2026-08-03: reached 1 of 4 real stalls.
37
+ **#2229** widened what it can see: the arm used to classify the gate from
38
+ the board's `merge_reason` alone, which `merge_queue.plan()` leaves *empty*
39
+ whenever its render-time freshness check has no live SHA data (the #1640
40
+ door / the #1566 "plan says READY, `--only` refuses" split) — so on an
41
+ already-enqueued entry the arm could not arm at all, and the drive spent
42
+ three blind retries and died *printing the refusal it had captured*
43
+ (quadraui#309: 11h blocked on a merge that then landed first try by hand).
44
+ It now falls back to the last `coord merge --only` diagnostic the drive
45
+ itself captured. Still only the STALE arm self-repairs — a *missing*
46
+ verdict is the #1640 lost-write shape and escalates to a human unchanged —
47
+ and, because that diagnostic is a snapshot rather than live state (#2149),
48
+ each capture buys at most one re-test before a real attempt has to
49
+ re-validate it.
37
50
  * **#1769** — `coord merge --revalidate` re-tests a stale-but-`passed` entry
38
51
  against the current base from the *merge* lane, which is where a branch with
39
52
  no live drive actually sits.