code-coordinator 0.5.76__tar.gz → 0.5.77__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (826) hide show
  1. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/drive.py +170 -14
  5. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/docs/DRIVE_QUEUE.md +13 -0
  6. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_drive.py +271 -0
  7. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/.claude/commands/board.md +0 -0
  8. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/.claude/commands/complete-session.md +0 -0
  9. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/.claude/commands/coordinator.md +0 -0
  10. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/.githooks/_lib.sh +0 -0
  11. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/.githooks/post-checkout +0 -0
  12. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/.githooks/post-commit +0 -0
  13. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/.githooks/post-merge +0 -0
  14. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  15. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/.github/coord-ci-acceptance.yml +0 -0
  16. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/.github/workflows/auto-release.yml +0 -0
  17. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/.github/workflows/cargo-test.yml +0 -0
  18. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/.github/workflows/publish.yml +0 -0
  19. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/.github/workflows/release-tui.yml +0 -0
  20. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/.github/workflows/test.yml +0 -0
  21. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/.gitignore +0 -0
  22. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/CLAUDE.md +0 -0
  23. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/GOAL.md +0 -0
  24. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/LICENSE +0 -0
  25. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/MANIFEST.in +0 -0
  26. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/README.md +0 -0
  27. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/code_coordinator.egg-info/SOURCES.txt +0 -0
  28. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/code_coordinator.egg-info/dependency_links.txt +0 -0
  29. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/code_coordinator.egg-info/entry_points.txt +0 -0
  30. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/code_coordinator.egg-info/requires.txt +0 -0
  31. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/code_coordinator.egg-info/scm_file_list.json +0 -0
  32. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/code_coordinator.egg-info/top_level.txt +0 -0
  33. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/__init__.py +0 -0
  34. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/_board_mapping.py +0 -0
  35. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/acceptance.py +0 -0
  36. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/acceptance_drivers.py +0 -0
  37. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/agent.py +0 -0
  38. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/agent_app.py +0 -0
  39. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/agent_update.py +0 -0
  40. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/agents/opencode/.gitignore +0 -0
  41. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/agents/opencode/agents/work.md +0 -0
  42. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/agents/opencode/routing.jsonc +0 -0
  43. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/audit.py +0 -0
  44. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/auto_loop.py +0 -0
  45. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/board_bool_guard.py +0 -0
  46. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/board_service.py +0 -0
  47. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/board_wire.py +0 -0
  48. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/brain.py +0 -0
  49. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/branch_model.py +0 -0
  50. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/bug_intake.py +0 -0
  51. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/cargo_cache.py +0 -0
  52. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/ci_github.py +0 -0
  53. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/ci_store.py +0 -0
  54. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/claim.py +0 -0
  55. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/cli.py +0 -0
  56. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/client.py +0 -0
  57. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/commands/__init__.py +0 -0
  58. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/commands/_common.py +0 -0
  59. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/commands/acceptance.py +0 -0
  60. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/commands/agent_ops.py +0 -0
  61. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/commands/audit.py +0 -0
  62. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/commands/chat.py +0 -0
  63. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/commands/dispatch.py +0 -0
  64. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/commands/dispatch_workers.py +0 -0
  65. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/commands/drive.py +0 -0
  66. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/commands/drive_queue.py +0 -0
  67. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/commands/gate_a.py +0 -0
  68. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/commands/gates.py +0 -0
  69. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/commands/issues.py +0 -0
  70. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/commands/lifecycle.py +0 -0
  71. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/commands/merge.py +0 -0
  72. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/commands/milestone.py +0 -0
  73. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/commands/plan_followup.py +0 -0
  74. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/commands/plans.py +0 -0
  75. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/commands/portal.py +0 -0
  76. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/commands/release.py +0 -0
  77. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/commands/repo.py +0 -0
  78. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/commands/report.py +0 -0
  79. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/commands/review.py +0 -0
  80. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/commands/scorecard.py +0 -0
  81. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/commands/sessions.py +0 -0
  82. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/commands/setup.py +0 -0
  83. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/commands/status.py +0 -0
  84. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/commands/terminal.py +0 -0
  85. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/commands/test_gate.py +0 -0
  86. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/commands/tui.py +0 -0
  87. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/comments.py +0 -0
  88. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/config.py +0 -0
  89. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/conflict_fix.py +0 -0
  90. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dao.py +0 -0
  91. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/__init__.py +0 -0
  92. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/fixture.py +0 -0
  93. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/index.html +0 -0
  94. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/server.py +0 -0
  95. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/terminal.py +0 -0
  96. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/.gitignore +0 -0
  97. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/components.json +0 -0
  98. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js +0 -0
  99. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  100. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js +0 -0
  101. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js +0 -0
  102. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  103. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  104. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  105. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  106. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  107. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/dist/index.html +0 -0
  108. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  109. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/dist/sw.js +0 -0
  110. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  111. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  112. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  113. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  114. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  115. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  116. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  117. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  118. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  119. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  120. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/eslint.config.js +0 -0
  121. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/index.html +0 -0
  122. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  123. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/package-lock.json +0 -0
  124. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/package.json +0 -0
  125. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  126. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/playwright.config.ts +0 -0
  127. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/postcss.config.js +0 -0
  128. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  129. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  130. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  131. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/App.tsx +0 -0
  132. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/api/client.ts +0 -0
  133. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  134. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  135. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  136. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  137. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  138. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  139. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  140. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  141. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  142. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  143. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  144. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  145. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  146. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  147. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  148. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  149. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  150. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  151. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  152. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  153. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  154. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  155. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  156. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  157. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  158. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  159. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  160. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  161. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  162. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  163. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  164. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  165. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  166. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  167. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  168. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/index.css +0 -0
  169. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  170. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  171. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/main.tsx +0 -0
  172. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  173. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  174. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  175. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  176. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  177. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  178. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  179. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  180. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  181. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  182. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  183. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  184. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  185. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  186. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  187. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  188. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  189. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  190. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  191. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  192. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  193. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  194. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  195. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/tailwind.config.js +0 -0
  196. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/tsconfig.json +0 -0
  197. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  198. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dashboard/webapp/vite.config.ts +0 -0
  199. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/db.py +0 -0
  200. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dead_end.py +0 -0
  201. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/deploy/README.md +0 -0
  202. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/deploy/coord-agent.service +0 -0
  203. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/deploy/coord-db-backup.service +0 -0
  204. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/deploy/coord-db-backup.sh +0 -0
  205. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/deploy/coord-db-backup.timer +0 -0
  206. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/deploy/coord-drive-queue.service +0 -0
  207. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/deploy/coord-drive-queue.timer +0 -0
  208. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/deploy/coord-notify.service +0 -0
  209. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/deploy/coord-notify.timer +0 -0
  210. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/deploy/coord-release-propagate.service +0 -0
  211. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/deploy/coord-release-propagate.timer +0 -0
  212. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/deploy/coord-release-window.service +0 -0
  213. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/deploy/coord-release-window.timer +0 -0
  214. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/deploy/coord-serve.service +0 -0
  215. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/deploy/coord-web-dist-build.service +0 -0
  216. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/deploy/coord-web-dist-build.timer +0 -0
  217. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/deploy/coord-web.service +0 -0
  218. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/deploy_manifest.py +0 -0
  219. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/deploy_units.py +0 -0
  220. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/deps.py +0 -0
  221. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/diagnose.py +0 -0
  222. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dispatch.py +0 -0
  223. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/dist_name.py +0 -0
  224. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/drive_queue.py +0 -0
  225. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/drive_state.py +0 -0
  226. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/events.py +0 -0
  227. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/failure_class.py +0 -0
  228. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/filelock.py +0 -0
  229. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/fleet_config_health.py +0 -0
  230. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/freshness.py +0 -0
  231. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/gate_a.py +0 -0
  232. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/gate_b.py +0 -0
  233. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/gate_snapshot.py +0 -0
  234. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/gates.py +0 -0
  235. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/github_ops.py +0 -0
  236. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/goal.py +0 -0
  237. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/graph_health.py +0 -0
  238. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/health/__init__.py +0 -0
  239. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/health/aggregate.py +0 -0
  240. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/health/checks/__init__.py +0 -0
  241. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/health/checks/agent_install.py +0 -0
  242. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/health/checks/cargo_targets.py +0 -0
  243. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/health/checks/claude_binary.py +0 -0
  244. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/health/checks/deploy_lane_facts.py +0 -0
  245. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/health/checks/disk.py +0 -0
  246. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/health/checks/fleet_board.py +0 -0
  247. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  248. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/health/checks/fleet_phantom.py +0 -0
  249. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/health/checks/fleet_unit_drift.py +0 -0
  250. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/health/checks/graph.py +0 -0
  251. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/health/checks/plan_usage.py +0 -0
  252. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/health/checks/repo_state.py +0 -0
  253. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/health/checks/spawned_coord.py +0 -0
  254. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/health/checks/timer_active.py +0 -0
  255. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/health/checks/toolchain.py +0 -0
  256. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/health/checks/unit_drift.py +0 -0
  257. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/health/checks/unit_enablement.py +0 -0
  258. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/health/checks/worktrees.py +0 -0
  259. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/health/cli.py +0 -0
  260. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/health/context.py +0 -0
  261. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/health/fleet_snapshot.py +0 -0
  262. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/health/models.py +0 -0
  263. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/health/pypi.py +0 -0
  264. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/health/registry.py +0 -0
  265. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/health/render.py +0 -0
  266. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/health/units.py +0 -0
  267. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/hooks.py +0 -0
  268. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/housekeeping.py +0 -0
  269. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/interactive.py +0 -0
  270. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/issue_store.py +0 -0
  271. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/liveness_auditor.py +0 -0
  272. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/machine_pause.py +0 -0
  273. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/merge_queue.py +0 -0
  274. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/milestone_chat.py +0 -0
  275. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/milestone_dispatch.py +0 -0
  276. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/milestone_gate.py +0 -0
  277. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/milestone_order.py +0 -0
  278. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/mock_author.py +0 -0
  279. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/models.py +0 -0
  280. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/network.py +0 -0
  281. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/new_issue_chat.py +0 -0
  282. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/notifier/__init__.py +0 -0
  283. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/notifier/baseline.py +0 -0
  284. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/notifier/cli.py +0 -0
  285. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/notifier/collect.py +0 -0
  286. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/notifier/digest.py +0 -0
  287. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/notifier/models.py +0 -0
  288. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/notifier/predicate.py +0 -0
  289. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/notifier/service.py +0 -0
  290. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/notifier/store.py +0 -0
  291. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/notifier/transport.py +0 -0
  292. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/notify.py +0 -0
  293. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/openapi.py +0 -0
  294. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/overlap_fence.py +0 -0
  295. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/parentage.py +0 -0
  296. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/parentage_github.py +0 -0
  297. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/pipeline.py +0 -0
  298. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/plan_parser.py +0 -0
  299. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/plans.py +0 -0
  300. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/platform_paths.py +0 -0
  301. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/portal_bridge.py +0 -0
  302. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/pr_body_lint.py +0 -0
  303. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/prereqs.py +0 -0
  304. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/progress.py +0 -0
  305. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/providers/__init__.py +0 -0
  306. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/providers/base.py +0 -0
  307. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/providers/claude.py +0 -0
  308. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/providers/claude_pty.py +0 -0
  309. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/providers/opencode.py +0 -0
  310. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/reconcile.py +0 -0
  311. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/refine_chat.py +0 -0
  312. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/release_cordon.py +0 -0
  313. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/release_propagate.py +0 -0
  314. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/release_verify.py +0 -0
  315. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/release_window.py +0 -0
  316. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/repo_edit.py +0 -0
  317. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/repo_onboard.py +0 -0
  318. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/reports.py +0 -0
  319. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/revalidate.py +0 -0
  320. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/review.py +0 -0
  321. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/scorecard.py +0 -0
  322. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/serve_app.py +0 -0
  323. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/skills/update-issue/SKILL.md +0 -0
  324. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/smoke.py +0 -0
  325. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/spend_ceiling.py +0 -0
  326. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/split_work.py +0 -0
  327. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/stage_projection.py +0 -0
  328. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/state.py +0 -0
  329. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/test_author.py +0 -0
  330. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/test_chat.py +0 -0
  331. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/test_orchestrator.py +0 -0
  332. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/test_report.py +0 -0
  333. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/tui_release.py +0 -0
  334. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/usage.py +0 -0
  335. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/usage_limits.py +0 -0
  336. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/usage_rollup.py +0 -0
  337. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coord/worker_events.py +0 -0
  338. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/coordinator.example.yml +0 -0
  339. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/deploy/coord-agent.service +0 -0
  340. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/deploy/coord-db-backup.service +0 -0
  341. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/deploy/coord-db-backup.sh +0 -0
  342. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/deploy/coord-db-backup.timer +0 -0
  343. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/deploy/coord-drive-queue.service +0 -0
  344. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/deploy/coord-drive-queue.timer +0 -0
  345. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/deploy/coord-notify.service +0 -0
  346. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/deploy/coord-notify.timer +0 -0
  347. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/deploy/coord-release-propagate.service +0 -0
  348. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/deploy/coord-release-propagate.timer +0 -0
  349. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/deploy/coord-release-window.service +0 -0
  350. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/deploy/coord-release-window.timer +0 -0
  351. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/deploy/coord-serve.service +0 -0
  352. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/deploy/coord-web-dist-build.service +0 -0
  353. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/deploy/coord-web-dist-build.sh +0 -0
  354. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/deploy/coord-web-dist-build.timer +0 -0
  355. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/deploy/coord-web-rollback.sh +0 -0
  356. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/deploy/coord-web.service +0 -0
  357. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/deploy/node-shim.sh +0 -0
  358. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/docs/AGENT_OPERATIONS.md +0 -0
  359. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/docs/ARCHITECTURE.md +0 -0
  360. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/docs/ARCH_SECURITY_GATES.md +0 -0
  361. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/docs/COCKPIT.md +0 -0
  362. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/docs/CONTROL_CENTER.md +0 -0
  363. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/docs/COST_DISCIPLINE.md +0 -0
  364. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/docs/CROSS_PLATFORM.md +0 -0
  365. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/docs/CUSTOMER_PORTAL.md +0 -0
  366. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/docs/EPHEMERAL_WORKERS.md +0 -0
  367. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/docs/FORGE_MIGRATION.md +0 -0
  368. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/docs/GRAPHIFY_SETUP.md +0 -0
  369. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/docs/ISSUE_GUIDANCE.md +0 -0
  370. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/docs/MAC_MINI.md +0 -0
  371. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  372. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/docs/NOTIFIER.md +0 -0
  373. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/docs/OPENCODE_VERIFICATION.md +0 -0
  374. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/docs/OPERATING_GOTCHAS.md +0 -0
  375. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/docs/ORACLE_LOOP.md +0 -0
  376. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/docs/PHONE_WEBAPP.md +0 -0
  377. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/docs/PIPELINE_V2.md +0 -0
  378. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/docs/PLATFORM_EVOLUTION.md +0 -0
  379. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/docs/SECOND_BACKEND.md +0 -0
  380. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/docs/STORE_SERVICE.md +0 -0
  381. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  382. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/docs/WEB_CONTROL_CENTER.md +0 -0
  383. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/docs/mocks/web/README.md +0 -0
  384. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/docs/mocks/web/_tokens.css +0 -0
  385. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/docs/mocks/web/issue-detail.html +0 -0
  386. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/docs/mocks/web/pipeline-narrow.html +0 -0
  387. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/docs/mocks/web/pipeline-wide.html +0 -0
  388. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/graphify-out/.gitignore +0 -0
  389. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/install-agent.sh +0 -0
  390. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/pyproject.toml +0 -0
  391. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/scripts/audit_review_verdict_overrides.py +0 -0
  392. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  393. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/scripts/azure-workers/build-worker-image.sh +0 -0
  394. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/scripts/azure-workers/coordinator-machine.py +0 -0
  395. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/scripts/azure-workers/epic-down.sh +0 -0
  396. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/scripts/azure-workers/epic-up.sh +0 -0
  397. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/scripts/azure-workers/preflight.sh +0 -0
  398. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/scripts/azure-workers/provision-worker.sh +0 -0
  399. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  400. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  401. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/scripts/azure-workers/verify-github-token.sh +0 -0
  402. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/scripts/codegen.py +0 -0
  403. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/scripts/coord-test-runner.sh +0 -0
  404. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/scripts/drive-batch.sh +0 -0
  405. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/scripts/gen_board_fixture.py +0 -0
  406. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/scripts/next_release_tag.py +0 -0
  407. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/scripts/run_tests_in_populated_home.sh +0 -0
  408. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/scripts/run_tests_without_gh.sh +0 -0
  409. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/scripts/smoke_437_interactive.py +0 -0
  410. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/scripts/verify_878_review_capture.py +0 -0
  411. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/scripts/verify_release_published.py +0 -0
  412. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/scripts/verify_release_wheel.py +0 -0
  413. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/setup.cfg +0 -0
  414. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/SMOKE_SET.md +0 -0
  415. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/__init__.py +0 -0
  416. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  417. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/acceptance/ms-33/contract.md +0 -0
  418. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/acceptance/ms-33/manifest.yml +0 -0
  419. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  420. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  421. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  422. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  423. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/acceptance/ms-37/conftest.py +0 -0
  424. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/acceptance/ms-37/contract.md +0 -0
  425. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/acceptance/ms-37/manifest.yml +0 -0
  426. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  427. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  428. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/acceptance/ms-38/contract.md +0 -0
  429. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/acceptance/ms-38/manifest.yml +0 -0
  430. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  431. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  432. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  433. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  434. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  435. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  436. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  437. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  438. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  439. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  440. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/acceptance/ms-51/contract.md +0 -0
  441. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  442. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  443. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/acceptance/ms-51/manifest.yml +0 -0
  444. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  445. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/acceptance/ms-51/tsconfig.json +0 -0
  446. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  447. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/conftest.py +0 -0
  448. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/fixtures/board-pipeline-basic.json +0 -0
  449. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  450. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  451. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  452. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/fixtures/playwright/all_pass.json +0 -0
  453. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  454. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/fixtures/playwright/mixed_fail.json +0 -0
  455. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  456. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  457. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/fixtures/playwright/skip.json +0 -0
  458. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/fixtures/playwright/truncated.json +0 -0
  459. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  460. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  461. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  462. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  463. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  464. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  465. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  466. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  467. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_acceptance.py +0 -0
  468. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_acceptance_drivers.py +0 -0
  469. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_agent.py +0 -0
  470. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_agent_api_error.py +0 -0
  471. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_agent_app.py +0 -0
  472. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_agent_branch_base.py +0 -0
  473. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_agent_branch_capture.py +0 -0
  474. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_agent_config_free_1712.py +0 -0
  475. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_agent_deploy_units_endpoint.py +0 -0
  476. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_agent_dirty_worktree.py +0 -0
  477. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_agent_graph_self_heal.py +0 -0
  478. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_agent_health_h3.py +0 -0
  479. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_agent_idle_restart.py +0 -0
  480. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_agent_push_failure.py +0 -0
  481. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_agent_reap.py +0 -0
  482. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_agent_repos_and_pull.py +0 -0
  483. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_agent_restart_services_endpoint.py +0 -0
  484. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_agent_startup_diagnostics.py +0 -0
  485. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_agent_update.py +0 -0
  486. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_agent_update_bluegreen.py +0 -0
  487. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_agent_usage_limit.py +0 -0
  488. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_agent_zero_commit.py +0 -0
  489. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_ambient_home_isolation.py +0 -0
  490. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_approve_reject_plan.py +0 -0
  491. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_approve_usage_gate.py +0 -0
  492. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_assignment_already_recorded_daemon.py +0 -0
  493. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_audit_log.py +0 -0
  494. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_audit_outcome.py +0 -0
  495. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_audit_query.py +0 -0
  496. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_auto_loop.py +0 -0
  497. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_auto_release_publish_2035.py +0 -0
  498. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_base_checkout_restore.py +0 -0
  499. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_board_cap_762.py +0 -0
  500. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_board_fixture.py +0 -0
  501. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_board_read_path.py +0 -0
  502. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_board_service.py +0 -0
  503. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_board_state.py +0 -0
  504. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_board_wire.py +0 -0
  505. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_brain.py +0 -0
  506. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_branch_model.py +0 -0
  507. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_bug_intake.py +0 -0
  508. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_build_worker_image_env_update.py +0 -0
  509. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cargo_cache.py +0 -0
  510. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_ci_acceptance_gate_1950.py +0 -0
  511. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_ci_parity_2091.py +0 -0
  512. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_ci_store.py +0 -0
  513. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_claim.py +0 -0
  514. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_acceptance.py +0 -0
  515. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_assign.py +0 -0
  516. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  517. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_assign_interactive_remote.py +0 -0
  518. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_assign_provider.py +0 -0
  519. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  520. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_audit.py +0 -0
  521. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_chat_continue.py +0 -0
  522. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_diagnose_config_provenance.py +0 -0
  523. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_diagnose_graph.py +0 -0
  524. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_doctor.py +0 -0
  525. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_doctor_config_free_1801.py +0 -0
  526. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  527. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_drive.py +0 -0
  528. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_drive_queue.py +0 -0
  529. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_escalate.py +0 -0
  530. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_fix_headless_review.py +0 -0
  531. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_gate_a.py +0 -0
  532. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_install_drift.py +0 -0
  533. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_install_skills.py +0 -0
  534. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_issue_create_label.py +0 -0
  535. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_issue_reopen.py +0 -0
  536. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_merge.py +0 -0
  537. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_milestone_assign.py +0 -0
  538. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_milestone_capture.py +0 -0
  539. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_milestone_chat_add_child.py +0 -0
  540. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_milestone_dispatch.py +0 -0
  541. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_milestone_gate_b.py +0 -0
  542. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_milestone_gate_c.py +0 -0
  543. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_milestone_order.py +0 -0
  544. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  545. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_milestone_ship.py +0 -0
  546. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_network.py +0 -0
  547. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_new_issue_chat.py +0 -0
  548. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_plans.py +0 -0
  549. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_portal.py +0 -0
  550. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_pull_artifact.py +0 -0
  551. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_queue.py +0 -0
  552. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_reattach_sessions.py +0 -0
  553. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_refine_board.py +0 -0
  554. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_release_preflight.py +0 -0
  555. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_release_propagate.py +0 -0
  556. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_release_window.py +0 -0
  557. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_repo_2220.py +0 -0
  558. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_scorecard.py +0 -0
  559. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_set_review_findings.py +0 -0
  560. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_status_advisory_terminal.py +0 -0
  561. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_status_merge_queue.py +0 -0
  562. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_status_provider.py +0 -0
  563. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_status_review_finalizing.py +0 -0
  564. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_status_test_failed_tag.py +0 -0
  565. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_status_usage_limit.py +0 -0
  566. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_sync_comments_873.py +0 -0
  567. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_test_plan.py +0 -0
  568. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_track.py +0 -0
  569. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_tui_update.py +0 -0
  570. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cli_wait.py +0 -0
  571. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_client_base_install.py +0 -0
  572. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_comments.py +0 -0
  573. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_completion_summary.py +0 -0
  574. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_config.py +0 -0
  575. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_config_acceptance.py +0 -0
  576. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_config_audit.py +0 -0
  577. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_config_pricing.py +0 -0
  578. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_config_usage_gate.py +0 -0
  579. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_conflict_fix.py +0 -0
  580. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_conflict_fix_semantic.py +0 -0
  581. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_coord_test.py +0 -0
  582. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_coord_test_runner_baseline.py +0 -0
  583. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_coord_test_runner_routing.py +0 -0
  584. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_coord_test_runner_toolchain.py +0 -0
  585. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_coord_web_sse_restart_live.py +0 -0
  586. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_coordinator_machine.py +0 -0
  587. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_cross_platform_imports.py +0 -0
  588. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_dashboard.py +0 -0
  589. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_dashboard_fixture.py +0 -0
  590. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_dashboard_terminal.py +0 -0
  591. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_dashboard_terminal_live.py +0 -0
  592. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_db.py +0 -0
  593. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_dead_end.py +0 -0
  594. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_deploy_coord_db_backup.py +0 -0
  595. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_deploy_coord_web_dist.py +0 -0
  596. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_deploy_coord_web_rollback.py +0 -0
  597. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_deploy_drive_queue_unit.py +0 -0
  598. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_deploy_manifest.py +0 -0
  599. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_deploy_units_lane.py +0 -0
  600. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_deploy_web_unit.py +0 -0
  601. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_deps.py +0 -0
  602. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_diagnose.py +0 -0
  603. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_dispatch.py +0 -0
  604. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_dispatch_target_validation.py +0 -0
  605. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_dist_name.py +0 -0
  606. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_done_housekeeping.py +0 -0
  607. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_drive_queue.py +0 -0
  608. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_drive_state.py +0 -0
  609. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_drive_tmux.py +0 -0
  610. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_epic_up_capability_detection.py +0 -0
  611. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  612. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_epic_up_image_provenance.py +0 -0
  613. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_errors.py +0 -0
  614. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_events.py +0 -0
  615. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_failure_class.py +0 -0
  616. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_filelock.py +0 -0
  617. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  618. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_fix_of_force_override.py +0 -0
  619. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_fleet_config_health.py +0 -0
  620. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_fleet_health_probes.py +0 -0
  621. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_fleet_health_snapshot.py +0 -0
  622. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_freshness.py +0 -0
  623. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_gate_a.py +0 -0
  624. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_gate_b.py +0 -0
  625. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_gate_snapshot_staleness.py +0 -0
  626. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_gates.py +0 -0
  627. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  628. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_generated_types_fixture.py +0 -0
  629. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_github_ops.py +0 -0
  630. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_goal.py +0 -0
  631. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_graph_health.py +0 -0
  632. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_handoff.py +0 -0
  633. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_health_checks.py +0 -0
  634. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_health_cli.py +0 -0
  635. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_health_cli_graph.py +0 -0
  636. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_health_config.py +0 -0
  637. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_health_context.py +0 -0
  638. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_health_deploy_lane_facts.py +0 -0
  639. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_health_incident_regression.py +0 -0
  640. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_health_pypi.py +0 -0
  641. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_health_registry.py +0 -0
  642. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_health_timer_active.py +0 -0
  643. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_health_toolchain.py +0 -0
  644. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_health_unit_drift.py +0 -0
  645. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_health_unit_enablement.py +0 -0
  646. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_hooks.py +0 -0
  647. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_human_attended_437.py +0 -0
  648. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_init.py +0 -0
  649. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_integration.py +0 -0
  650. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_interactive_briefing_echo.py +0 -0
  651. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_interactive_prefill_state.py +0 -0
  652. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_interactive_session_relaunch.py +0 -0
  653. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_interactive_test_verdict_backstop.py +0 -0
  654. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_interactive_token_attribution.py +0 -0
  655. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_interactive_worktree.py +0 -0
  656. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_issue_store_seam.py +0 -0
  657. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_liveness_auditor.py +0 -0
  658. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_liveness_notify.py +0 -0
  659. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_machine_pause.py +0 -0
  660. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_merge_queue.py +0 -0
  661. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_merge_verify.py +0 -0
  662. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_milestone_chat.py +0 -0
  663. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_milestone_dispatch.py +0 -0
  664. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_milestone_gate.py +0 -0
  665. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_milestone_order.py +0 -0
  666. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_milestone_seam.py +0 -0
  667. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_mock_author.py +0 -0
  668. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_model_tiering.py +0 -0
  669. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_models.py +0 -0
  670. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_models_config_labels.py +0 -0
  671. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_needs_attention.py +0 -0
  672. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_network.py +0 -0
  673. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_new_issue_chat.py +0 -0
  674. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_next_release_tag.py +0 -0
  675. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_no_direct_gh_calls.py +0 -0
  676. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_node_shim.py +0 -0
  677. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_notifier_baseline.py +0 -0
  678. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_notifier_cli.py +0 -0
  679. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_notifier_collect.py +0 -0
  680. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_notifier_config.py +0 -0
  681. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_notifier_drive_seam.py +0 -0
  682. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_notifier_isolation.py +0 -0
  683. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_notifier_predicate.py +0 -0
  684. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_notifier_quiet_hours.py +0 -0
  685. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_notifier_service.py +0 -0
  686. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_notify.py +0 -0
  687. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_notify_drain.py +0 -0
  688. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_openapi.py +0 -0
  689. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_operational_defaults.py +0 -0
  690. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_overlap_fence.py +0 -0
  691. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_packaged_deploy_units.py +0 -0
  692. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_parentage.py +0 -0
  693. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_paste_landed.py +0 -0
  694. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_pipeline.py +0 -0
  695. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_plan_followup_approve_plan_command.py +0 -0
  696. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_plan_followup_pr_command.py +0 -0
  697. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_plan_followup_review_command.py +0 -0
  698. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_plan_only.py +0 -0
  699. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_plan_parser.py +0 -0
  700. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_platform_paths.py +0 -0
  701. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_portal_bridge.py +0 -0
  702. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_portal_config.py +0 -0
  703. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_pr_body_lint.py +0 -0
  704. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_prereqs.py +0 -0
  705. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_production_db_guard.py +0 -0
  706. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_progress.py +0 -0
  707. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_provider_seam.py +0 -0
  708. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_providers.py +0 -0
  709. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_providers_config_labels.py +0 -0
  710. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_providers_pty.py +0 -0
  711. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_quiet_hours.py +0 -0
  712. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_quiet_hours_store_2146.py +0 -0
  713. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_reap_merged_sessions.py +0 -0
  714. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_reap_stale_interactive_tick.py +0 -0
  715. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_reconcile_branch.py +0 -0
  716. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_reconcile_completions.py +0 -0
  717. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_reconcile_merges.py +0 -0
  718. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_reconcile_usage_limit_done.py +0 -0
  719. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_refine_chat.py +0 -0
  720. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_release_cordon_2101.py +0 -0
  721. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_release_propagate.py +0 -0
  722. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_release_unified_1242.py +0 -0
  723. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_release_verify.py +0 -0
  724. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_release_window.py +0 -0
  725. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_remote_auto_prune.py +0 -0
  726. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_remote_interactive_reaper.py +0 -0
  727. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_repo_edit_2220.py +0 -0
  728. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_repo_onboard_2220.py +0 -0
  729. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_report_result_push.py +0 -0
  730. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_reports.py +0 -0
  731. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_retry.py +0 -0
  732. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_retry_advisory_1606.py +0 -0
  733. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_retry_type_1636.py +0 -0
  734. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_revalidate.py +0 -0
  735. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_review.py +0 -0
  736. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_review_end_review_without_verdict.py +0 -0
  737. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_review_parse_failure_diagnostic.py +0 -0
  738. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_review_reaffirm.py +0 -0
  739. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_review_state.py +0 -0
  740. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_review_verdict_backstop.py +0 -0
  741. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_review_verdict_override_audit.py +0 -0
  742. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_review_verdict_relay.py +0 -0
  743. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_review_zero_commits.py +0 -0
  744. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_scoped_review_wiring.py +0 -0
  745. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_scorecard.py +0 -0
  746. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_serve.py +0 -0
  747. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_serve_app_board_trim.py +0 -0
  748. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_session.py +0 -0
  749. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_slice_issue_attribution.py +0 -0
  750. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_smoke.py +0 -0
  751. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_smoke_live_checkout_restore.py +0 -0
  752. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_smoke_workflow.py +0 -0
  753. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_spend_ceiling.py +0 -0
  754. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_spend_ceiling_coordinator.py +0 -0
  755. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_split.py +0 -0
  756. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_split_work.py +0 -0
  757. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_stage_projection.py +0 -0
  758. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_stalled_pipeline.py +0 -0
  759. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_state.py +0 -0
  760. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_state_review_findings_daemon.py +0 -0
  761. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_status_fleet_footer.py +0 -0
  762. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_stop_1567.py +0 -0
  763. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_stuck.py +0 -0
  764. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_terminal_command.py +0 -0
  765. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_test_author.py +0 -0
  766. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_test_chat.py +0 -0
  767. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_test_orchestrator.py +0 -0
  768. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_test_report.py +0 -0
  769. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_test_verdict_parsing.py +0 -0
  770. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_test_verdict_transcript_floor.py +0 -0
  771. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_thin_client_board_audit.py +0 -0
  772. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_thin_client_config_load_1080.py +0 -0
  773. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_thin_client_daemon_routing_906.py +0 -0
  774. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_tmux_host.py +0 -0
  775. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_tmux_session.py +0 -0
  776. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_transcript_floor.py +0 -0
  777. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_usage.py +0 -0
  778. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_usage_limits.py +0 -0
  779. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_usage_rollup.py +0 -0
  780. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_venv_live_install_2121.py +0 -0
  781. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_version_single_source.py +0 -0
  782. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_watch.py +0 -0
  783. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_worker_events.py +0 -0
  784. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_worker_image_pin_sync.py +0 -0
  785. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_worker_safety.py +0 -0
  786. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_worker_test_scoping.py +0 -0
  787. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_worktree.py +0 -0
  788. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  789. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/Cargo.lock +0 -0
  790. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/Cargo.toml +0 -0
  791. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/cargo-config-local-quadraui.toml.example +0 -0
  792. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/app/audit.rs +0 -0
  793. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/app/chat.rs +0 -0
  794. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/app/data.rs +0 -0
  795. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/app/dialogs.rs +0 -0
  796. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/app/drive.rs +0 -0
  797. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/app/drive_queue.rs +0 -0
  798. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/app/escalation.rs +0 -0
  799. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/app/events.rs +0 -0
  800. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/app/fixtures.rs +0 -0
  801. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/app/fleet_health.rs +0 -0
  802. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/app/fleet_sessions.rs +0 -0
  803. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/app/fleet_terminals.rs +0 -0
  804. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/app/format.rs +0 -0
  805. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/app/milestone_dag.rs +0 -0
  806. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/app/mod.rs +0 -0
  807. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/app/msv.rs +0 -0
  808. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/app/pipeline.rs +0 -0
  809. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/app/plans.rs +0 -0
  810. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/app/render.rs +0 -0
  811. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/app/reports.rs +0 -0
  812. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/app/sessions.rs +0 -0
  813. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/app/settings_ui.rs +0 -0
  814. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/app/sidebar.rs +0 -0
  815. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/app/terminal.rs +0 -0
  816. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/app/tests.rs +0 -0
  817. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/app/types.rs +0 -0
  818. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/app/workspace.rs +0 -0
  819. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/bin/gtk.rs +0 -0
  820. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/commands.rs +0 -0
  821. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/lib.rs +0 -0
  822. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/main.rs +0 -0
  823. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/src/settings.rs +0 -0
  824. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/tests/acceptance.rs +0 -0
  825. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/tests/cli.rs +0 -0
  826. {code_coordinator-0.5.76 → code_coordinator-0.5.77}/tui/tests/fixtures/board_sample.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.76
3
+ Version: 0.5.77
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.76
3
+ Version: 0.5.77
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.76",
2
+ "tag": "0.5.77",
3
3
  "distance": 0,
4
- "node": "gdd3b9581f5fd9462b2fb9a85757ee783e3b09911",
4
+ "node": "gb940996c651692e5e0c90012a9046b2dfe09ec50",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-14"
@@ -289,6 +289,21 @@ class DriveCounters:
289
289
  # capture deserves its own full budget of cheap waits before the next
290
290
  # forced retry.
291
291
  gate_wait_rounds: int = 0
292
+ # #2229: the value `merge_attempts` held when the #1738 stale-smoke
293
+ # re-test last fired off a reason read out of `last_merge_diagnostic`
294
+ # rather than off the board (`-1` = never). A de-duplication latch in the
295
+ # same spirit as `review_fix_dispatched_for` above, for the same reason:
296
+ # `coord diagnose --stage test --reset` clears `test_state`, but the board
297
+ # this driver polls needs a beat to show it, and until it does the state
298
+ # is byte-for-byte identical to the one that triggered the re-test —
299
+ # except that, unlike a board `merge_reason`, the captured diagnostic is
300
+ # frozen and CANNOT change on its own. Without the latch a lagging board
301
+ # would burn the whole `max_fix_rounds` budget re-testing off one stale
302
+ # snapshot. Releases when `merge_attempts` advances, i.e. when a real
303
+ # `coord merge --only` attempt has re-captured the diagnostic — which is
304
+ # #2149's rule (act on the snapshot, then go re-validate it for real)
305
+ # expressed as a latch rather than a wait counter.
306
+ stale_smoke_diagnostic_attempt: int = -1
292
307
  # #2199: bounded retry for the trust gate's OWN dispatch — distinct from
293
308
  # `fix_rounds` (which bounds "the work needs another round" once a
294
309
  # verdict, passed or failed, actually landed on the board). This counts
@@ -2377,19 +2392,112 @@ def _merge_gate_kind(reason: str) -> str | None:
2377
2392
  _STALE_SMOKE_MARKERS = _mq_stale_smoke_markers
2378
2393
  _is_stale_smoke_reason = _mq_is_stale_smoke_reason
2379
2394
 
2395
+ # #2229: `coord merge --only` prints a gate line per REFUSED gate, and the
2396
+ # same run prints a "waived by this run" variant of that line for a gate the
2397
+ # invocation's own `--skip-review`/`--skip-smoke` disarmed
2398
+ # (`coord.commands.merge`, the `_status` ternary). A waived gate did not
2399
+ # refuse anything, so its line must never be read back as a refusal.
2400
+ _GATE_WAIVED_MARKER = "waived by this run"
2401
+
2402
+
2403
+ def _extract_gate_refusal_reason(diagnostic: str | None) -> str:
2404
+ """The first smoke/review gate refusal named anywhere in a captured
2405
+ `coord merge --only` *diagnostic*, or ``""`` (#2229).
2406
+
2407
+ Unlike :func:`_extract_gate_block_reason` — which matches only
2408
+ `_explain_missing_only_entry`'s "enqueue blocked by <gate>" wording, i.e.
2409
+ the NOT-YET-ENQUEUED shape — this reads the refusal out of a run where
2410
+ the entry *did* resolve. `coord merge --only` echoes one
2411
+ `` gate <name>: <reason> — will block this merge`` line per failing gate
2412
+ before `process()` runs, and `process()`'s own events (``smoke_required
2413
+ — …``) name it again; both are ordinary lines carrying the same gate
2414
+ vocabulary :func:`_merge_gate_kind` already classifies, so this scans
2415
+ lines rather than pinning one exact format that would silently stop
2416
+ matching the day either message is reworded.
2417
+
2418
+ quadraui#309: that text is the ONLY place the refusal existed. The board
2419
+ plan reported ``READY`` with an empty reason (``merge_queue.plan()``'s
2420
+ `_entry_gate_status` degrades to a no-op without live SHA data — the
2421
+ #1640 door, the #1566 "plan says ready, ``--only`` refuses" split), so
2422
+ `_merge_gate_divergence` saw nothing to classify and the drive spent
2423
+ three blind retries and died — printing this very text in its own death
2424
+ message.
2425
+ """
2426
+ for line in (diagnostic or "").splitlines():
2427
+ if _GATE_WAIVED_MARKER in line.lower():
2428
+ continue
2429
+ if _merge_gate_kind(line) is not None:
2430
+ return line.strip()
2431
+ return ""
2432
+
2433
+
2434
+ def _effective_merge_gate_reason(
2435
+ state: IssueState, counters: DriveCounters
2436
+ ) -> tuple[str, bool]:
2437
+ """The reason to classify the merge gate from, and whether it came from
2438
+ the captured diagnostic rather than the board (#2229).
2439
+
2440
+ Prefers `state.merge_reason` — live, re-read on every poll. Falls back to
2441
+ `counters.last_merge_diagnostic` only when the board reason names no gate
2442
+ this module knows an action for, because that is exactly the quadraui#309
2443
+ shape: the board is silent while this driver's OWN last `coord merge
2444
+ --only` attempt already captured the refusal verbatim.
2445
+
2446
+ The fallback is a LAST resort, taken only when the board offers no
2447
+ competing live signal — a snapshot must never outrank something being
2448
+ re-read every poll. Three cases keep the board's own reading:
2449
+
2450
+ - ``merge_status == ""`` — "no queue entry at all" is #2078's shape, with
2451
+ its own `_extract_gate_block_reason` bounded-wait arm in
2452
+ :func:`_decide_merge`. #2229 is about the case #2078 skips wholesale:
2453
+ an entry that IS enqueued (READY, PENDING, …) whose refusal only a
2454
+ live attempt ever saw.
2455
+ - ``merge_status == "CONFLICT"`` — a live merge-mechanics block with its
2456
+ own resolution path (#1474/#241's conflict-fix dispatch, reached
2457
+ through the bounded retry below). A re-test does not rebase a branch,
2458
+ and diverting to one is the same stall this issue is about, inverted.
2459
+ - a CI reason (#1891/#1892) — `merge_reason` already carries a live,
2460
+ recognised signal whose only resolution is more real time. Those two
2461
+ bare waits sit right after the divergence check and must keep winning.
2462
+
2463
+ The bool is the caller's warning label: a diagnostic-derived reason is a
2464
+ SNAPSHOT of the last real attempt, refreshed by nothing but another
2465
+ attempt (#2149's lesson — coord-portal#50 waited 2h33m on a cached
2466
+ "review required" that had already cleared). It is strictly fresher than
2467
+ an empty board reason, but it must not be re-acted on indefinitely; see
2468
+ `DriveCounters.stale_smoke_diagnostic_attempt`.
2469
+ """
2470
+ if _merge_gate_kind(state.merge_reason) is not None:
2471
+ return state.merge_reason, False
2472
+ if state.merge_status == "" or state.merge_status.upper() == "CONFLICT":
2473
+ return state.merge_reason, False
2474
+ if is_ci_pending_reason(state.merge_reason) or is_ci_infra_reason(
2475
+ state.merge_reason
2476
+ ):
2477
+ return state.merge_reason, False
2478
+ fallback = _extract_gate_refusal_reason(counters.last_merge_diagnostic)
2479
+ if fallback:
2480
+ return fallback, True
2481
+ return state.merge_reason, False
2380
2482
 
