code-coordinator 0.5.85__tar.gz → 0.5.86__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 (830) hide show
  1. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/merge.py +112 -0
  5. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/merge_queue.py +277 -0
  6. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/serve_app.py +18 -0
  7. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/OPERATING_GOTCHAS.md +70 -0
  8. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_merge.py +176 -0
  9. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_merge_queue.py +363 -0
  10. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_serve.py +112 -0
  11. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/.claude/commands/board.md +0 -0
  12. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/.claude/commands/complete-session.md +0 -0
  13. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/.claude/commands/coordinator.md +0 -0
  14. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/.githooks/_lib.sh +0 -0
  15. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/.githooks/post-checkout +0 -0
  16. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/.githooks/post-commit +0 -0
  17. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/.githooks/post-merge +0 -0
  18. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  19. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/.github/coord-ci-acceptance.yml +0 -0
  20. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/.github/workflows/auto-release.yml +0 -0
  21. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/.github/workflows/cargo-test.yml +0 -0
  22. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/.github/workflows/publish.yml +0 -0
  23. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/.github/workflows/release-tui.yml +0 -0
  24. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/.github/workflows/test.yml +0 -0
  25. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/.gitignore +0 -0
  26. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/CLAUDE.md +0 -0
  27. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/GOAL.md +0 -0
  28. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/LICENSE +0 -0
  29. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/MANIFEST.in +0 -0
  30. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/README.md +0 -0
  31. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/code_coordinator.egg-info/SOURCES.txt +0 -0
  32. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/code_coordinator.egg-info/dependency_links.txt +0 -0
  33. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/code_coordinator.egg-info/entry_points.txt +0 -0
  34. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/code_coordinator.egg-info/requires.txt +0 -0
  35. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/code_coordinator.egg-info/scm_file_list.json +0 -0
  36. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/code_coordinator.egg-info/top_level.txt +0 -0
  37. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/__init__.py +0 -0
  38. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/_board_mapping.py +0 -0
  39. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/acceptance.py +0 -0
  40. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/acceptance_drivers.py +0 -0
  41. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/agent.py +0 -0
  42. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/agent_app.py +0 -0
  43. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/agent_update.py +0 -0
  44. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/agents/opencode/.gitignore +0 -0
  45. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/agents/opencode/agents/work.md +0 -0
  46. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/agents/opencode/routing.jsonc +0 -0
  47. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/audit.py +0 -0
  48. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/auto_loop.py +0 -0
  49. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/board_bool_guard.py +0 -0
  50. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/board_service.py +0 -0
  51. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/board_wire.py +0 -0
  52. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/brain.py +0 -0
  53. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/branch_model.py +0 -0
  54. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/bug_intake.py +0 -0
  55. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/cargo_cache.py +0 -0
  56. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/ci_github.py +0 -0
  57. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/ci_store.py +0 -0
  58. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/claim.py +0 -0
  59. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/cli.py +0 -0
  60. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/client.py +0 -0
  61. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/__init__.py +0 -0
  62. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/_common.py +0 -0
  63. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/acceptance.py +0 -0
  64. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/agent_ops.py +0 -0
  65. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/audit.py +0 -0
  66. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/chat.py +0 -0
  67. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/dispatch.py +0 -0
  68. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/dispatch_workers.py +0 -0
  69. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/drive.py +0 -0
  70. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/drive_queue.py +0 -0
  71. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/gate_a.py +0 -0
  72. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/gates.py +0 -0
  73. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/issues.py +0 -0
  74. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/lifecycle.py +0 -0
  75. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/milestone.py +0 -0
  76. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/plan_followup.py +0 -0
  77. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/plans.py +0 -0
  78. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/portal.py +0 -0
  79. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/release.py +0 -0
  80. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/repo.py +0 -0
  81. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/report.py +0 -0
  82. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/review.py +0 -0
  83. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/scorecard.py +0 -0
  84. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/sessions.py +0 -0
  85. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/setup.py +0 -0
  86. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/status.py +0 -0
  87. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/terminal.py +0 -0
  88. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/test_gate.py +0 -0
  89. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/commands/tui.py +0 -0
  90. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/comments.py +0 -0
  91. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/config.py +0 -0
  92. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/conflict_fix.py +0 -0
  93. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dao.py +0 -0
  94. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/__init__.py +0 -0
  95. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/fixture.py +0 -0
  96. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/index.html +0 -0
  97. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/server.py +0 -0
  98. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/terminal.py +0 -0
  99. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/.gitignore +0 -0
  100. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/components.json +0 -0
  101. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/dist/assets/Gallery-Cq84itDE.js +0 -0
  102. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  103. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/dist/assets/Terminal-DOXLcMue.js +0 -0
  104. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/dist/assets/index-DHn-RIJ8.js +0 -0
  105. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  106. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  107. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  108. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  109. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  110. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/dist/index.html +0 -0
  111. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  112. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/dist/sw.js +0 -0
  113. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  114. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  115. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  116. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  117. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  118. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  119. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  120. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  121. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  122. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  123. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/eslint.config.js +0 -0
  124. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/index.html +0 -0
  125. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  126. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/package-lock.json +0 -0
  127. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/package.json +0 -0
  128. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  129. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/playwright.config.ts +0 -0
  130. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/postcss.config.js +0 -0
  131. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  132. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  133. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  134. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/App.tsx +0 -0
  135. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/api/client.ts +0 -0
  136. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  137. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  138. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  139. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  140. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  141. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  142. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  143. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  144. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  145. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  146. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  147. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  148. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  149. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  150. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  151. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  152. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  153. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  154. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  155. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  156. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  157. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  158. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  159. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  160. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  161. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  162. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  163. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  164. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  165. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  166. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  167. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  168. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  169. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  170. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  171. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/index.css +0 -0
  172. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  173. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  174. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/main.tsx +0 -0
  175. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  176. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  177. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  178. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  179. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  180. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  181. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  182. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  183. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  184. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  185. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  186. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  187. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  188. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  189. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  190. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  191. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  192. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  193. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  194. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  195. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  196. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  197. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  198. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/tailwind.config.js +0 -0
  199. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/tsconfig.json +0 -0
  200. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  201. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dashboard/webapp/vite.config.ts +0 -0
  202. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/db.py +0 -0
  203. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dead_end.py +0 -0
  204. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/README.md +0 -0
  205. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-agent.service +0 -0
  206. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-db-backup.service +0 -0
  207. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-db-backup.sh +0 -0
  208. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-db-backup.timer +0 -0
  209. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-drive-queue.service +0 -0
  210. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-drive-queue.timer +0 -0
  211. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-notify.service +0 -0
  212. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-notify.timer +0 -0
  213. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-release-propagate.service +0 -0
  214. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-release-propagate.timer +0 -0
  215. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-release-window.service +0 -0
  216. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-release-window.timer +0 -0
  217. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-serve.service +0 -0
  218. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-web-dist-build.service +0 -0
  219. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-web-dist-build.timer +0 -0
  220. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy/coord-web.service +0 -0
  221. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy_manifest.py +0 -0
  222. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deploy_units.py +0 -0
  223. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/deps.py +0 -0
  224. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/diagnose.py +0 -0
  225. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dispatch.py +0 -0
  226. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/dist_name.py +0 -0
  227. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/drive.py +0 -0
  228. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/drive_queue.py +0 -0
  229. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/drive_state.py +0 -0
  230. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/events.py +0 -0
  231. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/failure_class.py +0 -0
  232. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/filelock.py +0 -0
  233. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/fleet_config_health.py +0 -0
  234. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/freshness.py +0 -0
  235. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/gate_a.py +0 -0
  236. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/gate_b.py +0 -0
  237. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/gate_snapshot.py +0 -0
  238. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/gates.py +0 -0
  239. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/github_ops.py +0 -0
  240. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/goal.py +0 -0
  241. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/graph_health.py +0 -0
  242. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/__init__.py +0 -0
  243. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/aggregate.py +0 -0
  244. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/__init__.py +0 -0
  245. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/agent_install.py +0 -0
  246. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/cargo_targets.py +0 -0
  247. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/claude_binary.py +0 -0
  248. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/deploy_lane_facts.py +0 -0
  249. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/disk.py +0 -0
  250. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/fleet_board.py +0 -0
  251. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  252. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/fleet_phantom.py +0 -0
  253. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/fleet_unit_drift.py +0 -0
  254. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/graph.py +0 -0
  255. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/graphify_cli.py +0 -0
  256. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/plan_usage.py +0 -0
  257. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/repo_state.py +0 -0
  258. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/spawned_coord.py +0 -0
  259. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/timer_active.py +0 -0
  260. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/toolchain.py +0 -0
  261. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/unit_drift.py +0 -0
  262. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/unit_enablement.py +0 -0
  263. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/checks/worktrees.py +0 -0
  264. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/cli.py +0 -0
  265. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/context.py +0 -0
  266. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/fleet_snapshot.py +0 -0
  267. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/models.py +0 -0
  268. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/pypi.py +0 -0
  269. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/registry.py +0 -0
  270. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/render.py +0 -0
  271. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/health/units.py +0 -0
  272. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/hooks.py +0 -0
  273. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/housekeeping.py +0 -0
  274. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/interactive.py +0 -0
  275. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/issue_store.py +0 -0
  276. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/liveness_auditor.py +0 -0
  277. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/machine_pause.py +0 -0
  278. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/milestone_chat.py +0 -0
  279. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/milestone_dispatch.py +0 -0
  280. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/milestone_gate.py +0 -0
  281. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/milestone_order.py +0 -0
  282. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/mock_author.py +0 -0
  283. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/models.py +0 -0
  284. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/network.py +0 -0
  285. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/new_issue_chat.py +0 -0
  286. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/notifier/__init__.py +0 -0
  287. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/notifier/baseline.py +0 -0
  288. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/notifier/cli.py +0 -0
  289. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/notifier/collect.py +0 -0
  290. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/notifier/digest.py +0 -0
  291. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/notifier/models.py +0 -0
  292. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/notifier/predicate.py +0 -0
  293. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/notifier/service.py +0 -0
  294. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/notifier/store.py +0 -0
  295. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/notifier/transport.py +0 -0
  296. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/notify.py +0 -0
  297. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/openapi.py +0 -0
  298. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/overlap_fence.py +0 -0
  299. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/parentage.py +0 -0
  300. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/parentage_github.py +0 -0
  301. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/pipeline.py +0 -0
  302. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/plan_parser.py +0 -0
  303. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/plans.py +0 -0
  304. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/platform_paths.py +0 -0
  305. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/portal_bridge.py +0 -0
  306. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/pr_body_lint.py +0 -0
  307. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/prereqs.py +0 -0
  308. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/progress.py +0 -0
  309. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/providers/__init__.py +0 -0
  310. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/providers/base.py +0 -0
  311. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/providers/claude.py +0 -0
  312. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/providers/claude_pty.py +0 -0
  313. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/providers/opencode.py +0 -0
  314. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/reconcile.py +0 -0
  315. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/refine_chat.py +0 -0
  316. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/release_cordon.py +0 -0
  317. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/release_propagate.py +0 -0
  318. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/release_verify.py +0 -0
  319. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/release_window.py +0 -0
  320. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/repo_edit.py +0 -0
  321. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/repo_onboard.py +0 -0
  322. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/reports.py +0 -0
  323. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/revalidate.py +0 -0
  324. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/review.py +0 -0
  325. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/scorecard.py +0 -0
  326. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/skills/update-issue/SKILL.md +0 -0
  327. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/smoke.py +0 -0
  328. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/spend_ceiling.py +0 -0
  329. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/split_work.py +0 -0
  330. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/stage_projection.py +0 -0
  331. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/state.py +0 -0
  332. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/test_author.py +0 -0
  333. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/test_chat.py +0 -0
  334. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/test_orchestrator.py +0 -0
  335. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/test_report.py +0 -0
  336. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/tui_release.py +0 -0
  337. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/usage.py +0 -0
  338. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/usage_limits.py +0 -0
  339. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/usage_rollup.py +0 -0
  340. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coord/worker_events.py +0 -0
  341. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/coordinator.example.yml +0 -0
  342. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-agent.service +0 -0
  343. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-db-backup.service +0 -0
  344. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-db-backup.sh +0 -0
  345. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-db-backup.timer +0 -0
  346. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-drive-queue.service +0 -0
  347. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-drive-queue.timer +0 -0
  348. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-notify.service +0 -0
  349. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-notify.timer +0 -0
  350. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-release-propagate.service +0 -0
  351. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-release-propagate.timer +0 -0
  352. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-release-window.service +0 -0
  353. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-release-window.timer +0 -0
  354. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-serve.service +0 -0
  355. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-web-dist-build.service +0 -0
  356. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-web-dist-build.sh +0 -0
  357. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-web-dist-build.timer +0 -0
  358. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-web-rollback.sh +0 -0
  359. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/coord-web.service +0 -0
  360. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/deploy/node-shim.sh +0 -0
  361. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/AGENT_OPERATIONS.md +0 -0
  362. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/ARCHITECTURE.md +0 -0
  363. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/ARCH_SECURITY_GATES.md +0 -0
  364. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/COCKPIT.md +0 -0
  365. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/CONTROL_CENTER.md +0 -0
  366. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/COST_DISCIPLINE.md +0 -0
  367. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/CROSS_PLATFORM.md +0 -0
  368. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/CUSTOMER_PORTAL.md +0 -0
  369. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/DRIVE_QUEUE.md +0 -0
  370. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/EPHEMERAL_WORKERS.md +0 -0
  371. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/FORGE_MIGRATION.md +0 -0
  372. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/GRAPHIFY_SETUP.md +0 -0
  373. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/ISSUE_GUIDANCE.md +0 -0
  374. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/MAC_MINI.md +0 -0
  375. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  376. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/NOTIFIER.md +0 -0
  377. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/OPENCODE_VERIFICATION.md +0 -0
  378. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/ORACLE_LOOP.md +0 -0
  379. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/PHONE_WEBAPP.md +0 -0
  380. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/PIPELINE_V2.md +0 -0
  381. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/PLATFORM_EVOLUTION.md +0 -0
  382. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/SECOND_BACKEND.md +0 -0
  383. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/STORE_SERVICE.md +0 -0
  384. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  385. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/WEB_CONTROL_CENTER.md +0 -0
  386. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/mocks/web/README.md +0 -0
  387. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/mocks/web/_tokens.css +0 -0
  388. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/mocks/web/issue-detail.html +0 -0
  389. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/mocks/web/pipeline-narrow.html +0 -0
  390. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/docs/mocks/web/pipeline-wide.html +0 -0
  391. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/graphify-out/.gitignore +0 -0
  392. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/install-agent.sh +0 -0
  393. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/pyproject.toml +0 -0
  394. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/audit_review_verdict_overrides.py +0 -0
  395. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  396. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/azure-workers/build-worker-image.sh +0 -0
  397. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/azure-workers/coordinator-machine.py +0 -0
  398. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/azure-workers/epic-down.sh +0 -0
  399. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/azure-workers/epic-up.sh +0 -0
  400. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/azure-workers/preflight.sh +0 -0
  401. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/azure-workers/provision-worker.sh +0 -0
  402. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  403. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  404. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/azure-workers/verify-github-token.sh +0 -0
  405. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/codegen.py +0 -0
  406. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/coord-test-runner.sh +0 -0
  407. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/drive-batch.sh +0 -0
  408. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/gen_board_fixture.py +0 -0
  409. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/next_release_tag.py +0 -0
  410. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/run_tests_in_populated_home.sh +0 -0
  411. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/run_tests_without_gh.sh +0 -0
  412. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/smoke_437_interactive.py +0 -0
  413. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/verify_878_review_capture.py +0 -0
  414. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/verify_release_published.py +0 -0
  415. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/scripts/verify_release_wheel.py +0 -0
  416. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/setup.cfg +0 -0
  417. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/SMOKE_SET.md +0 -0
  418. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/__init__.py +0 -0
  419. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  420. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-33/contract.md +0 -0
  421. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-33/manifest.yml +0 -0
  422. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  423. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  424. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  425. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  426. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-37/conftest.py +0 -0
  427. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-37/contract.md +0 -0
  428. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-37/manifest.yml +0 -0
  429. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  430. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  431. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-38/contract.md +0 -0
  432. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-38/manifest.yml +0 -0
  433. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  434. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  435. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  436. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  437. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  438. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  439. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  440. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  441. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  442. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  443. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-51/contract.md +0 -0
  444. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  445. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  446. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-51/manifest.yml +0 -0
  447. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  448. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-51/tsconfig.json +0 -0
  449. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  450. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/conftest.py +0 -0
  451. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/board-pipeline-basic.json +0 -0
  452. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  453. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  454. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  455. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/playwright/all_pass.json +0 -0
  456. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  457. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/playwright/mixed_fail.json +0 -0
  458. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  459. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  460. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/playwright/skip.json +0 -0
  461. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/playwright/truncated.json +0 -0
  462. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  463. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  464. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  465. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  466. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  467. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  468. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  469. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  470. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_acceptance.py +0 -0
  471. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_acceptance_drivers.py +0 -0
  472. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent.py +0 -0
  473. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_api_error.py +0 -0
  474. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_app.py +0 -0
  475. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_branch_base.py +0 -0
  476. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_branch_capture.py +0 -0
  477. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_config_free_1712.py +0 -0
  478. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_deploy_units_endpoint.py +0 -0
  479. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_dirty_worktree.py +0 -0
  480. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_graph_self_heal.py +0 -0
  481. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_health_h3.py +0 -0
  482. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_idle_restart.py +0 -0
  483. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_push_failure.py +0 -0
  484. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_reap.py +0 -0
  485. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_repos_and_pull.py +0 -0
  486. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_restart_services_endpoint.py +0 -0
  487. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_startup_diagnostics.py +0 -0
  488. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_update.py +0 -0
  489. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_update_bluegreen.py +0 -0
  490. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_usage_limit.py +0 -0
  491. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_agent_zero_commit.py +0 -0
  492. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_ambient_home_isolation.py +0 -0
  493. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_approve_reject_plan.py +0 -0
  494. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_approve_usage_gate.py +0 -0
  495. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_assignment_already_recorded_daemon.py +0 -0
  496. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_audit_log.py +0 -0
  497. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_audit_outcome.py +0 -0
  498. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_audit_query.py +0 -0
  499. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_auto_loop.py +0 -0
  500. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_auto_release_publish_2035.py +0 -0
  501. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_base_checkout_restore.py +0 -0
  502. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_board_cap_762.py +0 -0
  503. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_board_fixture.py +0 -0
  504. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_board_read_path.py +0 -0
  505. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_board_service.py +0 -0
  506. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_board_state.py +0 -0
  507. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_board_wire.py +0 -0
  508. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_brain.py +0 -0
  509. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_branch_model.py +0 -0
  510. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_bug_intake.py +0 -0
  511. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_build_worker_image_env_update.py +0 -0
  512. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cargo_cache.py +0 -0
  513. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_ci_acceptance_gate_1950.py +0 -0
  514. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_ci_parity_2091.py +0 -0
  515. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_ci_store.py +0 -0
  516. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_claim.py +0 -0
  517. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_acceptance.py +0 -0
  518. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_assign.py +0 -0
  519. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  520. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_assign_interactive_remote.py +0 -0
  521. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_assign_provider.py +0 -0
  522. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  523. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_audit.py +0 -0
  524. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_chat_continue.py +0 -0
  525. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_diagnose_config_provenance.py +0 -0
  526. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_diagnose_graph.py +0 -0
  527. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_doctor.py +0 -0
  528. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_doctor_config_free_1801.py +0 -0
  529. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  530. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_drive.py +0 -0
  531. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_drive_queue.py +0 -0
  532. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_escalate.py +0 -0
  533. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_fix_headless_review.py +0 -0
  534. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_gate_a.py +0 -0
  535. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_install_drift.py +0 -0
  536. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_install_skills.py +0 -0
  537. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_issue_create_label.py +0 -0
  538. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_issue_reopen.py +0 -0
  539. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_milestone_assign.py +0 -0
  540. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_milestone_capture.py +0 -0
  541. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_milestone_chat_add_child.py +0 -0
  542. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_milestone_dispatch.py +0 -0
  543. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_milestone_gate_b.py +0 -0
  544. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_milestone_gate_c.py +0 -0
  545. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_milestone_order.py +0 -0
  546. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  547. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_milestone_ship.py +0 -0
  548. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_network.py +0 -0
  549. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_new_issue_chat.py +0 -0
  550. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_plans.py +0 -0
  551. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_portal.py +0 -0
  552. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_pull_artifact.py +0 -0
  553. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_queue.py +0 -0
  554. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_reattach_sessions.py +0 -0
  555. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_refine_board.py +0 -0
  556. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_release_preflight.py +0 -0
  557. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_release_propagate.py +0 -0
  558. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_release_window.py +0 -0
  559. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_repo_2220.py +0 -0
  560. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_scorecard.py +0 -0
  561. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_set_review_findings.py +0 -0
  562. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_status_advisory_terminal.py +0 -0
  563. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_status_merge_queue.py +0 -0
  564. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_status_provider.py +0 -0
  565. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_status_review_finalizing.py +0 -0
  566. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_status_test_failed_tag.py +0 -0
  567. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_status_usage_limit.py +0 -0
  568. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_sync_comments_873.py +0 -0
  569. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_test_plan.py +0 -0
  570. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_track.py +0 -0
  571. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_tui_update.py +0 -0
  572. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cli_wait.py +0 -0
  573. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_client_base_install.py +0 -0
  574. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_comments.py +0 -0
  575. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_completion_summary.py +0 -0
  576. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_config.py +0 -0
  577. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_config_acceptance.py +0 -0
  578. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_config_audit.py +0 -0
  579. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_config_pricing.py +0 -0
  580. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_config_usage_gate.py +0 -0
  581. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_conflict_fix.py +0 -0
  582. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_conflict_fix_semantic.py +0 -0
  583. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_coord_test.py +0 -0
  584. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_coord_test_runner_baseline.py +0 -0
  585. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_coord_test_runner_routing.py +0 -0
  586. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_coord_test_runner_toolchain.py +0 -0
  587. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_coord_web_sse_restart_live.py +0 -0
  588. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_coordinator_machine.py +0 -0
  589. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_cross_platform_imports.py +0 -0
  590. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_dashboard.py +0 -0
  591. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_dashboard_fixture.py +0 -0
  592. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_dashboard_terminal.py +0 -0
  593. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_dashboard_terminal_live.py +0 -0
  594. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_db.py +0 -0
  595. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_dead_end.py +0 -0
  596. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_deploy_coord_db_backup.py +0 -0
  597. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_deploy_coord_web_dist.py +0 -0
  598. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_deploy_coord_web_rollback.py +0 -0
  599. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_deploy_drive_queue_unit.py +0 -0
  600. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_deploy_manifest.py +0 -0
  601. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_deploy_units_lane.py +0 -0
  602. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_deploy_web_unit.py +0 -0
  603. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_deps.py +0 -0
  604. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_diagnose.py +0 -0
  605. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_dispatch.py +0 -0
  606. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_dispatch_target_validation.py +0 -0
  607. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_dist_name.py +0 -0
  608. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_done_housekeeping.py +0 -0
  609. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_drive.py +0 -0
  610. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_drive_queue.py +0 -0
  611. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_drive_state.py +0 -0
  612. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_drive_tmux.py +0 -0
  613. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_epic_up_capability_detection.py +0 -0
  614. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  615. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_epic_up_image_provenance.py +0 -0
  616. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_errors.py +0 -0
  617. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_events.py +0 -0
  618. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_failure_class.py +0 -0
  619. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_filelock.py +0 -0
  620. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  621. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_fix_of_force_override.py +0 -0
  622. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_fleet_config_health.py +0 -0
  623. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_fleet_health_probes.py +0 -0
  624. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_fleet_health_snapshot.py +0 -0
  625. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_freshness.py +0 -0
  626. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_gate_a.py +0 -0
  627. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_gate_b.py +0 -0
  628. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_gate_snapshot_staleness.py +0 -0
  629. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_gates.py +0 -0
  630. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  631. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_generated_types_fixture.py +0 -0
  632. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_github_ops.py +0 -0
  633. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_goal.py +0 -0
  634. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_graph_health.py +0 -0
  635. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_graph_selfheal_absent_2237.py +0 -0
  636. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_handoff.py +0 -0
  637. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_health_checks.py +0 -0
  638. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_health_cli.py +0 -0
  639. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_health_cli_graph.py +0 -0
  640. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_health_config.py +0 -0
  641. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_health_context.py +0 -0
  642. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_health_deploy_lane_facts.py +0 -0
  643. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_health_incident_regression.py +0 -0
  644. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_health_pypi.py +0 -0
  645. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_health_registry.py +0 -0
  646. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_health_timer_active.py +0 -0
  647. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_health_toolchain.py +0 -0
  648. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_health_unit_drift.py +0 -0
  649. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_health_unit_enablement.py +0 -0
  650. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_hooks.py +0 -0
  651. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_human_attended_437.py +0 -0
  652. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_init.py +0 -0
  653. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_integration.py +0 -0
  654. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_interactive_briefing_echo.py +0 -0
  655. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_interactive_prefill_state.py +0 -0
  656. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_interactive_session_relaunch.py +0 -0
  657. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_interactive_test_verdict_backstop.py +0 -0
  658. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_interactive_token_attribution.py +0 -0
  659. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_interactive_worktree.py +0 -0
  660. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_issue_store_seam.py +0 -0
  661. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_liveness_auditor.py +0 -0
  662. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_liveness_notify.py +0 -0
  663. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_machine_pause.py +0 -0
  664. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_merge_verify.py +0 -0
  665. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_milestone_chat.py +0 -0
  666. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_milestone_dispatch.py +0 -0
  667. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_milestone_gate.py +0 -0
  668. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_milestone_order.py +0 -0
  669. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_milestone_seam.py +0 -0
  670. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_mock_author.py +0 -0
  671. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_model_tiering.py +0 -0
  672. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_models.py +0 -0
  673. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_models_config_labels.py +0 -0
  674. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_needs_attention.py +0 -0
  675. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_network.py +0 -0
  676. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_new_issue_chat.py +0 -0
  677. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_next_release_tag.py +0 -0
  678. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_no_direct_gh_calls.py +0 -0
  679. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_node_shim.py +0 -0
  680. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_notifier_baseline.py +0 -0
  681. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_notifier_cli.py +0 -0
  682. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_notifier_collect.py +0 -0
  683. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_notifier_config.py +0 -0
  684. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_notifier_drive_seam.py +0 -0
  685. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_notifier_isolation.py +0 -0
  686. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_notifier_predicate.py +0 -0
  687. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_notifier_quiet_hours.py +0 -0
  688. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_notifier_service.py +0 -0
  689. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_notify.py +0 -0
  690. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_notify_drain.py +0 -0
  691. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_openapi.py +0 -0
  692. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_operational_defaults.py +0 -0
  693. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_overlap_fence.py +0 -0
  694. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_packaged_deploy_units.py +0 -0
  695. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_parentage.py +0 -0
  696. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_paste_landed.py +0 -0
  697. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_pipeline.py +0 -0
  698. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_plan_followup_approve_plan_command.py +0 -0
  699. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_plan_followup_pr_command.py +0 -0
  700. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_plan_followup_review_command.py +0 -0
  701. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_plan_only.py +0 -0
  702. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_plan_parser.py +0 -0
  703. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_platform_paths.py +0 -0
  704. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_portal_bridge.py +0 -0
  705. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_portal_config.py +0 -0
  706. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_pr_body_lint.py +0 -0
  707. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_prereqs.py +0 -0
  708. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_production_db_guard.py +0 -0
  709. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_progress.py +0 -0
  710. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_provider_seam.py +0 -0
  711. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_providers.py +0 -0
  712. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_providers_config_labels.py +0 -0
  713. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_providers_pty.py +0 -0
  714. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_quiet_hours.py +0 -0
  715. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_quiet_hours_store_2146.py +0 -0
  716. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_reap_merged_sessions.py +0 -0
  717. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_reap_stale_interactive_tick.py +0 -0
  718. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_reconcile_branch.py +0 -0
  719. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_reconcile_completions.py +0 -0
  720. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_reconcile_merges.py +0 -0
  721. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_reconcile_usage_limit_done.py +0 -0
  722. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_refine_chat.py +0 -0
  723. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_release_cordon_2101.py +0 -0
  724. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_release_cordon_deadlock_2240.py +0 -0
  725. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_release_propagate.py +0 -0
  726. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_release_unified_1242.py +0 -0
  727. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_release_verify.py +0 -0
  728. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_release_window.py +0 -0
  729. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_remote_auto_prune.py +0 -0
  730. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_remote_interactive_reaper.py +0 -0
  731. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_repo_edit_2220.py +0 -0
  732. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_repo_graph_fleet_2237.py +0 -0
  733. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_repo_onboard_2220.py +0 -0
  734. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_report_result_push.py +0 -0
  735. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_reports.py +0 -0
  736. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_retry.py +0 -0
  737. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_retry_advisory_1606.py +0 -0
  738. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_retry_type_1636.py +0 -0
  739. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_revalidate.py +0 -0
  740. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_review.py +0 -0
  741. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_review_end_review_without_verdict.py +0 -0
  742. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_review_parse_failure_diagnostic.py +0 -0
  743. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_review_reaffirm.py +0 -0
  744. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_review_state.py +0 -0
  745. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_review_verdict_backstop.py +0 -0
  746. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_review_verdict_override_audit.py +0 -0
  747. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_review_verdict_relay.py +0 -0
  748. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_review_zero_commits.py +0 -0
  749. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_scoped_review_wiring.py +0 -0
  750. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_scorecard.py +0 -0
  751. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_serve_app_board_trim.py +0 -0
  752. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_session.py +0 -0
  753. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_slice_issue_attribution.py +0 -0
  754. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_smoke.py +0 -0
  755. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_smoke_live_checkout_restore.py +0 -0
  756. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_smoke_workflow.py +0 -0
  757. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_spend_ceiling.py +0 -0
  758. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_spend_ceiling_coordinator.py +0 -0
  759. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_split.py +0 -0
  760. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_split_work.py +0 -0
  761. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_stage_projection.py +0 -0
  762. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_stalled_pipeline.py +0 -0
  763. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_state.py +0 -0
  764. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_state_review_findings_daemon.py +0 -0
  765. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_status_fleet_footer.py +0 -0
  766. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_stop_1567.py +0 -0
  767. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_stuck.py +0 -0
  768. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_terminal_command.py +0 -0
  769. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_test_author.py +0 -0
  770. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_test_chat.py +0 -0
  771. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_test_orchestrator.py +0 -0
  772. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_test_report.py +0 -0
  773. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_test_verdict_parsing.py +0 -0
  774. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_test_verdict_transcript_floor.py +0 -0
  775. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_thin_client_board_audit.py +0 -0
  776. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_thin_client_config_load_1080.py +0 -0
  777. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_thin_client_daemon_routing_906.py +0 -0
  778. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_tmux_host.py +0 -0
  779. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_tmux_session.py +0 -0
  780. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_transcript_floor.py +0 -0
  781. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_usage.py +0 -0
  782. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_usage_limits.py +0 -0
  783. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_usage_rollup.py +0 -0
  784. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_venv_live_install_2121.py +0 -0
  785. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_version_single_source.py +0 -0
  786. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_watch.py +0 -0
  787. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_worker_events.py +0 -0
  788. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_worker_image_pin_sync.py +0 -0
  789. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_worker_safety.py +0 -0
  790. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_worker_test_scoping.py +0 -0
  791. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_worktree.py +0 -0
  792. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  793. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/Cargo.lock +0 -0
  794. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/Cargo.toml +0 -0
  795. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/cargo-config-local-quadraui.toml.example +0 -0
  796. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/audit.rs +0 -0
  797. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/chat.rs +0 -0
  798. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/data.rs +0 -0
  799. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/dialogs.rs +0 -0
  800. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/drive.rs +0 -0
  801. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/drive_queue.rs +0 -0
  802. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/escalation.rs +0 -0
  803. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/events.rs +0 -0
  804. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/fixtures.rs +0 -0
  805. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/fleet_health.rs +0 -0
  806. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/fleet_sessions.rs +0 -0
  807. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/fleet_terminals.rs +0 -0
  808. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/format.rs +0 -0
  809. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/milestone_dag.rs +0 -0
  810. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/mod.rs +0 -0
  811. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/msv.rs +0 -0
  812. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/pipeline.rs +0 -0
  813. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/plans.rs +0 -0
  814. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/render.rs +0 -0
  815. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/reports.rs +0 -0
  816. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/sessions.rs +0 -0
  817. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/settings_ui.rs +0 -0
  818. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/sidebar.rs +0 -0
  819. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/terminal.rs +0 -0
  820. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/tests.rs +0 -0
  821. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/types.rs +0 -0
  822. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/app/workspace.rs +0 -0
  823. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/bin/gtk.rs +0 -0
  824. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/commands.rs +0 -0
  825. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/lib.rs +0 -0
  826. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/main.rs +0 -0
  827. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/src/settings.rs +0 -0
  828. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/tests/acceptance.rs +0 -0
  829. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/tests/cli.rs +0 -0
  830. {code_coordinator-0.5.85 → code_coordinator-0.5.86}/tui/tests/fixtures/board_sample.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.85
3
+ Version: 0.5.86
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.85
3
+ Version: 0.5.86
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.85",
2
+ "tag": "0.5.86",
3
3
  "distance": 0,
4
- "node": "g87a8be6dfe549ad5607352dbdda991a3ed87f1fd",
4
+ "node": "g38313e96b2a9fecca7cffcdcfc0c9f15b86ea28b",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-14"
@@ -317,6 +317,101 @@ def _dispatch_revalidation_conflicts(conflicted, config, *, dry_run: bool) -> No
317
317
  _dispatch_conflict_fixes(events, config, dry_run=False)
318
318
 
319
319
 
320
+ def _sweep_sibling_conflicts(events, items, config, gh_ops, *, dry_run: bool) -> list:
321
+ """#2246: after a merge lands, ask GitHub which sibling PRs it just broke.
322
+
323
+ A merge into ``target_branch`` can invalidate every other open PR against
324
+ that same branch. GitHub computes exactly which ones, asynchronously and
325
+ for free, and until #2246 nothing asked at the moment it matters —
326
+ ``mergeable`` was consulted only at *merge* time, i.e. one drive attempt
327
+ too late. On 2026-08-14 that cost four terminal ``blocked`` entries across
328
+ two repos: quadraui #306/#309 presented as "smoke gate — test verdict
329
+ stale", claude-coordinator #2234 as "checks_failed … (unknown)" with
330
+ ``coord fix`` asserting "CI is RED" for a PR whose CI had never run at all
331
+ (GitHub builds ``pull_request`` workflows from ``refs/pull/N/merge``, which
332
+ cannot exist while the PR conflicts, so *zero* check-suites were queued and
333
+ the absence was read as failure — #2244). No surface said *conflict*.
334
+
335
+ Two things happen for each sibling GitHub now reports ``CONFLICTING``,
336
+ both inside :func:`coord.merge_queue.sweep_sibling_conflicts` and the
337
+ dispatch call below:
338
+
339
+ 1. The entry is parked at ``CONFLICT`` with an error naming the merge that
340
+ broke it — so the next surface to read it says the true thing instead of
341
+ re-deriving whichever gate happened to be failing for an unrelated
342
+ reason, and ``coord drive``'s #1738 re-test arm stops answering a
343
+ conflict with a suite run.
344
+ 2. It is handed to :func:`_dispatch_conflict_fixes` as an ordinary
345
+ ``conflict`` event — the SAME call the post-``process()`` path makes —
346
+ so #241's conflict-fix worker is dispatched with every guard intact:
347
+ :func:`coord.merge_queue.classify_conflict` must still read the error as
348
+ ``rebaseable``, the #241/#784 retry cap still flips a second failure to
349
+ ``HUMAN_REQUIRED``, and ``dispatch_conflict_fix``'s in-flight check
350
+ still refuses a duplicate. Routed through that function rather than
351
+ calling ``dispatch_conflict_fix`` directly for the reason #2231 gives:
352
+ a second dispatch site with its own copy of those guards is how they
353
+ drift apart. That dispatch call can advance ``ev.entry.state`` a
354
+ second time (e.g. to ``HUMAN_REQUIRED`` on a retry-cap hit) — this
355
+ function persists that too, scoped to just the swept entries, so a
356
+ sibling this caller doesn't hold in ``items`` (the ``--only`` path)
357
+ doesn't have its escalation silently dropped on the floor while the
358
+ audit log claims it happened (#2246 review).
359
+
360
+ Skipped entirely under ``--dry-run`` — ``process()`` emits ``merged``
361
+ events there too, but nothing actually landed, so no sibling's mergeability
362
+ can have changed and marking one would be a lie written to the queue.
363
+
364
+ Returns the conflict events so the caller can fold them into its summary;
365
+ never raises (the sweep itself fails open — see its docstring). The merge
366
+ that triggered this has already succeeded and must not be undone or
367
+ obscured by a failed read afterwards.
368
+ """
369
+ if dry_run:
370
+ return []
371
+ from coord import merge_queue as _mq # noqa: PLC0415
372
+
373
+ try:
374
+ sweep_events = _mq.sweep_sibling_conflicts(events, items, gh_ops)
375
+ except Exception as e: # noqa: BLE001 — never let the sweep undo a merge
376
+ click.echo(
377
+ f" sibling-conflict sweep failed (merge itself is unaffected): {e!r}",
378
+ err=True,
379
+ )
380
+ return []
381
+ for ev in sweep_events:
382
+ e = ev.entry
383
+ click.echo(
384
+ f" {e.repo_name} #{e.issue_number} ({e.branch}): {ev.kind} — "
385
+ f"{ev.message}"
386
+ )
387
+ _dispatch_conflict_fixes(sweep_events, config, dry_run=False)
388
+ # #2246 review: `_dispatch_conflict_fixes` can advance a swept sibling's
389
+ # state a second time in place — e.g. `entry.state = HUMAN_REQUIRED` when
390
+ # `has_prior_conflict_fix` finds this sibling already burned a
391
+ # conflict-fix attempt against an earlier conflict. `mq.sweep_sibling_
392
+ # conflicts` above already persisted its own CONFLICT write, but for a
393
+ # sibling this caller doesn't hold in `items` (the `--only` path, the
394
+ # exact one #2246 targets), nothing after that dispatch call ever writes
395
+ # the newer HUMAN_REQUIRED back — `merge()`'s own final save keys only on
396
+ # `only_entry`. Without this, the audit log records "manual resolution
397
+ # required" while the board/queue still say CONFLICT: the split-brain
398
+ # class this repo's CLAUDE.md calls out (#1832/#2085). Persist here,
399
+ # scoped to just the entries this sweep touched — never the full queue —
400
+ # so a fresh conflict elsewhere isn't clobbered.
401
+ if sweep_events:
402
+ try:
403
+ fresh = _mq.load_queue()
404
+ by_id = {ev.entry.assignment_id: ev.entry for ev in sweep_events}
405
+ _mq.save_queue([by_id.get(x.assignment_id, x) for x in fresh])
406
+ except Exception as e: # noqa: BLE001 — fail open, per the sweep's own contract
407
+ click.echo(
408
+ " sibling-conflict fix-dispatch state failed to persist "
409
+ f"(merge itself is unaffected): {e!r}",
410
+ err=True,
411
+ )
412
+ return sweep_events
413
+
414
+
320
415
  def _dispatch_conflict_fixes(events, config, *, dry_run: bool) -> None:
321
416
  """#241: classify any conflict events and dispatch a conflict-fix worker
322
417
  for the eligible ones. Mutates each conflict event's ``ev.entry.state``
@@ -1691,6 +1786,16 @@ def merge(
1691
1786
  # before the save below so a retry-cap/non-rebaseable HUMAN_REQUIRED
1692
1787
  # mutation on only_entry.state is persisted, not lost.
1693
1788
  _dispatch_conflict_fixes(events_only, cfg_only, dry_run=dry_run)
1789
+ # #2246: `--only` merges one entry, but the branch it just moved is
1790
+ # shared — every OTHER queued PR based on it may have become
1791
+ # CONFLICTING a second ago. This is the drive-queue's path (`coord
1792
+ # drive` and the TUI both merge via `--only`), so it is exactly where
1793
+ # the 2026-08-14 collisions were minted. The sweep persists any
1794
+ # sibling it parks itself: the save below deliberately writes back
1795
+ # only `only_entry`.
1796
+ _sweep_sibling_conflicts(
1797
+ events_only, only_items, cfg_only, gh_ops, dry_run=dry_run,
1798
+ )
1694
1799
  if not dry_run:
1695
1800
  # Save only the modified entry back; all other entries are untouched.
1696
1801
  all_items_only = mq.load_queue()
@@ -2003,6 +2108,13 @@ def merge(
2003
2108
  # review, so the --only path below can share it).
2004
2109
  _dispatch_conflict_fixes(events, cfg, dry_run=dry_run)
2005
2110
 
2111
+ # #2246: whatever just landed may have invalidated its siblings — ask
2112
+ # GitHub now, while the merge that caused it is still the obvious
2113
+ # explanation, rather than letting the next drive attempt discover it as
2114
+ # some unrelated gate failure. Entries it parks are in `items`, so the
2115
+ # save below carries the mutation through naturally.
2116
+ _sweep_sibling_conflicts(events, items, cfg, gh_ops, dry_run=dry_run)
2117
+
2006
2118
  # Save state only when we actually moved
2007
2119
  if not dry_run:
2008
2120
  # Persist the updated entries by merging back over the on-disk queue.
@@ -3017,6 +3017,283 @@ def reconcile_conflict_entries(gh_ops: "GhOps") -> list["MergeEvent"]:
3017
3017
  return events
3018
3018
 
3019
3019
 
3020
+ # ── Post-merge sibling conflict sweep (#2246) ───────────────────────────────
3021
+
3022
+ #: How many times the sweep re-asks GitHub for a sibling's mergeability while
3023
+ #: it still reads ``UNKNOWN``. GitHub computes ``mergeable`` asynchronously and
3024
+ #: a merge that JUST landed is precisely the moment it is least likely to have
3025
+ #: settled — treating the first ``None`` as "clean" is the bug (#2246), so the
3026
+ #: probe is retried a bounded number of times before giving up.
3027
+ SIBLING_SWEEP_ATTEMPTS = 3
3028
+
3029
+ #: Seconds between sweep probe rounds. Total added wall-clock is at most
3030
+ #: ``(SIBLING_SWEEP_ATTEMPTS - 1) * SIBLING_SWEEP_INTERVAL`` regardless of how
3031
+ #: many siblings are in the queue — see :func:`sweep_sibling_conflicts`, which
3032
+ #: probes in ROUNDS (everyone, then only the still-unresolved) rather than
3033
+ #: exhausting the retry budget per entry.
3034
+ SIBLING_SWEEP_INTERVAL = 2.0
3035
+
3036
+
3037
+ def merged_bases(events: Iterable["MergeEvent"]) -> set[tuple[str, str]]:
3038
+ """The ``(repo_github, target_branch)`` pairs a batch of events just moved.
3039
+
3040
+ Scoped deliberately to ``kind == "merged"``: a base branch only invalidates
3041
+ siblings when something actually landed on it. Every other event kind
3042
+ (``opened``, ``sized``, ``conflict``, gate blocks) leaves the base exactly
3043
+ where it was and must not trigger a sweep.
3044
+ """
3045
+ return {
3046
+ (ev.entry.repo_github, ev.entry.target_branch)
3047
+ for ev in events
3048
+ if ev.kind == "merged" and ev.entry.repo_github and ev.entry.target_branch
3049
+ }
3050
+
3051
+
3052
+ def sibling_sweep_candidates(
3053
+ events: Iterable["MergeEvent"], items: Iterable["QueuedMerge"],
3054
+ ) -> list["QueuedMerge"]:
3055
+ """The queue entries a just-landed merge could plausibly have broken.
3056
+
3057
+ An entry qualifies when **all** of the following hold:
3058
+
3059
+ * Its ``(repo_github, target_branch)`` is one the batch actually moved
3060
+ (:func:`merged_bases`) — #2246's "scope to the merged repo, and only to
3061
+ PRs whose base is the branch that just moved".
3062
+ * It is not itself one of the entries that merged.
3063
+ * It has an open PR (``pr_number``) — GitHub can only compute
3064
+ mergeability for a PR, and an entry with no PR has nothing to mark.
3065
+ * It is still ``PENDING``. This is the **transition** filter #2246 asks
3066
+ for, expressed in the state the queue already keeps: ``CONFLICT`` is the
3067
+ durable record of "we already know this one is conflicting", so an entry
3068
+ parked there was somebody else's problem before this merge and is left
3069
+ alone (it is #1477's :func:`reconcile_conflict_entries` that unparks it).
3070
+ ``HUMAN_REQUIRED``/``MERGED``/``SKIPPED`` are equally not ours to touch.
3071
+ * Its cached ``error`` does not already read as a conflict. Belt-and-braces
3072
+ for the same rule: an entry can be ``PENDING`` while carrying a conflict
3073
+ error from a prior attempt (a re-enqueue, a #1477 unpark that raced),
3074
+ and re-dispatching a conflict-fix for it on every merge is exactly the
3075
+ loop #2246 says not to build.
3076
+
3077
+ Note what is deliberately *not* required: that the sibling be blocked on
3078
+ some particular gate. The whole point is that the gate it is blocked on
3079
+ (stale smoke verdict, "checks_failed (unknown)") is the WRONG reason — the
3080
+ real blocker is the conflict, and it is only visible if we look regardless.
3081
+ """
3082
+ moved = merged_bases(events)
3083
+ if not moved:
3084
+ return []
3085
+ merged_ids = {
3086
+ ev.entry.assignment_id for ev in events if ev.kind == "merged"
3087
+ }
3088
+ out: list[QueuedMerge] = []
3089
+ for entry in items:
3090
+ if entry.assignment_id in merged_ids:
3091
+ continue
3092
+ if (entry.repo_github, entry.target_branch) not in moved:
3093
+ continue
3094
+ if entry.state != PENDING or not entry.pr_number:
3095
+ continue
3096
+ if classify_conflict(entry.error) == "rebaseable":
3097
+ continue
3098
+ out.append(entry)
3099
+ return out
3100
+
3101
+
3102
+ def sibling_conflict_error(
3103
+ entry: "QueuedMerge", events: Iterable["MergeEvent"],
3104
+ ) -> str:
3105
+ """The ``entry.error`` text a swept sibling is parked with.
3106
+
3107
+ Two hard requirements, both load-bearing:
3108
+
3109
+ 1. It must contain wording :func:`classify_conflict` reads as
3110
+ ``"rebaseable"`` (here: ``merge conflict``), because the whole value of
3111
+ the sweep is that ``coord merge``'s existing ``_dispatch_conflict_fixes``
3112
+ step then routes it to the #241 worker with every guard intact — the
3113
+ retry cap, the in-flight check, the HUMAN_REQUIRED escalation.
3114
+ 2. It must NOT contain any ``_HUMAN_SIGNALS`` wording ("review required",
3115
+ "permission", "protected branch", …), which would classify it as a
3116
+ branch-protection problem and escalate straight to a human.
3117
+
3118
+ Beyond that it names the merge that caused it, because "which PR broke me"
3119
+ was the fact a human had to reconstruct by hand in both 2026-08-14
3120
+ collisions.
3121
+ """
3122
+ culprits = sorted({
3123
+ f"{ev.entry.repo_name}#{ev.entry.issue_number}"
3124
+ + (f" (PR #{ev.entry.pr_number})" if ev.entry.pr_number else "")
3125
+ for ev in events
3126
+ if ev.kind == "merged"
3127
+ and ev.entry.repo_github == entry.repo_github
3128
+ and ev.entry.target_branch == entry.target_branch
3129
+ })
3130
+ blame = ", ".join(culprits) if culprits else "a sibling merge"
3131
+ return (
3132
+ f"merge conflict: GitHub reports PR #{entry.pr_number} ({entry.branch}) "
3133
+ f"as CONFLICTING against {entry.target_branch} immediately after "
3134
+ f"{blame} landed on it. The blocker is a content conflict — not a "
3135
+ "stale test verdict and not a CI failure (a conflicting PR has no "
3136
+ f"{entry.target_branch} merge ref, so GitHub queues no pull_request "
3137
+ "check-suites for it at all). Rebase the branch onto "
3138
+ f"{entry.target_branch} and resolve (#2246)."
3139
+ )
3140
+
3141
+
3142
+ def sweep_sibling_conflicts(
3143
+ events: list["MergeEvent"],
3144
+ items: list["QueuedMerge"],
3145
+ gh_ops: "GhOps",
3146
+ *,
3147
+ attempts: int = SIBLING_SWEEP_ATTEMPTS,
3148
+ interval: float = SIBLING_SWEEP_INTERVAL,
3149
+ sleep=None,
3150
+ persist: bool = True,
3151
+ ) -> list["MergeEvent"]:
3152
+ """Ask GitHub which siblings *events*' merges just broke (#2246).
3153
+
3154
+ When a PR merges it can silently invalidate every other open PR against
3155
+ the same base. GitHub computes that for us exactly and for free, and
3156
+ before this nothing asked at the one moment it matters — ``mergeable`` was
3157
+ only consulted at merge time, i.e. after the next drive attempt was
3158
+ already spent. On 2026-08-14 that cost four terminal ``blocked`` entries
3159
+ across two repos, presented as "smoke gate — test verdict stale" and
3160
+ "checks_failed … (unknown)", neither of which said *conflict*.
3161
+
3162
+ Called immediately after :func:`process` with the events it returned and
3163
+ the item list the caller is about to persist. For every sibling that now
3164
+ reads ``CONFLICTING`` (see :func:`sibling_sweep_candidates` for who
3165
+ qualifies), the entry is moved to ``CONFLICT`` with a
3166
+ :func:`sibling_conflict_error` explaining what happened, and a
3167
+ ``conflict`` :class:`MergeEvent` is returned. The caller echoes those
3168
+ events and hands them to its usual conflict-fix dispatch step — the sweep
3169
+ itself never dispatches, so #241's retry cap and in-flight guards keep
3170
+ living in exactly one place.
3171
+
3172
+ **UNKNOWN is not clean.** GitHub recomputes mergeability asynchronously,
3173
+ and the instant after a merge is when it is most likely to still be
3174
+ computing — the first read came back ``UNKNOWN`` repeatedly in the
3175
+ 2026-08-14 session. Probing is therefore retried up to *attempts* times,
3176
+ in ROUNDS: every unresolved sibling is probed, then only the ones still
3177
+ unresolved are probed again after *interval* seconds. Total added
3178
+ wall-clock is bounded by ``(attempts - 1) * interval`` no matter how many
3179
+ siblings there are, rather than growing per entry.
3180
+
3181
+ **Fails open, always.** A ``gh`` error, a ``gh_ops`` with no
3182
+ ``check_pr_mergeable`` (the duck-typed stubs in older tests), an
3183
+ unreadable queue — every one of them yields "no sweep", never an
3184
+ exception. The merge that triggered this already succeeded; a read failure
3185
+ afterwards must not undo or obscure it.
3186
+
3187
+ Cost is one API call per candidate sibling per merge — single digits on
3188
+ this fleet — and zero when nothing merged, which is the overwhelmingly
3189
+ common tick.
3190
+
3191
+ Persistence: mutations are written straight back to the queue (``persist``
3192
+ is only turned off by tests). Entries the caller already holds in *items*
3193
+ are mutated **in place**, so the caller's own subsequent
3194
+ ``save_queue(merge_over_disk)`` step re-writes the same values rather than
3195
+ clobbering them — the same convention
3196
+ ``coord.commands.merge._dispatch_conflict_fixes`` relies on. Siblings the
3197
+ caller does *not* hold (the ``--only`` path, where ``items`` is a single
3198
+ entry) are persisted by this function's own write, which reloads the
3199
+ queue fresh and overrides **only** the entries this call itself moved to
3200
+ ``CONFLICT`` (one per event in the return value) — never the full *rows*
3201
+ snapshot this function built before its retry-sleep loop, which can be
3202
+ stale by the time we get here and would otherwise clobber any concurrent
3203
+ writer's changes to unrelated rows.
3204
+ """
3205
+ if not any(ev.kind == "merged" for ev in events):
3206
+ return []
3207
+ probe = getattr(gh_ops, "check_pr_mergeable", None)
3208
+ if probe is None:
3209
+ return []
3210
+
3211
+ try:
3212
+ disk = load_queue()
3213
+ except Exception: # noqa: BLE001 — a queue read error must not undo a merge
3214
+ _log.warning("sibling sweep: could not read the merge queue", exc_info=True)
3215
+ return []
3216
+
3217
+ # Prefer the caller's live objects for any row it already holds: mutating
3218
+ # a second copy loaded here would be silently reverted by the caller's own
3219
+ # save-over-disk step a few lines later.
3220
+ pool = {x.assignment_id: x for x in items}
3221
+ rows = [pool.get(x.assignment_id, x) for x in disk]
3222
+ known = {x.assignment_id for x in rows}
3223
+ rows.extend(x for x in items if x.assignment_id not in known)
3224
+
3225
+ candidates = sibling_sweep_candidates(events, rows)
3226
+ if not candidates:
3227
+ return []
3228
+
3229
+ _sleep = sleep if sleep is not None else time.sleep
3230
+ verdicts: dict[str, bool] = {}
3231
+ unresolved = list(candidates)
3232
+ for attempt in range(max(1, attempts)):
3233
+ if not unresolved:
3234
+ break
3235
+ if attempt:
3236
+ # Only ever paid when GitHub is genuinely still computing.
3237
+ _sleep(interval)
3238
+ still: list[QueuedMerge] = []
3239
+ for entry in unresolved:
3240
+ try:
3241
+ verdict = probe(entry.repo_github, entry.pr_number)
3242
+ except Exception: # noqa: BLE001 — fail open, per entry
3243
+ verdict = None
3244
+ if verdict is None:
3245
+ still.append(entry)
3246
+ else:
3247
+ verdicts[entry.assignment_id] = bool(verdict)
3248
+ unresolved = still
3249
+
3250
+ for entry in unresolved:
3251
+ # Never resolved inside the budget. Deliberately NOT marked: an
3252
+ # inconclusive read is not evidence of a conflict, and #1477's
3253
+ # reconcile pass plus the next ordinary merge attempt will both look
3254
+ # again. Logged so a systematically-slow repo is attributable.
3255
+ _log.info(
3256
+ "sibling sweep: %s#%s (PR #%s) still UNKNOWN after %d attempt(s)"
3257
+ " — left PENDING",
3258
+ entry.repo_name, entry.issue_number, entry.pr_number, max(1, attempts),
3259
+ )
3260
+
3261
+ out: list[MergeEvent] = []
3262
+ for entry in candidates:
3263
+ if verdicts.get(entry.assignment_id) is not False:
3264
+ continue
3265
+ entry.error = sibling_conflict_error(entry, events)
3266
+ entry.state = CONFLICT
3267
+ out.append(MergeEvent(
3268
+ entry, "conflict",
3269
+ f"became CONFLICTING when a sibling merged into "
3270
+ f"{entry.target_branch} — parked as a conflict, not a gate "
3271
+ "failure (#2246)",
3272
+ ))
3273
+
3274
+ if out and persist:
3275
+ try:
3276
+ fresh = load_queue()
3277
+ # Scope the override to the entries THIS call actually mutated
3278
+ # (one per `out` event) — never the full `rows` snapshot. `rows`
3279
+ # was built before the retry-sleep loop above (up to
3280
+ # ``(attempts - 1) * interval``, longer under real GitHub
3281
+ # latency), so by the time we get here it can be stale for every
3282
+ # entry in the queue, not just the swept candidates. Building
3283
+ # `by_id` from it and replacing the whole table would silently
3284
+ # revert any concurrent writer's changes to unrelated rows made
3285
+ # during that wait — exactly the convention this function's
3286
+ # docstring promises to follow (mutate in place, override only
3287
+ # what changed, default everything else to the fresh read).
3288
+ by_id = {ev.entry.assignment_id: ev.entry for ev in out}
3289
+ save_queue([by_id.get(x.assignment_id, x) for x in fresh])
3290
+ except Exception: # noqa: BLE001 — fail open
3291
+ _log.warning(
3292
+ "sibling sweep: could not persist conflict markers", exc_info=True,
3293
+ )
3294
+ return out
3295
+
3296
+
3020
3297
  def resolve_entry_key(items: list["QueuedMerge"], key: str) -> "QueuedMerge | None":
3021
3298
  """Resolve *key* to a queue entry by whatever identifier the read path
3022
3299
  printed — ``assignment_id``, the durable ``repo#issue`` form, a bare
@@ -1247,6 +1247,24 @@ def _auto_drain_tick(config: Config) -> "list":
1247
1247
  skip_smoke=False,
1248
1248
  )
1249
1249
 
1250
+ # #2246: anything that just landed may have made a SIBLING PR
1251
+ # CONFLICTING — GitHub knows exactly which, and auto-drain (unlike a
1252
+ # human running `coord merge`) has no other moment to ask. Held inside
1253
+ # the same lock as everything above: it is another full load->mutate->
1254
+ # save of the queue table and would race a concurrent `/merge`
1255
+ # otherwise. Best-effort — a sweep failure must not undo or obscure
1256
+ # the merge that triggered it, nor disable the persist step below.
1257
+ #
1258
+ # Marks only. Auto-drain has never dispatched a conflict-fix (that
1259
+ # lives in the `coord merge` CLI's `_dispatch_conflict_fixes`), and
1260
+ # #2246's floor is that the entry report *conflict* as its blocking
1261
+ # reason instead of whichever gate happened to be red — which is
1262
+ # exactly what parking it at CONFLICT with an explanatory error does.
1263
+ try:
1264
+ events.extend(mq.sweep_sibling_conflicts(events, ready_items, github_ops))
1265
+ except Exception: # noqa: BLE001
1266
+ log.warning("auto-drain: sibling-conflict sweep failed", exc_info=True)
1267
+
1250
1268
  # Persist: merge the mutated rows back over the on-disk queue (same
1251
1269
  # pattern as ``coord merge`` in cli.py to avoid clobbering unrelated rows).
1252
1270
  fresh = mq.load_queue()
@@ -964,3 +964,73 @@ If the conflict-fix worker itself fails, the #241/#784 retry cap still flips
964
964
  the entry to `HUMAN_REQUIRED` on the second attempt — rule #10's escape hatch
965
965
  applies from there. Nothing here loosens that: this only removes the case
966
966
  where **no** mechanism ran at all.
967
+
968
+ ## 19. A merge silently breaks its siblings, and until #2246 nothing asked GitHub which ones
969
+
970
+ Rule #18 is about **gate ordering** — a conflict reported as a stale verdict
971
+ because the smoke gate short-circuits first. This one is about **when we
972
+ look**. Both present as "the surface says something that isn't the blocker",
973
+ and they were filed the same day for a reason.
974
+
975
+ When a PR merges, every other open PR against that same base can become
976
+ unmergeable. GitHub computes exactly which ones, asynchronously and for free,
977
+ and `GhOps.check_pr_mergeable` has always been able to read it — but it was
978
+ consulted only at *merge* time, i.e. one drive attempt after the moment that
979
+ mattered. The merge that invalidated the sibling is the event; nothing was
980
+ listening to it.
981
+
982
+ Measured on 2026-08-14, two independent collisions, both through the drive
983
+ queue:
984
+
985
+ | collision | trigger | how it presented | cost |
986
+ |---|---|---|---|
987
+ | quadraui #306, #309 | #307/#308 merged first; all four append to `quadraui/tests/tui_example_driver.rs` | `smoke gate — test verdict stale` | both terminal `blocked`, 2 attempts each, 3 wasted `--revalidate` suite runs, 2 `coord fix` dispatches |
988
+ | claude-coordinator #2234 | #2230 merged; both touch `coord/drive_queue.py` | `checks_failed … (unknown)`, and `coord fix` reported *"CI is RED"* | terminal `blocked`, 2 attempts, a wasted empty commit, one `coord fix` dispatch |
989
+
990
+ In neither case did any surface say *conflict* until a human went looking. In
991
+ the second, **CI had never run at all**: GitHub builds `pull_request`
992
+ workflows from the merge ref (`refs/pull/N/merge`), which cannot exist while
993
+ the PR conflicts, so zero check-suites were queued and the absence was misread
994
+ as failure (that misreading is #2244's arm of the same day).
995
+
996
+ ### What runs now
997
+
998
+ Immediately after any merge lands, `merge_queue.sweep_sibling_conflicts` asks
999
+ GitHub about the other queued PRs **in that repo, on the branch that just
1000
+ moved**. A sibling GitHub now reports `CONFLICTING` is parked at `CONFLICT`
1001
+ with an error naming the merge that broke it, and handed to the same
1002
+ `_dispatch_conflict_fixes` call a failed merge attempt makes — so #241's
1003
+ `conflict-fix` worker is dispatched with the retry cap, the in-flight guard,
1004
+ and the `HUMAN_REQUIRED` escalation all intact.
1005
+
1006
+ Wired into `coord merge` (both the whole-queue path and `--only`, which is how
1007
+ `coord drive` and the TUI merge) and into the daemon's auto-drain tick. Never
1008
+ under `--dry-run`: nothing landed, so no sibling's mergeability can have
1009
+ changed and marking one would write a lie into the queue.
1010
+
1011
+ ### Four things to know when reading it
1012
+
1013
+ - **`mergeable` is not instant.** GitHub recomputes it asynchronously and the
1014
+ instant after a merge is when it is least likely to have settled — `UNKNOWN`
1015
+ came back repeatedly on 2026-08-14. The probe retries (`SIBLING_SWEEP_ATTEMPTS`,
1016
+ default 3) in **rounds**: everyone, then only the still-unresolved, so total
1017
+ added wall-clock is bounded by the attempt budget however long the queue is.
1018
+ A sibling still `UNKNOWN` when the budget runs out is left `PENDING` — an
1019
+ inconclusive read is not evidence of a conflict.
1020
+ - **Only transitions.** An entry already at `CONFLICT` is never probed. That
1021
+ state is the queue's own record of "we already know", so a PR that was
1022
+ conflicting before the merge is somebody else's problem — #1477's
1023
+ `reconcile_conflict_entries` is what unparks it when the fix lands. Without
1024
+ that rule, every merge in the repo would re-dispatch a conflict-fix for it,
1025
+ forever.
1026
+ - **Cost is one API call per queued sibling per merge**, not per tick. On this
1027
+ fleet that is single digits, and it is exactly zero on the overwhelmingly
1028
+ common tick where nothing merged.
1029
+ - **It fails open.** A `gh` error, an unreadable queue, a `gh_ops` without the
1030
+ probe — every one yields "no sweep", never an exception. The merge that
1031
+ triggered it has already succeeded and must not be undone or obscured by a
1032
+ read that failed afterwards.
1033
+
1034
+ Related: **#1894** — an unavailable CI must not consume retry budget, and a
1035
+ structurally-impossible CI (a conflicting PR has no merge ref, so no
1036
+ check-suite) is the same class.