code-coordinator 0.5.56__tar.gz → 0.5.58__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 (814) hide show
  1. {code_coordinator-0.5.56/code_coordinator.egg-info → code_coordinator-0.5.58}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.56 → code_coordinator-0.5.58/code_coordinator.egg-info}/PKG-INFO +1 -1
  3. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/code_coordinator.egg-info/SOURCES.txt +5 -0
  4. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/code_coordinator.egg-info/scm_file_list.json +5 -0
  5. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/cli.py +4 -0
  7. code_coordinator-0.5.58/coord/commands/portal.py +120 -0
  8. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/config.py +118 -0
  9. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/db.py +8 -1
  10. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/merge_queue.py +83 -4
  11. code_coordinator-0.5.58/coord/portal_bridge.py +350 -0
  12. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coordinator.example.yml +29 -0
  13. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_merge.py +20 -0
  14. code_coordinator-0.5.58/tests/test_cli_portal.py +163 -0
  15. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_db.py +73 -0
  16. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_merge_queue.py +147 -17
  17. code_coordinator-0.5.58/tests/test_portal_bridge.py +296 -0
  18. code_coordinator-0.5.58/tests/test_portal_config.py +124 -0
  19. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/tests/fixtures/board_sample.json +1 -0
  20. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/.claude/commands/board.md +0 -0
  21. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/.claude/commands/complete-session.md +0 -0
  22. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/.claude/commands/coordinator.md +0 -0
  23. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/.githooks/_lib.sh +0 -0
  24. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/.githooks/post-checkout +0 -0
  25. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/.githooks/post-commit +0 -0
  26. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/.githooks/post-merge +0 -0
  27. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  28. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/.github/workflows/auto-release.yml +0 -0
  29. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/.github/workflows/cargo-test.yml +0 -0
  30. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/.github/workflows/publish.yml +0 -0
  31. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/.github/workflows/release-tui.yml +0 -0
  32. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/.github/workflows/test.yml +0 -0
  33. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/.gitignore +0 -0
  34. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/CLAUDE.md +0 -0
  35. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/GOAL.md +0 -0
  36. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/LICENSE +0 -0
  37. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/MANIFEST.in +0 -0
  38. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/README.md +0 -0
  39. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/code_coordinator.egg-info/dependency_links.txt +0 -0
  40. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/code_coordinator.egg-info/entry_points.txt +0 -0
  41. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/code_coordinator.egg-info/requires.txt +0 -0
  42. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/code_coordinator.egg-info/top_level.txt +0 -0
  43. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/__init__.py +0 -0
  44. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/_board_mapping.py +0 -0
  45. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/acceptance.py +0 -0
  46. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/acceptance_drivers.py +0 -0
  47. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/agent.py +0 -0
  48. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/agent_app.py +0 -0
  49. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/agent_update.py +0 -0
  50. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/agents/opencode/.gitignore +0 -0
  51. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/agents/opencode/agents/work.md +0 -0
  52. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/agents/opencode/routing.jsonc +0 -0
  53. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/audit.py +0 -0
  54. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/auto_loop.py +0 -0
  55. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/board_bool_guard.py +0 -0
  56. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/board_service.py +0 -0
  57. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/board_wire.py +0 -0
  58. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/brain.py +0 -0
  59. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/branch_model.py +0 -0
  60. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/bug_intake.py +0 -0
  61. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/cargo_cache.py +0 -0
  62. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/ci_github.py +0 -0
  63. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/ci_store.py +0 -0
  64. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/claim.py +0 -0
  65. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/client.py +0 -0
  66. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/__init__.py +0 -0
  67. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/_common.py +0 -0
  68. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/acceptance.py +0 -0
  69. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/agent_ops.py +0 -0
  70. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/audit.py +0 -0
  71. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/chat.py +0 -0
  72. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/dispatch.py +0 -0
  73. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/dispatch_workers.py +0 -0
  74. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/drive.py +0 -0
  75. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/drive_queue.py +0 -0
  76. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/gate_a.py +0 -0
  77. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/gates.py +0 -0
  78. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/issues.py +0 -0
  79. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/lifecycle.py +0 -0
  80. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/merge.py +0 -0
  81. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/milestone.py +0 -0
  82. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/plan_followup.py +0 -0
  83. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/plans.py +0 -0
  84. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/release.py +0 -0
  85. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/report.py +0 -0
  86. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/review.py +0 -0
  87. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/scorecard.py +0 -0
  88. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/sessions.py +0 -0
  89. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/setup.py +0 -0
  90. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/status.py +0 -0
  91. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/terminal.py +0 -0
  92. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/test_gate.py +0 -0
  93. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/commands/tui.py +0 -0
  94. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/comments.py +0 -0
  95. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/conflict_fix.py +0 -0
  96. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dao.py +0 -0
  97. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/__init__.py +0 -0
  98. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/fixture.py +0 -0
  99. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/index.html +0 -0
  100. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/server.py +0 -0
  101. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/terminal.py +0 -0
  102. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/.gitignore +0 -0
  103. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/components.json +0 -0
  104. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js +0 -0
  105. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  106. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js +0 -0
  107. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js +0 -0
  108. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  109. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  110. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  111. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  112. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  113. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/dist/index.html +0 -0
  114. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  115. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/dist/sw.js +0 -0
  116. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  117. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  118. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  119. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  120. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  121. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  122. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  123. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  124. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  125. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  126. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/eslint.config.js +0 -0
  127. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/index.html +0 -0
  128. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  129. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/package-lock.json +0 -0
  130. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/package.json +0 -0
  131. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  132. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/playwright.config.ts +0 -0
  133. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/postcss.config.js +0 -0
  134. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  135. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  136. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  137. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/App.tsx +0 -0
  138. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/api/client.ts +0 -0
  139. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  140. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  141. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  142. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  143. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  144. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  145. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  146. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  147. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  148. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  149. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  150. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  151. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  152. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  153. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  154. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  155. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  156. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  157. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  158. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  159. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  160. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  161. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  162. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  163. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  164. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  165. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  166. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  167. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  168. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  169. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  170. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  171. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  172. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  173. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  174. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/index.css +0 -0
  175. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  176. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  177. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/main.tsx +0 -0
  178. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  179. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  180. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  181. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  182. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  183. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  184. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  185. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  186. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  187. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  188. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  189. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  190. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  191. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  192. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  193. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  194. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  195. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  196. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  197. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  198. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  199. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  200. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  201. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/tailwind.config.js +0 -0
  202. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/tsconfig.json +0 -0
  203. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  204. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dashboard/webapp/vite.config.ts +0 -0
  205. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dead_end.py +0 -0
  206. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/README.md +0 -0
  207. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-agent.service +0 -0
  208. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-db-backup.service +0 -0
  209. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-db-backup.sh +0 -0
  210. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-db-backup.timer +0 -0
  211. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-drive-queue.service +0 -0
  212. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-drive-queue.timer +0 -0
  213. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-notify.service +0 -0
  214. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-notify.timer +0 -0
  215. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-release-propagate.service +0 -0
  216. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-release-propagate.timer +0 -0
  217. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-release-window.service +0 -0
  218. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-release-window.timer +0 -0
  219. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-serve.service +0 -0
  220. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-web-dist-build.service +0 -0
  221. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-web-dist-build.timer +0 -0
  222. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy/coord-web.service +0 -0
  223. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy_manifest.py +0 -0
  224. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deploy_units.py +0 -0
  225. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/deps.py +0 -0
  226. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/diagnose.py +0 -0
  227. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dispatch.py +0 -0
  228. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/dist_name.py +0 -0
  229. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/drive.py +0 -0
  230. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/drive_queue.py +0 -0
  231. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/drive_state.py +0 -0
  232. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/events.py +0 -0
  233. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/failure_class.py +0 -0
  234. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/filelock.py +0 -0
  235. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/fleet_config_health.py +0 -0
  236. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/freshness.py +0 -0
  237. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/gate_a.py +0 -0
  238. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/gate_b.py +0 -0
  239. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/gate_snapshot.py +0 -0
  240. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/gates.py +0 -0
  241. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/github_ops.py +0 -0
  242. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/goal.py +0 -0
  243. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/graph_health.py +0 -0
  244. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/__init__.py +0 -0
  245. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/aggregate.py +0 -0
  246. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/__init__.py +0 -0
  247. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/agent_install.py +0 -0
  248. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/cargo_targets.py +0 -0
  249. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/claude_binary.py +0 -0
  250. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/deploy_lane_facts.py +0 -0
  251. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/disk.py +0 -0
  252. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/fleet_board.py +0 -0
  253. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  254. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/fleet_phantom.py +0 -0
  255. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/fleet_unit_drift.py +0 -0
  256. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/graph.py +0 -0
  257. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/plan_usage.py +0 -0
  258. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/repo_state.py +0 -0
  259. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/spawned_coord.py +0 -0
  260. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/timer_active.py +0 -0
  261. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/toolchain.py +0 -0
  262. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/unit_drift.py +0 -0
  263. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/unit_enablement.py +0 -0
  264. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/checks/worktrees.py +0 -0
  265. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/cli.py +0 -0
  266. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/context.py +0 -0
  267. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/fleet_snapshot.py +0 -0
  268. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/models.py +0 -0
  269. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/pypi.py +0 -0
  270. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/registry.py +0 -0
  271. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/render.py +0 -0
  272. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/health/units.py +0 -0
  273. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/hooks.py +0 -0
  274. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/housekeeping.py +0 -0
  275. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/interactive.py +0 -0
  276. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/issue_store.py +0 -0
  277. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/liveness_auditor.py +0 -0
  278. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/machine_pause.py +0 -0
  279. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/milestone_chat.py +0 -0
  280. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/milestone_dispatch.py +0 -0
  281. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/milestone_gate.py +0 -0
  282. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/milestone_order.py +0 -0
  283. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/mock_author.py +0 -0
  284. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/models.py +0 -0
  285. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/network.py +0 -0
  286. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/new_issue_chat.py +0 -0
  287. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/notifier/__init__.py +0 -0
  288. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/notifier/baseline.py +0 -0
  289. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/notifier/cli.py +0 -0
  290. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/notifier/collect.py +0 -0
  291. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/notifier/digest.py +0 -0
  292. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/notifier/models.py +0 -0
  293. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/notifier/predicate.py +0 -0
  294. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/notifier/service.py +0 -0
  295. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/notifier/store.py +0 -0
  296. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/notifier/transport.py +0 -0
  297. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/notify.py +0 -0
  298. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/openapi.py +0 -0
  299. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/overlap_fence.py +0 -0
  300. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/parentage.py +0 -0
  301. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/parentage_github.py +0 -0
  302. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/pipeline.py +0 -0
  303. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/plan_parser.py +0 -0
  304. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/plans.py +0 -0
  305. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/platform_paths.py +0 -0
  306. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/pr_body_lint.py +0 -0
  307. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/prereqs.py +0 -0
  308. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/progress.py +0 -0
  309. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/providers/__init__.py +0 -0
  310. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/providers/base.py +0 -0
  311. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/providers/claude.py +0 -0
  312. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/providers/claude_pty.py +0 -0
  313. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/providers/opencode.py +0 -0
  314. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/reconcile.py +0 -0
  315. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/refine_chat.py +0 -0
  316. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/release_cordon.py +0 -0
  317. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/release_propagate.py +0 -0
  318. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/release_verify.py +0 -0
  319. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/release_window.py +0 -0
  320. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/reports.py +0 -0
  321. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/revalidate.py +0 -0
  322. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/review.py +0 -0
  323. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/scorecard.py +0 -0
  324. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/serve_app.py +0 -0
  325. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/skills/update-issue/SKILL.md +0 -0
  326. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/smoke.py +0 -0
  327. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/spend_ceiling.py +0 -0
  328. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/split_work.py +0 -0
  329. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/stage_projection.py +0 -0
  330. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/state.py +0 -0
  331. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/test_author.py +0 -0
  332. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/test_chat.py +0 -0
  333. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/test_orchestrator.py +0 -0
  334. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/test_report.py +0 -0
  335. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/tui_release.py +0 -0
  336. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/usage.py +0 -0
  337. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/usage_limits.py +0 -0
  338. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/usage_rollup.py +0 -0
  339. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/coord/worker_events.py +0 -0
  340. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-agent.service +0 -0
  341. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-db-backup.service +0 -0
  342. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-db-backup.sh +0 -0
  343. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-db-backup.timer +0 -0
  344. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-drive-queue.service +0 -0
  345. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-drive-queue.timer +0 -0
  346. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-notify.service +0 -0
  347. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-notify.timer +0 -0
  348. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-release-propagate.service +0 -0
  349. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-release-propagate.timer +0 -0
  350. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-release-window.service +0 -0
  351. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-release-window.timer +0 -0
  352. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-serve.service +0 -0
  353. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-web-dist-build.service +0 -0
  354. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-web-dist-build.sh +0 -0
  355. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-web-dist-build.timer +0 -0
  356. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-web-rollback.sh +0 -0
  357. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/coord-web.service +0 -0
  358. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/deploy/node-shim.sh +0 -0
  359. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/AGENT_OPERATIONS.md +0 -0
  360. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/ARCHITECTURE.md +0 -0
  361. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/ARCH_SECURITY_GATES.md +0 -0
  362. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/COCKPIT.md +0 -0
  363. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/CONTROL_CENTER.md +0 -0
  364. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/CROSS_PLATFORM.md +0 -0
  365. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/CUSTOMER_PORTAL.md +0 -0
  366. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/DRIVE_QUEUE.md +0 -0
  367. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/EPHEMERAL_WORKERS.md +0 -0
  368. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/FORGE_MIGRATION.md +0 -0
  369. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/GRAPHIFY_SETUP.md +0 -0
  370. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/ISSUE_GUIDANCE.md +0 -0
  371. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/MAC_MINI.md +0 -0
  372. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  373. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/NOTIFIER.md +0 -0
  374. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/OPENCODE_VERIFICATION.md +0 -0
  375. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/OPERATING_GOTCHAS.md +0 -0
  376. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/ORACLE_LOOP.md +0 -0
  377. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/PHONE_WEBAPP.md +0 -0
  378. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/PIPELINE_V2.md +0 -0
  379. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/PLATFORM_EVOLUTION.md +0 -0
  380. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/SECOND_BACKEND.md +0 -0
  381. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/STORE_SERVICE.md +0 -0
  382. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  383. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/WEB_CONTROL_CENTER.md +0 -0
  384. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/mocks/web/README.md +0 -0
  385. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/mocks/web/_tokens.css +0 -0
  386. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/mocks/web/issue-detail.html +0 -0
  387. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/mocks/web/pipeline-narrow.html +0 -0
  388. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/docs/mocks/web/pipeline-wide.html +0 -0
  389. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/graphify-out/.gitignore +0 -0
  390. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/install-agent.sh +0 -0
  391. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/pyproject.toml +0 -0
  392. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/audit_review_verdict_overrides.py +0 -0
  393. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  394. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/azure-workers/build-worker-image.sh +0 -0
  395. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/azure-workers/coordinator-machine.py +0 -0
  396. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/azure-workers/epic-down.sh +0 -0
  397. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/azure-workers/epic-up.sh +0 -0
  398. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/azure-workers/preflight.sh +0 -0
  399. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/azure-workers/provision-worker.sh +0 -0
  400. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  401. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  402. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/azure-workers/verify-github-token.sh +0 -0
  403. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/codegen.py +0 -0
  404. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/coord-test-runner.sh +0 -0
  405. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/drive-batch.sh +0 -0
  406. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/gen_board_fixture.py +0 -0
  407. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/next_release_tag.py +0 -0
  408. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/run_tests_in_populated_home.sh +0 -0
  409. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/run_tests_without_gh.sh +0 -0
  410. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/smoke_437_interactive.py +0 -0
  411. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/verify_878_review_capture.py +0 -0
  412. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/verify_release_published.py +0 -0
  413. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/scripts/verify_release_wheel.py +0 -0
  414. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/setup.cfg +0 -0
  415. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/SMOKE_SET.md +0 -0
  416. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/__init__.py +0 -0
  417. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  418. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-33/contract.md +0 -0
  419. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-33/manifest.yml +0 -0
  420. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  421. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  422. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  423. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  424. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-37/conftest.py +0 -0
  425. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-37/contract.md +0 -0
  426. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-37/manifest.yml +0 -0
  427. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  428. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  429. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-38/contract.md +0 -0
  430. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-38/manifest.yml +0 -0
  431. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  432. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  433. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  434. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  435. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  436. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  437. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  438. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  439. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  440. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  441. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-51/contract.md +0 -0
  442. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  443. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  444. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-51/manifest.yml +0 -0
  445. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  446. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-51/tsconfig.json +0 -0
  447. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  448. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/conftest.py +0 -0
  449. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/board-pipeline-basic.json +0 -0
  450. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  451. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  452. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  453. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/playwright/all_pass.json +0 -0
  454. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  455. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/playwright/mixed_fail.json +0 -0
  456. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  457. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  458. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/playwright/skip.json +0 -0
  459. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/playwright/truncated.json +0 -0
  460. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  461. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  462. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  463. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  464. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  465. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  466. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  467. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  468. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_acceptance.py +0 -0
  469. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_acceptance_drivers.py +0 -0
  470. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent.py +0 -0
  471. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_api_error.py +0 -0
  472. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_app.py +0 -0
  473. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_branch_base.py +0 -0
  474. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_branch_capture.py +0 -0
  475. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_config_free_1712.py +0 -0
  476. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_deploy_units_endpoint.py +0 -0
  477. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_dirty_worktree.py +0 -0
  478. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_graph_self_heal.py +0 -0
  479. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_health_h3.py +0 -0
  480. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_idle_restart.py +0 -0
  481. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_push_failure.py +0 -0
  482. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_reap.py +0 -0
  483. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_repos_and_pull.py +0 -0
  484. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_restart_services_endpoint.py +0 -0
  485. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_startup_diagnostics.py +0 -0
  486. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_update.py +0 -0
  487. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_update_bluegreen.py +0 -0
  488. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_usage_limit.py +0 -0
  489. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_agent_zero_commit.py +0 -0
  490. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_ambient_home_isolation.py +0 -0
  491. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_approve_reject_plan.py +0 -0
  492. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_approve_usage_gate.py +0 -0
  493. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_assignment_already_recorded_daemon.py +0 -0
  494. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_audit_log.py +0 -0
  495. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_audit_outcome.py +0 -0
  496. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_audit_query.py +0 -0
  497. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_auto_loop.py +0 -0
  498. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_auto_release_publish_2035.py +0 -0
  499. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_base_checkout_restore.py +0 -0
  500. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_board_cap_762.py +0 -0
  501. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_board_fixture.py +0 -0
  502. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_board_read_path.py +0 -0
  503. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_board_service.py +0 -0
  504. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_board_state.py +0 -0
  505. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_board_wire.py +0 -0
  506. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_brain.py +0 -0
  507. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_branch_model.py +0 -0
  508. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_bug_intake.py +0 -0
  509. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_build_worker_image_env_update.py +0 -0
  510. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cargo_cache.py +0 -0
  511. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_ci_acceptance_gate_1950.py +0 -0
  512. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_ci_store.py +0 -0
  513. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_claim.py +0 -0
  514. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_acceptance.py +0 -0
  515. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_assign.py +0 -0
  516. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  517. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_assign_interactive_remote.py +0 -0
  518. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_assign_provider.py +0 -0
  519. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_audit.py +0 -0
  520. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_chat_continue.py +0 -0
  521. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_diagnose_config_provenance.py +0 -0
  522. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_diagnose_graph.py +0 -0
  523. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_doctor.py +0 -0
  524. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_doctor_config_free_1801.py +0 -0
  525. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  526. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_drive.py +0 -0
  527. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_drive_queue.py +0 -0
  528. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_escalate.py +0 -0
  529. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_fix_headless_review.py +0 -0
  530. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_gate_a.py +0 -0
  531. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_install_drift.py +0 -0
  532. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_install_skills.py +0 -0
  533. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_issue_create_label.py +0 -0
  534. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_issue_reopen.py +0 -0
  535. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_milestone_assign.py +0 -0
  536. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_milestone_capture.py +0 -0
  537. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_milestone_chat_add_child.py +0 -0
  538. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_milestone_dispatch.py +0 -0
  539. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_milestone_gate_b.py +0 -0
  540. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_milestone_gate_c.py +0 -0
  541. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_milestone_order.py +0 -0
  542. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  543. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_milestone_ship.py +0 -0
  544. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_network.py +0 -0
  545. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_new_issue_chat.py +0 -0
  546. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_plans.py +0 -0
  547. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_pull_artifact.py +0 -0
  548. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_queue.py +0 -0
  549. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_reattach_sessions.py +0 -0
  550. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_refine_board.py +0 -0
  551. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_release_preflight.py +0 -0
  552. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_release_propagate.py +0 -0
  553. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_release_window.py +0 -0
  554. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_scorecard.py +0 -0
  555. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_set_review_findings.py +0 -0
  556. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_status_advisory_terminal.py +0 -0
  557. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_status_merge_queue.py +0 -0
  558. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_status_provider.py +0 -0
  559. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_status_review_finalizing.py +0 -0
  560. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_status_test_failed_tag.py +0 -0
  561. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_status_usage_limit.py +0 -0
  562. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_sync_comments_873.py +0 -0
  563. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_test_plan.py +0 -0
  564. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_track.py +0 -0
  565. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_tui_update.py +0 -0
  566. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cli_wait.py +0 -0
  567. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_client_base_install.py +0 -0
  568. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_comments.py +0 -0
  569. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_completion_summary.py +0 -0
  570. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_config.py +0 -0
  571. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_config_acceptance.py +0 -0
  572. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_config_audit.py +0 -0
  573. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_config_pricing.py +0 -0
  574. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_config_usage_gate.py +0 -0
  575. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_conflict_fix.py +0 -0
  576. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_conflict_fix_semantic.py +0 -0
  577. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_coord_test.py +0 -0
  578. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_coord_test_runner_baseline.py +0 -0
  579. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_coord_test_runner_routing.py +0 -0
  580. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_coord_test_runner_toolchain.py +0 -0
  581. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_coord_web_sse_restart_live.py +0 -0
  582. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_coordinator_machine.py +0 -0
  583. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_cross_platform_imports.py +0 -0
  584. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_dashboard.py +0 -0
  585. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_dashboard_fixture.py +0 -0
  586. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_dashboard_terminal.py +0 -0
  587. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_dashboard_terminal_live.py +0 -0
  588. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_dead_end.py +0 -0
  589. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_deploy_coord_db_backup.py +0 -0
  590. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_deploy_coord_web_dist.py +0 -0
  591. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_deploy_coord_web_rollback.py +0 -0
  592. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_deploy_drive_queue_unit.py +0 -0
  593. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_deploy_manifest.py +0 -0
  594. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_deploy_units_lane.py +0 -0
  595. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_deploy_web_unit.py +0 -0
  596. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_deps.py +0 -0
  597. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_diagnose.py +0 -0
  598. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_dispatch.py +0 -0
  599. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_dispatch_target_validation.py +0 -0
  600. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_dist_name.py +0 -0
  601. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_done_housekeeping.py +0 -0
  602. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_drive.py +0 -0
  603. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_drive_queue.py +0 -0
  604. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_drive_state.py +0 -0
  605. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_drive_tmux.py +0 -0
  606. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_epic_up_capability_detection.py +0 -0
  607. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  608. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_epic_up_image_provenance.py +0 -0
  609. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_errors.py +0 -0
  610. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_events.py +0 -0
  611. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_failure_class.py +0 -0
  612. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_filelock.py +0 -0
  613. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  614. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_fix_of_force_override.py +0 -0
  615. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_fleet_config_health.py +0 -0
  616. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_fleet_health_probes.py +0 -0
  617. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_fleet_health_snapshot.py +0 -0
  618. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_freshness.py +0 -0
  619. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_gate_a.py +0 -0
  620. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_gate_b.py +0 -0
  621. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_gate_snapshot_staleness.py +0 -0
  622. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_gates.py +0 -0
  623. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_generated_types_fixture.py +0 -0
  624. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_github_ops.py +0 -0
  625. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_goal.py +0 -0
  626. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_graph_health.py +0 -0
  627. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_handoff.py +0 -0
  628. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_health_checks.py +0 -0
  629. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_health_cli.py +0 -0
  630. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_health_cli_graph.py +0 -0
  631. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_health_config.py +0 -0
  632. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_health_context.py +0 -0
  633. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_health_deploy_lane_facts.py +0 -0
  634. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_health_incident_regression.py +0 -0
  635. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_health_pypi.py +0 -0
  636. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_health_registry.py +0 -0
  637. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_health_timer_active.py +0 -0
  638. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_health_toolchain.py +0 -0
  639. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_health_unit_drift.py +0 -0
  640. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_health_unit_enablement.py +0 -0
  641. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_hooks.py +0 -0
  642. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_human_attended_437.py +0 -0
  643. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_init.py +0 -0
  644. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_integration.py +0 -0
  645. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_interactive_briefing_echo.py +0 -0
  646. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_interactive_prefill_state.py +0 -0
  647. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_interactive_session_relaunch.py +0 -0
  648. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_interactive_test_verdict_backstop.py +0 -0
  649. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_interactive_token_attribution.py +0 -0
  650. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_interactive_worktree.py +0 -0
  651. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_issue_store_seam.py +0 -0
  652. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_liveness_auditor.py +0 -0
  653. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_liveness_notify.py +0 -0
  654. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_machine_pause.py +0 -0
  655. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_merge_verify.py +0 -0
  656. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_milestone_chat.py +0 -0
  657. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_milestone_dispatch.py +0 -0
  658. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_milestone_gate.py +0 -0
  659. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_milestone_order.py +0 -0
  660. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_milestone_seam.py +0 -0
  661. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_mock_author.py +0 -0
  662. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_model_tiering.py +0 -0
  663. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_models.py +0 -0
  664. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_models_config_labels.py +0 -0
  665. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_needs_attention.py +0 -0
  666. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_network.py +0 -0
  667. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_new_issue_chat.py +0 -0
  668. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_next_release_tag.py +0 -0
  669. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_no_direct_gh_calls.py +0 -0
  670. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_node_shim.py +0 -0
  671. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_notifier_baseline.py +0 -0
  672. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_notifier_cli.py +0 -0
  673. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_notifier_collect.py +0 -0
  674. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_notifier_config.py +0 -0
  675. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_notifier_drive_seam.py +0 -0
  676. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_notifier_isolation.py +0 -0
  677. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_notifier_predicate.py +0 -0
  678. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_notifier_quiet_hours.py +0 -0
  679. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_notifier_service.py +0 -0
  680. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_notify.py +0 -0
  681. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_notify_drain.py +0 -0
  682. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_openapi.py +0 -0
  683. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_operational_defaults.py +0 -0
  684. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_overlap_fence.py +0 -0
  685. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_packaged_deploy_units.py +0 -0
  686. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_parentage.py +0 -0
  687. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_paste_landed.py +0 -0
  688. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_pipeline.py +0 -0
  689. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_plan_followup_approve_plan_command.py +0 -0
  690. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_plan_followup_pr_command.py +0 -0
  691. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_plan_followup_review_command.py +0 -0
  692. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_plan_only.py +0 -0
  693. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_plan_parser.py +0 -0
  694. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_platform_paths.py +0 -0
  695. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_pr_body_lint.py +0 -0
  696. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_prereqs.py +0 -0
  697. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_production_db_guard.py +0 -0
  698. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_progress.py +0 -0
  699. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_provider_seam.py +0 -0
  700. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_providers.py +0 -0
  701. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_providers_config_labels.py +0 -0
  702. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_providers_pty.py +0 -0
  703. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_quiet_hours.py +0 -0
  704. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_quiet_hours_store_2146.py +0 -0
  705. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_reap_merged_sessions.py +0 -0
  706. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_reap_stale_interactive_tick.py +0 -0
  707. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_reconcile_branch.py +0 -0
  708. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_reconcile_completions.py +0 -0
  709. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_reconcile_merges.py +0 -0
  710. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_reconcile_usage_limit_done.py +0 -0
  711. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_refine_chat.py +0 -0
  712. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_release_cordon_2101.py +0 -0
  713. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_release_propagate.py +0 -0
  714. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_release_unified_1242.py +0 -0
  715. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_release_verify.py +0 -0
  716. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_release_window.py +0 -0
  717. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_remote_auto_prune.py +0 -0
  718. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_remote_interactive_reaper.py +0 -0
  719. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_report_result_push.py +0 -0
  720. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_reports.py +0 -0
  721. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_retry.py +0 -0
  722. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_retry_advisory_1606.py +0 -0
  723. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_retry_type_1636.py +0 -0
  724. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_revalidate.py +0 -0
  725. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_review.py +0 -0
  726. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_review_end_review_without_verdict.py +0 -0
  727. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_review_parse_failure_diagnostic.py +0 -0
  728. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_review_reaffirm.py +0 -0
  729. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_review_state.py +0 -0
  730. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_review_verdict_backstop.py +0 -0
  731. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_review_verdict_override_audit.py +0 -0
  732. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_review_verdict_relay.py +0 -0
  733. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_review_zero_commits.py +0 -0
  734. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_scoped_review_wiring.py +0 -0
  735. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_scorecard.py +0 -0
  736. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_serve.py +0 -0
  737. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_serve_app_board_trim.py +0 -0
  738. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_session.py +0 -0
  739. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_slice_issue_attribution.py +0 -0
  740. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_smoke.py +0 -0
  741. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_smoke_live_checkout_restore.py +0 -0
  742. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_smoke_workflow.py +0 -0
  743. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_spend_ceiling.py +0 -0
  744. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_spend_ceiling_coordinator.py +0 -0
  745. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_split.py +0 -0
  746. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_split_work.py +0 -0
  747. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_stage_projection.py +0 -0
  748. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_stalled_pipeline.py +0 -0
  749. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_state.py +0 -0
  750. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_state_review_findings_daemon.py +0 -0
  751. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_status_fleet_footer.py +0 -0
  752. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_stop_1567.py +0 -0
  753. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_stuck.py +0 -0
  754. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_terminal_command.py +0 -0
  755. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_test_author.py +0 -0
  756. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_test_chat.py +0 -0
  757. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_test_orchestrator.py +0 -0
  758. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_test_report.py +0 -0
  759. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_test_verdict_parsing.py +0 -0
  760. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_test_verdict_transcript_floor.py +0 -0
  761. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_thin_client_board_audit.py +0 -0
  762. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_thin_client_config_load_1080.py +0 -0
  763. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_thin_client_daemon_routing_906.py +0 -0
  764. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_tmux_host.py +0 -0
  765. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_tmux_session.py +0 -0
  766. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_transcript_floor.py +0 -0
  767. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_usage.py +0 -0
  768. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_usage_limits.py +0 -0
  769. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_usage_rollup.py +0 -0
  770. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_venv_live_install_2121.py +0 -0
  771. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_version_single_source.py +0 -0
  772. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_watch.py +0 -0
  773. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_worker_events.py +0 -0
  774. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_worker_image_pin_sync.py +0 -0
  775. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_worker_safety.py +0 -0
  776. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_worktree.py +0 -0
  777. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  778. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/Cargo.lock +0 -0
  779. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/Cargo.toml +0 -0
  780. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/cargo-config-local-quadraui.toml.example +0 -0
  781. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/audit.rs +0 -0
  782. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/chat.rs +0 -0
  783. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/data.rs +0 -0
  784. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/dialogs.rs +0 -0
  785. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/drive.rs +0 -0
  786. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/drive_queue.rs +0 -0
  787. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/escalation.rs +0 -0
  788. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/events.rs +0 -0
  789. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/fixtures.rs +0 -0
  790. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/fleet_health.rs +0 -0
  791. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/fleet_sessions.rs +0 -0
  792. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/fleet_terminals.rs +0 -0
  793. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/format.rs +0 -0
  794. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/milestone_dag.rs +0 -0
  795. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/mod.rs +0 -0
  796. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/msv.rs +0 -0
  797. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/pipeline.rs +0 -0
  798. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/plans.rs +0 -0
  799. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/render.rs +0 -0
  800. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/reports.rs +0 -0
  801. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/sessions.rs +0 -0
  802. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/settings_ui.rs +0 -0
  803. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/sidebar.rs +0 -0
  804. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/terminal.rs +0 -0
  805. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/tests.rs +0 -0
  806. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/types.rs +0 -0
  807. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/app/workspace.rs +0 -0
  808. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/bin/gtk.rs +0 -0
  809. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/commands.rs +0 -0
  810. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/lib.rs +0 -0
  811. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/main.rs +0 -0
  812. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/src/settings.rs +0 -0
  813. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/tests/acceptance.rs +0 -0
  814. {code_coordinator-0.5.56 → code_coordinator-0.5.58}/tui/tests/cli.rs +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.56
3
+ Version: 0.5.58
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.56
3
+ Version: 0.5.58
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
@@ -100,6 +100,7 @@ coord/pipeline.py
100
100
  coord/plan_parser.py
101
101
  coord/plans.py
102
102
  coord/platform_paths.py
103
+ coord/portal_bridge.py
103
104
  coord/pr_body_lint.py
104
105
  coord/prereqs.py
105
106
  coord/progress.py
@@ -149,6 +150,7 @@ coord/commands/merge.py
149
150
  coord/commands/milestone.py
150
151
  coord/commands/plan_followup.py
151
152
  coord/commands/plans.py
153
+ coord/commands/portal.py
152
154
  coord/commands/release.py
153
155
  coord/commands/report.py
154
156
  coord/commands/review.py
@@ -484,6 +486,7 @@ tests/test_cli_milestone_ship.py
484
486
  tests/test_cli_network.py
485
487
  tests/test_cli_new_issue_chat.py
486
488
  tests/test_cli_plans.py
489
+ tests/test_cli_portal.py
487
490
  tests/test_cli_pull_artifact.py
488
491
  tests/test_cli_queue.py
489
492
  tests/test_cli_reattach_sessions.py
@@ -634,6 +637,8 @@ tests/test_plan_followup_review_command.py
634
637
  tests/test_plan_only.py
