code-coordinator 0.5.87__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.87 → code_coordinator-0.5.89}/CLAUDE.md +1 -1
  2. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/PKG-INFO +1 -1
  3. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/code_coordinator.egg-info/PKG-INFO +1 -1
  4. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/code_coordinator.egg-info/SOURCES.txt +2 -0
  5. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/code_coordinator.egg-info/scm_file_list.json +2 -0
  6. code_coordinator-0.5.89/code_coordinator.egg-info/scm_version.json +8 -0
  7. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/ci_github.py +35 -1
  8. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/ci_store.py +30 -0
  9. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/commands/drive_queue.py +357 -1
  10. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/db.py +12 -1
  11. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/drive.py +30 -5
  12. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/drive_queue.py +39 -6
  13. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/drive_state.py +16 -1
  14. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/github_ops.py +26 -0
  15. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/merge_queue.py +184 -2
  16. code_coordinator-0.5.89/coord/overlap_predict.py +627 -0
  17. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/docs/ARCHITECTURE.md +31 -3
  18. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_ci_store.py +117 -0
  19. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_drive_queue.py +204 -0
  20. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_db.py +81 -0
  21. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_drive.py +69 -0
  22. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_drive_queue.py +59 -0
  23. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_drive_state.py +37 -0
  24. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_github_ops.py +41 -0
  25. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_merge_queue.py +227 -0
  26. code_coordinator-0.5.89/tests/test_overlap_predict.py +339 -0
  27. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/tests/fixtures/board_sample.json +2 -0
  28. code_coordinator-0.5.87/code_coordinator.egg-info/scm_version.json +0 -8
  29. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/.claude/commands/board.md +0 -0
  30. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/.claude/commands/complete-session.md +0 -0
  31. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/.claude/commands/coordinator.md +0 -0
  32. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/.githooks/_lib.sh +0 -0
  33. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/.githooks/post-checkout +0 -0
  34. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/.githooks/post-commit +0 -0
  35. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/.githooks/post-merge +0 -0
  36. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  37. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/.github/coord-ci-acceptance.yml +0 -0
  38. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/.github/workflows/auto-release.yml +0 -0
  39. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/.github/workflows/cargo-test.yml +0 -0
  40. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/.github/workflows/publish.yml +0 -0
  41. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/.github/workflows/release-tui.yml +0 -0
  42. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/.github/workflows/test.yml +0 -0
  43. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/.gitignore +0 -0
  44. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/GOAL.md +0 -0
  45. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/LICENSE +0 -0
  46. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/MANIFEST.in +0 -0
  47. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/README.md +0 -0
  48. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/code_coordinator.egg-info/dependency_links.txt +0 -0
  49. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/code_coordinator.egg-info/entry_points.txt +0 -0
  50. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/code_coordinator.egg-info/requires.txt +0 -0
  51. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/code_coordinator.egg-info/top_level.txt +0 -0
  52. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/__init__.py +0 -0
  53. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/_board_mapping.py +0 -0
  54. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/acceptance.py +0 -0
  55. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/acceptance_drivers.py +0 -0
  56. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/agent.py +0 -0
  57. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/agent_app.py +0 -0
  58. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/agent_update.py +0 -0
  59. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/agents/opencode/.gitignore +0 -0
  60. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/agents/opencode/agents/work.md +0 -0
  61. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/agents/opencode/routing.jsonc +0 -0
  62. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/audit.py +0 -0
  63. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/auto_loop.py +0 -0
  64. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/board_bool_guard.py +0 -0
  65. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/board_service.py +0 -0
  66. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/board_wire.py +0 -0
  67. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/brain.py +0 -0
  68. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/branch_model.py +0 -0
  69. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/bug_intake.py +0 -0
  70. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/cargo_cache.py +0 -0
  71. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/claim.py +0 -0
  72. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/cli.py +0 -0
  73. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/client.py +0 -0
  74. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/commands/__init__.py +0 -0
  75. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/commands/_common.py +0 -0
  76. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/commands/acceptance.py +0 -0
  77. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/commands/agent_ops.py +0 -0
  78. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/commands/audit.py +0 -0
  79. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/commands/chat.py +0 -0
  80. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/commands/dispatch.py +0 -0
  81. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/commands/dispatch_workers.py +0 -0
  82. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/commands/drive.py +0 -0
  83. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/commands/gate_a.py +0 -0
  84. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/commands/gates.py +0 -0
  85. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/commands/issues.py +0 -0
  86. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/commands/lifecycle.py +0 -0
  87. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/commands/merge.py +0 -0
  88. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/commands/milestone.py +0 -0
  89. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/commands/plan_followup.py +0 -0
  90. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/commands/plans.py +0 -0
  91. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/commands/portal.py +0 -0
  92. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/commands/release.py +0 -0
  93. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/commands/repo.py +0 -0
  94. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/commands/report.py +0 -0
  95. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/commands/review.py +0 -0
  96. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/commands/scorecard.py +0 -0
  97. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/commands/sessions.py +0 -0
  98. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/commands/setup.py +0 -0
  99. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/commands/status.py +0 -0
  100. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/commands/terminal.py +0 -0
  101. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/commands/test_gate.py +0 -0
  102. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/commands/tui.py +0 -0
  103. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/comments.py +0 -0
  104. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/config.py +0 -0
  105. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/conflict_fix.py +0 -0
  106. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dao.py +0 -0
  107. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/__init__.py +0 -0
  108. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/fixture.py +0 -0
  109. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/index.html +0 -0
  110. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/server.py +0 -0
  111. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/terminal.py +0 -0
  112. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/.gitignore +0 -0
  113. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/components.json +0 -0
  114. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/assets/Gallery-Cq84itDE.js +0 -0
  115. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  116. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/assets/Terminal-DOXLcMue.js +0 -0
  117. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/assets/index-DHn-RIJ8.js +0 -0
  118. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  119. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  120. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  121. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  122. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  123. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/index.html +0 -0
  124. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  125. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/sw.js +0 -0
  126. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  127. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  128. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  129. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  130. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  131. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  132. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  133. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  134. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  135. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  136. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/eslint.config.js +0 -0
  137. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/index.html +0 -0
  138. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  139. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/package-lock.json +0 -0
  140. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/package.json +0 -0
  141. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  142. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/playwright.config.ts +0 -0
  143. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/postcss.config.js +0 -0
  144. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  145. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  146. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  147. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/App.tsx +0 -0
  148. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/api/client.ts +0 -0
  149. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  150. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  151. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  152. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  153. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  154. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  155. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  156. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  157. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  158. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  159. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  160. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  161. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  162. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  163. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  164. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  165. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  166. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  167. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  168. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  169. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  170. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  171. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  172. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  173. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  174. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  175. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  176. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  177. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  178. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  179. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  180. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  181. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  182. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  183. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  184. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/index.css +0 -0
  185. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  186. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  187. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/main.tsx +0 -0
  188. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  189. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  190. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  191. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  192. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  193. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  194. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  195. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  196. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  197. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  198. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  199. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  200. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  201. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  202. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  203. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  204. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  205. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  206. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  207. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  208. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  209. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  210. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  211. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/tailwind.config.js +0 -0
  212. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/tsconfig.json +0 -0
  213. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  214. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dashboard/webapp/vite.config.ts +0 -0
  215. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dead_end.py +0 -0
  216. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/deploy/README.md +0 -0
  217. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/deploy/coord-agent.service +0 -0
  218. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/deploy/coord-db-backup.service +0 -0
  219. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/deploy/coord-db-backup.sh +0 -0
  220. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/deploy/coord-db-backup.timer +0 -0
  221. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/deploy/coord-drive-queue.service +0 -0
  222. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/deploy/coord-drive-queue.timer +0 -0
  223. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/deploy/coord-notify.service +0 -0
  224. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/deploy/coord-notify.timer +0 -0
  225. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/deploy/coord-release-propagate.service +0 -0
  226. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/deploy/coord-release-propagate.timer +0 -0
  227. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/deploy/coord-release-window.service +0 -0
  228. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/deploy/coord-release-window.timer +0 -0
  229. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/deploy/coord-serve.service +0 -0
  230. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/deploy/coord-web-dist-build.service +0 -0
  231. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/deploy/coord-web-dist-build.timer +0 -0
  232. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/deploy/coord-web.service +0 -0
  233. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/deploy_manifest.py +0 -0
  234. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/deploy_units.py +0 -0
  235. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/deps.py +0 -0
  236. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/diagnose.py +0 -0
  237. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dispatch.py +0 -0
  238. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/dist_name.py +0 -0
  239. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/events.py +0 -0
  240. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/failure_class.py +0 -0
  241. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/filelock.py +0 -0
  242. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/fleet_config_health.py +0 -0
  243. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/freshness.py +0 -0
  244. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/gate_a.py +0 -0
  245. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/gate_b.py +0 -0
  246. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/gate_snapshot.py +0 -0
  247. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/gates.py +0 -0
  248. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/goal.py +0 -0
  249. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/graph_health.py +0 -0
  250. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/health/__init__.py +0 -0
  251. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/health/aggregate.py +0 -0
  252. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/health/checks/__init__.py +0 -0
  253. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/health/checks/agent_install.py +0 -0
  254. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/health/checks/cargo_targets.py +0 -0
  255. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/health/checks/claude_binary.py +0 -0
  256. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/health/checks/deploy_lane_facts.py +0 -0
  257. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/health/checks/disk.py +0 -0
  258. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/health/checks/fleet_board.py +0 -0
  259. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  260. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/health/checks/fleet_phantom.py +0 -0
  261. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/health/checks/fleet_unit_drift.py +0 -0
  262. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/health/checks/graph.py +0 -0
  263. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/health/checks/graphify_cli.py +0 -0
  264. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/health/checks/plan_usage.py +0 -0
  265. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/health/checks/repo_state.py +0 -0
  266. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/health/checks/spawned_coord.py +0 -0
  267. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/health/checks/timer_active.py +0 -0
  268. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/health/checks/toolchain.py +0 -0
  269. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/health/checks/unit_drift.py +0 -0
  270. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/health/checks/unit_enablement.py +0 -0
  271. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/health/checks/worktrees.py +0 -0
  272. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/health/cli.py +0 -0
  273. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/health/context.py +0 -0
  274. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/health/fleet_snapshot.py +0 -0
  275. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/health/models.py +0 -0
  276. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/health/pypi.py +0 -0
  277. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/health/registry.py +0 -0
  278. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/health/render.py +0 -0
  279. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/health/units.py +0 -0
  280. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/hooks.py +0 -0
  281. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/housekeeping.py +0 -0
  282. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/interactive.py +0 -0
  283. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/issue_store.py +0 -0
  284. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/liveness_auditor.py +0 -0
  285. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/machine_pause.py +0 -0
  286. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/milestone_chat.py +0 -0
  287. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/milestone_dispatch.py +0 -0
  288. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/milestone_gate.py +0 -0
  289. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/milestone_order.py +0 -0
  290. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/mock_author.py +0 -0
  291. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/models.py +0 -0
  292. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/network.py +0 -0
  293. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/new_issue_chat.py +0 -0
  294. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/notifier/__init__.py +0 -0
  295. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/notifier/baseline.py +0 -0
  296. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/notifier/cli.py +0 -0
  297. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/notifier/collect.py +0 -0
  298. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/notifier/digest.py +0 -0
  299. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/notifier/models.py +0 -0
  300. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/notifier/predicate.py +0 -0
  301. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/notifier/service.py +0 -0
  302. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/notifier/store.py +0 -0
  303. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/notifier/transport.py +0 -0
  304. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/notify.py +0 -0
  305. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/openapi.py +0 -0
  306. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/overlap_fence.py +0 -0
  307. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/parentage.py +0 -0
  308. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/parentage_github.py +0 -0
  309. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/pipeline.py +0 -0
  310. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/plan_parser.py +0 -0
  311. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/plans.py +0 -0
  312. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/platform_paths.py +0 -0
  313. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/portal_bridge.py +0 -0
  314. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/portal_store.py +0 -0
  315. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/portal_sync.py +0 -0
  316. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/pr_body_lint.py +0 -0
  317. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/prereqs.py +0 -0
  318. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/progress.py +0 -0
  319. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/providers/__init__.py +0 -0
  320. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/providers/base.py +0 -0
  321. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/providers/claude.py +0 -0
  322. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/providers/claude_pty.py +0 -0
  323. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/providers/opencode.py +0 -0
  324. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/reconcile.py +0 -0
  325. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/refine_chat.py +0 -0
  326. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/release_cordon.py +0 -0
  327. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/release_propagate.py +0 -0
  328. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/release_verify.py +0 -0
  329. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/release_window.py +0 -0
  330. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/repo_edit.py +0 -0
  331. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/repo_onboard.py +0 -0
  332. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/reports.py +0 -0
  333. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/revalidate.py +0 -0
  334. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/review.py +0 -0
  335. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/scorecard.py +0 -0
  336. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/serve_app.py +0 -0
  337. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/skills/update-issue/SKILL.md +0 -0
  338. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/smoke.py +0 -0
  339. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/spend_ceiling.py +0 -0
  340. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/split_work.py +0 -0
  341. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/stage_projection.py +0 -0
  342. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/state.py +0 -0
  343. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/test_author.py +0 -0
  344. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/test_chat.py +0 -0
  345. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/test_orchestrator.py +0 -0
  346. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/test_report.py +0 -0
  347. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/tui_release.py +0 -0
  348. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/usage.py +0 -0
  349. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/usage_limits.py +0 -0
  350. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/usage_rollup.py +0 -0
  351. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coord/worker_events.py +0 -0
  352. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/coordinator.example.yml +0 -0
  353. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/deploy/coord-agent.service +0 -0
  354. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/deploy/coord-db-backup.service +0 -0
  355. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/deploy/coord-db-backup.sh +0 -0
  356. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/deploy/coord-db-backup.timer +0 -0
  357. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/deploy/coord-drive-queue.service +0 -0
  358. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/deploy/coord-drive-queue.timer +0 -0
  359. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/deploy/coord-notify.service +0 -0
  360. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/deploy/coord-notify.timer +0 -0
  361. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/deploy/coord-release-propagate.service +0 -0
  362. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/deploy/coord-release-propagate.timer +0 -0
  363. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/deploy/coord-release-window.service +0 -0
  364. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/deploy/coord-release-window.timer +0 -0
  365. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/deploy/coord-serve.service +0 -0
  366. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/deploy/coord-web-dist-build.service +0 -0
  367. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/deploy/coord-web-dist-build.sh +0 -0
  368. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/deploy/coord-web-dist-build.timer +0 -0
  369. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/deploy/coord-web-rollback.sh +0 -0
  370. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/deploy/coord-web.service +0 -0
  371. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/deploy/node-shim.sh +0 -0
  372. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/docs/AGENT_OPERATIONS.md +0 -0
  373. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/docs/ARCH_SECURITY_GATES.md +0 -0
  374. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/docs/COCKPIT.md +0 -0
  375. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/docs/CONTROL_CENTER.md +0 -0
  376. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/docs/COST_DISCIPLINE.md +0 -0
  377. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/docs/CROSS_PLATFORM.md +0 -0
  378. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/docs/CUSTOMER_PORTAL.md +0 -0
  379. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/docs/DRIVE_QUEUE.md +0 -0
  380. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/docs/EPHEMERAL_WORKERS.md +0 -0
  381. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/docs/FORGE_MIGRATION.md +0 -0
  382. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/docs/GRAPHIFY_SETUP.md +0 -0
  383. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/docs/ISSUE_GUIDANCE.md +0 -0
  384. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/docs/MAC_MINI.md +0 -0
  385. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  386. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/docs/NOTIFIER.md +0 -0
  387. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/docs/OPENCODE_VERIFICATION.md +0 -0
  388. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/docs/OPERATING_GOTCHAS.md +0 -0
  389. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/docs/ORACLE_LOOP.md +0 -0
  390. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/docs/PHONE_WEBAPP.md +0 -0
  391. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/docs/PIPELINE_V2.md +0 -0
  392. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/docs/PLATFORM_EVOLUTION.md +0 -0
  393. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/docs/SECOND_BACKEND.md +0 -0
  394. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/docs/STORE_SERVICE.md +0 -0
  395. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  396. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/docs/WEB_CONTROL_CENTER.md +0 -0
  397. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/docs/mocks/web/README.md +0 -0
  398. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/docs/mocks/web/_tokens.css +0 -0
  399. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/docs/mocks/web/issue-detail.html +0 -0
  400. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/docs/mocks/web/pipeline-narrow.html +0 -0
  401. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/docs/mocks/web/pipeline-wide.html +0 -0
  402. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/graphify-out/.gitignore +0 -0
  403. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/install-agent.sh +0 -0
  404. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/pyproject.toml +0 -0
  405. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/scripts/audit_review_verdict_overrides.py +0 -0
  406. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  407. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/scripts/azure-workers/build-worker-image.sh +0 -0
  408. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/scripts/azure-workers/coordinator-machine.py +0 -0
  409. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/scripts/azure-workers/epic-down.sh +0 -0
  410. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/scripts/azure-workers/epic-up.sh +0 -0
  411. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/scripts/azure-workers/preflight.sh +0 -0
  412. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/scripts/azure-workers/provision-worker.sh +0 -0
  413. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  414. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  415. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/scripts/azure-workers/verify-github-token.sh +0 -0
  416. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/scripts/codegen.py +0 -0
  417. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/scripts/coord-test-runner.sh +0 -0
  418. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/scripts/drive-batch.sh +0 -0
  419. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/scripts/gen_board_fixture.py +0 -0
  420. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/scripts/next_release_tag.py +0 -0
  421. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/scripts/run_tests_in_populated_home.sh +0 -0
  422. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/scripts/run_tests_without_gh.sh +0 -0
  423. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/scripts/smoke_437_interactive.py +0 -0
  424. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/scripts/verify_878_review_capture.py +0 -0
  425. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/scripts/verify_release_published.py +0 -0
  426. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/scripts/verify_release_wheel.py +0 -0
  427. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/setup.cfg +0 -0
  428. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/SMOKE_SET.md +0 -0
  429. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/__init__.py +0 -0
  430. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  431. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/acceptance/ms-33/contract.md +0 -0
  432. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/acceptance/ms-33/manifest.yml +0 -0
  433. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  434. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  435. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  436. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  437. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/acceptance/ms-37/conftest.py +0 -0
  438. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/acceptance/ms-37/contract.md +0 -0
  439. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/acceptance/ms-37/manifest.yml +0 -0
  440. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  441. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  442. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/acceptance/ms-38/contract.md +0 -0
  443. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/acceptance/ms-38/manifest.yml +0 -0
  444. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  445. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  446. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  447. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  448. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  449. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  450. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  451. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  452. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  453. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  454. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/acceptance/ms-51/contract.md +0 -0
  455. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  456. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  457. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/acceptance/ms-51/manifest.yml +0 -0
  458. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  459. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/acceptance/ms-51/tsconfig.json +0 -0
  460. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  461. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/conftest.py +0 -0
  462. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/fixtures/board-pipeline-basic.json +0 -0
  463. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  464. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  465. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  466. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/fixtures/playwright/all_pass.json +0 -0
  467. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  468. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/fixtures/playwright/mixed_fail.json +0 -0
  469. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  470. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  471. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/fixtures/playwright/skip.json +0 -0
  472. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/fixtures/playwright/truncated.json +0 -0
  473. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  474. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  475. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  476. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  477. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  478. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  479. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  480. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  481. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_acceptance.py +0 -0
  482. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_acceptance_drivers.py +0 -0
  483. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_agent.py +0 -0
  484. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_agent_api_error.py +0 -0
  485. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_agent_app.py +0 -0
  486. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_agent_branch_base.py +0 -0
  487. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_agent_branch_capture.py +0 -0
  488. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_agent_config_free_1712.py +0 -0
  489. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_agent_deploy_units_endpoint.py +0 -0
  490. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_agent_dirty_worktree.py +0 -0
  491. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_agent_graph_self_heal.py +0 -0
  492. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_agent_health_h3.py +0 -0
  493. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_agent_idle_restart.py +0 -0
  494. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_agent_push_failure.py +0 -0
  495. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_agent_reap.py +0 -0
  496. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_agent_repos_and_pull.py +0 -0
  497. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_agent_restart_services_endpoint.py +0 -0
  498. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_agent_startup_diagnostics.py +0 -0
  499. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_agent_update.py +0 -0
  500. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_agent_update_bluegreen.py +0 -0
  501. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_agent_usage_limit.py +0 -0
  502. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_agent_zero_commit.py +0 -0
  503. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_ambient_home_isolation.py +0 -0
  504. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_approve_reject_plan.py +0 -0
  505. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_approve_usage_gate.py +0 -0
  506. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_assignment_already_recorded_daemon.py +0 -0
  507. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_audit_log.py +0 -0
  508. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_audit_outcome.py +0 -0
  509. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_audit_query.py +0 -0
  510. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_auto_loop.py +0 -0
  511. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_auto_release_publish_2035.py +0 -0
  512. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_base_checkout_restore.py +0 -0
  513. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_board_cap_762.py +0 -0
  514. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_board_fixture.py +0 -0
  515. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_board_read_path.py +0 -0
  516. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_board_service.py +0 -0
  517. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_board_state.py +0 -0
  518. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_board_wire.py +0 -0
  519. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_brain.py +0 -0
  520. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_branch_model.py +0 -0
  521. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_bug_intake.py +0 -0
  522. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_build_worker_image_env_update.py +0 -0
  523. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cargo_cache.py +0 -0
  524. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_ci_acceptance_gate_1950.py +0 -0
  525. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_ci_parity_2091.py +0 -0
  526. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_claim.py +0 -0
  527. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_acceptance.py +0 -0
  528. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_assign.py +0 -0
  529. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  530. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_assign_interactive_remote.py +0 -0
  531. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_assign_provider.py +0 -0
  532. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  533. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_audit.py +0 -0
  534. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_chat_continue.py +0 -0
  535. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_diagnose_config_provenance.py +0 -0
  536. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_diagnose_graph.py +0 -0
  537. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_doctor.py +0 -0
  538. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_doctor_config_free_1801.py +0 -0
  539. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  540. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_drive.py +0 -0
  541. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_escalate.py +0 -0
  542. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_fix_headless_review.py +0 -0
  543. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_gate_a.py +0 -0
  544. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_install_drift.py +0 -0
  545. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_install_skills.py +0 -0
  546. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_issue_create_label.py +0 -0
  547. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_issue_reopen.py +0 -0
  548. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_merge.py +0 -0
  549. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_milestone_assign.py +0 -0
  550. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_milestone_capture.py +0 -0
  551. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_milestone_chat_add_child.py +0 -0
  552. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_milestone_dispatch.py +0 -0
  553. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_milestone_gate_b.py +0 -0
  554. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_milestone_gate_c.py +0 -0
  555. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_milestone_order.py +0 -0
  556. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  557. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_milestone_ship.py +0 -0
  558. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_network.py +0 -0
  559. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_new_issue_chat.py +0 -0
  560. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_plans.py +0 -0
  561. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_portal.py +0 -0
  562. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_pull_artifact.py +0 -0
  563. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_queue.py +0 -0
  564. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_reattach_sessions.py +0 -0
  565. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_refine_board.py +0 -0
  566. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_release_preflight.py +0 -0
  567. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_release_propagate.py +0 -0
  568. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_release_window.py +0 -0
  569. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_repo_2220.py +0 -0
  570. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_scorecard.py +0 -0
  571. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_set_review_findings.py +0 -0
  572. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_status_advisory_terminal.py +0 -0
  573. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_status_merge_queue.py +0 -0
  574. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_status_provider.py +0 -0
  575. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_status_review_finalizing.py +0 -0
  576. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_status_test_failed_tag.py +0 -0
  577. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_status_usage_limit.py +0 -0
  578. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_sync_comments_873.py +0 -0
  579. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_test_plan.py +0 -0
  580. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_track.py +0 -0
  581. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_tui_update.py +0 -0
  582. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cli_wait.py +0 -0
  583. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_client_base_install.py +0 -0
  584. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_comments.py +0 -0
  585. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_completion_summary.py +0 -0
  586. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_config.py +0 -0
  587. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_config_acceptance.py +0 -0
  588. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_config_audit.py +0 -0
  589. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_config_pricing.py +0 -0
  590. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_config_usage_gate.py +0 -0
  591. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_conflict_fix.py +0 -0
  592. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_conflict_fix_semantic.py +0 -0
  593. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_coord_test.py +0 -0
  594. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_coord_test_runner_baseline.py +0 -0
  595. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_coord_test_runner_routing.py +0 -0
  596. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_coord_test_runner_toolchain.py +0 -0
  597. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_coord_web_sse_restart_live.py +0 -0
  598. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_coordinator_machine.py +0 -0
  599. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_cross_platform_imports.py +0 -0
  600. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_dashboard.py +0 -0
  601. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_dashboard_fixture.py +0 -0
  602. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_dashboard_terminal.py +0 -0
  603. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_dashboard_terminal_live.py +0 -0
  604. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_dead_end.py +0 -0
  605. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_deploy_coord_db_backup.py +0 -0
  606. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_deploy_coord_web_dist.py +0 -0
  607. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_deploy_coord_web_rollback.py +0 -0
  608. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_deploy_drive_queue_unit.py +0 -0
  609. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_deploy_manifest.py +0 -0
  610. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_deploy_units_lane.py +0 -0
  611. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_deploy_web_unit.py +0 -0
  612. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_deps.py +0 -0
  613. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_diagnose.py +0 -0
  614. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_dispatch.py +0 -0
  615. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_dispatch_target_validation.py +0 -0
  616. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_dist_name.py +0 -0
  617. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_done_housekeeping.py +0 -0
  618. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_drive_tmux.py +0 -0
  619. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_epic_up_capability_detection.py +0 -0
  620. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  621. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_epic_up_image_provenance.py +0 -0
  622. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_errors.py +0 -0
  623. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_events.py +0 -0
  624. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_failure_class.py +0 -0
  625. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_filelock.py +0 -0
  626. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  627. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_fix_of_force_override.py +0 -0
  628. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_fleet_config_health.py +0 -0
  629. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_fleet_health_probes.py +0 -0
  630. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_fleet_health_snapshot.py +0 -0
  631. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_freshness.py +0 -0
  632. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_gate_a.py +0 -0
  633. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_gate_b.py +0 -0
  634. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_gate_snapshot_staleness.py +0 -0
  635. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_gates.py +0 -0
  636. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  637. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_generated_types_fixture.py +0 -0
  638. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_goal.py +0 -0
  639. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_graph_health.py +0 -0
  640. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_graph_selfheal_absent_2237.py +0 -0
  641. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_handoff.py +0 -0
  642. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_health_checks.py +0 -0
  643. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_health_cli.py +0 -0
  644. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_health_cli_graph.py +0 -0
  645. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_health_config.py +0 -0
  646. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_health_context.py +0 -0
  647. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_health_deploy_lane_facts.py +0 -0
  648. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_health_incident_regression.py +0 -0
  649. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_health_pypi.py +0 -0
  650. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_health_registry.py +0 -0
  651. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_health_timer_active.py +0 -0
  652. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_health_toolchain.py +0 -0
  653. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_health_unit_drift.py +0 -0
  654. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_health_unit_enablement.py +0 -0
  655. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_hooks.py +0 -0
  656. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_human_attended_437.py +0 -0
  657. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_init.py +0 -0
  658. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_integration.py +0 -0
  659. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_interactive_briefing_echo.py +0 -0
  660. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_interactive_prefill_state.py +0 -0
  661. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_interactive_session_relaunch.py +0 -0
  662. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_interactive_test_verdict_backstop.py +0 -0
  663. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_interactive_token_attribution.py +0 -0
  664. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_interactive_worktree.py +0 -0
  665. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_issue_store_seam.py +0 -0
  666. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_liveness_auditor.py +0 -0
  667. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_liveness_notify.py +0 -0
  668. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_machine_pause.py +0 -0
  669. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_merge_verify.py +0 -0
  670. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_milestone_chat.py +0 -0
  671. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_milestone_dispatch.py +0 -0
  672. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_milestone_gate.py +0 -0
  673. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_milestone_order.py +0 -0
  674. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_milestone_seam.py +0 -0
  675. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_mock_author.py +0 -0
  676. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_model_tiering.py +0 -0
  677. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_models.py +0 -0
  678. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_models_config_labels.py +0 -0
  679. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_needs_attention.py +0 -0
  680. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_network.py +0 -0
  681. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_new_issue_chat.py +0 -0
  682. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_next_release_tag.py +0 -0
  683. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_no_direct_gh_calls.py +0 -0
  684. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_node_shim.py +0 -0
  685. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_notifier_baseline.py +0 -0
  686. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_notifier_cli.py +0 -0
  687. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_notifier_collect.py +0 -0
  688. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_notifier_config.py +0 -0
  689. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_notifier_drive_seam.py +0 -0
  690. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_notifier_isolation.py +0 -0
  691. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_notifier_predicate.py +0 -0
  692. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_notifier_quiet_hours.py +0 -0
  693. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_notifier_service.py +0 -0
  694. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_notify.py +0 -0
  695. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_notify_drain.py +0 -0
  696. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_openapi.py +0 -0
  697. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_operational_defaults.py +0 -0
  698. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_overlap_fence.py +0 -0
  699. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_packaged_deploy_units.py +0 -0
  700. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_parentage.py +0 -0
  701. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_paste_landed.py +0 -0
  702. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_pipeline.py +0 -0
  703. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_plan_followup_approve_plan_command.py +0 -0
  704. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_plan_followup_pr_command.py +0 -0
  705. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_plan_followup_review_command.py +0 -0
  706. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_plan_only.py +0 -0
  707. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_plan_parser.py +0 -0
  708. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_platform_paths.py +0 -0
  709. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_portal_bridge.py +0 -0
  710. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_portal_config.py +0 -0
  711. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_portal_sync.py +0 -0
  712. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_pr_body_lint.py +0 -0
  713. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_prereqs.py +0 -0
  714. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_production_db_guard.py +0 -0
  715. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_progress.py +0 -0
  716. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_provider_seam.py +0 -0
  717. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_providers.py +0 -0
  718. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_providers_config_labels.py +0 -0
  719. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_providers_pty.py +0 -0
  720. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_quiet_hours.py +0 -0
  721. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_quiet_hours_store_2146.py +0 -0
  722. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_reap_merged_sessions.py +0 -0
  723. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_reap_stale_interactive_tick.py +0 -0
  724. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_reconcile_branch.py +0 -0
  725. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_reconcile_completions.py +0 -0
  726. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_reconcile_merges.py +0 -0
  727. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_reconcile_usage_limit_done.py +0 -0
  728. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_refine_chat.py +0 -0
  729. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_release_cordon_2101.py +0 -0
  730. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_release_cordon_deadlock_2240.py +0 -0
  731. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_release_propagate.py +0 -0
  732. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_release_unified_1242.py +0 -0
  733. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_release_verify.py +0 -0
  734. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_release_window.py +0 -0
  735. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_remote_auto_prune.py +0 -0
  736. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_remote_interactive_reaper.py +0 -0
  737. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_repo_edit_2220.py +0 -0
  738. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_repo_graph_fleet_2237.py +0 -0
  739. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_repo_onboard_2220.py +0 -0
  740. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_report_result_push.py +0 -0
  741. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_reports.py +0 -0
  742. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_retry.py +0 -0
  743. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_retry_advisory_1606.py +0 -0
  744. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_retry_type_1636.py +0 -0
  745. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_revalidate.py +0 -0
  746. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_review.py +0 -0
  747. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_review_end_review_without_verdict.py +0 -0
  748. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_review_parse_failure_diagnostic.py +0 -0
  749. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_review_reaffirm.py +0 -0
  750. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_review_state.py +0 -0
  751. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_review_verdict_backstop.py +0 -0
  752. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_review_verdict_override_audit.py +0 -0
  753. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_review_verdict_relay.py +0 -0
  754. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_review_zero_commits.py +0 -0
  755. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_scoped_review_wiring.py +0 -0
  756. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_scorecard.py +0 -0
  757. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_serve.py +0 -0
  758. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_serve_app_board_trim.py +0 -0
  759. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_session.py +0 -0
  760. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_slice_issue_attribution.py +0 -0
  761. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_smoke.py +0 -0
  762. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_smoke_live_checkout_restore.py +0 -0
  763. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_smoke_workflow.py +0 -0
  764. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_spend_ceiling.py +0 -0
  765. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_spend_ceiling_coordinator.py +0 -0
  766. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_split.py +0 -0
  767. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_split_work.py +0 -0
  768. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_stage_projection.py +0 -0
  769. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_stalled_pipeline.py +0 -0
  770. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_state.py +0 -0
  771. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_state_review_findings_daemon.py +0 -0
  772. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_status_fleet_footer.py +0 -0
  773. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_stop_1567.py +0 -0
  774. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_stuck.py +0 -0
  775. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_terminal_command.py +0 -0
  776. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_test_author.py +0 -0
  777. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_test_chat.py +0 -0
  778. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_test_orchestrator.py +0 -0
  779. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_test_report.py +0 -0
  780. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_test_verdict_parsing.py +0 -0
  781. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_test_verdict_transcript_floor.py +0 -0
  782. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_thin_client_board_audit.py +0 -0
  783. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_thin_client_config_load_1080.py +0 -0
  784. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_thin_client_daemon_routing_906.py +0 -0
  785. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_tmux_host.py +0 -0
  786. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_tmux_session.py +0 -0
  787. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_transcript_floor.py +0 -0
  788. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_usage.py +0 -0
  789. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_usage_limits.py +0 -0
  790. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_usage_rollup.py +0 -0
  791. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_venv_live_install_2121.py +0 -0
  792. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_version_single_source.py +0 -0
  793. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_watch.py +0 -0
  794. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_worker_events.py +0 -0
  795. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_worker_image_pin_sync.py +0 -0
  796. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_worker_safety.py +0 -0
  797. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_worker_test_scoping.py +0 -0
  798. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_worktree.py +0 -0
  799. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  800. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/Cargo.lock +0 -0
  801. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/Cargo.toml +0 -0
  802. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/cargo-config-local-quadraui.toml.example +0 -0
  803. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/app/audit.rs +0 -0
  804. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/app/chat.rs +0 -0
  805. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/app/data.rs +0 -0
  806. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/app/dialogs.rs +0 -0
  807. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/app/drive.rs +0 -0
  808. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/app/drive_queue.rs +0 -0
  809. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/app/escalation.rs +0 -0
  810. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/app/events.rs +0 -0
  811. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/app/fixtures.rs +0 -0
  812. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/app/fleet_health.rs +0 -0
  813. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/app/fleet_sessions.rs +0 -0
  814. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/app/fleet_terminals.rs +0 -0
  815. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/app/format.rs +0 -0
  816. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/app/milestone_dag.rs +0 -0
  817. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/app/mod.rs +0 -0
  818. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/app/msv.rs +0 -0
  819. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/app/pipeline.rs +0 -0
  820. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/app/plans.rs +0 -0
  821. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/app/render.rs +0 -0
  822. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/app/reports.rs +0 -0
  823. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/app/sessions.rs +0 -0
  824. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/app/settings_ui.rs +0 -0
  825. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/app/sidebar.rs +0 -0
  826. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/app/terminal.rs +0 -0
  827. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/app/tests.rs +0 -0
  828. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/app/types.rs +0 -0
  829. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/app/workspace.rs +0 -0
  830. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/bin/gtk.rs +0 -0
  831. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/commands.rs +0 -0
  832. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/lib.rs +0 -0
  833. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/main.rs +0 -0
  834. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/src/settings.rs +0 -0
  835. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/tests/acceptance.rs +0 -0
  836. {code_coordinator-0.5.87 → code_coordinator-0.5.89}/tui/tests/cli.rs +0 -0