2381
- def _merge_gate_divergence(state: IssueState) -> str | None:
2483
+
2484
+ def _merge_gate_divergence(state: IssueState, reason: str | None = None) -> str | None:
2382
2485
  """``"smoke"``/``"review"`` when *state* shows the #1526 divergence,
2383
2486
  else ``None``.
2384
2487
 
2385
- The divergence: `state.merge_reason` names a smoke/review block while
2386
- this SAME state's `work_test_state`/`review_verdict` says the opposite.
2387
- That contradiction can only come from `coord merge` checking something
2388
- this driver's view does not (freshness against the CURRENT branch/base,
2389
- not just the terminal verdict) — never from a retry, since neither
2390
- input changes by running `coord merge` again unchanged.
2488
+ The divergence: the merge gate's *reason* names a smoke/review block
2489
+ while this SAME state's `work_test_state`/`review_verdict` says the
2490
+ opposite. That contradiction can only come from `coord merge` checking
2491
+ something this driver's view does not (freshness against the CURRENT
2492
+ branch/base, not just the terminal verdict) — never from a retry, since
2493
+ neither input changes by running `coord merge` again unchanged.
2494
+
2495
+ *reason* (#2229) defaults to `state.merge_reason`, the board's own text.
2496
+ :func:`_decide_merge` passes :func:`_effective_merge_gate_reason`'s
2497
+ result instead so a refusal that exists ONLY in the last captured
2498
+ `coord merge --only` diagnostic still classifies.
2391
2499
  """
