code-coordinator 0.5.88__tar.gz → 0.5.89__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 (836) hide show
  1. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. code_coordinator-0.5.89/code_coordinator.egg-info/scm_version.json +8 -0
  4. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/ci_github.py +35 -1
  5. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/ci_store.py +30 -0
  6. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/db.py +12 -1
  7. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/drive.py +30 -5
  8. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/drive_queue.py +39 -6
  9. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/drive_state.py +16 -1
  10. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/github_ops.py +26 -0
  11. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/merge_queue.py +184 -2
  12. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_ci_store.py +117 -0
  13. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_db.py +81 -0
  14. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_drive.py +69 -0
  15. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_drive_queue.py +59 -0
  16. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_drive_state.py +37 -0
  17. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_github_ops.py +41 -0
  18. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_merge_queue.py +227 -0
  19. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/tests/fixtures/board_sample.json +2 -0
  20. code_coordinator-0.5.88/code_coordinator.egg-info/scm_version.json +0 -8
  21. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/.claude/commands/board.md +0 -0
  22. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/.claude/commands/complete-session.md +0 -0
  23. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/.claude/commands/coordinator.md +0 -0
  24. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/.githooks/_lib.sh +0 -0
  25. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/.githooks/post-checkout +0 -0
  26. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/.githooks/post-commit +0 -0
  27. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/.githooks/post-merge +0 -0
  28. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  29. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/.github/coord-ci-acceptance.yml +0 -0
  30. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/.github/workflows/auto-release.yml +0 -0
  31. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/.github/workflows/cargo-test.yml +0 -0
  32. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/.github/workflows/publish.yml +0 -0
  33. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/.github/workflows/release-tui.yml +0 -0
  34. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/.github/workflows/test.yml +0 -0
  35. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/.gitignore +0 -0
  36. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/CLAUDE.md +0 -0
  37. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/GOAL.md +0 -0
  38. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/LICENSE +0 -0
  39. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/MANIFEST.in +0 -0
  40. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/README.md +0 -0
  41. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/code_coordinator.egg-info/SOURCES.txt +0 -0
  42. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/code_coordinator.egg-info/dependency_links.txt +0 -0
  43. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/code_coordinator.egg-info/entry_points.txt +0 -0
  44. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/code_coordinator.egg-info/requires.txt +0 -0
  45. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/code_coordinator.egg-info/scm_file_list.json +0 -0
  46. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/code_coordinator.egg-info/top_level.txt +0 -0
  47. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/__init__.py +0 -0
  48. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/_board_mapping.py +0 -0
  49. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/acceptance.py +0 -0
  50. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/acceptance_drivers.py +0 -0
  51. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/agent.py +0 -0
  52. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/agent_app.py +0 -0
  53. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/agent_update.py +0 -0
  54. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/agents/opencode/.gitignore +0 -0
  55. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/agents/opencode/agents/work.md +0 -0
  56. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/agents/opencode/routing.jsonc +0 -0
  57. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/audit.py +0 -0
  58. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/auto_loop.py +0 -0
  59. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/board_bool_guard.py +0 -0
  60. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/board_service.py +0 -0
  61. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/board_wire.py +0 -0
  62. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/brain.py +0 -0
  63. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/branch_model.py +0 -0
  64. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/bug_intake.py +0 -0
  65. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/cargo_cache.py +0 -0
  66. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/claim.py +0 -0
  67. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/cli.py +0 -0
  68. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/client.py +0 -0
  69. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/__init__.py +0 -0
  70. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/_common.py +0 -0
  71. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/acceptance.py +0 -0
  72. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/agent_ops.py +0 -0
  73. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/audit.py +0 -0
  74. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/chat.py +0 -0
  75. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/dispatch.py +0 -0
  76. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/dispatch_workers.py +0 -0
  77. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/drive.py +0 -0
  78. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/drive_queue.py +0 -0
  79. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/gate_a.py +0 -0
  80. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/gates.py +0 -0
  81. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/issues.py +0 -0
  82. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/lifecycle.py +0 -0
  83. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/merge.py +0 -0
  84. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/milestone.py +0 -0
  85. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/plan_followup.py +0 -0
  86. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/plans.py +0 -0
  87. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/portal.py +0 -0
  88. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/release.py +0 -0
  89. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/repo.py +0 -0
  90. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/report.py +0 -0
  91. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/review.py +0 -0
  92. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/scorecard.py +0 -0
  93. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/sessions.py +0 -0
  94. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/setup.py +0 -0
  95. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/status.py +0 -0
  96. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/terminal.py +0 -0
  97. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/test_gate.py +0 -0
  98. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/commands/tui.py +0 -0
  99. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/comments.py +0 -0
  100. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/config.py +0 -0
  101. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/conflict_fix.py +0 -0
  102. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dao.py +0 -0
  103. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/__init__.py +0 -0
  104. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/fixture.py +0 -0
  105. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/index.html +0 -0
  106. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/server.py +0 -0
  107. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/terminal.py +0 -0
  108. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/.gitignore +0 -0
  109. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/components.json +0 -0
  110. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/assets/Gallery-Cq84itDE.js +0 -0
  111. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  112. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/assets/Terminal-DOXLcMue.js +0 -0
  113. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/assets/index-DHn-RIJ8.js +0 -0
  114. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  115. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  116. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  117. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  118. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  119. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/index.html +0 -0
  120. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  121. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/sw.js +0 -0
  122. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  123. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  124. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  125. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  126. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  127. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  128. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  129. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  130. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  131. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  132. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/eslint.config.js +0 -0
  133. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/index.html +0 -0
  134. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  135. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/package-lock.json +0 -0
  136. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/package.json +0 -0
  137. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  138. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/playwright.config.ts +0 -0
  139. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/postcss.config.js +0 -0
  140. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  141. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  142. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  143. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/App.tsx +0 -0
  144. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/api/client.ts +0 -0
  145. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  146. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  147. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  148. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  149. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  150. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  151. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  152. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  153. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  154. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  155. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  156. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  157. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  158. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  159. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  160. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  161. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  162. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  163. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  164. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  165. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  166. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  167. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  168. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  169. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  170. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  171. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  172. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  173. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  174. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  175. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  176. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  177. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  178. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  179. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  180. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/index.css +0 -0
  181. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  182. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  183. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/main.tsx +0 -0
  184. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  185. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  186. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  187. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  188. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  189. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  190. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  191. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  192. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  193. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  194. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  195. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  196. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  197. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  198. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  199. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  200. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  201. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  202. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  203. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  204. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  205. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  206. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  207. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/tailwind.config.js +0 -0
  208. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/tsconfig.json +0 -0
  209. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  210. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dashboard/webapp/vite.config.ts +0 -0
  211. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dead_end.py +0 -0
  212. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/README.md +0 -0
  213. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-agent.service +0 -0
  214. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-db-backup.service +0 -0
  215. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-db-backup.sh +0 -0
  216. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-db-backup.timer +0 -0
  217. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-drive-queue.service +0 -0
  218. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-drive-queue.timer +0 -0
  219. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-notify.service +0 -0
  220. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-notify.timer +0 -0
  221. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-release-propagate.service +0 -0
  222. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-release-propagate.timer +0 -0
  223. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-release-window.service +0 -0
  224. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-release-window.timer +0 -0
  225. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-serve.service +0 -0
  226. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-web-dist-build.service +0 -0
  227. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-web-dist-build.timer +0 -0
  228. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy/coord-web.service +0 -0
  229. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy_manifest.py +0 -0
  230. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deploy_units.py +0 -0
  231. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/deps.py +0 -0
  232. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/diagnose.py +0 -0
  233. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dispatch.py +0 -0
  234. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/dist_name.py +0 -0
  235. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/events.py +0 -0
  236. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/failure_class.py +0 -0
  237. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/filelock.py +0 -0
  238. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/fleet_config_health.py +0 -0
  239. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/freshness.py +0 -0
  240. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/gate_a.py +0 -0
  241. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/gate_b.py +0 -0
  242. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/gate_snapshot.py +0 -0
  243. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/gates.py +0 -0
  244. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/goal.py +0 -0
  245. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/graph_health.py +0 -0
  246. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/__init__.py +0 -0
  247. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/aggregate.py +0 -0
  248. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/__init__.py +0 -0
  249. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/agent_install.py +0 -0
  250. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/cargo_targets.py +0 -0
  251. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/claude_binary.py +0 -0
  252. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/deploy_lane_facts.py +0 -0
  253. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/disk.py +0 -0
  254. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/fleet_board.py +0 -0
  255. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  256. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/fleet_phantom.py +0 -0
  257. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/fleet_unit_drift.py +0 -0
  258. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/graph.py +0 -0
  259. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/graphify_cli.py +0 -0
  260. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/plan_usage.py +0 -0
  261. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/repo_state.py +0 -0
  262. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/spawned_coord.py +0 -0
  263. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/timer_active.py +0 -0
  264. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/toolchain.py +0 -0
  265. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/unit_drift.py +0 -0
  266. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/unit_enablement.py +0 -0
  267. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/checks/worktrees.py +0 -0
  268. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/cli.py +0 -0
  269. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/context.py +0 -0
  270. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/fleet_snapshot.py +0 -0
  271. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/models.py +0 -0
  272. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/pypi.py +0 -0
  273. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/registry.py +0 -0
  274. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/render.py +0 -0
  275. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/health/units.py +0 -0
  276. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/hooks.py +0 -0
  277. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/housekeeping.py +0 -0
  278. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/interactive.py +0 -0
  279. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/issue_store.py +0 -0
  280. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/liveness_auditor.py +0 -0
  281. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/machine_pause.py +0 -0
  282. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/milestone_chat.py +0 -0
  283. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/milestone_dispatch.py +0 -0
  284. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/milestone_gate.py +0 -0
  285. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/milestone_order.py +0 -0
  286. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/mock_author.py +0 -0
  287. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/models.py +0 -0
  288. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/network.py +0 -0
  289. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/new_issue_chat.py +0 -0
  290. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/notifier/__init__.py +0 -0
  291. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/notifier/baseline.py +0 -0
  292. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/notifier/cli.py +0 -0
  293. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/notifier/collect.py +0 -0
  294. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/notifier/digest.py +0 -0
  295. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/notifier/models.py +0 -0
  296. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/notifier/predicate.py +0 -0
  297. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/notifier/service.py +0 -0
  298. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/notifier/store.py +0 -0
  299. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/notifier/transport.py +0 -0
  300. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/notify.py +0 -0
  301. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/openapi.py +0 -0
  302. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/overlap_fence.py +0 -0
  303. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/overlap_predict.py +0 -0
  304. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/parentage.py +0 -0
  305. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/parentage_github.py +0 -0
  306. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/pipeline.py +0 -0
  307. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/plan_parser.py +0 -0
  308. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/plans.py +0 -0
  309. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/platform_paths.py +0 -0
  310. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/portal_bridge.py +0 -0
  311. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/portal_store.py +0 -0
  312. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/portal_sync.py +0 -0
  313. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/pr_body_lint.py +0 -0
  314. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/prereqs.py +0 -0
  315. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/progress.py +0 -0
  316. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/providers/__init__.py +0 -0
  317. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/providers/base.py +0 -0
  318. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/providers/claude.py +0 -0
  319. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/providers/claude_pty.py +0 -0
  320. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/providers/opencode.py +0 -0
  321. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/reconcile.py +0 -0
  322. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/refine_chat.py +0 -0
  323. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/release_cordon.py +0 -0
  324. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/release_propagate.py +0 -0
  325. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/release_verify.py +0 -0
  326. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/release_window.py +0 -0
  327. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/repo_edit.py +0 -0
  328. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/repo_onboard.py +0 -0
  329. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/reports.py +0 -0
  330. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/revalidate.py +0 -0
  331. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/review.py +0 -0
  332. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/scorecard.py +0 -0
  333. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/serve_app.py +0 -0
  334. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/skills/update-issue/SKILL.md +0 -0
  335. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/smoke.py +0 -0
  336. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/spend_ceiling.py +0 -0
  337. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/split_work.py +0 -0
  338. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/stage_projection.py +0 -0
  339. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/state.py +0 -0
  340. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/test_author.py +0 -0
  341. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/test_chat.py +0 -0
  342. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/test_orchestrator.py +0 -0
  343. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/test_report.py +0 -0
  344. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/tui_release.py +0 -0
  345. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/usage.py +0 -0
  346. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/usage_limits.py +0 -0
  347. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/usage_rollup.py +0 -0
  348. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coord/worker_events.py +0 -0
  349. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/coordinator.example.yml +0 -0
  350. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-agent.service +0 -0
  351. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-db-backup.service +0 -0
  352. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-db-backup.sh +0 -0
  353. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-db-backup.timer +0 -0
  354. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-drive-queue.service +0 -0
  355. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-drive-queue.timer +0 -0
  356. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-notify.service +0 -0
  357. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-notify.timer +0 -0
  358. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-release-propagate.service +0 -0
  359. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-release-propagate.timer +0 -0
  360. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-release-window.service +0 -0
  361. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-release-window.timer +0 -0
  362. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-serve.service +0 -0
  363. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-web-dist-build.service +0 -0
  364. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-web-dist-build.sh +0 -0
  365. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-web-dist-build.timer +0 -0
  366. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-web-rollback.sh +0 -0
  367. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/coord-web.service +0 -0
  368. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/deploy/node-shim.sh +0 -0
  369. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/AGENT_OPERATIONS.md +0 -0
  370. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/ARCHITECTURE.md +0 -0
  371. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/ARCH_SECURITY_GATES.md +0 -0
  372. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/COCKPIT.md +0 -0
  373. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/CONTROL_CENTER.md +0 -0
  374. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/COST_DISCIPLINE.md +0 -0
  375. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/CROSS_PLATFORM.md +0 -0
  376. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/CUSTOMER_PORTAL.md +0 -0
  377. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/DRIVE_QUEUE.md +0 -0
  378. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/EPHEMERAL_WORKERS.md +0 -0
  379. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/FORGE_MIGRATION.md +0 -0
  380. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/GRAPHIFY_SETUP.md +0 -0
  381. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/ISSUE_GUIDANCE.md +0 -0
  382. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/MAC_MINI.md +0 -0
  383. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  384. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/NOTIFIER.md +0 -0
  385. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/OPENCODE_VERIFICATION.md +0 -0
  386. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/OPERATING_GOTCHAS.md +0 -0
  387. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/ORACLE_LOOP.md +0 -0
  388. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/PHONE_WEBAPP.md +0 -0
  389. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/PIPELINE_V2.md +0 -0
  390. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/PLATFORM_EVOLUTION.md +0 -0
  391. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/SECOND_BACKEND.md +0 -0
  392. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/STORE_SERVICE.md +0 -0
  393. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  394. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/WEB_CONTROL_CENTER.md +0 -0
  395. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/mocks/web/README.md +0 -0
  396. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/mocks/web/_tokens.css +0 -0
  397. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/mocks/web/issue-detail.html +0 -0
  398. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/mocks/web/pipeline-narrow.html +0 -0
  399. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/docs/mocks/web/pipeline-wide.html +0 -0
  400. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/graphify-out/.gitignore +0 -0
  401. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/install-agent.sh +0 -0
  402. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/pyproject.toml +0 -0
  403. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/audit_review_verdict_overrides.py +0 -0
  404. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  405. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/azure-workers/build-worker-image.sh +0 -0
  406. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/azure-workers/coordinator-machine.py +0 -0
  407. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/azure-workers/epic-down.sh +0 -0
  408. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/azure-workers/epic-up.sh +0 -0
  409. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/azure-workers/preflight.sh +0 -0
  410. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/azure-workers/provision-worker.sh +0 -0
  411. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  412. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  413. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/azure-workers/verify-github-token.sh +0 -0
  414. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/codegen.py +0 -0
  415. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/coord-test-runner.sh +0 -0
  416. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/drive-batch.sh +0 -0
  417. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/gen_board_fixture.py +0 -0
  418. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/next_release_tag.py +0 -0
  419. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/run_tests_in_populated_home.sh +0 -0
  420. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/run_tests_without_gh.sh +0 -0
  421. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/smoke_437_interactive.py +0 -0
  422. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/verify_878_review_capture.py +0 -0
  423. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/verify_release_published.py +0 -0
  424. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/scripts/verify_release_wheel.py +0 -0
  425. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/setup.cfg +0 -0
  426. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/SMOKE_SET.md +0 -0
  427. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/__init__.py +0 -0
  428. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  429. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-33/contract.md +0 -0
  430. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-33/manifest.yml +0 -0
  431. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  432. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  433. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  434. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  435. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-37/conftest.py +0 -0
  436. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-37/contract.md +0 -0
  437. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-37/manifest.yml +0 -0
  438. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  439. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  440. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-38/contract.md +0 -0
  441. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-38/manifest.yml +0 -0
  442. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  443. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  444. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  445. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  446. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  447. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  448. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  449. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  450. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  451. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  452. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-51/contract.md +0 -0
  453. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  454. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  455. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-51/manifest.yml +0 -0
  456. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  457. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-51/tsconfig.json +0 -0
  458. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  459. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/conftest.py +0 -0
  460. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/board-pipeline-basic.json +0 -0
  461. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  462. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  463. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  464. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/playwright/all_pass.json +0 -0
  465. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  466. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/playwright/mixed_fail.json +0 -0
  467. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  468. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  469. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/playwright/skip.json +0 -0
  470. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/playwright/truncated.json +0 -0
  471. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  472. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  473. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  474. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  475. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  476. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  477. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  478. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  479. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_acceptance.py +0 -0
  480. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_acceptance_drivers.py +0 -0
  481. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent.py +0 -0
  482. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_api_error.py +0 -0
  483. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_app.py +0 -0
  484. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_branch_base.py +0 -0
  485. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_branch_capture.py +0 -0
  486. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_config_free_1712.py +0 -0
  487. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_deploy_units_endpoint.py +0 -0
  488. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_dirty_worktree.py +0 -0
  489. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_graph_self_heal.py +0 -0
  490. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_health_h3.py +0 -0
  491. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_idle_restart.py +0 -0
  492. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_push_failure.py +0 -0
  493. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_reap.py +0 -0
  494. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_repos_and_pull.py +0 -0
  495. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_restart_services_endpoint.py +0 -0
  496. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_startup_diagnostics.py +0 -0
  497. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_update.py +0 -0
  498. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_update_bluegreen.py +0 -0
  499. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_usage_limit.py +0 -0
  500. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_agent_zero_commit.py +0 -0
  501. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_ambient_home_isolation.py +0 -0
  502. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_approve_reject_plan.py +0 -0
  503. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_approve_usage_gate.py +0 -0
  504. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_assignment_already_recorded_daemon.py +0 -0
  505. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_audit_log.py +0 -0
  506. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_audit_outcome.py +0 -0
  507. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_audit_query.py +0 -0
  508. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_auto_loop.py +0 -0
  509. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_auto_release_publish_2035.py +0 -0
  510. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_base_checkout_restore.py +0 -0
  511. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_board_cap_762.py +0 -0
  512. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_board_fixture.py +0 -0
  513. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_board_read_path.py +0 -0
  514. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_board_service.py +0 -0
  515. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_board_state.py +0 -0
  516. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_board_wire.py +0 -0
  517. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_brain.py +0 -0
  518. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_branch_model.py +0 -0
  519. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_bug_intake.py +0 -0
  520. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_build_worker_image_env_update.py +0 -0
  521. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cargo_cache.py +0 -0
  522. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_ci_acceptance_gate_1950.py +0 -0
  523. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_ci_parity_2091.py +0 -0
  524. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_claim.py +0 -0
  525. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_acceptance.py +0 -0
  526. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_assign.py +0 -0
  527. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  528. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_assign_interactive_remote.py +0 -0
  529. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_assign_provider.py +0 -0
  530. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  531. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_audit.py +0 -0
  532. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_chat_continue.py +0 -0
  533. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_diagnose_config_provenance.py +0 -0
  534. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_diagnose_graph.py +0 -0
  535. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_doctor.py +0 -0
  536. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_doctor_config_free_1801.py +0 -0
  537. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  538. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_drive.py +0 -0
  539. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_drive_queue.py +0 -0
  540. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_escalate.py +0 -0
  541. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_fix_headless_review.py +0 -0
  542. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_gate_a.py +0 -0
  543. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_install_drift.py +0 -0
  544. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_install_skills.py +0 -0
  545. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_issue_create_label.py +0 -0
  546. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_issue_reopen.py +0 -0
  547. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_merge.py +0 -0
  548. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_milestone_assign.py +0 -0
  549. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_milestone_capture.py +0 -0
  550. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_milestone_chat_add_child.py +0 -0
  551. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_milestone_dispatch.py +0 -0
  552. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_milestone_gate_b.py +0 -0
  553. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_milestone_gate_c.py +0 -0
  554. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_milestone_order.py +0 -0
  555. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  556. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_milestone_ship.py +0 -0
  557. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_network.py +0 -0
  558. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_new_issue_chat.py +0 -0
  559. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_plans.py +0 -0
  560. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_portal.py +0 -0
  561. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_pull_artifact.py +0 -0
  562. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_queue.py +0 -0
  563. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_reattach_sessions.py +0 -0
  564. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_refine_board.py +0 -0
  565. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_release_preflight.py +0 -0
  566. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_release_propagate.py +0 -0
  567. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_release_window.py +0 -0
  568. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_repo_2220.py +0 -0
  569. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_scorecard.py +0 -0
  570. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_set_review_findings.py +0 -0
  571. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_status_advisory_terminal.py +0 -0
  572. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_status_merge_queue.py +0 -0
  573. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_status_provider.py +0 -0
  574. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_status_review_finalizing.py +0 -0
  575. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_status_test_failed_tag.py +0 -0
  576. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_status_usage_limit.py +0 -0
  577. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_sync_comments_873.py +0 -0
  578. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_test_plan.py +0 -0
  579. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_track.py +0 -0
  580. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_tui_update.py +0 -0
  581. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cli_wait.py +0 -0
  582. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_client_base_install.py +0 -0
  583. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_comments.py +0 -0
  584. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_completion_summary.py +0 -0
  585. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_config.py +0 -0
  586. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_config_acceptance.py +0 -0
  587. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_config_audit.py +0 -0
  588. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_config_pricing.py +0 -0
  589. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_config_usage_gate.py +0 -0
  590. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_conflict_fix.py +0 -0
  591. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_conflict_fix_semantic.py +0 -0
  592. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_coord_test.py +0 -0
  593. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_coord_test_runner_baseline.py +0 -0
  594. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_coord_test_runner_routing.py +0 -0
  595. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_coord_test_runner_toolchain.py +0 -0
  596. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_coord_web_sse_restart_live.py +0 -0
  597. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_coordinator_machine.py +0 -0
  598. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_cross_platform_imports.py +0 -0
  599. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_dashboard.py +0 -0
  600. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_dashboard_fixture.py +0 -0
  601. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_dashboard_terminal.py +0 -0
  602. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_dashboard_terminal_live.py +0 -0
  603. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_dead_end.py +0 -0
  604. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_deploy_coord_db_backup.py +0 -0
  605. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_deploy_coord_web_dist.py +0 -0
  606. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_deploy_coord_web_rollback.py +0 -0
  607. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_deploy_drive_queue_unit.py +0 -0
  608. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_deploy_manifest.py +0 -0
  609. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_deploy_units_lane.py +0 -0
  610. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_deploy_web_unit.py +0 -0
  611. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_deps.py +0 -0
  612. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_diagnose.py +0 -0
  613. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_dispatch.py +0 -0
  614. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_dispatch_target_validation.py +0 -0
  615. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_dist_name.py +0 -0
  616. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_done_housekeeping.py +0 -0
  617. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_drive_tmux.py +0 -0
  618. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_epic_up_capability_detection.py +0 -0
  619. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  620. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_epic_up_image_provenance.py +0 -0
  621. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_errors.py +0 -0
  622. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_events.py +0 -0
  623. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_failure_class.py +0 -0
  624. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_filelock.py +0 -0
  625. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  626. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_fix_of_force_override.py +0 -0
  627. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_fleet_config_health.py +0 -0
  628. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_fleet_health_probes.py +0 -0
  629. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_fleet_health_snapshot.py +0 -0
  630. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_freshness.py +0 -0
  631. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_gate_a.py +0 -0
  632. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_gate_b.py +0 -0
  633. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_gate_snapshot_staleness.py +0 -0
  634. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_gates.py +0 -0
  635. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  636. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_generated_types_fixture.py +0 -0
  637. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_goal.py +0 -0
  638. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_graph_health.py +0 -0
  639. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_graph_selfheal_absent_2237.py +0 -0
  640. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_handoff.py +0 -0
  641. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_health_checks.py +0 -0
  642. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_health_cli.py +0 -0
  643. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_health_cli_graph.py +0 -0
  644. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_health_config.py +0 -0
  645. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_health_context.py +0 -0
  646. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_health_deploy_lane_facts.py +0 -0
  647. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_health_incident_regression.py +0 -0
  648. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_health_pypi.py +0 -0
  649. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_health_registry.py +0 -0
  650. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_health_timer_active.py +0 -0
  651. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_health_toolchain.py +0 -0
  652. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_health_unit_drift.py +0 -0
  653. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_health_unit_enablement.py +0 -0
  654. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_hooks.py +0 -0
  655. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_human_attended_437.py +0 -0
  656. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_init.py +0 -0
  657. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_integration.py +0 -0
  658. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_interactive_briefing_echo.py +0 -0
  659. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_interactive_prefill_state.py +0 -0
  660. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_interactive_session_relaunch.py +0 -0
  661. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_interactive_test_verdict_backstop.py +0 -0
  662. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_interactive_token_attribution.py +0 -0
  663. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_interactive_worktree.py +0 -0
  664. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_issue_store_seam.py +0 -0
  665. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_liveness_auditor.py +0 -0
  666. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_liveness_notify.py +0 -0
  667. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_machine_pause.py +0 -0
  668. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_merge_verify.py +0 -0
  669. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_milestone_chat.py +0 -0
  670. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_milestone_dispatch.py +0 -0
  671. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_milestone_gate.py +0 -0
  672. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_milestone_order.py +0 -0
  673. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_milestone_seam.py +0 -0
  674. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_mock_author.py +0 -0
  675. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_model_tiering.py +0 -0
  676. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_models.py +0 -0
  677. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_models_config_labels.py +0 -0
  678. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_needs_attention.py +0 -0
  679. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_network.py +0 -0
  680. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_new_issue_chat.py +0 -0
  681. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_next_release_tag.py +0 -0
  682. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_no_direct_gh_calls.py +0 -0
  683. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_node_shim.py +0 -0
  684. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_notifier_baseline.py +0 -0
  685. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_notifier_cli.py +0 -0
  686. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_notifier_collect.py +0 -0
  687. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_notifier_config.py +0 -0
  688. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_notifier_drive_seam.py +0 -0
  689. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_notifier_isolation.py +0 -0
  690. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_notifier_predicate.py +0 -0
  691. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_notifier_quiet_hours.py +0 -0
  692. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_notifier_service.py +0 -0
  693. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_notify.py +0 -0
  694. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_notify_drain.py +0 -0
  695. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_openapi.py +0 -0
  696. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_operational_defaults.py +0 -0
  697. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_overlap_fence.py +0 -0
  698. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_overlap_predict.py +0 -0
  699. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_packaged_deploy_units.py +0 -0
  700. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_parentage.py +0 -0
  701. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_paste_landed.py +0 -0
  702. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_pipeline.py +0 -0
  703. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_plan_followup_approve_plan_command.py +0 -0
  704. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_plan_followup_pr_command.py +0 -0
  705. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_plan_followup_review_command.py +0 -0
  706. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_plan_only.py +0 -0
  707. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_plan_parser.py +0 -0
  708. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_platform_paths.py +0 -0
  709. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_portal_bridge.py +0 -0
  710. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_portal_config.py +0 -0
  711. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_portal_sync.py +0 -0
  712. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_pr_body_lint.py +0 -0
  713. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_prereqs.py +0 -0
  714. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_production_db_guard.py +0 -0
  715. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_progress.py +0 -0
  716. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_provider_seam.py +0 -0
  717. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_providers.py +0 -0
  718. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_providers_config_labels.py +0 -0
  719. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_providers_pty.py +0 -0
  720. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_quiet_hours.py +0 -0
  721. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_quiet_hours_store_2146.py +0 -0
  722. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_reap_merged_sessions.py +0 -0
  723. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_reap_stale_interactive_tick.py +0 -0
  724. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_reconcile_branch.py +0 -0
  725. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_reconcile_completions.py +0 -0
  726. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_reconcile_merges.py +0 -0
  727. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_reconcile_usage_limit_done.py +0 -0
  728. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_refine_chat.py +0 -0
  729. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_release_cordon_2101.py +0 -0
  730. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_release_cordon_deadlock_2240.py +0 -0
  731. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_release_propagate.py +0 -0
  732. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_release_unified_1242.py +0 -0
  733. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_release_verify.py +0 -0
  734. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_release_window.py +0 -0
  735. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_remote_auto_prune.py +0 -0
  736. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_remote_interactive_reaper.py +0 -0
  737. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_repo_edit_2220.py +0 -0
  738. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_repo_graph_fleet_2237.py +0 -0
  739. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_repo_onboard_2220.py +0 -0
  740. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_report_result_push.py +0 -0
  741. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_reports.py +0 -0
  742. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_retry.py +0 -0
  743. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_retry_advisory_1606.py +0 -0
  744. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_retry_type_1636.py +0 -0
  745. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_revalidate.py +0 -0
  746. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_review.py +0 -0
  747. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_review_end_review_without_verdict.py +0 -0
  748. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_review_parse_failure_diagnostic.py +0 -0
  749. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_review_reaffirm.py +0 -0
  750. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_review_state.py +0 -0
  751. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_review_verdict_backstop.py +0 -0
  752. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_review_verdict_override_audit.py +0 -0
  753. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_review_verdict_relay.py +0 -0
  754. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_review_zero_commits.py +0 -0
  755. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_scoped_review_wiring.py +0 -0
  756. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_scorecard.py +0 -0
  757. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_serve.py +0 -0
  758. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_serve_app_board_trim.py +0 -0
  759. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_session.py +0 -0
  760. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_slice_issue_attribution.py +0 -0
  761. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_smoke.py +0 -0
  762. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_smoke_live_checkout_restore.py +0 -0
  763. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_smoke_workflow.py +0 -0
  764. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_spend_ceiling.py +0 -0
  765. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_spend_ceiling_coordinator.py +0 -0
  766. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_split.py +0 -0
  767. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_split_work.py +0 -0
  768. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_stage_projection.py +0 -0
  769. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_stalled_pipeline.py +0 -0
  770. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_state.py +0 -0
  771. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_state_review_findings_daemon.py +0 -0
  772. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_status_fleet_footer.py +0 -0
  773. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_stop_1567.py +0 -0
  774. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_stuck.py +0 -0
  775. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_terminal_command.py +0 -0
  776. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_test_author.py +0 -0
  777. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_test_chat.py +0 -0
  778. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_test_orchestrator.py +0 -0
  779. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_test_report.py +0 -0
  780. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_test_verdict_parsing.py +0 -0
  781. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_test_verdict_transcript_floor.py +0 -0
  782. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_thin_client_board_audit.py +0 -0
  783. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_thin_client_config_load_1080.py +0 -0
  784. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_thin_client_daemon_routing_906.py +0 -0
  785. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_tmux_host.py +0 -0
  786. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_tmux_session.py +0 -0
  787. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_transcript_floor.py +0 -0
  788. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_usage.py +0 -0
  789. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_usage_limits.py +0 -0
  790. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_usage_rollup.py +0 -0
  791. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_venv_live_install_2121.py +0 -0
  792. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_version_single_source.py +0 -0
  793. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_watch.py +0 -0
  794. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_worker_events.py +0 -0
  795. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_worker_image_pin_sync.py +0 -0
  796. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_worker_safety.py +0 -0
  797. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_worker_test_scoping.py +0 -0
  798. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_worktree.py +0 -0
  799. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  800. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/Cargo.lock +0 -0
  801. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/Cargo.toml +0 -0
  802. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/cargo-config-local-quadraui.toml.example +0 -0
  803. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/audit.rs +0 -0
  804. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/chat.rs +0 -0
  805. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/data.rs +0 -0
  806. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/dialogs.rs +0 -0
  807. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/drive.rs +0 -0
  808. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/drive_queue.rs +0 -0
  809. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/escalation.rs +0 -0
  810. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/events.rs +0 -0
  811. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/fixtures.rs +0 -0
  812. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/fleet_health.rs +0 -0
  813. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/fleet_sessions.rs +0 -0
  814. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/fleet_terminals.rs +0 -0
  815. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/format.rs +0 -0
  816. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/milestone_dag.rs +0 -0
  817. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/mod.rs +0 -0
  818. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/msv.rs +0 -0
  819. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/pipeline.rs +0 -0
  820. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/plans.rs +0 -0
  821. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/render.rs +0 -0
  822. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/reports.rs +0 -0
  823. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/sessions.rs +0 -0
  824. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/settings_ui.rs +0 -0
  825. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/sidebar.rs +0 -0
  826. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/terminal.rs +0 -0
  827. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/tests.rs +0 -0
  828. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/types.rs +0 -0
  829. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/app/workspace.rs +0 -0
  830. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/bin/gtk.rs +0 -0
  831. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/commands.rs +0 -0
  832. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/lib.rs +0 -0
  833. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/main.rs +0 -0
  834. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/src/settings.rs +0 -0
  835. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/tests/acceptance.rs +0 -0
  836. {code_coordinator-0.5.88 → code_coordinator-0.5.89}/tui/tests/cli.rs +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.88