635
638
  tests/test_plan_parser.py
636
639
  tests/test_platform_paths.py
640
+ tests/test_portal_bridge.py
641
+ tests/test_portal_config.py
637
642
  tests/test_pr_body_lint.py
638
643
  tests/test_prereqs.py
639
644
  tests/test_production_db_guard.py
@@ -61,6 +61,7 @@
61
61
  "coord/commands/milestone.py",
62
62
  "coord/commands/plan_followup.py",
63
63
  "coord/commands/plans.py",
64
+ "coord/commands/portal.py",
64
65
  "coord/commands/release.py",
65
66
  "coord/commands/report.py",
66
67
  "coord/commands/review.py",
@@ -272,6 +273,7 @@
272
273
  "coord/plan_parser.py",
273
274
  "coord/plans.py",
274
275
  "coord/platform_paths.py",
276
+ "coord/portal_bridge.py",
275
277
  "coord/pr_body_lint.py",
276
278
  "coord/prereqs.py",
277
279
  "coord/progress.py",
@@ -514,6 +516,7 @@
514
516
  "tests/test_cli_network.py",
515
517
  "tests/test_cli_new_issue_chat.py",
516
518
  "tests/test_cli_plans.py",
519
+ "tests/test_cli_portal.py",
517
520
  "tests/test_cli_pull_artifact.py",
518
521
  "tests/test_cli_queue.py",
519
522
  "tests/test_cli_reattach_sessions.py",
@@ -664,6 +667,8 @@
664
667
  "tests/test_plan_only.py",
665
668
  "tests/test_plan_parser.py",
666
669
  "tests/test_platform_paths.py",
670
+ "tests/test_portal_bridge.py",
671
+ "tests/test_portal_config.py",
667
672
  "tests/test_pr_body_lint.py",
668
673
  "tests/test_prereqs.py",
669
674
  "tests/test_production_db_guard.py",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.56",
2
+ "tag": "0.5.58",
3
3
  "distance": 0,
4
- "node": "gb8053d5c79cc3a574e1df4a7543e49d6a6d09410",
4
+ "node": "g36b37b343666fd25278ef49e2b4521e94ec1a50a",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-13"
@@ -87,6 +87,9 @@ from coord.health.cli import health
87
87
  # #1632: same arrangement for the fleet notifier — predicate, baselines,
88
88
  # transport seam and CLI all live in coord/notifier/.
89
89
  from coord.notifier.cli import notifier_group
90
+ # #2179: coord-portal sync bridge client — coord/portal_bridge.py is the
91
+ # client, coord/commands/portal.py is the CLI over it.
92
+ from coord.commands.portal import portal_group
90
93
  from coord.commands.merge import (
91
94
  bounce,
92
95
  merge,
@@ -391,6 +394,7 @@ main.add_command(gates)
391
394
  main.add_command(doctor)
392
395
  main.add_command(health)
393
396
  main.add_command(notifier_group)
397
+ main.add_command(portal_group)
394
398
  main.add_command(issue_group)
395
399
  main.add_command(context_group)
396
400
  main.add_command(audit)
@@ -0,0 +1,120 @@
1
+ """``coord portal`` — exercise the coord-portal sync bridge client (#2179).
2
+
3
+ Everything that automatically decides *when* to push a status, and *which*
4
+ coord-side work a portal submission maps to, is out of scope here (see
5
+ ``coord/portal_bridge.py``'s module docstring — that is follow-up work this
6
+ issue deliberately did not take on). What exists today is the thin client
7
+ plus enough CLI surface to:
8
+
9
+ * prove the credential pair actually works (``coord portal heartbeat``),
10
+ which is also how an operator manually verifies #2179's acceptance shape
11
+ end to end once ``BRIDGE_CLIENT_ID``/``BRIDGE_CLIENT_SECRET`` are set — a
12
+ submission's ``/deliveries`` row going ``queued`` → ``sent`` in production
13
+ is only reachable at all once something has pushed a status; and
14
+ * push one status update by hand (``coord portal push``), so a submission's
15
+ status can be moved even before anything automatic drives it.
16
+ """
17
+
18
+ from __future__ import annotations
19
+
20
+ import json
21
+
22
+ import click
23
+
24
+ from coord.commands._common import _CONFIG_OPTION, _load_config
25
+ from coord.portal_bridge import (
26
+ PortalBridgeError,
27
+ SUBMISSION_STATUSES,
28
+ client_from_config,
29
+ )
30
+
31
+
32
+ @click.group("portal")
33
+ def portal_group() -> None:
34
+ """coord-portal sync bridge — status, manual push, heartbeat (#2179)."""
35
+
36
+
37
+ @portal_group.command("status")
38
+ @_CONFIG_OPTION
39
+ @click.option("--json", "as_json", is_flag=True, default=False)
40
+ def portal_status(config_path, as_json: bool) -> None:
41
+ """Show whether the portal bridge is configured, without sending anything."""
42
+ cfg = _load_config(config_path).portal
43
+ payload = {
44
+ "enabled": cfg.enabled,
45
+ "base_url": cfg.base_url,
46
+ "credentials_set": bool(cfg.bridge_client_id and cfg.bridge_client_secret),
47
+ "timeout_secs": cfg.timeout_secs,
48
+ "max_retries": cfg.max_retries,
49
+ }
50
+ if as_json:
51
+ click.echo(json.dumps(payload, indent=2, sort_keys=True))
52
+ return
53
+ if not cfg.enabled:
54
+ click.echo("portal: disabled (no 'portal:' block, or portal.enabled: false)")
55
+ return
56
+ click.echo(f"portal: ENABLED base_url={cfg.base_url} "
57
+ f"credentials={'set' if payload['credentials_set'] else 'MISSING'}")
58
+
59
+
60
+ @portal_group.command("heartbeat")
61
+ @_CONFIG_OPTION
62
+ def portal_heartbeat(config_path) -> None:
63
+ """Send one heartbeat, proving the credential pair and base_url work.
64
+
65
+ Exits non-zero on failure — a 401 here means BRIDGE_CLIENT_ID/SECRET on
66
+ this side do not match what the portal has (or Cloudflare Access is
67
+ rejecting the request before it even gets there).
68
+ """
69
+ cfg = _load_config(config_path).portal
70
+ client = client_from_config(cfg)
71
+ if client is None:
72
+ click.secho(
73
+ "portal is not enabled — nothing to do (see `coord portal status`)",
74
+ fg="yellow",
75
+ )
76
+ raise SystemExit(1)
77
+ try:
78
+ ok = client.heartbeat()
79
+ except PortalBridgeError as exc:
80
+ click.secho(f"heartbeat failed: {exc}", fg="red")
81
+ raise SystemExit(1) from exc
82
+ if ok:
83
+ click.secho("heartbeat sent", fg="green")
84
+ return
85
+ click.secho("heartbeat sent but portal did not confirm 'ok'", fg="red")
86
+ raise SystemExit(1)
87
+
88
+
89
+ @portal_group.command("push")
90
+ @_CONFIG_OPTION
91
+ @click.argument("submission_id")
92
+ @click.argument("revision", type=int)
93
+ @click.argument("status", type=click.Choice(SUBMISSION_STATUSES))
94
+ def portal_push(config_path, submission_id: str, revision: int, status: str) -> None:
95
+ """Push one status update by hand: SUBMISSION_ID REVISION STATUS.
96
+
97
+ REVISION must be strictly greater than whatever the portal last accepted
98
+ for this submission, or the push comes back `already_applied` (a
99
+ success, not an error — see coord-portal's src/bridge/updates.ts).
100
+ """
101
+ cfg = _load_config(config_path).portal
102
+ client = client_from_config(cfg)
103
+ if client is None:
104
+ click.secho(
105
+ "portal is not enabled — nothing to do (see `coord portal status`)",
106
+ fg="yellow",
107
+ )
108
+ raise SystemExit(1)
109
+ try:
110
+ result = client.push_status(submission_id, revision, status)
111
+ except PortalBridgeError as exc:
112
+ click.secho(f"push failed: {exc}", fg="red")
113
+ raise SystemExit(1) from exc
114
+ if result.ok:
115
+ click.secho(f"{result.outcome}: {submission_id}@{revision} -> {status}", fg="green")
116
+ return
117
+ click.secho(
118
+ f"rejected: {submission_id}@{revision} -> {status} ({result.reason})", fg="red"
119
+ )
120
+ raise SystemExit(1)
@@ -1671,6 +1671,41 @@ class NotificationsConfig:
1671
1671
  cold_ceiling_mins: dict[str, float] = field(default_factory=dict)
1672
1672
 
1673
1673
 
1674
+ @dataclass
1675
+ class PortalConfig:
1676
+ """The outbound client to coord-portal's sync bridge (#2179, ``docs/CUSTOMER_PORTAL.md``).
1677
+
1678
+ Absent block == disabled == coord never talks to the portal — unchanged
1679
+ behaviour for every existing deployment, and the correct default until
1680
+ ``BRIDGE_CLIENT_ID``/``BRIDGE_CLIENT_SECRET`` actually exist in production
1681
+ (they do not, as of #2179: ``wrangler secret list`` on the portal has no
1682
+ entry for either).
1683
+
1684
+ The portal is a third party from coord's perspective — a push failure
1685
+ must be retried and surfaced, never fatal to a merge or a dispatch.
1686
+ Nothing in :mod:`coord.portal_bridge` sits on the dispatch path; it is a
1687
+ client other code calls, not a check anything blocks on.
1688
+ """
1689
+
1690
+ enabled: bool = False
1691
+ # e.g. "https://intake.heurontech.com". No default: a client pointed at
1692
+ # nothing by accident is worse than one that refuses to start.
1693
+ base_url: str | None = None
1694
+ # The Cloudflare Access service-token pair coord-portal's
1695
+ # ``isBridgeAuthorized`` requires as a matched, non-empty pair (half a
1696
+ # credential is not a credential, and it fails closed on exactly that).
1697
+ # Support ``${VAR}`` expansion (mirrors ``providers.definitions[*].env``)
1698
+ # so the real secret lives in the environment, never committed in
1699
+ # coordinator.yml.
1700
+ bridge_client_id: str | None = None
1701
+ bridge_client_secret: str | None = None
1702
+ timeout_secs: float = 10.0
1703
+ # Retries are for transient/5xx failures only — see
1704
+ # coord.portal_bridge.PortalBridgeClient. A 401 never retries: a bad
1705
+ # credential does not become a good one on attempt two.
1706
+ max_retries: int = 2
1707
+
1708
+
1674
1709
  @dataclass
1675
1710
  class Config:
1676
1711
  repos: list[Repo]
@@ -1695,6 +1730,8 @@ class Config:
1695
1730
  health: HealthConfig = field(default_factory=HealthConfig)
1696
1731
  # #1632 — absent block == disabled == today's behaviour (silence).
1697
1732
  notifications: NotificationsConfig = field(default_factory=NotificationsConfig)
1733
+ # #2179 — absent block == disabled == coord never talks to coord-portal.
1734
+ portal: PortalConfig = field(default_factory=PortalConfig)
1698
1735
  path: Path | None = None
1699
1736
 
1700
1737
  def repo(self, name: str) -> Repo | None:
@@ -1767,6 +1804,7 @@ def parse_mapping(raw: Any, *, path: Path | None = None) -> Config:
1767
1804
  pricing = _parse_pricing(raw.get("pricing"))
1768
1805
  health = _parse_health(raw.get("health"))
1769
1806
  notifications = _parse_notifications(raw.get("notifications"))
1807
+ portal = _parse_portal(raw.get("portal"))
1770
1808
 
1771
1809
  return Config(
1772
1810
  repos=repos,
@@ -1789,6 +1827,7 @@ def parse_mapping(raw: Any, *, path: Path | None = None) -> Config:
1789
1827
  pricing=pricing,
1790
1828
  health=health,
1791
1829
  notifications=notifications,
1830
+ portal=portal,
1792
1831
  path=p,
1793
1832
  )
1794
1833
 
@@ -3239,6 +3278,85 @@ def _expand_env_vars(value: str) -> str:
3239
3278
  return _ENV_VAR_RE.sub(_replace, value)
3240
3279
 
3241
3280
 
3281
+ _PORTAL_PLAIN_STR_FIELDS = ("base_url",)
3282
+ _PORTAL_SECRET_STR_FIELDS = ("bridge_client_id", "bridge_client_secret")
3283
+
3284
+
3285
+ def _parse_portal(raw: Any) -> PortalConfig:
3286
+ """Parse the optional ``portal:`` block from coordinator.yml (#2179).
3287
+
3288
+ An absent block returns a **disabled** :class:`PortalConfig` — unchanged
3289
+ behaviour for every existing deployment, and the correct default until
3290
+ ``BRIDGE_CLIENT_ID``/``BRIDGE_CLIENT_SECRET`` exist in production.
3291
+ """
3292
+ if raw is None:
3293
+ return PortalConfig()
3294
+ if not isinstance(raw, dict):
3295
+ raise ConfigError("'portal' must be a mapping")
3296
+
3297
+ cfg = PortalConfig()
3298
+ known = {f.name for f in fields(PortalConfig)}
3299
+ unknown = sorted(set(raw) - known)
3300
+ if unknown:
3301
+ raise ConfigError(
3302
+ f"unknown portal option(s): {', '.join(unknown)} "
3303
+ f"(valid: {', '.join(sorted(known))})"
3304
+ )
3305
+
3306
+ if "enabled" in raw:
3307
+ if not isinstance(raw["enabled"], bool):
3308
+ raise ConfigError("portal.enabled must be a boolean")
3309
+ cfg.enabled = raw["enabled"]
3310
+
3311
+ for key in _PORTAL_PLAIN_STR_FIELDS:
3312
+ if key in raw:
3313
+ value = raw[key]
3314
+ if value is not None and not isinstance(value, str):
3315
+ raise ConfigError(f"portal.{key} must be a string or null")
3316
+ if isinstance(value, str) and not value.strip():
3317
+ raise ConfigError(f"portal.{key} must be a non-empty string or null")
3318
+ setattr(cfg, key, value.strip().rstrip("/") if isinstance(value, str) else None)
3319
+
3320
+ for key in _PORTAL_SECRET_STR_FIELDS:
3321
+ if key in raw:
3322
+ value = raw[key]
3323
+ if value is not None and not isinstance(value, str):
3324
+ raise ConfigError(f"portal.{key} must be a string or null")
3325
+ if isinstance(value, str):
3326
+ # ${VAR} expansion (mirrors providers.definitions[*].env) so the
3327
+ # real secret lives in the environment, never committed here —
3328
+ # coordinator.yml is public-repo-adjacent operator config, and
3329
+ # these two values are exactly what coord-portal is public
3330
+ # about NOT holding on its own side of the boundary.
3331
+ value = _expand_env_vars(value).strip()
3332
+ if not value:
3333
+ raise ConfigError(f"portal.{key} must be a non-empty string or null")
3334
+ setattr(cfg, key, value if isinstance(value, str) else None)
3335
+
3336
+ if "timeout_secs" in raw:
3337
+ value = raw["timeout_secs"]
3338
+ if isinstance(value, bool) or not isinstance(value, (int, float)) or value <= 0:
3339
+ raise ConfigError("portal.timeout_secs must be a positive number")
3340
+ cfg.timeout_secs = float(value)
3341
+
3342
+ if "max_retries" in raw:
3343
+ value = raw["max_retries"]
3344
+ if isinstance(value, bool) or not isinstance(value, int) or value < 0:
3345
+ raise ConfigError("portal.max_retries must be a non-negative integer")
3346
+ cfg.max_retries = value
3347
+
3348
+ if cfg.enabled and not (cfg.base_url and cfg.bridge_client_id and cfg.bridge_client_secret):
3349
+ # Half a credential is not a credential — coord-portal's
3350
+ # isBridgeAuthorized takes the identical position and fails closed on
3351
+ # exactly this. Refuse at parse time rather than 401-looping forever.
3352
+ raise ConfigError(
3353
+ "portal.enabled is true but base_url/bridge_client_id/bridge_client_secret "
3354
+ "are not all set"
3355
+ )
3356
+
3357
+ return cfg
3358
+
3359
+
3242
3360
  def _parse_providers(raw: Any) -> ProvidersConfig:
3243
3361
  """Parse the optional ``providers:`` block from coordinator.yml.
3244
3362
 
@@ -188,7 +188,8 @@ def _ensure_schema(conn: sqlite3.Connection) -> None:
188
188
  enqueued_at REAL,
189
189
  assignment_type TEXT DEFAULT 'work',
190
190
  required_gates TEXT,
191
- ci_infra_reruns INTEGER NOT NULL DEFAULT 0
191
+ ci_infra_reruns INTEGER NOT NULL DEFAULT 0,
192
+ ci_stale_reruns INTEGER NOT NULL DEFAULT 0
192
193
  );
193
194
 
194
195
  CREATE TABLE IF NOT EXISTS plans (
@@ -697,6 +698,12 @@ def _migrate_add_columns(conn: sqlite3.Connection) -> None:
697
698
  # predating this column (no auto-reruns spent yet), same as the
698
699
  # column's own default for freshly-enqueued entries.
699
700
  "ALTER TABLE merge_queue ADD COLUMN ci_infra_reruns INTEGER NOT NULL DEFAULT 0",
701
+ # #2197: the CI-staleness auto-rerun's OWN counter — see
702
+ # `coord.merge_queue.MAX_CI_STALE_RERUNS` and
703
+ # `QueuedMerge.ci_stale_reruns`'s docstring for why it is kept
704
+ # separate from `ci_infra_reruns` rather than sharing it. 0 for
705
+ # every row predating this column, same as a freshly-enqueued entry.
706
+ "ALTER TABLE merge_queue ADD COLUMN ci_stale_reruns INTEGER NOT NULL DEFAULT 0",
700
707
  # #1956: verdict provenance — WHO recorded `review_verdict` and HOW
701
708
  # (see coord.models.Assignment.verdict_source for the three values
702
709
  # and why conflating them was the second half of #1956). NULL for
@@ -1417,6 +1417,19 @@ def is_ci_infra_reason(reason: str | None) -> bool:
1417
1417
  # standing breakage.
1418
1418
  MAX_CI_INFRA_RERUNS = 2
1419
1419
 
1420
+ # #2197: same shape as MAX_CI_INFRA_RERUNS above, but for the OTHER CI
1421
+ # auto-rerun trigger `process()` supports — a PASSING check recorded against
1422
+ # a base that has since moved (:data:`CI_STALE_PREFIX`, #1851's staleness
1423
+ # signal), not a failure. Deliberately a SEPARATE constant/counter from
1424
+ # `ci_infra_reruns`: the two triggers answer opposite readings of CI ("this
1425
+ # failed and needs to prove itself again" vs. "this passed but predates the
1426
+ # base and needs a fresh answer") and must be independently capped and
1427
+ # independently legible in the audit trail. A base that keeps moving out
1428
+ # from under one PR (a busy queue, or a genuinely wedged branch) would
1429
+ # otherwise auto-rerun forever; two tries rides out an ordinary busy tick
1430
+ # without masking a PR that just isn't going to catch up unattended.
1431
+ MAX_CI_STALE_RERUNS = 2
1432
+
1420
1433
 
1421
1434
  def _ci_infra_reason(
1422
1435
  ci: "CiStore", repo: str, number: int, failed: "list[CheckRun]"
@@ -2168,6 +2181,15 @@ class QueuedMerge:
2168
2181
  # forever. 0 for every entry that has never hit a verdictless failure,
2169
2182
  # and for rows predating this column.
2170
2183
  ci_infra_reruns: int = 0
2184
+ # #2197: count of automatic `CiStore.rerun_for_pr` calls `process()` has
2185
+ # issued for this entry's CURRENT run of CI staleness (#1851) — a
2186
+ # PASSING check recorded against a base that has since moved. Kept
2187
+ # separate from `ci_infra_reruns` above on purpose (see
2188
+ # `MAX_CI_STALE_RERUNS`'s comment): the two triggers must be
2189
+ # independently capped and independently legible in the audit trail.
2190
+ # Capped at `MAX_CI_STALE_RERUNS`. 0 for every entry that has never gone
2191
+ # CI-stale, and for rows predating this column.
2192
+ ci_stale_reruns: int = 0
2171
2193
 
2172
2194
 
2173
2195
  class GhOps(Protocol):
@@ -2459,6 +2481,9 @@ def load_queue() -> list[QueuedMerge]:
2459
2481
  # #1892: column added via migration; NULL (pre-migration rows)
2460
2482
  # decodes to 0 — no auto-reruns spent yet, same as a fresh entry.
2461
2483
  ci_infra_reruns=row["ci_infra_reruns"] or 0,
2484
+ # #2197: same NULL-to-0 decoding as ci_infra_reruns above, for
2485
+ # rows predating this column.
2486
+ ci_stale_reruns=row["ci_stale_reruns"] or 0,
2462
2487
  )
2463
2488
  for row in rows
2464
2489
  ]
@@ -2475,15 +2500,16 @@ def save_queue(items: list[QueuedMerge]) -> None:
2475
2500
  assignment_id, repo_name, repo_github, branch,
2476
2501
  target_branch, issue_number, issue_title, state,
2477
2502
  pr_number, pr_url, size, last_attempt, error, enqueued_at,
2478
- assignment_type, required_gates, ci_infra_reruns
2479
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
2503
+ assignment_type, required_gates, ci_infra_reruns,
2504
+ ci_stale_reruns
2505
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
2480
2506
  (
2481
2507
  item.assignment_id, item.repo_name, item.repo_github,
2482
2508
  item.branch, item.target_branch, item.issue_number,
2483
2509
  item.issue_title, item.state, item.pr_number, item.pr_url,
2484
2510
  item.size, item.last_attempt, item.error, item.enqueued_at,
2485
2511
  item.assignment_type, json.dumps(list(item.required_gates or [])),
2486
- item.ci_infra_reruns,
2512
+ item.ci_infra_reruns, item.ci_stale_reruns,
2487
2513
  ),
2488
2514
  )
2489
2515
 
@@ -4503,16 +4529,69 @@ def process(
4503
4529
  # distinctly (`checks_stale`) from checks_failed/
4504
4530
  # checks_pending above so an operator (and `coord merge
4505
4531
  # --revalidate`, the remedy) can tell the three apart.
4532
+ #
4533
+ # #2197: this used to always block here, escalating to a
4534
+ # human (or, via `coord drive`, spending a merge attempt)
4535
+ # for a condition a re-run resolves on its own — the exact
4536
+ # #2170 regression (a docs-only base move stales a
4537
+ # perfectly good green PR). Mirror #1892's shape exactly:
4538
+ # auto-rerun via the SAME `CiStore.rerun_for_pr` this
4539
+ # module already calls unattended for verdictless
4540
+ # failures, up to `MAX_CI_STALE_RERUNS` — but track it
4541
+ # with its OWN counter (`ci_stale_reruns`), never
4542
+ # `ci_infra_reruns`, so a failed-then-stale (or
4543
+ # stale-then-failed) PR does not have one trigger silently
4544
+ # spend the other's budget, and so the audit trail can
4545
+ # always tell which condition an auto-rerun was answering.
4506
4546
  if checks and _ci_checks_are_stale(
4507
4547
  checks, gh_ops, entry.repo_github, entry.target_branch, smoke,
4508
4548
  ):
4549
+ if entry.ci_stale_reruns < MAX_CI_STALE_RERUNS:
4550
+ entry.ci_stale_reruns += 1
4551
+ reran = ci.rerun_for_pr(entry.repo_github, entry.pr_number)
4552
+ _log.info(
4553
+ "#2197 auto-rerun %d/%d for stale CI on %s#%d "
4554
+ "(PR #%s) (rerun_for_pr %s)",
4555
+ entry.ci_stale_reruns, MAX_CI_STALE_RERUNS,
4556
+ entry.repo_name, entry.issue_number,
4557
+ entry.pr_number,
4558
+ "triggered" if reran else "FAILED",
4559
+ )
4560
+ # #1891: same `CI_PENDING_PREFIX` wording the
4561
+ # genuinely-still-running case uses above — this is
4562
+ # what lets `coord drive`'s `is_ci_pending_reason`
4563
+ # check (coord/drive.py) treat a re-run THIS auto-
4564
+ # trigger just kicked off exactly like any other
4565
+ # in-flight CI: a bare wait, never a spent merge
4566
+ # attempt. The queue resumes it automatically once
4567
+ # the re-run reports, no operator needed.
4568
+ msg = (
4569
+ f"{CI_PENDING_PREFIX} re-run triggered for CI "
4570
+ "checks that predate the current base (#2197 "
4571
+ f"auto-rerun {entry.ci_stale_reruns}/"
4572
+ f"{MAX_CI_STALE_RERUNS} "
4573
+ f"{'triggered' if reran else 'failed to trigger'})"
4574
+ )
4575
+ entry.error = msg
4576
+ events.append(MergeEvent(entry, "checks_stale_rerun", msg))
4577
+ continue # #292: skip, don't halt the group
4509
4578
  msg = (
4510
4579
  f"{CI_STALE_PREFIX} checks predate the current base "
4511
- "— re-run CI (`coord merge --revalidate`) before merging"
4580
+ f"— auto-rerun budget exhausted ({entry.ci_stale_reruns}/"
4581
+ f"{MAX_CI_STALE_RERUNS}); re-run CI (`coord merge "
4582
+ "--revalidate`) before merging"
4512
4583
  )
4513
4584
  entry.error = msg
4514
4585
  events.append(MergeEvent(entry, "checks_stale", msg))
4515
4586
  continue # #292: skip, don't halt the group
4587
+ # #2197: reached only once the checks are genuinely fresh
4588
+ # (or the smoke-side #1738/#1778/#1847 base-move exemption
4589
+ # spared them) — mirrors the `ci_infra_reruns = 0` reset
4590
+ # above and for the identical reason: whatever staleness
4591
+ # streak the budget was tracking has now actually resolved,
4592
+ # so a LATER base move starts its own budget from zero
4593
+ # rather than inheriting an unrelated exhausted count.
4594
+ entry.ci_stale_reruns = 0
4516
4595
  # #1318: cache is_epic_issue lookups for this entry — the same
4517
4596
  # referenced number can show up in both the PR body and one or
4518
4597
  # more commit messages below, and each lookup is a `gh` round