2392
- kind = _merge_gate_kind(state.merge_reason)
2500
+ kind = _merge_gate_kind(state.merge_reason if reason is None else reason)
2393
2501
  if kind == "smoke" and state.work_test_state in ("passed", "skipped"):
2394
2502
  return "smoke"
2395
2503
  if kind == "review" and state.review_verdict == "approve":
@@ -2398,7 +2506,11 @@ def _merge_gate_divergence(state: IssueState) -> str | None:
2398
2506
 
2399
2507
 
2400
2508
  def _escalate_merge(
2401
- state: IssueState, status: str, *, gate_kind: str | None = None
2509
+ state: IssueState,
2510
+ status: str,
2511
+ *,
2512
+ gate_kind: str | None = None,
2513
+ gate_reason: str | None = None,
2402
2514
  ) -> Action:
2403
2515
  """Build the EXIT action for a merge status retrying cannot fix (#1505).
2404
2516
 
@@ -2422,6 +2534,16 @@ def _escalate_merge(
2422
2534
  (re-confirm the test verdict, or a scoped/full re-review) rather than the
2423
2535
  generic "inspect the plan" fallback below.
2424
2536
 
2537
+ *gate_reason* (#2229) is the text that gate_kind was classified from,
2538
+ when it is NOT `state.merge_reason` — i.e. when the board carried no
2539
+ reason and :func:`_effective_merge_gate_reason` recovered the refusal
2540
+ from the last captured `coord merge --only` diagnostic instead. The
2541
+ escalation narrative quotes it, because ``reports ''`` is exactly the
2542
+ unactionable escalation quadraui#309 would otherwise have produced. The
2543
+ recorded ``--gate merge_reason=…`` pair still reports the BOARD's own
2544
+ (empty) value — the gates block is a snapshot of board state, and
2545
+ overwriting it here would hide the very divergence being escalated.
2546
+
2425
2547
  Otherwise, the proposed command mirrors the #1477 resolution this issue
2426
2548
  was opened over: when a PR is known, ``gh pr merge --rebase`` + ``coord
2427
2549
  reconcile-merges`` is the sanctioned escape hatch (also documented in
@@ -2468,9 +2590,10 @@ def _escalate_merge(
2468
2590
  if gate_kind == "smoke"
2469
2591
  else f"review_verdict={state.review_verdict!r}"
2470
2592
  )
2593
+ reported = state.merge_reason if gate_reason is None else gate_reason
2471
2594
  reason = (
2472
2595
  f"{gate_kind}_required — coord merge's own gate reports "
2473
- f"{state.merge_reason!r}, but this driver's OWN view already "
2596
+ f"{reported!r}, but this driver's OWN view already "
2474
2597
  f"shows {driver_view} — the two cannot converge by retrying the "
2475
2598
  "identical `coord merge` command (#1526); a human must "
2476
2599
  "reconcile them"
@@ -2562,8 +2685,30 @@ def _decide_merge(
2562
2685
  readings; retrying the identical ``coord merge`` command changes neither
2563
2686
  side of the disagreement.
2564
2687
  """
2565
- divergence = _merge_gate_divergence(state)
2566
- if divergence == "smoke" and _is_stale_smoke_reason(state.merge_reason):
2688
+ # #2229: classify from the board's `merge_reason` when it names a gate,
2689
+ # and otherwise from this driver's OWN last `coord merge --only` output.
2690
+ # quadraui#309 sat blocked for 11h on a merge that landed first try by
2691
+ # hand because the board reason was empty (#1566/#1640) while the
2692
+ # captured diagnostic said, in as many words, "smoke test verdict is
2693
+ # stale" — the exact string the #1738 auto-repair arm below keys on. It
2694
+ # was used for one thing: being printed into the give-up message.
2695
+ gate_reason, gate_reason_from_diagnostic = _effective_merge_gate_reason(
2696
+ state, counters
2697
+ )
2698
+ divergence = _merge_gate_divergence(state, reason=gate_reason)
2699
+ if (
2700
+ gate_reason_from_diagnostic
2701
+ and divergence == "smoke"
2702
+ and _is_stale_smoke_reason(gate_reason)
2703
+ and counters.stale_smoke_diagnostic_attempt == counters.merge_attempts
2704
+ ):
2705
+ # A re-test already fired off THIS snapshot and no real attempt has
2706
+ # re-captured it since, so re-firing would spend a second fix round
2707
+ # on evidence that literally cannot have changed. Drop to the bounded
2708
+ # retry below instead: that attempt refreshes the diagnostic, which
2709
+ # either lands the merge or re-arms this arm against fresh evidence.
2710
+ divergence = None
2711
+ if divergence == "smoke" and _is_stale_smoke_reason(gate_reason):
2567
2712
  # #1738: a STALE (not missing) smoke verdict has a safe, bounded
2568
2713
  # self-service fix this driver can take without a human — re-run the
2569
2714
  # Test stage against the current base via the same non-destructive