3
+ Version: 0.5.89
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.88
3
+ Version: 0.5.89
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
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "0.5.89",
3
+ "distance": 0,
4
+ "node": "gfa2f63e730c0e6f6a87687f5f4143b0f9b74f38f",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-08-15"
8
+ }
@@ -18,7 +18,7 @@ from dataclasses import dataclass, field
18
18
  from datetime import datetime
19
19
 
20
20
  from coord import github_ops
21
- from coord.ci_store import CheckRun, JobRun, JobStep
21
+ from coord.ci_store import CheckRun, JobRun, JobStep, failed_checks
22
22
 
23
23
 
24
24
  def _parse_ts(raw: str | None) -> float | None:
@@ -236,6 +236,40 @@ class GitHubCi:
236
236
  self._jobs_cache.pop((repo, str(run_id)), None)
237
237
  return all_ok and any_ok
238
238
 
239
+ def rerun_failed_for_pr(self, repo: str, number: int) -> bool:
240
+ """Re-run only the FAILING job(s) behind *repo*#*number*'s current
241
+ checks via ``gh run rerun <id> --failed`` (#2252).
242
+
243
+ Same shape as :meth:`rerun_for_pr` above, narrowed to the run ids
244
+ behind :func:`coord.ci_store.failed_checks` rather than every run id
245
+ among the PR's checks — a passing check's run is left untouched, so
246
+ the caller's #2252 flake re-check can't accidentally spend CI
247
+ minutes re-proving a check that already reported green, and the
248
+ green evidence itself (timestamps, logs) survives intact for the
249
+ board to keep showing.
250
+
251
+ Same best-effort / return-value / cache-invalidation contract as
252
+ `rerun_for_pr`: ``True`` only when at least one run id was found
253
+ among the currently-failing checks *and* every ``gh run rerun
254
+ --failed`` call issued exited zero.
255
+ """
256
+ checks = self.list_checks_for_pr(repo, number)
257
+ run_ids = sorted({c.run_id for c in failed_checks(checks) if c.run_id})
258
+ if not run_ids:
259
+ return False
260
+ all_ok = True
261
+ any_ok = False
262
+ for run_id in run_ids:
263
+ if github_ops.rerun_workflow_run_failed(repo, run_id):
264
+ any_ok = True
265
+ else:
266
+ all_ok = False
267
+ if any_ok:
268
+ self.invalidate(repo, number)
269
+ for run_id in run_ids:
270
+ self._jobs_cache.pop((repo, str(run_id)), None)
271
+ return all_ok and any_ok
272
+
239
273
  def list_jobs_for_run(self, repo: str, run_id: str) -> list["JobRun"]:
240
274
  """Job/step detail for Actions run *run_id* on *repo* via ``gh api``
241
275
  (#1892) — backs :func:`coord.ci_store.is_verdictless_job`.
@@ -195,6 +195,31 @@ class CiStore(Protocol):
195
195
  """
196
196
  ...
197
197
 
198
+ def rerun_failed_for_pr(self, repo: str, number: int) -> bool:
199
+ """Re-run ONLY the currently-failing job(s) behind *repo*#*number*'s
200
+ checks (#2252). Returns whether it worked.
201
+
202
+ Narrower than :meth:`rerun_for_pr`, which reruns every distinct
203
+ Actions run id behind ALL of a PR's checks — passing ones included.
204
+ Re-running the whole run would also re-trigger jobs that already
205
+ reported green, discarding that first-pass evidence for nothing:
206
+ #2252 asks "is the RED one flaky?", not "run the suite again", and
207
+ wants the answer without paying for (or risking a second read of)
208
+ checks that already settled.
209
+
210
+ This is the mechanism behind :mod:`coord.merge_queue`'s one-shot
211
+ flake re-check (``MAX_CI_FLAKY_RERUNS`` — deliberately ONE re-run,
212
+ not a retry loop: two independent observations is the whole ask).
213
+ Call sites duck-type via ``getattr(ci, "rerun_failed_for_pr",
214
+ None)`` so a `CiStore` stand-in that predates this capability (most
215
+ duck-typed test stubs, :class:`coord.gate_snapshot.GateSnapshot`)
216
+ simply doesn't offer it — read as "could not trigger a re-run",
217
+ the same fail-safe fallback an actual `gh` failure produces (#2252:
218
+ "if the re-run cannot be triggered, fall back to today's
219
+ behaviour").
220
+ """
221
+ ...
222
+
198
223
 
199
224
  class NoOpCi:
200
225
  """Always-available fallback that returns no checks and reruns nothing.
@@ -226,6 +251,11 @@ class NoOpCi:
226
251
  detail to fetch (#1892)."""
227
252
  return []
228
253
 
254
+ def rerun_failed_for_pr(self, repo: str, number: int) -> bool:
255
+ """No-op: CI gating is disabled entirely, so there is nothing to
256
+ re-run (#2252)."""
257
+ return False
258
+
229
259
 
230
260
  # ── Classification helpers ──────────────────────────────────────────────────
231
261
 
@@ -189,7 +189,9 @@ def _ensure_schema(conn: sqlite3.Connection) -> None:
189
189
  assignment_type TEXT DEFAULT 'work',
190
190
  required_gates TEXT,
191
191
  ci_infra_reruns INTEGER NOT NULL DEFAULT 0,
192
- ci_stale_reruns INTEGER NOT NULL DEFAULT 0
192
+ ci_stale_reruns INTEGER NOT NULL DEFAULT 0,
193
+ ci_flaky_reruns INTEGER NOT NULL DEFAULT 0,
194
+ ci_flaky_pending TEXT NOT NULL DEFAULT ''
193
195
  );
194
196
 
195
197
  CREATE TABLE IF NOT EXISTS plans (
@@ -857,6 +859,15 @@ def _migrate_add_columns(conn: sqlite3.Connection) -> None:
857
859
  # 0 for every row predating this migration, same as the column's own
858
860
  # default for a freshly-enqueued entry.
859
861
  "ALTER TABLE drive_queue ADD COLUMN resumes INTEGER NOT NULL DEFAULT 0",
862
+ # #2252: the flake-recheck auto-rerun's OWN counter/pending-state —
863
+ # see `coord.merge_queue.MAX_CI_FLAKY_RERUNS` and
864
+ # `QueuedMerge.ci_flaky_reruns`/`ci_flaky_pending`'s docstrings for
865
+ # why they're kept separate from `ci_infra_reruns`/`ci_stale_reruns`
866
+ # above rather than sharing either. 0/'' for every row predating
867
+ # this migration — no flake re-run ever spent/pending — same as the
868
+ # columns' own defaults for a freshly-enqueued entry.
869
+ "ALTER TABLE merge_queue ADD COLUMN ci_flaky_reruns INTEGER NOT NULL DEFAULT 0",
870
+ "ALTER TABLE merge_queue ADD COLUMN ci_flaky_pending TEXT NOT NULL DEFAULT ''",
860
871
  ]
