code-coordinator 0.5.77__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.77 → code_coordinator-0.5.78}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/merge.py +68 -0
  5. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/merge_queue.py +107 -0
  6. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/revalidate.py +59 -0
  7. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/OPERATING_GOTCHAS.md +57 -0
  8. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_merge_queue.py +221 -0
  9. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_revalidate.py +271 -0
  10. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/.claude/commands/board.md +0 -0
  11. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/.claude/commands/complete-session.md +0 -0
  12. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/.claude/commands/coordinator.md +0 -0
  13. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/.githooks/_lib.sh +0 -0
  14. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/.githooks/post-checkout +0 -0
  15. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/.githooks/post-commit +0 -0
  16. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/.githooks/post-merge +0 -0
  17. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  18. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/.github/coord-ci-acceptance.yml +0 -0
  19. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/.github/workflows/auto-release.yml +0 -0
  20. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/.github/workflows/cargo-test.yml +0 -0
  21. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/.github/workflows/publish.yml +0 -0
  22. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/.github/workflows/release-tui.yml +0 -0
  23. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/.github/workflows/test.yml +0 -0
  24. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/.gitignore +0 -0
  25. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/CLAUDE.md +0 -0
  26. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/GOAL.md +0 -0
  27. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/LICENSE +0 -0
  28. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/MANIFEST.in +0 -0
  29. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/README.md +0 -0
  30. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/code_coordinator.egg-info/SOURCES.txt +0 -0
  31. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/code_coordinator.egg-info/dependency_links.txt +0 -0
  32. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/code_coordinator.egg-info/entry_points.txt +0 -0
  33. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/code_coordinator.egg-info/requires.txt +0 -0
  34. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/code_coordinator.egg-info/scm_file_list.json +0 -0
  35. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/code_coordinator.egg-info/top_level.txt +0 -0
  36. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/__init__.py +0 -0
  37. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/_board_mapping.py +0 -0
  38. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/acceptance.py +0 -0
  39. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/acceptance_drivers.py +0 -0
  40. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/agent.py +0 -0
  41. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/agent_app.py +0 -0
  42. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/agent_update.py +0 -0
  43. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/agents/opencode/.gitignore +0 -0
  44. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/agents/opencode/agents/work.md +0 -0
  45. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/agents/opencode/routing.jsonc +0 -0
  46. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/audit.py +0 -0
  47. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/auto_loop.py +0 -0
  48. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/board_bool_guard.py +0 -0
  49. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/board_service.py +0 -0
  50. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/board_wire.py +0 -0
  51. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/brain.py +0 -0
  52. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/branch_model.py +0 -0
  53. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/bug_intake.py +0 -0
  54. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/cargo_cache.py +0 -0
  55. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/ci_github.py +0 -0
  56. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/ci_store.py +0 -0
  57. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/claim.py +0 -0
  58. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/cli.py +0 -0
  59. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/client.py +0 -0
  60. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/__init__.py +0 -0
  61. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/_common.py +0 -0
  62. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/acceptance.py +0 -0
  63. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/agent_ops.py +0 -0
  64. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/audit.py +0 -0
  65. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/chat.py +0 -0
  66. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/dispatch.py +0 -0
  67. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/dispatch_workers.py +0 -0
  68. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/drive.py +0 -0
  69. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/drive_queue.py +0 -0
  70. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/gate_a.py +0 -0
  71. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/gates.py +0 -0
  72. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/issues.py +0 -0
  73. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/lifecycle.py +0 -0
  74. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/milestone.py +0 -0
  75. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/plan_followup.py +0 -0
  76. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/plans.py +0 -0
  77. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/portal.py +0 -0
  78. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/release.py +0 -0
  79. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/repo.py +0 -0
  80. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/report.py +0 -0
  81. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/review.py +0 -0
  82. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/scorecard.py +0 -0
  83. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/sessions.py +0 -0
  84. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/setup.py +0 -0
  85. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/status.py +0 -0
  86. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/terminal.py +0 -0
  87. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/test_gate.py +0 -0
  88. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/commands/tui.py +0 -0
  89. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/comments.py +0 -0
  90. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/config.py +0 -0
  91. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/conflict_fix.py +0 -0
  92. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dao.py +0 -0
  93. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/__init__.py +0 -0
  94. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/fixture.py +0 -0
  95. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/index.html +0 -0
  96. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/server.py +0 -0
  97. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/terminal.py +0 -0
  98. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/.gitignore +0 -0
  99. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/components.json +0 -0
  100. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js +0 -0
  101. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  102. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js +0 -0
  103. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js +0 -0
  104. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  105. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  106. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  107. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  108. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  109. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/index.html +0 -0
  110. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  111. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/sw.js +0 -0
  112. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  113. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  114. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  115. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  116. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  117. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  118. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  119. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  120. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  121. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  122. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/eslint.config.js +0 -0
  123. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/index.html +0 -0
  124. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  125. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/package-lock.json +0 -0
  126. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/package.json +0 -0
  127. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  128. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/playwright.config.ts +0 -0
  129. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/postcss.config.js +0 -0
  130. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  131. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  132. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  133. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/App.tsx +0 -0
  134. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/api/client.ts +0 -0
  135. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  136. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  137. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  138. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  139. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  140. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  141. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  142. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  143. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  144. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  145. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  146. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  147. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  148. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  149. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  150. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  151. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  152. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  153. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  154. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  155. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  156. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  157. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  158. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  159. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  160. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  161. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  162. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  163. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  164. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  165. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  166. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  167. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  168. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  169. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  170. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/index.css +0 -0
  171. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  172. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  173. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/main.tsx +0 -0
  174. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  175. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  176. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  177. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  178. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  179. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  180. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  181. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  182. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  183. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  184. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  185. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  186. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  187. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  188. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  189. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  190. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  191. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  192. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  193. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  194. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  195. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  196. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  197. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/tailwind.config.js +0 -0
  198. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/tsconfig.json +0 -0
  199. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  200. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dashboard/webapp/vite.config.ts +0 -0
  201. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/db.py +0 -0
  202. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dead_end.py +0 -0
  203. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/README.md +0 -0
  204. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-agent.service +0 -0
  205. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-db-backup.service +0 -0
  206. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-db-backup.sh +0 -0
  207. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-db-backup.timer +0 -0
  208. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-drive-queue.service +0 -0
  209. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-drive-queue.timer +0 -0
  210. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-notify.service +0 -0
  211. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-notify.timer +0 -0
  212. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-release-propagate.service +0 -0
  213. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-release-propagate.timer +0 -0
  214. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-release-window.service +0 -0
  215. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-release-window.timer +0 -0
  216. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-serve.service +0 -0
  217. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-web-dist-build.service +0 -0
  218. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-web-dist-build.timer +0 -0
  219. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy/coord-web.service +0 -0
  220. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy_manifest.py +0 -0
  221. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deploy_units.py +0 -0
  222. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/deps.py +0 -0
  223. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/diagnose.py +0 -0
  224. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dispatch.py +0 -0
  225. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/dist_name.py +0 -0
  226. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/drive.py +0 -0
  227. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/drive_queue.py +0 -0
  228. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/drive_state.py +0 -0
  229. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/events.py +0 -0
  230. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/failure_class.py +0 -0
  231. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/filelock.py +0 -0
  232. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/fleet_config_health.py +0 -0
  233. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/freshness.py +0 -0
  234. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/gate_a.py +0 -0
  235. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/gate_b.py +0 -0
  236. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/gate_snapshot.py +0 -0
  237. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/gates.py +0 -0
  238. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/github_ops.py +0 -0
  239. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/goal.py +0 -0
  240. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/graph_health.py +0 -0
  241. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/__init__.py +0 -0
  242. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/aggregate.py +0 -0
  243. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/__init__.py +0 -0
  244. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/agent_install.py +0 -0
  245. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/cargo_targets.py +0 -0
  246. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/claude_binary.py +0 -0
  247. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/deploy_lane_facts.py +0 -0
  248. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/disk.py +0 -0
  249. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/fleet_board.py +0 -0
  250. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  251. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/fleet_phantom.py +0 -0
  252. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/fleet_unit_drift.py +0 -0
  253. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/graph.py +0 -0
  254. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/plan_usage.py +0 -0
  255. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/repo_state.py +0 -0
  256. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/spawned_coord.py +0 -0
  257. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/timer_active.py +0 -0
  258. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/toolchain.py +0 -0
  259. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/unit_drift.py +0 -0
  260. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/unit_enablement.py +0 -0
  261. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/checks/worktrees.py +0 -0
  262. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/cli.py +0 -0
  263. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/context.py +0 -0
  264. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/fleet_snapshot.py +0 -0
  265. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/models.py +0 -0
  266. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/pypi.py +0 -0
  267. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/registry.py +0 -0
  268. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/render.py +0 -0
  269. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/health/units.py +0 -0
  270. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/hooks.py +0 -0
  271. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/housekeeping.py +0 -0
  272. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/interactive.py +0 -0
  273. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/issue_store.py +0 -0
  274. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/liveness_auditor.py +0 -0
  275. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/machine_pause.py +0 -0
  276. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/milestone_chat.py +0 -0
  277. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/milestone_dispatch.py +0 -0
  278. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/milestone_gate.py +0 -0
  279. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/milestone_order.py +0 -0
  280. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/mock_author.py +0 -0
  281. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/models.py +0 -0
  282. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/network.py +0 -0
  283. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/new_issue_chat.py +0 -0
  284. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/notifier/__init__.py +0 -0
  285. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/notifier/baseline.py +0 -0
  286. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/notifier/cli.py +0 -0
  287. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/notifier/collect.py +0 -0
  288. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/notifier/digest.py +0 -0
  289. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/notifier/models.py +0 -0
  290. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/notifier/predicate.py +0 -0
  291. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/notifier/service.py +0 -0
  292. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/notifier/store.py +0 -0
  293. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/notifier/transport.py +0 -0
  294. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/notify.py +0 -0
  295. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/openapi.py +0 -0
  296. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/overlap_fence.py +0 -0
  297. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/parentage.py +0 -0
  298. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/parentage_github.py +0 -0
  299. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/pipeline.py +0 -0
  300. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/plan_parser.py +0 -0
  301. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/plans.py +0 -0
  302. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/platform_paths.py +0 -0
  303. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/portal_bridge.py +0 -0
  304. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/pr_body_lint.py +0 -0
  305. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/prereqs.py +0 -0
  306. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/progress.py +0 -0
  307. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/providers/__init__.py +0 -0
  308. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/providers/base.py +0 -0
  309. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/providers/claude.py +0 -0
  310. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/providers/claude_pty.py +0 -0
  311. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/providers/opencode.py +0 -0
  312. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/reconcile.py +0 -0
  313. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/refine_chat.py +0 -0
  314. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/release_cordon.py +0 -0
  315. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/release_propagate.py +0 -0
  316. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/release_verify.py +0 -0
  317. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/release_window.py +0 -0
  318. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/repo_edit.py +0 -0
  319. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/repo_onboard.py +0 -0
  320. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/reports.py +0 -0
  321. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/review.py +0 -0
  322. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/scorecard.py +0 -0
  323. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/serve_app.py +0 -0
  324. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/skills/update-issue/SKILL.md +0 -0
  325. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/smoke.py +0 -0
  326. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/spend_ceiling.py +0 -0
  327. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/split_work.py +0 -0
  328. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/stage_projection.py +0 -0
  329. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/state.py +0 -0
  330. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/test_author.py +0 -0
  331. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/test_chat.py +0 -0
  332. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/test_orchestrator.py +0 -0
  333. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/test_report.py +0 -0
  334. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/tui_release.py +0 -0
  335. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/usage.py +0 -0
  336. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/usage_limits.py +0 -0
  337. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/usage_rollup.py +0 -0
  338. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coord/worker_events.py +0 -0
  339. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/coordinator.example.yml +0 -0
  340. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-agent.service +0 -0
  341. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-db-backup.service +0 -0
  342. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-db-backup.sh +0 -0
  343. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-db-backup.timer +0 -0
  344. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-drive-queue.service +0 -0
  345. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-drive-queue.timer +0 -0
  346. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-notify.service +0 -0
  347. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-notify.timer +0 -0
  348. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-release-propagate.service +0 -0
  349. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-release-propagate.timer +0 -0
  350. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-release-window.service +0 -0
  351. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-release-window.timer +0 -0
  352. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-serve.service +0 -0
  353. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-web-dist-build.service +0 -0
  354. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-web-dist-build.sh +0 -0
  355. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-web-dist-build.timer +0 -0
  356. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-web-rollback.sh +0 -0
  357. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/coord-web.service +0 -0
  358. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/deploy/node-shim.sh +0 -0
  359. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/AGENT_OPERATIONS.md +0 -0
  360. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/ARCHITECTURE.md +0 -0
  361. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/ARCH_SECURITY_GATES.md +0 -0
  362. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/COCKPIT.md +0 -0
  363. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/CONTROL_CENTER.md +0 -0
  364. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/COST_DISCIPLINE.md +0 -0
  365. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/CROSS_PLATFORM.md +0 -0
  366. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/CUSTOMER_PORTAL.md +0 -0
  367. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/DRIVE_QUEUE.md +0 -0
  368. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/EPHEMERAL_WORKERS.md +0 -0
  369. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/FORGE_MIGRATION.md +0 -0
  370. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/GRAPHIFY_SETUP.md +0 -0
  371. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/ISSUE_GUIDANCE.md +0 -0
  372. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/MAC_MINI.md +0 -0
  373. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  374. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/NOTIFIER.md +0 -0
  375. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/OPENCODE_VERIFICATION.md +0 -0
  376. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/ORACLE_LOOP.md +0 -0
  377. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/PHONE_WEBAPP.md +0 -0
  378. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/PIPELINE_V2.md +0 -0
  379. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/PLATFORM_EVOLUTION.md +0 -0
  380. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/SECOND_BACKEND.md +0 -0
  381. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/STORE_SERVICE.md +0 -0
  382. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  383. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/WEB_CONTROL_CENTER.md +0 -0
  384. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/mocks/web/README.md +0 -0
  385. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/mocks/web/_tokens.css +0 -0
  386. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/mocks/web/issue-detail.html +0 -0
  387. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/mocks/web/pipeline-narrow.html +0 -0
  388. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/docs/mocks/web/pipeline-wide.html +0 -0
  389. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/graphify-out/.gitignore +0 -0
  390. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/install-agent.sh +0 -0
  391. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/pyproject.toml +0 -0
  392. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/audit_review_verdict_overrides.py +0 -0
  393. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  394. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/azure-workers/build-worker-image.sh +0 -0
  395. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/azure-workers/coordinator-machine.py +0 -0
  396. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/azure-workers/epic-down.sh +0 -0
  397. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/azure-workers/epic-up.sh +0 -0
  398. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/azure-workers/preflight.sh +0 -0
  399. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/azure-workers/provision-worker.sh +0 -0
  400. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  401. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  402. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/azure-workers/verify-github-token.sh +0 -0
  403. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/codegen.py +0 -0
  404. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/coord-test-runner.sh +0 -0
  405. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/drive-batch.sh +0 -0
  406. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/gen_board_fixture.py +0 -0
  407. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/next_release_tag.py +0 -0
  408. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/run_tests_in_populated_home.sh +0 -0
  409. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/run_tests_without_gh.sh +0 -0
  410. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/smoke_437_interactive.py +0 -0
  411. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/verify_878_review_capture.py +0 -0
  412. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/verify_release_published.py +0 -0
  413. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/scripts/verify_release_wheel.py +0 -0
  414. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/setup.cfg +0 -0
  415. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/SMOKE_SET.md +0 -0
  416. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/__init__.py +0 -0
  417. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  418. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-33/contract.md +0 -0
  419. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-33/manifest.yml +0 -0
  420. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  421. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  422. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  423. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  424. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-37/conftest.py +0 -0
  425. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-37/contract.md +0 -0
  426. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-37/manifest.yml +0 -0
  427. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  428. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  429. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-38/contract.md +0 -0
  430. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-38/manifest.yml +0 -0
  431. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  432. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  433. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  434. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  435. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  436. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  437. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  438. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  439. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  440. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  441. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-51/contract.md +0 -0
  442. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  443. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  444. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-51/manifest.yml +0 -0
  445. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  446. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-51/tsconfig.json +0 -0
  447. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  448. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/conftest.py +0 -0
  449. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/board-pipeline-basic.json +0 -0
  450. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  451. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  452. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  453. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/playwright/all_pass.json +0 -0
  454. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  455. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/playwright/mixed_fail.json +0 -0
  456. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  457. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  458. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/playwright/skip.json +0 -0
  459. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/playwright/truncated.json +0 -0
  460. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  461. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  462. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  463. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  464. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  465. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  466. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  467. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  468. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_acceptance.py +0 -0
  469. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_acceptance_drivers.py +0 -0
  470. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent.py +0 -0
  471. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_api_error.py +0 -0
  472. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_app.py +0 -0
  473. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_branch_base.py +0 -0
  474. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_branch_capture.py +0 -0
  475. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_config_free_1712.py +0 -0
  476. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_deploy_units_endpoint.py +0 -0
  477. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_dirty_worktree.py +0 -0
  478. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_graph_self_heal.py +0 -0
  479. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_health_h3.py +0 -0
  480. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_idle_restart.py +0 -0
  481. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_push_failure.py +0 -0
  482. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_reap.py +0 -0
  483. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_repos_and_pull.py +0 -0
  484. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_restart_services_endpoint.py +0 -0
  485. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_startup_diagnostics.py +0 -0
  486. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_update.py +0 -0
  487. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_update_bluegreen.py +0 -0
  488. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_usage_limit.py +0 -0
  489. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_agent_zero_commit.py +0 -0
  490. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_ambient_home_isolation.py +0 -0
  491. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_approve_reject_plan.py +0 -0
  492. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_approve_usage_gate.py +0 -0
  493. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_assignment_already_recorded_daemon.py +0 -0
  494. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_audit_log.py +0 -0
  495. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_audit_outcome.py +0 -0
  496. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_audit_query.py +0 -0
  497. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_auto_loop.py +0 -0
  498. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_auto_release_publish_2035.py +0 -0
  499. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_base_checkout_restore.py +0 -0
  500. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_board_cap_762.py +0 -0
  501. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_board_fixture.py +0 -0
  502. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_board_read_path.py +0 -0
  503. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_board_service.py +0 -0
  504. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_board_state.py +0 -0
  505. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_board_wire.py +0 -0
  506. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_brain.py +0 -0
  507. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_branch_model.py +0 -0
  508. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_bug_intake.py +0 -0
  509. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_build_worker_image_env_update.py +0 -0
  510. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cargo_cache.py +0 -0
  511. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_ci_acceptance_gate_1950.py +0 -0
  512. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_ci_parity_2091.py +0 -0
  513. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_ci_store.py +0 -0
  514. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_claim.py +0 -0
  515. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_acceptance.py +0 -0
  516. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_assign.py +0 -0
  517. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  518. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_assign_interactive_remote.py +0 -0
  519. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_assign_provider.py +0 -0
  520. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  521. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_audit.py +0 -0
  522. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_chat_continue.py +0 -0
  523. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_diagnose_config_provenance.py +0 -0
  524. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_diagnose_graph.py +0 -0
  525. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_doctor.py +0 -0
  526. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_doctor_config_free_1801.py +0 -0
  527. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  528. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_drive.py +0 -0
  529. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_drive_queue.py +0 -0
  530. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_escalate.py +0 -0
  531. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_fix_headless_review.py +0 -0
  532. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_gate_a.py +0 -0
  533. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_install_drift.py +0 -0
  534. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_install_skills.py +0 -0
  535. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_issue_create_label.py +0 -0
  536. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_issue_reopen.py +0 -0
  537. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_merge.py +0 -0
  538. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_milestone_assign.py +0 -0
  539. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_milestone_capture.py +0 -0
  540. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_milestone_chat_add_child.py +0 -0
  541. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_milestone_dispatch.py +0 -0
  542. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_milestone_gate_b.py +0 -0
  543. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_milestone_gate_c.py +0 -0
  544. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_milestone_order.py +0 -0
  545. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  546. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_milestone_ship.py +0 -0
  547. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_network.py +0 -0
  548. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_new_issue_chat.py +0 -0
  549. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_plans.py +0 -0
  550. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_portal.py +0 -0
  551. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_pull_artifact.py +0 -0
  552. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_queue.py +0 -0
  553. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_reattach_sessions.py +0 -0
  554. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_refine_board.py +0 -0
  555. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_release_preflight.py +0 -0
  556. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_release_propagate.py +0 -0
  557. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_release_window.py +0 -0
  558. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_repo_2220.py +0 -0
  559. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_scorecard.py +0 -0
  560. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_set_review_findings.py +0 -0
  561. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_status_advisory_terminal.py +0 -0
  562. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_status_merge_queue.py +0 -0
  563. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_status_provider.py +0 -0
  564. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_status_review_finalizing.py +0 -0
  565. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_status_test_failed_tag.py +0 -0
  566. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_status_usage_limit.py +0 -0
  567. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_sync_comments_873.py +0 -0
  568. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_test_plan.py +0 -0
  569. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_track.py +0 -0
  570. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_tui_update.py +0 -0
  571. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cli_wait.py +0 -0
  572. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_client_base_install.py +0 -0
  573. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_comments.py +0 -0
  574. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_completion_summary.py +0 -0
  575. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_config.py +0 -0
  576. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_config_acceptance.py +0 -0
  577. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_config_audit.py +0 -0
  578. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_config_pricing.py +0 -0
  579. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_config_usage_gate.py +0 -0
  580. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_conflict_fix.py +0 -0
  581. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_conflict_fix_semantic.py +0 -0
  582. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_coord_test.py +0 -0
  583. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_coord_test_runner_baseline.py +0 -0
  584. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_coord_test_runner_routing.py +0 -0
  585. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_coord_test_runner_toolchain.py +0 -0
  586. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_coord_web_sse_restart_live.py +0 -0
  587. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_coordinator_machine.py +0 -0
  588. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_cross_platform_imports.py +0 -0
  589. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_dashboard.py +0 -0
  590. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_dashboard_fixture.py +0 -0
  591. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_dashboard_terminal.py +0 -0
  592. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_dashboard_terminal_live.py +0 -0
  593. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_db.py +0 -0
  594. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_dead_end.py +0 -0
  595. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_deploy_coord_db_backup.py +0 -0
  596. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_deploy_coord_web_dist.py +0 -0
  597. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_deploy_coord_web_rollback.py +0 -0
  598. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_deploy_drive_queue_unit.py +0 -0
  599. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_deploy_manifest.py +0 -0
  600. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_deploy_units_lane.py +0 -0
  601. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_deploy_web_unit.py +0 -0
  602. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_deps.py +0 -0
  603. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_diagnose.py +0 -0
  604. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_dispatch.py +0 -0
  605. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_dispatch_target_validation.py +0 -0
  606. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_dist_name.py +0 -0
  607. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_done_housekeeping.py +0 -0
  608. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_drive.py +0 -0
  609. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_drive_queue.py +0 -0
  610. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_drive_state.py +0 -0
  611. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_drive_tmux.py +0 -0
  612. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_epic_up_capability_detection.py +0 -0
  613. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  614. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_epic_up_image_provenance.py +0 -0
  615. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_errors.py +0 -0
  616. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_events.py +0 -0
  617. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_failure_class.py +0 -0
  618. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_filelock.py +0 -0
  619. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  620. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_fix_of_force_override.py +0 -0
  621. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_fleet_config_health.py +0 -0
  622. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_fleet_health_probes.py +0 -0
  623. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_fleet_health_snapshot.py +0 -0
  624. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_freshness.py +0 -0
  625. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_gate_a.py +0 -0
  626. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_gate_b.py +0 -0
  627. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_gate_snapshot_staleness.py +0 -0
  628. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_gates.py +0 -0
  629. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  630. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_generated_types_fixture.py +0 -0
  631. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_github_ops.py +0 -0
  632. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_goal.py +0 -0
  633. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_graph_health.py +0 -0
  634. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_handoff.py +0 -0
  635. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_health_checks.py +0 -0
  636. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_health_cli.py +0 -0
  637. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_health_cli_graph.py +0 -0
  638. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_health_config.py +0 -0
  639. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_health_context.py +0 -0
  640. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_health_deploy_lane_facts.py +0 -0
  641. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_health_incident_regression.py +0 -0
  642. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_health_pypi.py +0 -0
  643. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_health_registry.py +0 -0
  644. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_health_timer_active.py +0 -0
  645. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_health_toolchain.py +0 -0
  646. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_health_unit_drift.py +0 -0
  647. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_health_unit_enablement.py +0 -0
  648. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_hooks.py +0 -0
  649. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_human_attended_437.py +0 -0
  650. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_init.py +0 -0
  651. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_integration.py +0 -0
  652. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_interactive_briefing_echo.py +0 -0
  653. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_interactive_prefill_state.py +0 -0
  654. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_interactive_session_relaunch.py +0 -0
  655. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_interactive_test_verdict_backstop.py +0 -0
  656. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_interactive_token_attribution.py +0 -0
  657. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_interactive_worktree.py +0 -0
  658. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_issue_store_seam.py +0 -0
  659. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_liveness_auditor.py +0 -0
  660. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_liveness_notify.py +0 -0
  661. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_machine_pause.py +0 -0
  662. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_merge_verify.py +0 -0
  663. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_milestone_chat.py +0 -0
  664. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_milestone_dispatch.py +0 -0
  665. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_milestone_gate.py +0 -0
  666. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_milestone_order.py +0 -0
  667. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_milestone_seam.py +0 -0
  668. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_mock_author.py +0 -0
  669. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_model_tiering.py +0 -0
  670. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_models.py +0 -0
  671. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_models_config_labels.py +0 -0
  672. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_needs_attention.py +0 -0
  673. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_network.py +0 -0
  674. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_new_issue_chat.py +0 -0
  675. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_next_release_tag.py +0 -0
  676. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_no_direct_gh_calls.py +0 -0
  677. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_node_shim.py +0 -0
  678. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_notifier_baseline.py +0 -0
  679. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_notifier_cli.py +0 -0
  680. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_notifier_collect.py +0 -0
  681. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_notifier_config.py +0 -0
  682. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_notifier_drive_seam.py +0 -0
  683. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_notifier_isolation.py +0 -0
  684. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_notifier_predicate.py +0 -0
  685. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_notifier_quiet_hours.py +0 -0
  686. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_notifier_service.py +0 -0
  687. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_notify.py +0 -0
  688. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_notify_drain.py +0 -0
  689. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_openapi.py +0 -0
  690. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_operational_defaults.py +0 -0
  691. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_overlap_fence.py +0 -0
  692. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_packaged_deploy_units.py +0 -0
  693. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_parentage.py +0 -0
  694. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_paste_landed.py +0 -0
  695. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_pipeline.py +0 -0
  696. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_plan_followup_approve_plan_command.py +0 -0
  697. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_plan_followup_pr_command.py +0 -0
  698. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_plan_followup_review_command.py +0 -0
  699. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_plan_only.py +0 -0
  700. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_plan_parser.py +0 -0
  701. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_platform_paths.py +0 -0
  702. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_portal_bridge.py +0 -0
  703. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_portal_config.py +0 -0
  704. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_pr_body_lint.py +0 -0
  705. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_prereqs.py +0 -0
  706. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_production_db_guard.py +0 -0
  707. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_progress.py +0 -0
  708. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_provider_seam.py +0 -0
  709. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_providers.py +0 -0
  710. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_providers_config_labels.py +0 -0
  711. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_providers_pty.py +0 -0
  712. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_quiet_hours.py +0 -0
  713. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_quiet_hours_store_2146.py +0 -0
  714. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_reap_merged_sessions.py +0 -0
  715. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_reap_stale_interactive_tick.py +0 -0
  716. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_reconcile_branch.py +0 -0
  717. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_reconcile_completions.py +0 -0
  718. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_reconcile_merges.py +0 -0
  719. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_reconcile_usage_limit_done.py +0 -0
  720. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_refine_chat.py +0 -0
  721. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_release_cordon_2101.py +0 -0
  722. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_release_propagate.py +0 -0
  723. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_release_unified_1242.py +0 -0
  724. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_release_verify.py +0 -0
  725. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_release_window.py +0 -0
  726. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_remote_auto_prune.py +0 -0
  727. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_remote_interactive_reaper.py +0 -0
  728. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_repo_edit_2220.py +0 -0
  729. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_repo_onboard_2220.py +0 -0
  730. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_report_result_push.py +0 -0
  731. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_reports.py +0 -0
  732. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_retry.py +0 -0
  733. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_retry_advisory_1606.py +0 -0
  734. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_retry_type_1636.py +0 -0
  735. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_review.py +0 -0
  736. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_review_end_review_without_verdict.py +0 -0
  737. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_review_parse_failure_diagnostic.py +0 -0
  738. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_review_reaffirm.py +0 -0
  739. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_review_state.py +0 -0
  740. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_review_verdict_backstop.py +0 -0
  741. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_review_verdict_override_audit.py +0 -0
  742. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_review_verdict_relay.py +0 -0
  743. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_review_zero_commits.py +0 -0
  744. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_scoped_review_wiring.py +0 -0
  745. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_scorecard.py +0 -0
  746. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_serve.py +0 -0
  747. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_serve_app_board_trim.py +0 -0
  748. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_session.py +0 -0
  749. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_slice_issue_attribution.py +0 -0
  750. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_smoke.py +0 -0
  751. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_smoke_live_checkout_restore.py +0 -0
  752. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_smoke_workflow.py +0 -0
  753. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_spend_ceiling.py +0 -0
  754. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_spend_ceiling_coordinator.py +0 -0
  755. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_split.py +0 -0
  756. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_split_work.py +0 -0
  757. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_stage_projection.py +0 -0
  758. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_stalled_pipeline.py +0 -0
  759. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_state.py +0 -0
  760. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_state_review_findings_daemon.py +0 -0
  761. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_status_fleet_footer.py +0 -0
  762. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_stop_1567.py +0 -0
  763. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_stuck.py +0 -0
  764. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_terminal_command.py +0 -0
  765. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_test_author.py +0 -0
  766. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_test_chat.py +0 -0
  767. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_test_orchestrator.py +0 -0
  768. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_test_report.py +0 -0
  769. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_test_verdict_parsing.py +0 -0
  770. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_test_verdict_transcript_floor.py +0 -0
  771. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_thin_client_board_audit.py +0 -0
  772. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_thin_client_config_load_1080.py +0 -0
  773. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_thin_client_daemon_routing_906.py +0 -0
  774. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_tmux_host.py +0 -0
  775. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_tmux_session.py +0 -0
  776. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_transcript_floor.py +0 -0
  777. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_usage.py +0 -0
  778. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_usage_limits.py +0 -0
  779. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_usage_rollup.py +0 -0
  780. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_venv_live_install_2121.py +0 -0
  781. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_version_single_source.py +0 -0
  782. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_watch.py +0 -0
  783. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_worker_events.py +0 -0
  784. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_worker_image_pin_sync.py +0 -0
  785. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_worker_safety.py +0 -0
  786. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_worker_test_scoping.py +0 -0
  787. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_worktree.py +0 -0
  788. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  789. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/Cargo.lock +0 -0
  790. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/Cargo.toml +0 -0
  791. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/cargo-config-local-quadraui.toml.example +0 -0
  792. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/audit.rs +0 -0
  793. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/chat.rs +0 -0
  794. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/data.rs +0 -0
  795. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/dialogs.rs +0 -0
  796. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/drive.rs +0 -0
  797. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/drive_queue.rs +0 -0
  798. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/escalation.rs +0 -0
  799. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/events.rs +0 -0
  800. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/fixtures.rs +0 -0
  801. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/fleet_health.rs +0 -0
  802. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/fleet_sessions.rs +0 -0
  803. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/fleet_terminals.rs +0 -0
  804. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/format.rs +0 -0
  805. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/milestone_dag.rs +0 -0
  806. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/mod.rs +0 -0
  807. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/msv.rs +0 -0
  808. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/pipeline.rs +0 -0
  809. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/plans.rs +0 -0
  810. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/render.rs +0 -0
  811. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/reports.rs +0 -0
  812. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/sessions.rs +0 -0
  813. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/settings_ui.rs +0 -0
  814. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/sidebar.rs +0 -0
  815. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/terminal.rs +0 -0
  816. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/tests.rs +0 -0
  817. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/types.rs +0 -0
  818. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/app/workspace.rs +0 -0
  819. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/bin/gtk.rs +0 -0
  820. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/commands.rs +0 -0
  821. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/lib.rs +0 -0
  822. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/main.rs +0 -0
  823. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/src/settings.rs +0 -0
  824. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/tests/acceptance.rs +0 -0
  825. {code_coordinator-0.5.77 → code_coordinator-0.5.78}/tui/tests/cli.rs +0 -0
  826. {code_coordinator-0.5.77 → 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.77
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.77
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.77",
2
+ "tag": "0.5.78",
3
3
  "distance": 0,
4
- "node": "gb940996c651692e5e0c90012a9046b2dfe09ec50",
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``
@@ -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",
@@ -907,3 +907,60 @@ these figures. Note also that #2132's classification covers 27 rows, not the
907
907
  38 the original count named — the worker could not reproduce the exact window
908
908
  boundary, and cross-validated instead against the `review_iteration=2 → 6 legs`
909
909
  figure, which matched exactly. Treat it as representative, not a literal audit.
910
+
911
+ ## 18. "test verdict stale" on a branch that no longer merges is the wrong headline — the conflict is (#2231)
912
+
913
+ Gate evaluation is ordered (review → smoke → CI → …) and every gate
914
+ short-circuits. So an entry whose branch does not merge **at all** never
915
+ reaches the merge attempt: it reports `smoke gate — test verdict stale`, which
916
+ invites the one remedy that cannot possibly work, and neither repair mechanism
917
+ can arm behind it —
918
+
919
+ - **#1738**'s stale-smoke auto-repair answers a stale verdict, and the verdict
920
+ was never the problem;
921
+ - **#241**'s `conflict-fix` worker is dispatched by `coord merge` *when the
922
+ merge attempt fails on a rebaseable conflict* — and no merge was attempted.
923
+
924
+ quadraui **#306/#309** sat 11h each in exactly that position (`mergeable:
925
+ false, mergeable_state: dirty`; four sibling driver-test backfills all
926
+ appending to `quadraui/tests/tui_example_driver.rs`, two stranded once the
927
+ first two merged). A human eventually ran `coord fix <aid> --force --guidance
928
+ "<rebase, keep both sides, push --force-with-lease>"` — which is #241's own job
929
+ description.
930
+
931
+ Two things now close that gap, both keyed to a **STALE** verdict specifically
932
+ (a genuinely missing verdict is the #1640 lost-write shape and still escalates
933
+ to a human, unchanged):
934
+
935
+ 1. **The smoke gate asks whether the branch merges before it blocks.** When
936
+ the gate is about to refuse on a stale verdict, `merge_queue.
937
+ stale_smoke_conflict_reason` probes `check_pr_mergeable`. A confirmed
938
+ `mergeable: false` turns the refusal into a `conflict` event —
939
+ `entry.state = CONFLICT`, and `_dispatch_conflict_fixes` arms the rebase
940
+ worker exactly as a failed merge attempt would have. `coord merge --plan`
941
+ and the board's `merge_reason` name the conflict too, so `coord drive`
942
+ stops reading the entry as re-testable. An inconclusive probe (`None` —
943
+ GitHub still computing — or a `gh` error, or a caller with no live probe
944
+ at all, e.g. the `/board` read path's `GateSnapshot`) leaves today's
945
+ stale-verdict block exactly as it was.
946
+ 2. **`--revalidate` acts on the conflict it finds.** It already composes each
947
+ branch onto the live base in a throwaway worktree, so a `git merge`
948
+ conflict there is a stronger fact than GitHub's `mergeable` field. That
949
+ verdict used to be formatted for the operator and then dropped; it is now
950
+ carried out structurally (`BatchRevalidationResult.conflicted`) and routed
951
+ through the same `_dispatch_conflict_fixes` call. The suite never runs for
952
+ a branch that will not compose, and no verdict is rewritten.
953
+
954
+ What you should see instead of an 11-hour park:
955
+
956
+ ```
957
+ --revalidate: api #102: the blocker is a CONFLICT, not a stale verdict — the
958
+ branch does not compose onto its base. Routing to the conflict-fix path
959
+ (#241) instead of re-testing (#2231).
960
+ api #102: conflict-fix dispatched to laptop
961
+ ```
962
+
963
+ If the conflict-fix worker itself fails, the #241/#784 retry cap still flips
964
+ the entry to `HUMAN_REQUIRED` on the second attempt — rule #10's escape hatch
965
+ applies from there. Nothing here loosens that: this only removes the case
966
+ where **no** mechanism ran at all.
@@ -8252,3 +8252,224 @@ class TestAbandonedRunningMarkerIsStaleNotMissing:
8252
8252
  candidates = mq.revalidation_candidates([entry], board, _Cfg())
8253
8253
 
8254
8254
  assert [c.work_assignment_id for c in candidates] == ["w1"]
8255
+
8256
+
8257
+ # ══════════════════════════════════════════════════════════════════════════════
8258
+ # #2231: a conflict hiding behind a stale-verdict smoke block
8259
+ # ══════════════════════════════════════════════════════════════════════════════
8260
+
8261
+ class TestStaleSmokeConflictProbe:
8262
+ """#2231: gate evaluation short-circuits on the smoke gate, so an entry
8263
+ whose branch does not merge AT ALL reports "test verdict stale" — the one
8264
+ remedy that cannot work — and never reaches the merge attempt that would
8265
+ have armed #241's conflict-fix.
8266
+
8267
+ quadraui #306/#309 sat 11h each in exactly that position: `mergeable:
8268
+ false, mergeable_state: dirty`, four sibling branches appending to one
8269
+ file, two of them stranded once the first two merged. `--revalidate`
8270
+ diagnosed it perfectly and nothing acted; a human finally typed `coord fix
8271
+ --force`, which is #241's own job description.
8272
+ """
8273
+
8274
+ @staticmethod
8275
+ def _config():
8276
+ return TestSmokeGate._config()
8277
+
8278
+ @staticmethod
8279
+ def _stale_setup(*, mergeable: bool | None):
8280
+ """One PENDING entry whose passed verdict was staled by a base move,
8281
+ plus a `gh` stub with a definite answer about mergeability."""
8282
+ work = TestSmokeGate._work("w1", test_state="passed")
8283
+ work.test_head_sha = "branch-sha-1"
8284
+ work.test_patch_id = "patch-1"
8285
+ work.test_base_sha = "main-sha-old"
8286
+ board = TestSmokeGate._board(completed=[work])
8287
+
8288
+ entry = _q("w1", size=10, pr=100)
8289
+ entry.branch_head_sha = "branch-sha-1"
8290
+ entry.branch_patch_id = "patch-1"
8291
+ entry.target_branch_head_sha = "main-sha-new" # base moved under it
8292
+ gh = FakeGh(mergeable_results={100: mergeable})
8293
+ return entry, board, gh
8294
+
8295
+ # ── the predicate ──
8296
+
8297
+ def test_reason_names_the_conflict_when_github_says_not_mergeable(self) -> None:
8298
+ entry, board, gh = self._stale_setup(mergeable=False)
8299
+ smoke = mq.evaluate_smoke_verdict(entry, board)
8300
+ assert smoke.kind == mq.SMOKE_STALE
8301
+
8302
+ reason = mq.stale_smoke_conflict_reason(entry, smoke, gh)
8303
+
8304
+ assert reason is not None
8305
+ # The conflict leads; the stale verdict is named as downstream, not as
8306
+ # the blocker (the acceptance criterion's "not (only) a stale verdict").
8307
+ assert "merge conflict" in reason.lower()
8308
+ assert "test verdict" in reason.lower()
8309
+
8310
+ def test_reason_classifies_as_rebaseable_and_not_as_stale_smoke(self) -> None:
8311
+ """The wording is load-bearing in both directions: `classify_conflict`
8312
+ decides whether #241 dispatches, and `is_stale_smoke_reason` decides
8313
+ whether `coord drive` answers with a re-test. Getting either wrong
8314
+ reproduces the bug with extra steps."""
8315
+ entry, board, gh = self._stale_setup(mergeable=False)
8316
+ reason = mq.stale_smoke_conflict_reason(
8317
+ entry, mq.evaluate_smoke_verdict(entry, board), gh,
8318
+ )
8319
+
8320
+ assert mq.classify_conflict(reason) == "rebaseable"
8321
+ assert mq.is_stale_smoke_reason(reason) is False
8322
+
8323
+ def test_silent_when_the_pr_is_mergeable(self) -> None:
8324
+ """Acceptance: a genuinely stale verdict on a cleanly-composing branch
8325
+ still takes the #1738 path, unchanged."""
8326
+ entry, board, gh = self._stale_setup(mergeable=True)
8327
+ assert mq.stale_smoke_conflict_reason(
8328
+ entry, mq.evaluate_smoke_verdict(entry, board), gh,
8329
+ ) is None
8330
+
8331
+ def test_silent_when_mergeability_is_still_computing(self) -> None:
8332
+ """`None` is "GitHub hasn't decided", not "conflict". Upgrading an
8333
+ inconclusive read would point a rebase worker at a clean branch."""
8334
+ entry, board, gh = self._stale_setup(mergeable=None)
8335
+ assert mq.stale_smoke_conflict_reason(
8336
+ entry, mq.evaluate_smoke_verdict(entry, board), gh,
8337
+ ) is None
8338
+
8339
+ def test_silent_when_the_probe_raises(self) -> None:
8340
+ entry, board, _gh = self._stale_setup(mergeable=False)
8341
+
8342
+ class _Boom:
8343
+ def check_pr_mergeable(self, repo, number):
8344
+ raise RuntimeError("gh exploded")
8345
+
8346
+ assert mq.stale_smoke_conflict_reason(
8347
+ entry, mq.evaluate_smoke_verdict(entry, board), _Boom(),
8348
+ ) is None
8349
+
8350
+ def test_silent_without_a_probe_at_all(self) -> None:
8351
+ """The `/board` read path evaluates gates against a GateSnapshot, which
8352
+ implements no `gh` calls (#1336 Invariant 1). Duck-typed, like the
8353
+ #1877 CI-absent branch."""
8354
+ entry, board, _gh = self._stale_setup(mergeable=False)
8355
+
8356
+ class _NoProbe:
8357
+ pass
8358
+
8359
+ assert mq.stale_smoke_conflict_reason(
8360
+ entry, mq.evaluate_smoke_verdict(entry, board), _NoProbe(),
8361
+ ) is None
8362
+
8363
+ def test_silent_for_a_missing_verdict(self) -> None:
8364
+ """SMOKE_MISSING is the #1640 lost-write shape and stays out of scope,
8365
+ exactly as it is for `revalidation_candidates`."""
8366
+ work = TestSmokeGate._work("w1", test_state=None)
8367
+ board = TestSmokeGate._board(completed=[work])
8368
+ entry = _q("w1", pr=100)
8369
+ smoke = mq.evaluate_smoke_verdict(entry, board)
8370
+
8371
+ assert smoke.kind == mq.SMOKE_MISSING
8372
+ assert mq.stale_smoke_conflict_reason(
8373
+ entry, smoke, FakeGh(mergeable_results={100: False}),
8374
+ ) is None
8375
+
8376
+ def test_silent_before_a_pr_exists(self) -> None:
8377
+ entry, board, gh = self._stale_setup(mergeable=False)
8378
+ entry.pr_number = None
8379
+ assert mq.stale_smoke_conflict_reason(
8380
+ entry, mq.evaluate_smoke_verdict(entry, board), gh,
8381
+ ) is None
8382
+
8383
+ # ── process(): the event that arms #241 ──
8384
+
8385
+ def test_process_emits_a_conflict_event_not_smoke_required(self) -> None:
8386
+ """The headline: the entry that used to park at PENDING/"stale" now
8387
+ parks at CONFLICT with a `conflict` event — which is precisely what
8388
+ `coord.commands.merge._dispatch_conflict_fixes` consumes."""
8389
+ entry, board, gh = self._stale_setup(mergeable=False)
8390
+ events = process([entry], gh, config=self._config(), board=board)
8391
+
8392
+ kinds = [e.kind for e in events]
8393
+ assert "conflict" in kinds
8394
+ assert "smoke_required" not in kinds
8395
+ assert "merged" not in kinds
8396
+ assert gh.merge_calls == []
8397
+ assert entry.state == CONFLICT
8398
+ assert mq.classify_conflict(entry.error) == "rebaseable"
8399
+
8400
+ def test_process_still_blocks_on_smoke_when_the_branch_is_clean(self) -> None:
8401
+ entry, board, gh = self._stale_setup(mergeable=True)
8402
+ events = process([entry], gh, config=self._config(), board=board)
8403
+
8404
+ kinds = [e.kind for e in events]
8405
+ assert "smoke_required" in kinds
8406
+ assert "conflict" not in kinds
8407
+ assert entry.state == PENDING
8408
+ assert mq.is_stale_smoke_reason(entry.error) is True
8409
+
8410
+ def test_process_unchanged_when_gh_reports_nothing(self) -> None:
8411
+ """Every pre-#2231 test uses a `gh` stub whose `check_pr_mergeable`
8412
+ answers `None`; none of them may change behaviour."""
8413
+ entry, board, _gh = self._stale_setup(mergeable=None)
8414
+ events = process([entry], FakeGh(), config=self._config(), board=board)
8415
+
8416
+ assert [e.kind for e in events].count("smoke_required") == 1
8417
+ assert entry.state == PENDING
8418
+
8419
+ # ── process(dry_run=True): the preview must not disagree with --plan ──
8420
+
8421
+ def test_dry_run_reports_conflict_not_smoke_required(self) -> None:
8422
+ """Review finding on iteration 1: the smoke gate's own `--dry-run`
8423
+ preview block sat right next to the CI gate's #1877 dry-run conflict
8424
+ check but wasn't updated for #2231, so `coord merge --dry-run`
8425
+ (without `--revalidate`) kept printing the stale-verdict headline for
8426
+ an entry `--plan`/a real run both correctly report as `conflict` —
8427
+ the exact "two surfaces answer the same question differently"
8428
+ split-brain this issue exists to fix."""
8429
+ entry, board, gh = self._stale_setup(mergeable=False)
8430
+ events = process([entry], gh, config=self._config(), board=board, dry_run=True)
8431
+
8432
+ kinds = [e.kind for e in events]
8433
+ assert "conflict" in kinds
8434
+ assert "smoke_required" not in kinds
8435
+ assert gh.merge_calls == []
8436
+ # dry-run never mutates state
8437
+ assert entry.state == PENDING
8438
+ conflict_event = next(e for e in events if e.kind == "conflict")
8439
+ assert mq.classify_conflict(conflict_event.message) == "rebaseable"
8440
+
8441
+ def test_dry_run_still_shows_smoke_required_when_the_branch_is_clean(self) -> None:
8442
+ """Acceptance: a genuinely stale verdict on a cleanly-composing
8443
+ branch still takes the #1738 path, unchanged — including in the
8444
+ dry-run preview."""
8445
+ entry, board, gh = self._stale_setup(mergeable=True)
8446
+ events = process([entry], gh, config=self._config(), board=board, dry_run=True)
8447
+
8448
+ kinds = [e.kind for e in events]
8449
+ assert "smoke_required" in kinds
8450
+ assert "conflict" not in kinds
8451
+ assert entry.state == PENDING
8452
+
8453
+ # ── _entry_gate_status(): what the plan/board reports ──
8454
+
8455
+ def test_plan_reason_names_the_conflict(self) -> None:
8456
+ """Acceptance: "An entry whose branch does not compose onto its base
8457
+ reports conflict as its blocking reason, not (only) a stale verdict."
8458
+ """
8459
+ entry, board, gh = self._stale_setup(mergeable=False)
8460
+ status, reason = mq.entry_gate_status(
8461
+ entry, board, self._config(), None, gh,
8462
+ )
8463
+
8464
+ assert status == mq.PLAN_BLOCKED
8465
+ assert "merge conflict" in reason.lower()
8466
+ assert mq.is_stale_smoke_reason(reason) is False
8467
+
8468
+ def test_plan_reason_unchanged_for_a_clean_branch(self) -> None:
8469
+ entry, board, gh = self._stale_setup(mergeable=True)
8470
+ status, reason = mq.entry_gate_status(
8471
+ entry, board, self._config(), None, gh,
8472
+ )
8473
+
8474
+ assert status == mq.PLAN_BLOCKED
8475
+ assert mq.is_stale_smoke_reason(reason) is True