@@ -2575,8 +2720,17 @@ def _decide_merge(
2575
2720
  # going stale (e.g. a base that keeps moving under it) still
2576
2721
  # converges to an escalation instead of spinning forever.
2577
2722
  if counters.fix_rounds >= opts.max_fix_rounds:
2578
- return _escalate_merge(state, state.merge_status, gate_kind=divergence)
2723
+ return _escalate_merge(
2724
+ state,
2725
+ state.merge_status,
2726
+ gate_kind=divergence,
2727
+ gate_reason=gate_reason,
2728
+ )
2579
2729
  counters.fix_rounds += 1
2730
+ if gate_reason_from_diagnostic:
2731
+ # #2229: arm the latch above — one re-test per captured
2732
+ # diagnostic, then a real attempt has to re-validate it.
2733
+ counters.stale_smoke_diagnostic_attempt = counters.merge_attempts
2580
2734
  return Action(
2581
2735
  kind=RUN,
2582
2736
  label=(
@@ -2597,7 +2751,9 @@ def _decide_merge(
2597
2751
  ),
2598
2752
  )
2599
2753
  if divergence is not None:
2600
- return _escalate_merge(state, state.merge_status, gate_kind=divergence)
2754
+ return _escalate_merge(
2755
+ state, state.merge_status, gate_kind=divergence, gate_reason=gate_reason
2756
+ )
2601
2757
 
2602
2758
  # #1891: a CI verdict that has not arrived is not a CI verdict of "no" —
2603
2759
  # checked BEFORE the `status` switch below (and regardless of what
@@ -34,6 +34,19 @@ Three arms have since landed against it:
34
34
  * **#1738** — `coord drive` re-dispatches the Test stage once, automatically,
35
35
  on a STALE (not missing) verdict. Only fires while a **live drive** is
36
36
  watching the issue. Measured 2026-08-03: reached 1 of 4 real stalls.
37
+ **#2229** widened what it can see: the arm used to classify the gate from
38
+ the board's `merge_reason` alone, which `merge_queue.plan()` leaves *empty*
39
+ whenever its render-time freshness check has no live SHA data (the #1640
40
+ door / the #1566 "plan says READY, `--only` refuses" split) — so on an
41
+ already-enqueued entry the arm could not arm at all, and the drive spent
42
+ three blind retries and died *printing the refusal it had captured*
43
+ (quadraui#309: 11h blocked on a merge that then landed first try by hand).
44
+ It now falls back to the last `coord merge --only` diagnostic the drive
45
+ itself captured. Still only the STALE arm self-repairs — a *missing*
46
+ verdict is the #1640 lost-write shape and escalates to a human unchanged —
47
+ and, because that diagnostic is a snapshot rather than live state (#2149),
48
+ each capture buys at most one re-test before a real attempt has to
49
+ re-validate it.
37
50
  * **#1769** — `coord merge --revalidate` re-tests a stale-but-`passed` entry
38
51
  against the current base from the *merge* lane, which is where a branch with
39
52
  no live drive actually sits.
@@ -3413,6 +3413,277 @@ def test_is_stale_smoke_reason_distinguishes_stale_from_missing():
3413
3413
  assert not _is_stale_smoke_reason(None)
3414
3414
 
3415
3415
 
3416
+ # ═══════════════════════════════════════════════════════════════════════════
3417
+ # #2229: the driver captured the exact merge refusal, printed it into its own
3418
+ # death message, and never classified it.
3419
+ #
3420
+ # quadraui#309 sat blocked for 11h on a merge that landed first try by hand.
3421
+ # `merge_queue.plan()` reported READY with NO reason (`_entry_gate_status`
3422
+ # re-derives freshness at board-build time and degrades to a no-op without
3423
+ # live SHA data — the #1640 door / #1566 "plan says ready, --only refuses"
3424
+ # split), so `_merge_gate_divergence` had nothing to classify. Meanwhile every
3425
+ # `coord merge --only` attempt captured "smoke test verdict is stale" into
3426
+ # `counters.last_merge_diagnostic` — the exact string the #1738 auto-repair
3427
+ # arm keys on — and used it for nothing but the give-up message.
3428
+ #
3429
+ # #2078's diagnostic fallback did not cover this: it lives inside the
3430
+ # `status == ""` arm (#309's entry WAS enqueued) and matches only the
3431
+ # not-yet-enqueued `enqueue blocked by <gate>` wording.
3432
+ # ═══════════════════════════════════════════════════════════════════════════
3433
+
3434
+
3435
+ def _stale_smoke_diagnostic() -> str:
3436
+ """The quadraui#309 diagnostic, verbatim in shape: `coord merge --only`'s
3437
+ own pre-`process()` gate line plus the `smoke_required` event."""
3438
+ return (
3439
+ " gate smoke: test verdict stale (recorded against base f6216e4, "
3440
+ "base now c50e30c) — will block this merge\n"
3441
+ " quadraui #309 (issue-309-drive-queue-bot): smoke_required — smoke "
3442
+ "test verdict is stale: recorded against base f6216e4, base is now "
3443
+ "c50e30c — re-verify against the current base, then `coord test "
3444
+ "41ae4f893239 --passed`"
3445
+ )
3446
+
3447
+
3448
+ def _missing_smoke_diagnostic() -> str:
3449
+ return (
3450
+ " gate smoke: smoke test required but no verdict recorded — will "
3451
+ "block this merge"
3452
+ )
3453
+
3454
+
3455
+ def test_stale_smoke_only_in_the_captured_diagnostic_takes_the_retest_arm():
3456
+ """THE #2229 regression test. Board: `merge_status='READY'`,
3457
+ `merge_reason=''` — nothing to classify. Diagnostic: this driver's own
3458
+ last `coord merge --only`, saying the smoke verdict is stale. The #1738
3459
+ re-test must arm off that, instead of the three blind retries that ended
3460
+ in `exit_code=1` and an 11h stall."""
3461
+ counters = DriveCounters(last_merge_diagnostic=_stale_smoke_diagnostic())
3462
+ action = step(
3463
+ approved_work(merge_status="READY", merge_reason=""),
3464
+ counters=counters,
3465
+ )
3466
+ assert action.kind == RUN
3467
+ assert action.command == (
3468
+ "diagnose", REPO, str(ISSUE), "--stage", "test", "--reset",
3469
+ )
3470
+ assert counters.fix_rounds == 1
3471
+ assert counters.merge_attempts == 0 # no blind retry spent
3472
+
3473
+
3474
+ def test_missing_verdict_in_the_captured_diagnostic_escalates_and_never_repairs():
3475
+ """`_STALE_SMOKE_MARKERS` stays a STRICT subset of `_SMOKE_GATE_MARKERS`
3476
+ on the diagnostic path too: a MISSING verdict is the #1640 lost-write
3477
+ shape, which a re-test cannot safely paper over. It escalates to a human
3478
+ on first encounter, exactly as it does off a board reason."""
3479
+ counters = DriveCounters(last_merge_diagnostic=_missing_smoke_diagnostic())
3480
+ action = step(
3481
+ approved_work(merge_status="READY", merge_reason=""),
3482
+ counters=counters,
3483
+ )
3484
+ assert action.is_exit
3485
+ assert action.exit_code == EXIT_ESCALATED
3486
+ assert counters.fix_rounds == 0
3487
+ assert "smoke" in action.message.lower()
3488
+
3489
+
3490
+ def test_diagnostic_derived_escalation_quotes_the_recovered_reason():
3491
+ """An escalation that says `reports ''` is unactionable — the whole #2229
3492
+ complaint. The recovered gate text has to reach the recorded reason."""
3493
+ action = step(
3494
+ approved_work(merge_status="READY", merge_reason=""),
3495
+ counters=DriveCounters(last_merge_diagnostic=_missing_smoke_diagnostic()),
3496
+ )
3497
+ assert action.is_exit
3498
+ assert "smoke test required but no verdict recorded" in " ".join(action.command)
3499
+
3500
+
3501
+ def test_diagnostic_derived_retest_fires_once_per_captured_snapshot():
3502
+ """#2149's lesson as a latch: the diagnostic is a SNAPSHOT that nothing
3503
+ but a real attempt refreshes. `coord diagnose --stage test --reset` clears
3504
+ `test_state`, but the board needs a beat to show it — until then the state
3505
+ is byte-for-byte identical. One re-test per snapshot, then a REAL attempt
3506
+ has to re-validate; otherwise a lagging board burns the whole
3507
+ `max_fix_rounds` budget off one frozen line."""
3508
+ counters = DriveCounters(last_merge_diagnostic=_stale_smoke_diagnostic())
3509
+ opts = DriveOptions(machine="precision", max_fix_rounds=3)
3510
+ s = approved_work(merge_status="READY", merge_reason="")
3511
+
3512
+ first = step(s, opts, counters=counters)
3513
+ assert first.command[0] == "diagnose"
3514
+ assert counters.fix_rounds == 1
3515
+
3516
+ # Same frozen diagnostic, same board — must NOT spend a second fix round.
3517
+ second = step(s, opts, counters=counters)
3518
+ assert second.kind == RUN
3519
+ assert second.command == ("merge", "--only", "w1", "--method", "rebase")
3520
+ assert counters.fix_rounds == 1
3521
+ assert counters.merge_attempts == 1
3522
+
3523
+
3524
+ def test_diagnostic_derived_retest_is_bounded_by_max_fix_rounds():
3525
+ """The re-test arm shares the same `fix_rounds` budget when it arms off
3526
+ the diagnostic — a board that never catches up must converge on an
3527
+ escalation, never spin to the deadline."""
3528
+ counters = DriveCounters(last_merge_diagnostic=_stale_smoke_diagnostic())
3529
+ opts = DriveOptions(machine="precision", max_fix_rounds=2, max_merge_attempts=99)
3530
+ s = approved_work(merge_status="READY", merge_reason="")
3531
+
3532
+ actions = []
3533
+ for _ in range(12):
3534
+ action = step(s, opts, counters=counters)
3535
+ actions.append(action)
3536
+ if action.is_exit:
3537
+ break
3538
+
3539
+ assert actions[-1].is_exit
3540
+ assert actions[-1].exit_code == EXIT_ESCALATED
3541
+ assert counters.fix_rounds == 2
3542
+ retests = [a for a in actions if a.command and a.command[0] == "diagnose"]
3543
+ assert len(retests) == 2
3544
+
3545
+
3546
+ def test_a_board_reason_still_wins_over_the_captured_diagnostic():
3547
+ """The fallback is a fallback: `merge_reason` is live and re-read every
3548
+ poll, the diagnostic is only as fresh as the last attempt. When the board
3549
+ names a gate, that is what gets classified."""
3550
+ counters = DriveCounters(last_merge_diagnostic=_stale_smoke_diagnostic())
3551
+ action = step(
3552
+ approved_work(
3553
+ merge_status="READY",
3554
+ merge_reason="review required but not approved",
3555
+ ),
3556
+ counters=counters,
3557
+ )
3558
+ assert action.is_exit
3559
+ assert action.exit_code == EXIT_ESCALATED
3560
+ assert "review-reaffirm w1" in " ".join(action.command)
3561
+ assert counters.fix_rounds == 0
3562
+
3563
+
3564
+ def test_an_enqueued_status_with_no_gate_in_the_diagnostic_still_retries_blind():
3565
+ """The companion case: an enqueued entry whose captured diagnostic names
3566
+ no gate at all has nothing to classify — the bounded `--only` retry is
3567
+ still the right move, unchanged."""
3568
+ counters = DriveCounters(
3569
+ last_merge_diagnostic="merge-queue: 1 entry processed; 0 merged"
3570
+ )
3571
+ action = step(
3572
+ approved_work(merge_status="READY", merge_reason=""),
3573
+ counters=counters,
3574
+ )
3575
+ assert action.kind == RUN
3576
+ assert action.command == ("merge", "--only", "w1", "--method", "rebase")
3577
+ assert counters.merge_attempts == 1
3578
+
3579
+
3580
+ def test_the_first_merge_poll_never_classifies_off_an_empty_diagnostic():
3581
+ """Before any attempt has run there is no diagnostic, so #2229 can never
3582
+ escalate (or re-test) a merge this drive has not even tried once."""
3583
+ counters = DriveCounters()
3584
+ action = step(
3585
+ approved_work(merge_status="READY", merge_reason=""), counters=counters
3586
+ )
3587
+ assert action.kind == RUN
3588
+ assert action.command[0] == "merge"
3589
+
3590
+
3591
+ def test_the_empty_status_enqueue_blocked_path_is_unchanged_by_2229():
3592
+ """`status == ""` is #2078's shape and keeps #2078's bounded-wait arm:
3593
+ "no queue entry at all" is a different fact from "enqueued and refused",
3594
+ and the cheap wait is what lets a not-yet-enqueued row self-heal without
3595
+ spending a re-test on it."""
3596
+ counters = DriveCounters()
3597
+ opts = DriveOptions(machine="precision", max_merge_attempts=3)
3598
+ counters.last_merge_diagnostic = (
3599
+ "merge-queue: no entry found for 'w1', but 1 done work row(s) on the "
3600
+ "board match it:\n"
3601
+ " claude-coordinator #1392 (assignment w1, branch fix-1392) — "
3602
+ "enqueue blocked by smoke gate — test verdict stale (recorded "
3603
+ "against base 5f34a46, base now ff1bd1f) (waive with --skip-smoke)"
3604
+ )
3605
+ action = step(approved_work(merge_status=""), opts, counters=counters)
3606
+ assert action.kind == WAIT
3607
+ assert "not yet enqueued" in action.label
3608
+ assert counters.fix_rounds == 0
3609
+ assert counters.gate_wait_rounds == 1
3610
+
3611
+
3612
+ def test_a_live_ci_wait_still_wins_over_a_captured_gate_line():
3613
+ """#1891/#1892's bare waits sit right after the divergence check and must
3614
+ keep winning: `merge_reason` carries a live, recognised signal whose only
3615
+ resolution is more real time. A snapshot from an older attempt must not
3616
+ divert the drive into a re-test while CI is still reporting."""
3617
+ counters = DriveCounters(last_merge_diagnostic=_stale_smoke_diagnostic())
3618
+ action = step(
3619
+ approved_work(
3620
+ merge_status="READY",
3621
+ merge_reason="CI running: build, windows",
3622
+ ),
3623
+ counters=counters,
3624
+ )
3625
+ assert action.kind == WAIT
3626
+ assert counters.fix_rounds == 0
3627
+ assert counters.merge_attempts == 0
3628
+
3629
+
3630
+ def test_a_conflict_status_still_reaches_its_own_conflict_fix_dispatch():
3631
+ """CONFLICT is a live merge-mechanics block with its own resolution path
3632
+ (#1474/#241, reached through the bounded `--only` retry). A re-test does
3633
+ not rebase a branch — diverting to one is this issue's stall, inverted."""
3634
+ counters = DriveCounters(last_merge_diagnostic=_stale_smoke_diagnostic())
3635
+ action = step(
3636
+ approved_work(merge_status="CONFLICT", merge_reason=""),
3637
+ counters=counters,
3638
+ )
3639
+ assert action.kind == RUN
3640
+ assert action.command == ("merge", "--only", "w1", "--method", "rebase")
3641
+ assert counters.fix_rounds == 0
3642
+
3643
+
3644
+ def test_extract_gate_refusal_reason_reads_either_wording():
3645
+ from coord.drive import _extract_gate_refusal_reason
3646
+
3647
+ assert "test verdict stale" in _extract_gate_refusal_reason(
3648
+ _stale_smoke_diagnostic()
3649
+ )
3650
+ assert _extract_gate_refusal_reason(
3651
+ " gate review: review required but not approved — will block this merge"
3652
+ ) == "gate review: review required but not approved — will block this merge"
3653
+ # No gate named — nothing to classify.
3654
+ assert _extract_gate_refusal_reason("merge-queue: 1 merged") == ""
3655
+ assert _extract_gate_refusal_reason("") == ""
3656
+ assert _extract_gate_refusal_reason(None) == ""
3657
+
3658
+
3659
+ def test_extract_gate_refusal_reason_ignores_a_gate_this_run_waived():
3660
+ """`coord merge --only --skip-smoke` prints the SAME gate line with
3661
+ "waived by this run" instead of "will block this merge". A waived gate
3662
+ refused nothing and must never be read back as a refusal."""
3663
+ from coord.drive import _extract_gate_refusal_reason
3664
+
3665
+ waived = (
3666
+ " gate smoke: test verdict stale (base moved) — waived by this run\n"
3667
+ " --skip-smoke: interactive smoke-test gate bypassed (#465)"
3668
+ )
3669
+ assert _extract_gate_refusal_reason(waived) == ""
3670
+
3671
+
3672
+ def test_a_waived_gate_in_the_diagnostic_leaves_the_merge_retryable():
3673
+ """End to end: the waiver guard above must not turn a merge that this run
3674
+ explicitly un-gated into an escalation or a re-test."""
3675
+ counters = DriveCounters(
3676
+ last_merge_diagnostic=(
3677
+ " gate smoke: test verdict stale (base moved) — waived by this run"
3678
+ )
3679
+ )
3680
+ action = step(
3681
+ approved_work(merge_status="READY", merge_reason=""), counters=counters
3682
+ )
3683
+ assert action.kind == RUN
3684
+ assert action.command[0] == "merge"
3685
+
3686
+
3416
3687
  # ── terminal: merged, verified ───────────────────────────────────────────────
3417
3688
 
3418
3689