861
872
  for sql in migrations:
862
873
  try:
@@ -130,6 +130,7 @@ from coord.worker_events import is_usage_limit_reason
130
130
  # See `_STALE_SMOKE_MARKERS` / `_is_stale_smoke_reason` below.
131
131
  from coord.merge_queue import (
132
132
  STALE_SMOKE_MARKERS as _mq_stale_smoke_markers,
133
+ is_ci_flaky_reason,
133
134
  is_ci_infra_reason,
134
135
  is_ci_pending_reason,
135
136
  is_stale_smoke_reason as _mq_is_stale_smoke_reason,
@@ -2513,9 +2514,10 @@ def _effective_merge_gate_reason(
2513
2514
  own resolution path (#1474/#241's conflict-fix dispatch, reached
2514
2515
  through the bounded retry below). A re-test does not rebase a branch,
2515
2516
  and diverting to one is the same stall this issue is about, inverted.
2516
- - a CI reason (#1891/#1892) — `merge_reason` already carries a live,
2517
- recognised signal whose only resolution is more real time. Those two
2518
- bare waits sit right after the divergence check and must keep winning.
2517
+ - a CI reason (#1891/#1892/#2252) — `merge_reason` already carries a
2518
+ live, recognised signal whose only resolution is more real time.
2519
+ These bare waits sit right after the divergence check and must keep
2520
+ winning.
2519
2521
 
2520
2522
  The bool is the caller's warning label: a diagnostic-derived reason is a
2521
2523
  SNAPSHOT of the last real attempt, refreshed by nothing but another
@@ -2528,8 +2530,10 @@ def _effective_merge_gate_reason(
2528
2530
  return state.merge_reason, False
2529
2531
  if state.merge_status == "" or state.merge_status.upper() == "CONFLICT":
2530
2532
  return state.merge_reason, False
2531
- if is_ci_pending_reason(state.merge_reason) or is_ci_infra_reason(
2532
- state.merge_reason
2533
+ if (
2534
+ is_ci_pending_reason(state.merge_reason)
2535
+ or is_ci_infra_reason(state.merge_reason)
2536
+ or is_ci_flaky_reason(state.merge_reason)
2533
2537
  ):
2534
2538
  return state.merge_reason, False
2535
2539
  fallback = _extract_gate_refusal_reason(counters.last_merge_diagnostic)
@@ -2851,6 +2855,27 @@ def _decide_merge(
2851
2855
  )
2852
2856
  )
2853
2857
 
2858
+ # #2252: the OTHER sibling case — a CI verdict DID arrive AND said
2859
+ # something real about the code, but `coord merge`'s own live attempt
2860
+ # has only observed it fail ONCE so far and is already re-running the
2861
+ # failed job(s) to rule out a flake (see
2862
+ # `coord.merge_queue.MAX_CI_FLAKY_RERUNS`) before spending a drive
2863
+ # attempt on it. Retrying `coord merge` here would just re-observe the
2864
+ # same in-flight re-run and spend an attempt for nothing — same bare
2865
+ # wait as #1891/#1892 above, for the identical reason: only more real
2866
+ # time (the re-run landing) resolves it, never another `coord merge`
2867
+ # retry. Once the re-run's answer is in, this reason either clears
2868
+ # (flake — merge proceeds, zero attempts spent) or reverts to the plain
2869
+ # "checks failed" wording (confirmed real — spends the attempt exactly
2870
+ # like today), so this wait is bounded by construction, never open-ended.
2871
+ if is_ci_flaky_reason(state.merge_reason):
2872
+ return _wait(
2873
+ label=(
2874
+ "MERGE: CI failed — re-running once to rule out a flake, "
2875
+ f"not retrying (#2252): {state.merge_reason}"
2876
+ )
2877
+ )
2878
+
2854
2879
  status = state.merge_status
2855
2880
  if status.upper() == "HUMAN_REQUIRED":
2856
2881
  return _die(
@@ -72,7 +72,12 @@ from typing import Any, Iterable, Mapping, Sequence
72
72
 
73
73
  from coord.drive_state import TERMINAL_STATUSES, WORK_LIKE
74
74
  from coord.gate_a import is_gate_a_refusal_reason
75
- from coord.merge_queue import PLAN_READY, is_ci_infra_reason, is_ci_pending_reason
75
+ from coord.merge_queue import (
76
+ PLAN_READY,
77
+ is_ci_flaky_reason,
78
+ is_ci_infra_reason,
79
+ is_ci_pending_reason,
80
+ )
76
81
  from coord.models import is_policy_refusal_reason
77
82
 
78
83
  # ── queue states ─────────────────────────────────────────────────────────────
@@ -119,6 +124,17 @@ STATE_FAILED = "failed"
119
124
  # relaunching a fresh `coord drive` right now would just observe the same
120
125
  # rerun-in-progress and wait again, so this parks instead of spending an
121
126
  # attempt. See `build_board_view`'s population of `merge_ci_pending` below.
127
+ #
128
+ # #2252 extends the SAME state to a THIRD trigger:
129
+ # `coord.merge_queue.is_ci_flaky_reason` — a CI verdict that DID arrive AND
130
+ # said something real about the code, but has only been observed failing
131
+ # ONCE so far. The "more real time" that un-parks the entry is the one
132
+ # scoped re-run (`MAX_CI_FLAKY_RERUNS`) landing — a coin-flip flake clears
133
+ # and the entry resumes having spent zero attempts, a confirmed-real failure
134
+ # reverts to a plain `checks_failed` block (spends the attempt exactly like
135
+ # today) on the very next tick. Same reasoning as #1892 for why this parks
136
+ # rather than spends: relaunching right now would just observe the same
137
+ # re-run-in-progress and wait again.
122
138
  STATE_PARKED = "parked"
123
139
 
124
140
  TERMINAL_QUEUE_STATES: frozenset[str] = frozenset(
@@ -816,17 +832,34 @@ def build_board_view(
816
832
  if is_ci_infra_reason(raw_reason) and not is_ci_infra_reason(plan_reason):
817
833
  reason = raw_reason
818
834
  reason_is_live = False
819
- if not (is_ci_pending_reason(reason) or is_ci_infra_reason(reason)):
835
+ # #2252: same recovery, for the sibling CI_FLAKY_PREFIX
836
+ # classification — a `checks_failed` streak currently mid its one
837
+ # #2252 re-run to rule out a flake. `_entry_gate_status` re-derives
838
+ # this identically to a plain "checks failed: ..." block (it has no
839
+ # notion of the raw row's `ci_flaky_reruns`/`ci_flaky_pending`
840
+ # state), so the raw reading must win here too or this entry would
841
+ # never park — it would instead sit `checks_failed` and burn a
842
+ # drive-queue launch attempt for the exact transient #2252 exists
843
+ # to catch. `elif`: the two classifications are mutually exclusive
844
+ # per entry (see the identical `elif` in `drive_state._merge_entry`).
845
+ elif is_ci_flaky_reason(raw_reason) and not is_ci_flaky_reason(plan_reason):
846
+ reason = raw_reason
847
+ reason_is_live = False
848
+ if not (
849
+ is_ci_pending_reason(reason)
850
+ or is_ci_infra_reason(reason)
851
+ or is_ci_flaky_reason(reason)
852
+ ):
820
853
  continue
821
854
  # #2158: the same plan row that came back with NO reason of its own
822
855
  # also carries `ci_summary` — `summarize_counts` over the very checks
823
856
  # `_entry_gate_status` just consulted, on the same board build. When
824
857
  # that rollup positively shows every check finished and none failed,
825
858
  # it is direct evidence AGAINST the raw row's frozen "CI running:" /
826
- # "CI infra:" string, which no read path ever rewrites. Believing the
827
- # write-path string over it is what wedged claude-coordinator#2138
828
- # parked for 7h25m on CI that had gone green 41s before the park was
829
- # written.
859
+ # "CI infra:" / "CI re-checking:" string, which no read path ever
860
+ # rewrites. Believing the write-path string over it is what wedged
861
+ # claude-coordinator#2138 parked for 7h25m on CI that had gone green
862
+ # 41s before the park was written.
830
863
  #
831
864
  # The override is deliberately POSITIVE-evidence-only, and only where
832
865
  # the plan itself is silent:
@@ -34,7 +34,7 @@ from dataclasses import asdict, dataclass, field
34
34
  from pathlib import Path
35
35
  from typing import Any
36
36
 
37
- from coord.merge_queue import is_ci_infra_reason
37
+ from coord.merge_queue import is_ci_flaky_reason, is_ci_infra_reason
38
38
  from coord.models import WORK_LIKE_TYPES, test_mode_from_labels
39
39
 
40
40
  # Assignment types that can carry the Test/Review gates for an issue. Sourced
@@ -582,6 +582,21 @@ def _merge_entry(
582
582
  raw_reason = raw_entry.get("error")
583
583
  if is_ci_infra_reason(raw_reason) and not is_ci_infra_reason(reason):
584
584
  reason = raw_reason
585
+ # #2252: same recovery, for the SAME reason, for the sibling
586
+ # CI_FLAKY_PREFIX classification — `_entry_gate_status`'s fresh
587
+ # re-derivation has no notion of "this entry already spent its one
588
+ # #2252 re-run and is waiting on the answer" (that state lives only
589
+ # in `QueuedMerge.ci_flaky_reruns`/`ci_flaky_pending`, updated by
590
+ # the live `merge_queue.process()` path and persisted onto the raw
591
+ # row's `error`), so it would otherwise re-derive the SAME failing
592
+ # checks as the plain "checks failed: ..." wording every tick,
593
+ # shadowing the more specific CI-re-checking reading the raw row
594
+ # already has. `elif` — the two classifications are mutually
595
+ # exclusive per entry (one failure streak is either infra or
596
+ # flaky-pending, never both at once), so only one raw-preference
597
+ # branch can ever legitimately fire for a given raw_reason.
598
+ elif is_ci_flaky_reason(raw_reason) and not is_ci_flaky_reason(reason):
599
+ reason = raw_reason
585
600
 
586
601
  return {
587
602
  "status": status,
@@ -1630,6 +1630,32 @@ def rerun_workflow_run(repo: str, run_id: str) -> bool:
1630
1630
  return result.returncode == 0
1631
1631
 
1632
1632
 
1633
+ def rerun_workflow_run_failed(repo: str, run_id: str) -> bool:
1634
+ """Re-run only the FAILING job(s) of Actions workflow run *run_id* on
1635
+ *repo* via ``gh run rerun <id> --failed`` (#2252).
1636
+
1637
+ The single ``gh`` sink for :meth:`coord.ci_github.GitHubCi.
1638
+ rerun_failed_for_pr` — the narrower sibling of
1639
+ :func:`rerun_workflow_run` (#1851/#1892), which restarts the WHOLE run
1640
+ including jobs that already reported green. ``--failed`` is exactly
1641
+ #2252's own scoping ask: cheaper, and it keeps the first pass's green
1642
+ evidence intact instead of discarding it for no reason.
1643
+
1644
+ Returns ``True`` only on a clean (exit 0) rerun; any subprocess failure
1645
+ (missing ``gh``, timeout, non-zero exit — e.g. the run is already in
1646
+ progress, or the id is stale/invalid) returns ``False`` rather than
1647
+ raising, matching :func:`rerun_workflow_run`'s own best-effort contract.
1648
+ """
1649
+ try:
1650
+ result = subprocess.run(
1651
+ ["gh", "run", "rerun", str(run_id), "--repo", repo, "--failed"],
1652
+ capture_output=True, text=True, timeout=30,
1653
+ )
1654
+ except (OSError, subprocess.TimeoutExpired):
1655
+ return False
1656
+ return result.returncode == 0
1657
+
1658
+
1633
1659
  def truncate_diff_text(diff: str, max_chars: int = 60000) -> str:
1634
1660
  """Truncate *diff* to *max_chars* with a trailing note, if it's over.
1635
1661
 
@@ -801,6 +801,52 @@ def _record_gate_bypass_audit(entry: "QueuedMerge", config) -> list[str]:
801
801
  return bypassed
802
802
 
803
803
 
804
+ def _record_ci_flake_audit(entry: "QueuedMerge", pending_json: str) -> None:
805
+ """Emit one ``ci_flake_detected`` operational audit row (#2252): a check
806
+ that failed once, was re-run exactly once, and came back clean.
807
+
808
+ *pending_json* is the JSON blob :func:`process` stashed on
809
+ ``entry.ci_flaky_pending`` at the moment it triggered the re-run — the
810
+ failing check names/conclusions and the branch SHA they failed against,
811
+ captured then because ``branch_head_sha`` is transient (recomputed every
812
+ tick, never persisted) and the checks themselves may already read
813
+ differently on ``gh`` by the time the re-run resolves.
814
+
815
+ This audit row is the thing #2252 asks for explicitly: without a durable
816
+ record, a check that is flaky 30% of the time gets silently waved
817
+ through every time instead of surfacing as a repeat offender someone
818
+ should fix — ``record_audit`` (queryable via ``coord audit`` /
819
+ ``query_audit_log``) is that durable record. Best-effort like every
820
+ other audit call site in this module: ``record_audit`` never raises,
821
+ and a malformed/missing blob (should not happen — this module is the
822
+ only writer of ``ci_flaky_pending``) degrades to an empty ``checks``
823
+ list rather than raising into the merge loop.
824
+ """
825
+ try:
826
+ payload = json.loads(pending_json) if pending_json else {}
827
+ except (TypeError, ValueError):
828
+ payload = {}
829
+ record_audit(
830
+ tier="operational",
831
+ category="ci",
832
+ event_type="ci_flake_detected",
833
+ actor="system",
834
+ summary=(
835
+ f"CI flake on {entry.repo_name}#{entry.issue_number} "
836
+ f"(PR #{entry.pr_number}): failed once, passed on re-run — "
837
+ "zero drive attempts spent (#2252)"
838
+ ),
839
+ repo=entry.repo_name,
840
+ issue=entry.issue_number,
841
+ assignment_id=entry.assignment_id,
842
+ details={
843
+ "pr_number": entry.pr_number,
844
+ "sha": payload.get("sha"),
845
+ "checks": payload.get("checks", []),
846
+ },
847
+ )
848
+
849
+
804
850
  @dataclass(frozen=True)
805
851
  class MergeGateFailure:
806
852
  """One un-satisfied merge gate for a work row / queue entry (#1695).
@@ -1408,6 +1454,32 @@ def is_ci_infra_reason(reason: str | None) -> bool:
1408
1454
  return (reason or "").startswith(CI_INFRA_PREFIX)
1409
1455
 
1410
1456
 
1457
+ # #2252: the reason string prefix for a `checks_failed` entry whose failing
1458
+ # check(s) carry a REAL verdict about the code — unlike `CI_INFRA_PREFIX`
1459
+ # above — but have only been observed failing ONCE so far. `process()` has
1460
+ # triggered exactly one scoped re-run of the failed job(s) (#2252's whole
1461
+ # ask: "before a failed check consumes a drive attempt, re-run the failed
1462
+ # job(s) once and re-read" — a 1-in-N flaky test reports the identical
1463
+ # completed/failure verdict a genuine regression does, so the verdict alone
1464
+ # can't tell them apart; a second, independent observation can) and is
1465
+ # waiting on its answer.
1466
+ #
1467
+ # Distinctly named from the plain "checks failed: ..." wording a CONFIRMED
1468
+ # failure produces (this entry's one-shot re-run budget already spent,
1469
+ # still red on the second read) so `coord.drive`'s retry accounting and
1470
+ # `coord.drive_queue`'s `parked` state can extend the SAME "self-refreshing,
1471
+ # no attempt yet" treatment #1891/#1892 already give
1472
+ # `CI_PENDING_PREFIX`/`CI_INFRA_PREFIX` to this one — see
1473
+ # :func:`is_ci_flaky_reason` and `MAX_CI_FLAKY_RERUNS`.
1474
+ CI_FLAKY_PREFIX = "CI re-checking:"
1475
+
1476
+
1477
+ def is_ci_flaky_reason(reason: str | None) -> bool:
1478
+ """True when *reason* names a `checks_failed` block currently mid its
1479
+ ONE #2252 re-run to rule out a flake — see :data:`CI_FLAKY_PREFIX`."""
1480
+ return (reason or "").startswith(CI_FLAKY_PREFIX)
1481
+
1482
+
1411
1483
  # #1892: auto-reruns `process()` will trigger for a single entry's verdictless
1412
1484
  # CI failure (via `CiStore.rerun_for_pr`) before giving up and parking it for
1413
1485
  # a human instead of the queue's own #1891 machinery. A workflow genuinely
@@ -1430,6 +1502,15 @@ MAX_CI_INFRA_RERUNS = 2
1430
1502
  # without masking a PR that just isn't going to catch up unattended.
1431
1503
  MAX_CI_STALE_RERUNS = 2
1432
1504
 
1505
+ # #2252: at most one auto-rerun per failure streak before a genuinely-
1506
+ # verdicted (non-infra) `checks_failed` spends the drive attempt exactly as
1507
+ # it does today. "One re-run, not a retry loop" is the issue's own bound:
1508
+ # two independent observations (the original run and this one re-run) is
1509
+ # enough to tell "broken" from "flaky" without starting to mask code that is
1510
+ # genuinely, repeatedly broken — a higher cap here would blur back into the
1511
+ # thing #1892's own cap already guards against for the verdictless case.
1512
+ MAX_CI_FLAKY_RERUNS = 1
1513
+
1433
1514
 
1434
1515
  def _ci_infra_reason(
1435
1516
  ci: "CiStore", repo: str, number: int, failed: "list[CheckRun]"
@@ -2251,6 +2332,26 @@ class QueuedMerge:
2251
2332
  # Capped at `MAX_CI_STALE_RERUNS`. 0 for every entry that has never gone
2252
2333
  # CI-stale, and for rows predating this column.
2253
2334
  ci_stale_reruns: int = 0
2335
+ # #2252: count of automatic `CiStore.rerun_failed_for_pr` calls
2336
+ # `process()` has issued for this entry's CURRENT streak of genuinely-
2337
+ # verdicted (non-infra) CI failures — capped at `MAX_CI_FLAKY_RERUNS`.
2338
+ # Kept separate from `ci_infra_reruns`/`ci_stale_reruns` above for the
2339
+ # same reason those two are kept apart from each other: independently
2340
+ # capped, independently legible in the audit trail. 0 for every entry
2341
+ # that has never hit a genuine-verdict failure, and for rows predating
2342
+ # this column.
2343
+ ci_flaky_reruns: int = 0
2344
+ # #2252: JSON blob of the failing check names/conclusions and the
2345
+ # branch SHA they failed against, captured at the moment `process()`
2346
+ # triggered this entry's one flake-checking re-run. `branch_head_sha`
2347
+ # itself is transient (recomputed from GitHub every tick, never
2348
+ # persisted) — this is the only durable record of WHAT failed once the
2349
+ # re-run's answer arrives on a later tick. `""` (falsy) means no re-run
2350
+ # is currently pending an answer; set only while `ci_flaky_reruns`
2351
+ # reflects an in-flight re-run, cleared the moment its answer (pass ->
2352
+ # flake recorded via `record_audit`, fail -> confirmed real, no flake)
2353
+ # is known.
2354
+ ci_flaky_pending: str = ""
2254
2355
 
2255
2356
 
2256
2357
  class GhOps(Protocol):
@@ -2568,6 +2669,10 @@ def load_queue() -> list[QueuedMerge]:
2568
2669
  # #2197: same NULL-to-0 decoding as ci_infra_reruns above, for
2569
2670
  # rows predating this column.
2570
2671
  ci_stale_reruns=row["ci_stale_reruns"] or 0,
2672
+ # #2252: same NULL-to-0/'' decoding as the other rerun counters
2673
+ # above, for rows predating these columns.
2674
+ ci_flaky_reruns=row["ci_flaky_reruns"] or 0,
2675
+ ci_flaky_pending=row["ci_flaky_pending"] or "",
2571
2676
  )
2572
2677
  for row in rows
2573
2678
  ]
@@ -2585,8 +2690,8 @@ def save_queue(items: list[QueuedMerge]) -> None:
2585
2690
  target_branch, issue_number, issue_title, state,
2586
2691
  pr_number, pr_url, size, last_attempt, error, enqueued_at,
2587
2692
  assignment_type, required_gates, ci_infra_reruns,
2588
- ci_stale_reruns
2589
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
2693
+ ci_stale_reruns, ci_flaky_reruns, ci_flaky_pending
2694
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
2590
2695
  (
2591
2696
  item.assignment_id, item.repo_name, item.repo_github,
2592
2697
  item.branch, item.target_branch, item.issue_number,
@@ -2594,6 +2699,7 @@ def save_queue(items: list[QueuedMerge]) -> None:
2594
2699
  item.size, item.last_attempt, item.error, item.enqueued_at,
2595
2700
  item.assignment_type, json.dumps(list(item.required_gates or [])),
2596
2701
  item.ci_infra_reruns, item.ci_stale_reruns,
2702
+ item.ci_flaky_reruns, item.ci_flaky_pending,
2597
2703
  ),
2598
2704
  )
2599
2705
 
@@ -5110,6 +5216,69 @@ def process(
5110
5216
  entry.error = msg
5111
5217
  events.append(MergeEvent(entry, "checks_failed", msg))
5112
5218
  continue # #292: skip, don't halt the group
5219
+ # #2252: reached only when `infra_reason is None` —
5220
+ # every failing check carries a REAL verdict about the
5221
+ # code (#1892's verdictless case is handled/exhausted
5222
+ # above). A real verdict is still not enough to tell
5223
+ # "broken" from "flaky": a 1-in-N random-tempdir
5224
+ # collision reports exactly the same completed/failure
5225
+ # conclusion a genuine regression does. Re-run the
5226
+ # failed job(s) once — scoped via `rerun_failed_for_pr`
5227
+ # so the green evidence from checks that already passed
5228
+ # is never touched — and re-read before spending the
5229
+ # drive attempt this failure would otherwise cost.
5230
+ if entry.ci_flaky_reruns < MAX_CI_FLAKY_RERUNS:
5231
+ rerun_failed_for_pr = getattr(
5232
+ ci, "rerun_failed_for_pr", None
5233
+ )
5234
+ reran = (
5235
+ rerun_failed_for_pr(entry.repo_github, entry.pr_number)
5236
+ if rerun_failed_for_pr is not None
5237
+ else False
5238
+ )
5239
+ if reran:
5240
+ entry.ci_flaky_reruns += 1
5241
+ entry.ci_flaky_pending = json.dumps({
5242
+ "checks": [
5243
+ {"name": c.name, "conclusion": c.conclusion}
5244
+ for c in failed
5245
+ ],
5246
+ "sha": entry.branch_head_sha,
5247
+ })
5248
+ msg = (
5249
+ f"{CI_FLAKY_PREFIX} {summary} — re-running "
5250
+ "once before treating as broken "
5251
+ f"({entry.ci_flaky_reruns}/"
5252
+ f"{MAX_CI_FLAKY_RERUNS}, #2252)"
5253
+ )
5254
+ entry.error = msg
5255
+ _log.info(
5256
+ "#2252 flake re-check %d/%d for %s#%d "
5257
+ "(PR #%s): %s (rerun_failed_for_pr triggered)",
5258
+ entry.ci_flaky_reruns, MAX_CI_FLAKY_RERUNS,
5259
+ entry.repo_name, entry.issue_number,
5260
+ entry.pr_number, summary,
5261
+ )
5262
+ events.append(MergeEvent(entry, "ci_flaky_rerun", msg))
5263
+ continue # #292: skip, don't halt the group
5264
+ # #2252 fail-safe: the re-run could not be
5265
+ # triggered (no `rerun_failed_for_pr` capability, or
5266
+ # the `gh` call itself failed) — fall straight
5267
+ # through to the plain `checks_failed` block below,
5268
+ # spending the attempt exactly as if this feature
5269
+ # did not exist. Never treat "could not re-run" as
5270
+ # "passed", and never increment `ci_flaky_reruns`
5271
+ # for a re-run that never actually happened.
5272
+ elif entry.ci_flaky_pending:
5273
+ # Budget already spent for this failure streak and
5274
+ # it is STILL red on the second read — confirmed
5275
+ # real, not a flake (#2252's other acceptance
5276
+ # criterion: "a check that fails twice: attempt
5277
+ # consumed, entry blocks — identical to today").
5278
+ # Nothing to record; clear the pending marker so a
5279
+ # later, unrelated resolution doesn't misattribute
5280
+ # this already-confirmed streak as a flake.
5281
+ entry.ci_flaky_pending = ""
5113
5282
  msg = f"checks failed: {summary}"
5114
5283
  entry.error = msg
5115
5284
  events.append(MergeEvent(entry, "checks_failed", msg))
@@ -5150,6 +5319,19 @@ def process(
5150
5319
  # that case is harmless since such an entry can never have
5151
5320
  # accrued a nonzero `ci_infra_reruns` to begin with.
5152
5321
  entry.ci_infra_reruns = 0
5322
+ # #2252: this same "genuinely resolved" point is also where
5323
+ # a suspected-flaky failure gets its answer: nothing failed
5324
+ # and nothing is pending, so the one re-run this entry spent
5325
+ # (see the `ci_flaky_reruns`/`CI_FLAKY_PREFIX` branch above)
5326
+ # came back clean. Record it — the audit trail is what keeps
5327
+ # this from quietly becoming a "just retry until green"
5328
+ # button: a check that is flaky 30% of the time should show
5329
+ # up as thirty recorded flakes, not thirty invisible free
5330
+ # passes.
5331
+ if entry.ci_flaky_pending:
5332
+ _record_ci_flake_audit(entry, entry.ci_flaky_pending)
5333
+ entry.ci_flaky_pending = ""
5334
+ entry.ci_flaky_reruns = 0
5153
5335
  # #1851: a green CI result can itself be stale relative to the
5154
5336
  # base — see `_ci_checks_are_stale`'s docstring. Named
5155
5337
  # distinctly (`checks_stale`) from checks_failed/