@@ -171,7 +171,7 @@ One line each — the reasoning behind them is in
171
171
  - **`coordinator.yml` is the single source of truth** for repo topology, machine capabilities, dependencies, concurrency limits, review settings, smoke-test rules, and the pipeline gate order (`pipeline.default_gates`). It lives in `~/.coord/`, **not** the repo checkout.
172
172
  - **User approves everything.** `coord plan` proposes, the user reviews, `coord approve` dispatches. No autonomous dispatch.
173
173
  - **Claim detection prevents duplicate work.** Before dispatching, the coordinator checks the board for active assignments and the remote for `issue-{N}-*` branches.
174
- - **Conflict rules are inferred, not configured** and only on the `coord plan` path. Overlap avoidance is a line in the planning brain's *prompt*, not a mechanism; the drive queue bypasses the brain entirely, so unattended work gets no file-overlap check. There is no `file_groups`/`exclusive_files` config.
174
+ - **Conflict rules are inferred, not configured.** There is no `file_groups`/`exclusive_files` config and never will be. The `coord plan` path infers overlap via a line in the planning brain's *prompt* (a prompt instruction, not a mechanism). The drive queue bypasses the brain, so it has its own inference: `coord drive-queue add` compares the issue's own `## Files` declaration against the **real diffs** of in-flight branches in that repo (`coord/overlap_predict.py`, #2247) and, on an overlap, chains the newcomer `--after` the incumbent. **It ORDERS, never refuses** — a false positive costs latency, a refusal costs work — and an issue that declares nothing gets exactly the pre-#2247 behaviour. Accuracy is measured, not assumed: `coord drive-queue overlap-report` scores each prediction against what the branches actually touched.
175
175
  - **Adversarial reviews are rule-enforcing, not rubber-stamping.** On worker completion a fresh `claude -p` session on a *different* machine reviews the PR diff against this file and the review checklist, with zero shared context with the worker — that's the whole point.
176
176
  - **The pipeline order is `Work → Test → Review → Merge`.** Test precedes Review; the headless auto-loop holds review dispatch until there is a `passed`/`skipped` test verdict.
177
177
  - **Merge is gated on CI checks (#240).** `coord merge` refuses when a check failed or is still running — and a PR with *zero* reported checks is not automatically clear either (#1904).
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.87
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.87
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
@@ -95,6 +95,7 @@ coord/new_issue_chat.py
95
95
  coord/notify.py
96
96
  coord/openapi.py
97
97
  coord/overlap_fence.py
98
+ coord/overlap_predict.py
98
99
  coord/parentage.py
99
100
  coord/parentage_github.py
100
101
  coord/pipeline.py
@@ -640,6 +641,7 @@ tests/test_notify_drain.py
640
641
  tests/test_openapi.py
641
642
  tests/test_operational_defaults.py
642
643
  tests/test_overlap_fence.py
644
+ tests/test_overlap_predict.py
643
645
  tests/test_packaged_deploy_units.py
644
646
  tests/test_parentage.py
645
647
  tests/test_paste_landed.py
@@ -270,6 +270,7 @@
270
270
  "coord/notify.py",
271
271
  "coord/openapi.py",
272
272
  "coord/overlap_fence.py",
273
+ "coord/overlap_predict.py",
273
274
  "coord/parentage.py",
274
275
  "coord/parentage_github.py",
275
276
  "coord/pipeline.py",
@@ -670,6 +671,7 @@
670
671
  "tests/test_openapi.py",
671
672
  "tests/test_operational_defaults.py",
672
673
  "tests/test_overlap_fence.py",
674
+ "tests/test_overlap_predict.py",
673
675
  "tests/test_packaged_deploy_units.py",
674
676
  "tests/test_parentage.py",
675
677
  "tests/test_paste_landed.py",
@@ -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
 
@@ -39,6 +39,7 @@ from typing import Any, Mapping
39
39
  import click
40
40
 
41
41
  from coord.commands._common import _CONFIG_OPTION
42
+ from coord.drive_state import WORK_LIKE
42
43
  from coord.drive_queue import (
43
44
  DEFAULT_MAX_ATTEMPTS,
44
45
  DEFAULT_MAX_PARALLEL_PER_REPO,
@@ -55,6 +56,7 @@ from coord.drive_queue import (
55
56
  STATE_PARKED,
56
57
  STATE_RUNNING,
57
58
  STATE_WAITING,
59
+ TERMINAL_QUEUE_STATES,
58
60
  BoardView,
59
61
  ProbeResult,
60
62
  QueueEntry,
@@ -74,6 +76,20 @@ from coord.drive_queue import (
74
76
  render_plan,
75
77
  validate_enqueue,
76
78
  )
79
+ from coord.overlap_predict import (
80
+ AUDIT_CATEGORY,
81
+ EVENT_PREDICTED,
82
+ EVENT_SCORED,
83
+ OUTCOME_UNKNOWN,
84
+ Prediction,
85
+ classify_outcome,
86
+ collect_candidate_files,
87
+ declared_footprints,
88
+ inflight_footprints,
89
+ predict_overlap,
90
+ predictions_from_audit,
91
+ tally,
92
+ )
77
93
 
78
94
  # Wall-clock ceiling for the `coord drive --tmux` launch subprocess. The
79
95
  # launch itself only blocks for #1606's liveness verification (16 × 0.5s) plus
@@ -162,6 +178,16 @@ def drive_queue_group() -> None:
162
178
  "treated as a failure. Requires --hold-after."
163
179
  ),
164
180
  )
181
+ @click.option(
182
+ "--no-predict-overlap",
183
+ is_flag=True,
184
+ default=False,
185
+ help=(
186
+ "Skip #2247's predicted file-overlap ordering for this add — queue it "
187
+ "exactly where the flags say, even if its declared files collide with "
188
+ "work already in flight."
189
+ ),
190
+ )
165
191
  @click.option(
166
192
  "--scope",
167
193
  "hold_scope",
@@ -185,6 +211,7 @@ def drive_queue_add(
185
211
  hold_after: bool,
186
212
  hold_reason: str,
187
213
  resume_when: str,
214
+ no_predict_overlap: bool,
188
215
  hold_scope: str,
189
216
  config_path: Path,
190
217
  ) -> None:
@@ -193,6 +220,11 @@ def drive_queue_add(
193
220
  Validation happens BEFORE the write, the same posture `coord milestone
194
221
  write-order` takes for `## Work order`: a self-edge or a dependency cycle
195
222
  exits non-zero and leaves the queue exactly as it was.
223
+
224
+ #2247: when this issue's DECLARED files (a `## Files` block in its body)
225
+ collide with work already in flight in the same repo, the entry is chained
226
+ `--after` that work automatically and the reason is recorded. That is an
227
+ ORDER change, never a refusal — see `coord.overlap_predict`.
196
228
  """
197
229
  from coord.state import enqueue_drive_queue, list_drive_queue # noqa: PLC0415
198
230
 
@@ -226,6 +258,19 @@ def drive_queue_add(
226
258
  "(entries-only). Pass --scope fleet again if the fleet-wide stop was still needed."
227
259
  )
228
260
 
261
+ # #2247: predicted file overlap ORDERS, never refuses. Anything that goes
262
+ # wrong in here (unreadable body, unreachable board, a failed compare)
263
+ # yields an empty prediction and this add behaves exactly as it did before
264
+ # the feature existed.
265
+ prediction = Prediction()
266
+ auto_after: list[str] = []
267
+ if not no_predict_overlap:
268
+ prediction = _predict_overlap(config_path, repo, issue, existing_entries)
269
+ auto_after = _applicable_auto_after(
270
+ existing_entries, repo, issue, after, prediction
271
+ )
272
+ after = [*after, *auto_after]
273
+
229
274
  enqueue_drive_queue(
230
275
  repo,
231
276
  issue,
@@ -237,6 +282,8 @@ def drive_queue_add(
237
282
  resume_when=resume_when,
238
283
  hold_scope=hold_scope,
239
284
  )
285
+ if auto_after:
286
+ _record_overlap_prediction(repo, issue, prediction, auto_after)
240
287
  suffix = f" after {', '.join(after)}" if after else ""
241
288
  pinned = f" on {machine}" if machine else ""
242
289
  gate = ""
@@ -246,7 +293,169 @@ def drive_queue_add(
246
293
  gate += " (fleet-wide — nothing anywhere launches)"
247
294
  if resume_when:
248
295
  gate += f" (auto-resume when `{resume_when}` passes)"
249
- click.echo(f"queued {entry_key(repo, issue)}{pinned}{suffix}{gate}{scope_downgrade_warning}")
296
+ overlap_note = f"\n{prediction.reason}" if auto_after else ""
297
+ click.echo(
298
+ f"queued {entry_key(repo, issue)}{pinned}{suffix}{gate}"
299
+ f"{scope_downgrade_warning}{overlap_note}"
300
+ )
301
+
302
+
303
+ # ── #2247: predicted file-overlap ordering ───────────────────────────────────
304
+
305
+
306
+ def _issue_body(repo_name: str, issue_number: int) -> str:
307
+ """This issue's body from the coordinator's OWN issue store, or ``""``.
308
+
309
+ Daemon (a thin client's canonical copy) first, then the local ``issues``
310
+ cache. Deliberately NO GitHub leg: `add` is an interactive command, the
311
+ overwhelmingly common case is an issue with no `## Files` block at all,
312
+ and putting a live `gh` round-trip on every one of those to learn nothing
313
+ is a bad trade against a feature whose whole design premise is that no
314
+ prediction is a fine answer. An issue the board has never synced simply
315
+ gets today's behaviour — and #2246's post-merge sweep is what catches the
316
+ collisions prediction misses.
317
+
318
+ Fail-open at every layer — a body we cannot read means no prediction.
319
+ """
320
+ try:
321
+ from coord.client import fetch_issue, resolve_board_service # noqa: PLC0415
322
+
323
+ svc = resolve_board_service()
324
+ if svc is not None:
325
+ row = fetch_issue(svc, repo_name, int(issue_number))
326
+ if row is not None:
327
+ return str(row.get("body") or "")
328
+ except Exception: # noqa: BLE001 — see docstring
329
+ pass
330
+ try:
331
+ from coord.db import get_connection # noqa: PLC0415
332
+
333
+ row = get_connection().execute(
334
+ "SELECT body FROM issues WHERE repo_name = ? AND number = ?",
335
+ (repo_name, int(issue_number)),
336
+ ).fetchone()
337
+ return "" if row is None else str(row["body"] or "")
338
+ except Exception: # noqa: BLE001 — see docstring
339
+ return ""
340
+
341
+
342
+ def _repo_coordinates(config_path: Path, repo: str) -> tuple[str, str] | None:
343
+ """``(github slug, default branch)`` for *repo*, or ``None``."""
344
+ try:
345
+ from coord.commands._common import _load_config # noqa: PLC0415
346
+
347
+ repo_cfg = _load_config(config_path).repo(repo)
348
+ except Exception: # noqa: BLE001 — a config that won't load means no prediction
349
+ return None
350
+ if repo_cfg is None:
351
+ return None
352
+ return str(repo_cfg.github or ""), str(getattr(repo_cfg, "default_branch", "") or "main")
353
+
354
+
355
+ def _predict_overlap(
356
+ config_path: Path, repo: str, issue: int, existing_entries: list[QueueEntry],
357
+ ) -> Prediction:
358
+ """Compare this issue's declared files against work already in flight.
359
+
360
+ Same-repo only: two repos' paths cannot collide, and comparing them would
361
+ manufacture overlaps out of a shared filename. In-flight branches are
362
+ checked first (ground truth); a queued entry with no branch yet is
363
+ compared declaration-to-declaration, and only when it has one.
364
+ """
365
+ coordinates = _repo_coordinates(config_path, repo)
366
+ if coordinates is None:
367
+ return Prediction()
368
+ repo_github, base_branch = coordinates
369
+
370
+ def body_fetcher(repo_name: str, number: int) -> str:
371
+ return _issue_body(repo_name, number)
372
+
373
+ candidate = collect_candidate_files(repo, issue, body_fetcher)
374
+ if not candidate:
375
+ # Rule 3: no prediction is a valid answer. Nothing is fetched, nothing
376
+ # is compared, and the add is byte-identical to the pre-#2247 one.
377
+ return Prediction()
378
+
379
+ key = entry_key(repo, issue)
380
+ footprints = inflight_footprints(
381
+ repo, repo_github, base_branch, exclude_issue_number=issue,
382
+ )
383
+ covered = {key, *(f.key for f in footprints)}
384
+ queued = [
385
+ (e.repo, e.issue)
386
+ for e in existing_entries
387
+ if e.repo == repo
388
+ and e.key not in covered
389
+ and e.state not in TERMINAL_QUEUE_STATES
390
+ ]
391
+ footprints.extend(declared_footprints(queued, body_fetcher, exclude_keys=covered))
392
+ return predict_overlap(candidate, footprints, exclude_keys={key})
393
+
394
+
395
+ def _applicable_auto_after(
396
+ existing_entries: list[QueueEntry],
397
+ repo: str,
398
+ issue: int,
399
+ after: list[str],
400
+ prediction: Prediction,
401
+ ) -> list[str]:
402
+ """The predicted pre-reqs that are actually safe to add.
403
+
404
+ An INFERRED edge must never be able to fail an add the operator's own
405
+ flags would have allowed, so each one is validated on its own and simply
406
+ dropped if it would self-edge or close a cycle — the opposite posture to
407
+ `validate_enqueue`'s treatment of an operator-declared `--after`, which is
408
+ a typo worth reporting.
409
+ """
410
+ applied: list[str] = []
411
+ for candidate_key in prediction.after_keys:
412
+ if candidate_key in after or candidate_key in applied:
413
+ continue
414
+ try:
415
+ validate_enqueue(
416
+ existing_entries, repo, issue, [*after, *applied, candidate_key]
417
+ )
418
+ except QueueError:
419
+ continue
420
+ applied.append(candidate_key)
421
+ return applied
422
+
423
+
424
+ def _record_overlap_prediction(
425
+ repo: str, issue: int, prediction: Prediction, applied: list[str],
426
+ ) -> None:
427
+ """Persist WHY this entry was ordered — on the row and in the audit log.
428
+
429
+ Two sinks, deliberately. `last_reason` is what an operator reading `coord
430
+ drive-queue list` sees immediately, but the tick owns that column and will
431
+ overwrite it on the entry's first attempt. The audit row is the durable
432
+ one, and it carries both sides' file lists so the claim can be scored
433
+ later (`coord drive-queue overlap-report`) — without that, nobody can tell
434
+ a working predictor from a lucky one.
435
+ """
436
+ details = prediction.audit_details()
437
+ details["applied_after"] = list(applied)
438
+ try:
439
+ from coord.audit import record_audit # noqa: PLC0415
440
+
441
+ record_audit(
442
+ tier="business",
443
+ category=AUDIT_CATEGORY,
444
+ event_type=EVENT_PREDICTED,
445
+ actor="drive-queue",
446
+ summary=prediction.reason,
447
+ repo=repo,
448
+ issue=issue,
449
+ details=details,
450
+ )
451
+ except Exception: # noqa: BLE001 — recording must never fail the enqueue
452
+ pass
453
+ try:
454
+ from coord.state import update_drive_queue_entry # noqa: PLC0415
455
+
456
+ update_drive_queue_entry(repo, issue, last_reason=prediction.reason)
457
+ except Exception: # noqa: BLE001 — same
458
+ pass
250
459
 
251
460
 
252
461
  def validate_hold_flags(
@@ -641,6 +850,153 @@ def drive_queue_status(output_json: bool, config_path: Path) -> None:
641
850
  click.echo("alert: (none)")
642
851
 
643
852
 
853
+ # ── overlap-report (#2247) ───────────────────────────────────────────────────
854
+
855
+
856
+ def _branch_index(board: Any, repo: str) -> dict[int, str]:
857
+ """``issue number -> branch`` for every work-like assignment in *repo*.
858
+
859
+ Reads ``completed`` as well as ``active``: scoring happens AFTER the work
860
+ landed, which is precisely when its assignment is no longer active.
861
+ """
862
+ index: dict[int, str] = {}
863
+ for bucket in ("active", "completed"):
864
+ for a in list(getattr(board, bucket, ()) or []):
865
+ if getattr(a, "type", "") not in WORK_LIKE:
866
+ continue
867
+ if getattr(a, "repo_name", "") != repo or not getattr(a, "branch", ""):
868
+ continue
869
+ index.setdefault(int(a.issue_number), str(a.branch))
870
+ return index
871
+
872
+
873
+ @drive_queue_group.command("overlap-report")
874
+ @click.option("--repo", "repo", default=None, help="Restrict to one repo (default: every repo).")
875
+ @click.option("--limit", type=int, default=200, show_default=True, help="How many prediction rows to read back.")
876
+ @click.option("--json", "output_json", is_flag=True, default=False, help="Emit the scored rows as JSON.")
877
+ @_CONFIG_OPTION
878
+ def drive_queue_overlap_report(
879
+ repo: str | None, limit: int, output_json: bool, config_path: Path,
880
+ ) -> None:
881
+ """Score #2247's file-overlap predictions against what the branches DID touch.
882
+
883
+ Every auto-`--after` this feature applied is a checkable claim ("these two
884
+ file sets will intersect"). This reads those claims back out of the audit
885
+ log and compares them to the real diffs, recording each verdict so a
886
+ FALSE POSITIVE — an entry serialized for nothing — is a number rather than
887
+ an anecdote. A prediction whose branches cannot be diffed yet is left
888
+ unscored, not counted against the predictor.
889
+ """
890
+ from coord.audit import query_audit_log, record_audit # noqa: PLC0415
891
+
892
+ try:
893
+ predicted = query_audit_log(
894
+ event_type=EVENT_PREDICTED, category=AUDIT_CATEGORY, repo=repo, limit=limit,
895
+ )
896
+ already = query_audit_log(
897
+ event_type=EVENT_SCORED, category=AUDIT_CATEGORY, repo=repo, limit=limit,
898
+ )
899
+ except Exception as exc: # noqa: BLE001 — a read-only report never crashes
900
+ raise click.ClickException(f"could not read the audit log: {exc}") from None
901
+
902
+ scored_before = {
903
+ (str((e.get("details") or {}).get("key") or ""),
904
+ str((e.get("details") or {}).get("other_key") or ""))
905
+ for e in already.get("entries") or []
906
+ }
907
+ records = predictions_from_audit(predicted.get("entries") or [])
908
+ if not records:
909
+ click.echo("overlap predictions: (none recorded)")
910
+ return
911
+
912
+ boards: dict[str, Any] = {}
913
+ diffs: dict[tuple[str, str], list[str] | None] = {}
914
+
915
+ def actual_files(repo_name: str, issue_number: int) -> list[str] | None:
916
+ coordinates = _repo_coordinates(config_path, repo_name)
917
+ if coordinates is None:
918
+ return None
919
+ repo_github, base_branch = coordinates
920
+ if repo_name not in boards:
921
+ try:
922
+ from coord.board_service import read_board # noqa: PLC0415
923
+
924
+ boards[repo_name] = read_board()
925
+ except Exception: # noqa: BLE001 — unknown, never "no overlap"
926
+ boards[repo_name] = None
927
+ board = boards[repo_name]
928
+ if board is None:
929
+ return None
930
+ branch = _branch_index(board, repo_name).get(int(issue_number))
931
+ if not branch:
932
+ return None
933
+ cache_key = (repo_github, branch)
934
+ if cache_key not in diffs:
935
+ try:
936
+ from coord import github_ops # noqa: PLC0415
937
+
938
+ diffs[cache_key] = github_ops.get_compare_files(
939
+ repo_github, base_branch, branch
940
+ )
941
+ except Exception: # noqa: BLE001 — unknown, never "no overlap"
942
+ diffs[cache_key] = None
943
+ return diffs[cache_key]
944
+
945
+ rows: list[dict[str, Any]] = []
946
+ for record in records:
947
+ other = parse_key(record["other_key"])
948
+ outcome = OUTCOME_UNKNOWN
949
+ if other is not None:
950
+ outcome = classify_outcome(
951
+ record["files"],
952
+ actual_files(record["repo"], record["issue"]),
953
+ actual_files(other[0], other[1]),
954
+ )
955
+ rows.append({**record, "outcome": outcome})
956
+ if outcome == OUTCOME_UNKNOWN:
957
+ continue
958
+ if (record["key"], record["other_key"]) in scored_before:
959
+ continue
960
+ record_audit(
961
+ tier="business",
962
+ category=AUDIT_CATEGORY,
963
+ event_type=EVENT_SCORED,
964
+ actor="drive-queue",
965
+ summary=f"{record['key']} ordered after {record['other_key']}: {outcome}",
966
+ repo=record["repo"],
967
+ issue=record["issue"],
968
+ details={
969
+ "key": record["key"],
970
+ "other_key": record["other_key"],
971
+ "outcome": outcome,
972
+ "predicted_files": record["files"],
973
+ "source": record["source"],
974
+ },
975
+ )
976
+
977
+ accuracy = tally(r["outcome"] for r in rows)
978
+ if output_json:
979
+ click.echo(
980
+ _json.dumps(
981
+ {
982
+ "rows": rows,
983
+ "confirmed": accuracy.confirmed,
984
+ "false_positive": accuracy.false_positive,
985
+ "unknown": accuracy.unknown,
986
+ "precision": accuracy.precision,
987
+ }
988
+ )
989
+ )
990
+ return
991
+ click.echo(f"overlap predictions: {accuracy.render()}")
992
+ for row in rows:
993
+ files = ", ".join(row["files"][:3]) or "(none)"
994
+ click.echo(
995
+ f" {row['key']} after {row['other_key']} [{row['source']}] "
996
+ f"{row['outcome']} — {files}"
997
+ )
998
+
999
+
644
1000
  # ── resume (#1757) ───────────────────────────────────────────────────────────
645
1001
 
646
1002
 
@@ -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: