code-coordinator 0.5.85__tar.gz → 0.5.87__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 (834) hide show
  1. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/code_coordinator.egg-info/SOURCES.txt +3 -0
  4. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/code_coordinator.egg-info/scm_file_list.json +3 -0
  5. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/commands/merge.py +112 -0
  7. code_coordinator-0.5.87/coord/commands/portal.py +405 -0
  8. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/db.py +110 -0
  9. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/merge_queue.py +277 -0
  10. code_coordinator-0.5.87/coord/portal_store.py +756 -0
  11. code_coordinator-0.5.87/coord/portal_sync.py +618 -0
  12. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/serve_app.py +102 -1
  13. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coordinator.example.yml +16 -7
  14. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/docs/CUSTOMER_PORTAL.md +15 -0
  15. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/docs/OPERATING_GOTCHAS.md +70 -0
  16. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_agent_app.py +42 -1
  17. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_merge.py +176 -0
  18. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_portal.py +99 -0
  19. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_merge_queue.py +363 -0
  20. code_coordinator-0.5.87/tests/test_portal_sync.py +716 -0
  21. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_serve.py +112 -0
  22. code_coordinator-0.5.85/coord/commands/portal.py +0 -120
  23. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/.claude/commands/board.md +0 -0
  24. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/.claude/commands/complete-session.md +0 -0
  25. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/.claude/commands/coordinator.md +0 -0
  26. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/.githooks/_lib.sh +0 -0
  27. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/.githooks/post-checkout +0 -0
  28. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/.githooks/post-commit +0 -0
  29. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/.githooks/post-merge +0 -0
  30. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  31. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/.github/coord-ci-acceptance.yml +0 -0
  32. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/.github/workflows/auto-release.yml +0 -0
  33. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/.github/workflows/cargo-test.yml +0 -0
  34. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/.github/workflows/publish.yml +0 -0
  35. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/.github/workflows/release-tui.yml +0 -0
  36. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/.github/workflows/test.yml +0 -0
  37. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/.gitignore +0 -0
  38. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/CLAUDE.md +0 -0
  39. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/GOAL.md +0 -0
  40. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/LICENSE +0 -0
  41. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/MANIFEST.in +0 -0
  42. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/README.md +0 -0
  43. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/code_coordinator.egg-info/dependency_links.txt +0 -0
  44. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/code_coordinator.egg-info/entry_points.txt +0 -0
  45. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/code_coordinator.egg-info/requires.txt +0 -0
  46. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/code_coordinator.egg-info/top_level.txt +0 -0
  47. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/__init__.py +0 -0
  48. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/_board_mapping.py +0 -0
  49. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/acceptance.py +0 -0
  50. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/acceptance_drivers.py +0 -0
  51. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/agent.py +0 -0
  52. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/agent_app.py +0 -0
  53. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/agent_update.py +0 -0
  54. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/agents/opencode/.gitignore +0 -0
  55. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/agents/opencode/agents/work.md +0 -0
  56. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/agents/opencode/routing.jsonc +0 -0
  57. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/audit.py +0 -0
  58. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/auto_loop.py +0 -0
  59. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/board_bool_guard.py +0 -0
  60. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/board_service.py +0 -0
  61. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/board_wire.py +0 -0
  62. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/brain.py +0 -0
  63. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/branch_model.py +0 -0
  64. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/bug_intake.py +0 -0
  65. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/cargo_cache.py +0 -0
  66. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/ci_github.py +0 -0
  67. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/ci_store.py +0 -0
  68. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/claim.py +0 -0
  69. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/cli.py +0 -0
  70. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/client.py +0 -0
  71. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/commands/__init__.py +0 -0
  72. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/commands/_common.py +0 -0
  73. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/commands/acceptance.py +0 -0
  74. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/commands/agent_ops.py +0 -0
  75. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/commands/audit.py +0 -0
  76. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/commands/chat.py +0 -0
  77. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/commands/dispatch.py +0 -0
  78. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/commands/dispatch_workers.py +0 -0
  79. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/commands/drive.py +0 -0
  80. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/commands/drive_queue.py +0 -0
  81. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/commands/gate_a.py +0 -0
  82. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/commands/gates.py +0 -0
  83. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/commands/issues.py +0 -0
  84. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/commands/lifecycle.py +0 -0
  85. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/commands/milestone.py +0 -0
  86. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/commands/plan_followup.py +0 -0
  87. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/commands/plans.py +0 -0
  88. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/commands/release.py +0 -0
  89. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/commands/repo.py +0 -0
  90. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/commands/report.py +0 -0
  91. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/commands/review.py +0 -0
  92. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/commands/scorecard.py +0 -0
  93. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/commands/sessions.py +0 -0
  94. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/commands/setup.py +0 -0
  95. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/commands/status.py +0 -0
  96. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/commands/terminal.py +0 -0
  97. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/commands/test_gate.py +0 -0
  98. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/commands/tui.py +0 -0
  99. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/comments.py +0 -0
  100. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/config.py +0 -0
  101. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/conflict_fix.py +0 -0
  102. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dao.py +0 -0
  103. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/__init__.py +0 -0
  104. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/fixture.py +0 -0
  105. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/index.html +0 -0
  106. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/server.py +0 -0
  107. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/terminal.py +0 -0
  108. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/.gitignore +0 -0
  109. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/components.json +0 -0
  110. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/dist/assets/Gallery-Cq84itDE.js +0 -0
  111. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  112. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/dist/assets/Terminal-DOXLcMue.js +0 -0
  113. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/dist/assets/index-DHn-RIJ8.js +0 -0
  114. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  115. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  116. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  117. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  118. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  119. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/dist/index.html +0 -0
  120. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  121. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/dist/sw.js +0 -0
  122. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  123. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  124. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  125. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  126. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  127. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  128. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  129. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  130. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  131. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  132. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/eslint.config.js +0 -0
  133. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/index.html +0 -0
  134. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  135. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/package-lock.json +0 -0
  136. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/package.json +0 -0
  137. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  138. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/playwright.config.ts +0 -0
  139. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/postcss.config.js +0 -0
  140. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  141. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  142. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  143. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/App.tsx +0 -0
  144. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/api/client.ts +0 -0
  145. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  146. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  147. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  148. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  149. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  150. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  151. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  152. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  153. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  154. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  155. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  156. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  157. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  158. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  159. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  160. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  161. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  162. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  163. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  164. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  165. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  166. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  167. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  168. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  169. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  170. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  171. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  172. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  173. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  174. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  175. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  176. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  177. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  178. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  179. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  180. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/index.css +0 -0
  181. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  182. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  183. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/main.tsx +0 -0
  184. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  185. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  186. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  187. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  188. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  189. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  190. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  191. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  192. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  193. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  194. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  195. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  196. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  197. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  198. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  199. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  200. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  201. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  202. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  203. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  204. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  205. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  206. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  207. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/tailwind.config.js +0 -0
  208. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/tsconfig.json +0 -0
  209. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  210. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dashboard/webapp/vite.config.ts +0 -0
  211. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dead_end.py +0 -0
  212. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/deploy/README.md +0 -0
  213. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/deploy/coord-agent.service +0 -0
  214. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/deploy/coord-db-backup.service +0 -0
  215. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/deploy/coord-db-backup.sh +0 -0
  216. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/deploy/coord-db-backup.timer +0 -0
  217. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/deploy/coord-drive-queue.service +0 -0
  218. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/deploy/coord-drive-queue.timer +0 -0
  219. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/deploy/coord-notify.service +0 -0
  220. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/deploy/coord-notify.timer +0 -0
  221. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/deploy/coord-release-propagate.service +0 -0
  222. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/deploy/coord-release-propagate.timer +0 -0
  223. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/deploy/coord-release-window.service +0 -0
  224. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/deploy/coord-release-window.timer +0 -0
  225. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/deploy/coord-serve.service +0 -0
  226. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/deploy/coord-web-dist-build.service +0 -0
  227. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/deploy/coord-web-dist-build.timer +0 -0
  228. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/deploy/coord-web.service +0 -0
  229. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/deploy_manifest.py +0 -0
  230. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/deploy_units.py +0 -0
  231. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/deps.py +0 -0
  232. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/diagnose.py +0 -0
  233. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dispatch.py +0 -0
  234. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/dist_name.py +0 -0
  235. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/drive.py +0 -0
  236. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/drive_queue.py +0 -0
  237. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/drive_state.py +0 -0
  238. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/events.py +0 -0
  239. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/failure_class.py +0 -0
  240. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/filelock.py +0 -0
  241. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/fleet_config_health.py +0 -0
  242. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/freshness.py +0 -0
  243. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/gate_a.py +0 -0
  244. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/gate_b.py +0 -0
  245. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/gate_snapshot.py +0 -0
  246. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/gates.py +0 -0
  247. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/github_ops.py +0 -0
  248. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/goal.py +0 -0
  249. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/graph_health.py +0 -0
  250. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/health/__init__.py +0 -0
  251. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/health/aggregate.py +0 -0
  252. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/health/checks/__init__.py +0 -0
  253. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/health/checks/agent_install.py +0 -0
  254. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/health/checks/cargo_targets.py +0 -0
  255. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/health/checks/claude_binary.py +0 -0
  256. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/health/checks/deploy_lane_facts.py +0 -0
  257. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/health/checks/disk.py +0 -0
  258. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/health/checks/fleet_board.py +0 -0
  259. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  260. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/health/checks/fleet_phantom.py +0 -0
  261. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/health/checks/fleet_unit_drift.py +0 -0
  262. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/health/checks/graph.py +0 -0
  263. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/health/checks/graphify_cli.py +0 -0
  264. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/health/checks/plan_usage.py +0 -0
  265. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/health/checks/repo_state.py +0 -0
  266. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/health/checks/spawned_coord.py +0 -0
  267. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/health/checks/timer_active.py +0 -0
  268. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/health/checks/toolchain.py +0 -0
  269. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/health/checks/unit_drift.py +0 -0
  270. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/health/checks/unit_enablement.py +0 -0
  271. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/health/checks/worktrees.py +0 -0
  272. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/health/cli.py +0 -0
  273. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/health/context.py +0 -0
  274. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/health/fleet_snapshot.py +0 -0
  275. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/health/models.py +0 -0
  276. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/health/pypi.py +0 -0
  277. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/health/registry.py +0 -0
  278. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/health/render.py +0 -0
  279. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/health/units.py +0 -0
  280. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/hooks.py +0 -0
  281. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/housekeeping.py +0 -0
  282. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/interactive.py +0 -0
  283. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/issue_store.py +0 -0
  284. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/liveness_auditor.py +0 -0
  285. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/machine_pause.py +0 -0
  286. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/milestone_chat.py +0 -0
  287. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/milestone_dispatch.py +0 -0
  288. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/milestone_gate.py +0 -0
  289. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/milestone_order.py +0 -0
  290. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/mock_author.py +0 -0
  291. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/models.py +0 -0
  292. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/network.py +0 -0
  293. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/new_issue_chat.py +0 -0
  294. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/notifier/__init__.py +0 -0
  295. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/notifier/baseline.py +0 -0
  296. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/notifier/cli.py +0 -0
  297. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/notifier/collect.py +0 -0
  298. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/notifier/digest.py +0 -0
  299. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/notifier/models.py +0 -0
  300. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/notifier/predicate.py +0 -0
  301. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/notifier/service.py +0 -0
  302. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/notifier/store.py +0 -0
  303. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/notifier/transport.py +0 -0
  304. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/notify.py +0 -0
  305. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/openapi.py +0 -0
  306. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/overlap_fence.py +0 -0
  307. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/parentage.py +0 -0
  308. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/parentage_github.py +0 -0
  309. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/pipeline.py +0 -0
  310. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/plan_parser.py +0 -0
  311. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/plans.py +0 -0
  312. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/platform_paths.py +0 -0
  313. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/portal_bridge.py +0 -0
  314. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/pr_body_lint.py +0 -0
  315. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/prereqs.py +0 -0
  316. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/progress.py +0 -0
  317. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/providers/__init__.py +0 -0
  318. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/providers/base.py +0 -0
  319. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/providers/claude.py +0 -0
  320. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/providers/claude_pty.py +0 -0
  321. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/providers/opencode.py +0 -0
  322. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/reconcile.py +0 -0
  323. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/refine_chat.py +0 -0
  324. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/release_cordon.py +0 -0
  325. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/release_propagate.py +0 -0
  326. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/release_verify.py +0 -0
  327. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/release_window.py +0 -0
  328. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/repo_edit.py +0 -0
  329. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/repo_onboard.py +0 -0
  330. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/reports.py +0 -0
  331. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/revalidate.py +0 -0
  332. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/review.py +0 -0
  333. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/scorecard.py +0 -0
  334. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/skills/update-issue/SKILL.md +0 -0
  335. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/smoke.py +0 -0
  336. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/spend_ceiling.py +0 -0
  337. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/split_work.py +0 -0
  338. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/stage_projection.py +0 -0
  339. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/state.py +0 -0
  340. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/test_author.py +0 -0
  341. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/test_chat.py +0 -0
  342. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/test_orchestrator.py +0 -0
  343. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/test_report.py +0 -0
  344. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/tui_release.py +0 -0
  345. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/usage.py +0 -0
  346. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/usage_limits.py +0 -0
  347. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/usage_rollup.py +0 -0
  348. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/coord/worker_events.py +0 -0
  349. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/deploy/coord-agent.service +0 -0
  350. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/deploy/coord-db-backup.service +0 -0
  351. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/deploy/coord-db-backup.sh +0 -0
  352. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/deploy/coord-db-backup.timer +0 -0
  353. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/deploy/coord-drive-queue.service +0 -0
  354. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/deploy/coord-drive-queue.timer +0 -0
  355. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/deploy/coord-notify.service +0 -0
  356. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/deploy/coord-notify.timer +0 -0
  357. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/deploy/coord-release-propagate.service +0 -0
  358. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/deploy/coord-release-propagate.timer +0 -0
  359. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/deploy/coord-release-window.service +0 -0
  360. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/deploy/coord-release-window.timer +0 -0
  361. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/deploy/coord-serve.service +0 -0
  362. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/deploy/coord-web-dist-build.service +0 -0
  363. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/deploy/coord-web-dist-build.sh +0 -0
  364. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/deploy/coord-web-dist-build.timer +0 -0
  365. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/deploy/coord-web-rollback.sh +0 -0
  366. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/deploy/coord-web.service +0 -0
  367. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/deploy/node-shim.sh +0 -0
  368. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/docs/AGENT_OPERATIONS.md +0 -0
  369. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/docs/ARCHITECTURE.md +0 -0
  370. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/docs/ARCH_SECURITY_GATES.md +0 -0
  371. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/docs/COCKPIT.md +0 -0
  372. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/docs/CONTROL_CENTER.md +0 -0
  373. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/docs/COST_DISCIPLINE.md +0 -0
  374. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/docs/CROSS_PLATFORM.md +0 -0
  375. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/docs/DRIVE_QUEUE.md +0 -0
  376. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/docs/EPHEMERAL_WORKERS.md +0 -0
  377. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/docs/FORGE_MIGRATION.md +0 -0
  378. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/docs/GRAPHIFY_SETUP.md +0 -0
  379. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/docs/ISSUE_GUIDANCE.md +0 -0
  380. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/docs/MAC_MINI.md +0 -0
  381. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  382. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/docs/NOTIFIER.md +0 -0
  383. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/docs/OPENCODE_VERIFICATION.md +0 -0
  384. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/docs/ORACLE_LOOP.md +0 -0
  385. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/docs/PHONE_WEBAPP.md +0 -0
  386. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/docs/PIPELINE_V2.md +0 -0
  387. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/docs/PLATFORM_EVOLUTION.md +0 -0
  388. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/docs/SECOND_BACKEND.md +0 -0
  389. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/docs/STORE_SERVICE.md +0 -0
  390. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  391. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/docs/WEB_CONTROL_CENTER.md +0 -0
  392. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/docs/mocks/web/README.md +0 -0
  393. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/docs/mocks/web/_tokens.css +0 -0
  394. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/docs/mocks/web/issue-detail.html +0 -0
  395. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/docs/mocks/web/pipeline-narrow.html +0 -0
  396. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/docs/mocks/web/pipeline-wide.html +0 -0
  397. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/graphify-out/.gitignore +0 -0
  398. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/install-agent.sh +0 -0
  399. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/pyproject.toml +0 -0
  400. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/scripts/audit_review_verdict_overrides.py +0 -0
  401. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  402. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/scripts/azure-workers/build-worker-image.sh +0 -0
  403. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/scripts/azure-workers/coordinator-machine.py +0 -0
  404. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/scripts/azure-workers/epic-down.sh +0 -0
  405. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/scripts/azure-workers/epic-up.sh +0 -0
  406. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/scripts/azure-workers/preflight.sh +0 -0
  407. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/scripts/azure-workers/provision-worker.sh +0 -0
  408. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  409. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  410. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/scripts/azure-workers/verify-github-token.sh +0 -0
  411. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/scripts/codegen.py +0 -0
  412. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/scripts/coord-test-runner.sh +0 -0
  413. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/scripts/drive-batch.sh +0 -0
  414. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/scripts/gen_board_fixture.py +0 -0
  415. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/scripts/next_release_tag.py +0 -0
  416. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/scripts/run_tests_in_populated_home.sh +0 -0
  417. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/scripts/run_tests_without_gh.sh +0 -0
  418. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/scripts/smoke_437_interactive.py +0 -0
  419. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/scripts/verify_878_review_capture.py +0 -0
  420. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/scripts/verify_release_published.py +0 -0
  421. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/scripts/verify_release_wheel.py +0 -0
  422. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/setup.cfg +0 -0
  423. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/SMOKE_SET.md +0 -0
  424. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/__init__.py +0 -0
  425. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  426. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/acceptance/ms-33/contract.md +0 -0
  427. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/acceptance/ms-33/manifest.yml +0 -0
  428. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  429. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  430. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  431. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  432. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/acceptance/ms-37/conftest.py +0 -0
  433. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/acceptance/ms-37/contract.md +0 -0
  434. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/acceptance/ms-37/manifest.yml +0 -0
  435. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  436. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  437. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/acceptance/ms-38/contract.md +0 -0
  438. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/acceptance/ms-38/manifest.yml +0 -0
  439. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  440. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  441. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  442. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  443. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  444. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  445. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  446. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  447. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  448. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  449. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/acceptance/ms-51/contract.md +0 -0
  450. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  451. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  452. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/acceptance/ms-51/manifest.yml +0 -0
  453. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  454. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/acceptance/ms-51/tsconfig.json +0 -0
  455. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  456. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/conftest.py +0 -0
  457. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/fixtures/board-pipeline-basic.json +0 -0
  458. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  459. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  460. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  461. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/fixtures/playwright/all_pass.json +0 -0
  462. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  463. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/fixtures/playwright/mixed_fail.json +0 -0
  464. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  465. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  466. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/fixtures/playwright/skip.json +0 -0
  467. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/fixtures/playwright/truncated.json +0 -0
  468. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  469. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  470. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  471. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  472. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  473. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  474. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  475. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  476. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_acceptance.py +0 -0
  477. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_acceptance_drivers.py +0 -0
  478. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_agent.py +0 -0
  479. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_agent_api_error.py +0 -0
  480. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_agent_branch_base.py +0 -0
  481. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_agent_branch_capture.py +0 -0
  482. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_agent_config_free_1712.py +0 -0
  483. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_agent_deploy_units_endpoint.py +0 -0
  484. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_agent_dirty_worktree.py +0 -0
  485. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_agent_graph_self_heal.py +0 -0
  486. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_agent_health_h3.py +0 -0
  487. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_agent_idle_restart.py +0 -0
  488. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_agent_push_failure.py +0 -0
  489. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_agent_reap.py +0 -0
  490. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_agent_repos_and_pull.py +0 -0
  491. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_agent_restart_services_endpoint.py +0 -0
  492. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_agent_startup_diagnostics.py +0 -0
  493. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_agent_update.py +0 -0
  494. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_agent_update_bluegreen.py +0 -0
  495. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_agent_usage_limit.py +0 -0
  496. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_agent_zero_commit.py +0 -0
  497. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_ambient_home_isolation.py +0 -0
  498. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_approve_reject_plan.py +0 -0
  499. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_approve_usage_gate.py +0 -0
  500. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_assignment_already_recorded_daemon.py +0 -0
  501. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_audit_log.py +0 -0
  502. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_audit_outcome.py +0 -0
  503. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_audit_query.py +0 -0
  504. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_auto_loop.py +0 -0
  505. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_auto_release_publish_2035.py +0 -0
  506. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_base_checkout_restore.py +0 -0
  507. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_board_cap_762.py +0 -0
  508. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_board_fixture.py +0 -0
  509. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_board_read_path.py +0 -0
  510. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_board_service.py +0 -0
  511. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_board_state.py +0 -0
  512. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_board_wire.py +0 -0
  513. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_brain.py +0 -0
  514. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_branch_model.py +0 -0
  515. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_bug_intake.py +0 -0
  516. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_build_worker_image_env_update.py +0 -0
  517. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cargo_cache.py +0 -0
  518. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_ci_acceptance_gate_1950.py +0 -0
  519. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_ci_parity_2091.py +0 -0
  520. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_ci_store.py +0 -0
  521. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_claim.py +0 -0
  522. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_acceptance.py +0 -0
  523. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_assign.py +0 -0
  524. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  525. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_assign_interactive_remote.py +0 -0
  526. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_assign_provider.py +0 -0
  527. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  528. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_audit.py +0 -0
  529. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_chat_continue.py +0 -0
  530. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_diagnose_config_provenance.py +0 -0
  531. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_diagnose_graph.py +0 -0
  532. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_doctor.py +0 -0
  533. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_doctor_config_free_1801.py +0 -0
  534. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  535. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_drive.py +0 -0
  536. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_drive_queue.py +0 -0
  537. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_escalate.py +0 -0
  538. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_fix_headless_review.py +0 -0
  539. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_gate_a.py +0 -0
  540. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_install_drift.py +0 -0
  541. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_install_skills.py +0 -0
  542. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_issue_create_label.py +0 -0
  543. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_issue_reopen.py +0 -0
  544. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_milestone_assign.py +0 -0
  545. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_milestone_capture.py +0 -0
  546. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_milestone_chat_add_child.py +0 -0
  547. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_milestone_dispatch.py +0 -0
  548. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_milestone_gate_b.py +0 -0
  549. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_milestone_gate_c.py +0 -0
  550. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_milestone_order.py +0 -0
  551. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  552. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_milestone_ship.py +0 -0
  553. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_network.py +0 -0
  554. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_new_issue_chat.py +0 -0
  555. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_plans.py +0 -0
  556. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_pull_artifact.py +0 -0
  557. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_queue.py +0 -0
  558. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_reattach_sessions.py +0 -0
  559. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_refine_board.py +0 -0
  560. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_release_preflight.py +0 -0
  561. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_release_propagate.py +0 -0
  562. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_release_window.py +0 -0
  563. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_repo_2220.py +0 -0
  564. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_scorecard.py +0 -0
  565. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_set_review_findings.py +0 -0
  566. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_status_advisory_terminal.py +0 -0
  567. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_status_merge_queue.py +0 -0
  568. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_status_provider.py +0 -0
  569. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_status_review_finalizing.py +0 -0
  570. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_status_test_failed_tag.py +0 -0
  571. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_status_usage_limit.py +0 -0
  572. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_sync_comments_873.py +0 -0
  573. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_test_plan.py +0 -0
  574. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_track.py +0 -0
  575. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_tui_update.py +0 -0
  576. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cli_wait.py +0 -0
  577. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_client_base_install.py +0 -0
  578. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_comments.py +0 -0
  579. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_completion_summary.py +0 -0
  580. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_config.py +0 -0
  581. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_config_acceptance.py +0 -0
  582. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_config_audit.py +0 -0
  583. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_config_pricing.py +0 -0
  584. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_config_usage_gate.py +0 -0
  585. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_conflict_fix.py +0 -0
  586. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_conflict_fix_semantic.py +0 -0
  587. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_coord_test.py +0 -0
  588. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_coord_test_runner_baseline.py +0 -0
  589. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_coord_test_runner_routing.py +0 -0
  590. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_coord_test_runner_toolchain.py +0 -0
  591. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_coord_web_sse_restart_live.py +0 -0
  592. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_coordinator_machine.py +0 -0
  593. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_cross_platform_imports.py +0 -0
  594. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_dashboard.py +0 -0
  595. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_dashboard_fixture.py +0 -0
  596. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_dashboard_terminal.py +0 -0
  597. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_dashboard_terminal_live.py +0 -0
  598. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_db.py +0 -0
  599. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_dead_end.py +0 -0
  600. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_deploy_coord_db_backup.py +0 -0
  601. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_deploy_coord_web_dist.py +0 -0
  602. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_deploy_coord_web_rollback.py +0 -0
  603. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_deploy_drive_queue_unit.py +0 -0
  604. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_deploy_manifest.py +0 -0
  605. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_deploy_units_lane.py +0 -0
  606. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_deploy_web_unit.py +0 -0
  607. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_deps.py +0 -0
  608. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_diagnose.py +0 -0
  609. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_dispatch.py +0 -0
  610. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_dispatch_target_validation.py +0 -0
  611. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_dist_name.py +0 -0
  612. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_done_housekeeping.py +0 -0
  613. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_drive.py +0 -0
  614. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_drive_queue.py +0 -0
  615. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_drive_state.py +0 -0
  616. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_drive_tmux.py +0 -0
  617. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_epic_up_capability_detection.py +0 -0
  618. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  619. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_epic_up_image_provenance.py +0 -0
  620. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_errors.py +0 -0
  621. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_events.py +0 -0
  622. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_failure_class.py +0 -0
  623. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_filelock.py +0 -0
  624. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  625. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_fix_of_force_override.py +0 -0
  626. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_fleet_config_health.py +0 -0
  627. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_fleet_health_probes.py +0 -0
  628. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_fleet_health_snapshot.py +0 -0
  629. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_freshness.py +0 -0
  630. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_gate_a.py +0 -0
  631. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_gate_b.py +0 -0
  632. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_gate_snapshot_staleness.py +0 -0
  633. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_gates.py +0 -0
  634. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  635. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_generated_types_fixture.py +0 -0
  636. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_github_ops.py +0 -0
  637. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_goal.py +0 -0
  638. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_graph_health.py +0 -0
  639. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_graph_selfheal_absent_2237.py +0 -0
  640. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_handoff.py +0 -0
  641. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_health_checks.py +0 -0
  642. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_health_cli.py +0 -0
  643. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_health_cli_graph.py +0 -0
  644. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_health_config.py +0 -0
  645. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_health_context.py +0 -0
  646. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_health_deploy_lane_facts.py +0 -0
  647. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_health_incident_regression.py +0 -0
  648. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_health_pypi.py +0 -0
  649. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_health_registry.py +0 -0
  650. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_health_timer_active.py +0 -0
  651. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_health_toolchain.py +0 -0
  652. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_health_unit_drift.py +0 -0
  653. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_health_unit_enablement.py +0 -0
  654. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_hooks.py +0 -0
  655. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_human_attended_437.py +0 -0
  656. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_init.py +0 -0
  657. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_integration.py +0 -0
  658. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_interactive_briefing_echo.py +0 -0
  659. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_interactive_prefill_state.py +0 -0
  660. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_interactive_session_relaunch.py +0 -0
  661. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_interactive_test_verdict_backstop.py +0 -0
  662. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_interactive_token_attribution.py +0 -0
  663. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_interactive_worktree.py +0 -0
  664. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_issue_store_seam.py +0 -0
  665. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_liveness_auditor.py +0 -0
  666. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_liveness_notify.py +0 -0
  667. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_machine_pause.py +0 -0
  668. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_merge_verify.py +0 -0
  669. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_milestone_chat.py +0 -0
  670. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_milestone_dispatch.py +0 -0
  671. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_milestone_gate.py +0 -0
  672. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_milestone_order.py +0 -0
  673. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_milestone_seam.py +0 -0
  674. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_mock_author.py +0 -0
  675. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_model_tiering.py +0 -0
  676. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_models.py +0 -0
  677. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_models_config_labels.py +0 -0
  678. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_needs_attention.py +0 -0
  679. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_network.py +0 -0
  680. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_new_issue_chat.py +0 -0
  681. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_next_release_tag.py +0 -0
  682. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_no_direct_gh_calls.py +0 -0
  683. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_node_shim.py +0 -0
  684. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_notifier_baseline.py +0 -0
  685. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_notifier_cli.py +0 -0
  686. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_notifier_collect.py +0 -0
  687. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_notifier_config.py +0 -0
  688. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_notifier_drive_seam.py +0 -0
  689. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_notifier_isolation.py +0 -0
  690. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_notifier_predicate.py +0 -0
  691. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_notifier_quiet_hours.py +0 -0
  692. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_notifier_service.py +0 -0
  693. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_notify.py +0 -0
  694. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_notify_drain.py +0 -0
  695. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_openapi.py +0 -0
  696. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_operational_defaults.py +0 -0
  697. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_overlap_fence.py +0 -0
  698. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_packaged_deploy_units.py +0 -0
  699. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_parentage.py +0 -0
  700. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_paste_landed.py +0 -0
  701. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_pipeline.py +0 -0
  702. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_plan_followup_approve_plan_command.py +0 -0
  703. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_plan_followup_pr_command.py +0 -0
  704. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_plan_followup_review_command.py +0 -0
  705. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_plan_only.py +0 -0
  706. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_plan_parser.py +0 -0
  707. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_platform_paths.py +0 -0
  708. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_portal_bridge.py +0 -0
  709. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_portal_config.py +0 -0
  710. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_pr_body_lint.py +0 -0
  711. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_prereqs.py +0 -0
  712. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_production_db_guard.py +0 -0
  713. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_progress.py +0 -0
  714. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_provider_seam.py +0 -0
  715. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_providers.py +0 -0
  716. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_providers_config_labels.py +0 -0
  717. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_providers_pty.py +0 -0
  718. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_quiet_hours.py +0 -0
  719. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_quiet_hours_store_2146.py +0 -0
  720. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_reap_merged_sessions.py +0 -0
  721. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_reap_stale_interactive_tick.py +0 -0
  722. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_reconcile_branch.py +0 -0
  723. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_reconcile_completions.py +0 -0
  724. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_reconcile_merges.py +0 -0
  725. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_reconcile_usage_limit_done.py +0 -0
  726. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_refine_chat.py +0 -0
  727. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_release_cordon_2101.py +0 -0
  728. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_release_cordon_deadlock_2240.py +0 -0
  729. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_release_propagate.py +0 -0
  730. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_release_unified_1242.py +0 -0
  731. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_release_verify.py +0 -0
  732. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_release_window.py +0 -0
  733. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_remote_auto_prune.py +0 -0
  734. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_remote_interactive_reaper.py +0 -0
  735. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_repo_edit_2220.py +0 -0
  736. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_repo_graph_fleet_2237.py +0 -0
  737. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_repo_onboard_2220.py +0 -0
  738. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_report_result_push.py +0 -0
  739. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_reports.py +0 -0
  740. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_retry.py +0 -0
  741. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_retry_advisory_1606.py +0 -0
  742. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_retry_type_1636.py +0 -0
  743. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_revalidate.py +0 -0
  744. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_review.py +0 -0
  745. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_review_end_review_without_verdict.py +0 -0
  746. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_review_parse_failure_diagnostic.py +0 -0
  747. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_review_reaffirm.py +0 -0
  748. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_review_state.py +0 -0
  749. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_review_verdict_backstop.py +0 -0
  750. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_review_verdict_override_audit.py +0 -0
  751. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_review_verdict_relay.py +0 -0
  752. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_review_zero_commits.py +0 -0
  753. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_scoped_review_wiring.py +0 -0
  754. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_scorecard.py +0 -0
  755. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_serve_app_board_trim.py +0 -0
  756. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_session.py +0 -0
  757. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_slice_issue_attribution.py +0 -0
  758. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_smoke.py +0 -0
  759. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_smoke_live_checkout_restore.py +0 -0
  760. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_smoke_workflow.py +0 -0
  761. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_spend_ceiling.py +0 -0
  762. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_spend_ceiling_coordinator.py +0 -0
  763. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_split.py +0 -0
  764. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_split_work.py +0 -0
  765. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_stage_projection.py +0 -0
  766. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_stalled_pipeline.py +0 -0
  767. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_state.py +0 -0
  768. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_state_review_findings_daemon.py +0 -0
  769. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_status_fleet_footer.py +0 -0
  770. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_stop_1567.py +0 -0
  771. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_stuck.py +0 -0
  772. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_terminal_command.py +0 -0
  773. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_test_author.py +0 -0
  774. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_test_chat.py +0 -0
  775. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_test_orchestrator.py +0 -0
  776. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_test_report.py +0 -0
  777. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_test_verdict_parsing.py +0 -0
  778. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_test_verdict_transcript_floor.py +0 -0
  779. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_thin_client_board_audit.py +0 -0
  780. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_thin_client_config_load_1080.py +0 -0
  781. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_thin_client_daemon_routing_906.py +0 -0
  782. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_tmux_host.py +0 -0
  783. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_tmux_session.py +0 -0
  784. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_transcript_floor.py +0 -0
  785. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_usage.py +0 -0
  786. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_usage_limits.py +0 -0
  787. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_usage_rollup.py +0 -0
  788. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_venv_live_install_2121.py +0 -0
  789. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_version_single_source.py +0 -0
  790. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_watch.py +0 -0
  791. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_worker_events.py +0 -0
  792. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_worker_image_pin_sync.py +0 -0
  793. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_worker_safety.py +0 -0
  794. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_worker_test_scoping.py +0 -0
  795. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_worktree.py +0 -0
  796. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  797. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/Cargo.lock +0 -0
  798. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/Cargo.toml +0 -0
  799. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/cargo-config-local-quadraui.toml.example +0 -0
  800. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/app/audit.rs +0 -0
  801. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/app/chat.rs +0 -0
  802. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/app/data.rs +0 -0
  803. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/app/dialogs.rs +0 -0
  804. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/app/drive.rs +0 -0
  805. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/app/drive_queue.rs +0 -0
  806. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/app/escalation.rs +0 -0
  807. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/app/events.rs +0 -0
  808. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/app/fixtures.rs +0 -0
  809. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/app/fleet_health.rs +0 -0
  810. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/app/fleet_sessions.rs +0 -0
  811. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/app/fleet_terminals.rs +0 -0
  812. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/app/format.rs +0 -0
  813. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/app/milestone_dag.rs +0 -0
  814. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/app/mod.rs +0 -0
  815. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/app/msv.rs +0 -0
  816. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/app/pipeline.rs +0 -0
  817. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/app/plans.rs +0 -0
  818. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/app/render.rs +0 -0
  819. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/app/reports.rs +0 -0
  820. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/app/sessions.rs +0 -0
  821. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/app/settings_ui.rs +0 -0
  822. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/app/sidebar.rs +0 -0
  823. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/app/terminal.rs +0 -0
  824. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/app/tests.rs +0 -0
  825. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/app/types.rs +0 -0
  826. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/app/workspace.rs +0 -0
  827. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/bin/gtk.rs +0 -0
  828. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/commands.rs +0 -0
  829. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/lib.rs +0 -0
  830. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/main.rs +0 -0
  831. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/src/settings.rs +0 -0
  832. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/tests/acceptance.rs +0 -0
  833. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/tests/cli.rs +0 -0
  834. {code_coordinator-0.5.85 → code_coordinator-0.5.87}/tui/tests/fixtures/board_sample.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.85
3
+ Version: 0.5.87
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.85
3
+ Version: 0.5.87
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
@@ -102,6 +102,8 @@ coord/plan_parser.py
102
102
  coord/plans.py
103
103
  coord/platform_paths.py
104
104
  coord/portal_bridge.py
105
+ coord/portal_store.py
106
+ coord/portal_sync.py
105
107
  coord/pr_body_lint.py
106
108
  coord/prereqs.py
107
109
  coord/progress.py
@@ -650,6 +652,7 @@ tests/test_plan_parser.py
650
652
  tests/test_platform_paths.py
651
653
  tests/test_portal_bridge.py
652
654
  tests/test_portal_config.py
655
+ tests/test_portal_sync.py
653
656
  tests/test_pr_body_lint.py
654
657
  tests/test_prereqs.py
655
658
  tests/test_production_db_guard.py
@@ -277,6 +277,8 @@
277
277
  "coord/plans.py",
278
278
  "coord/platform_paths.py",
279
279
  "coord/portal_bridge.py",
280
+ "coord/portal_store.py",
281
+ "coord/portal_sync.py",
280
282
  "coord/pr_body_lint.py",
281
283
  "coord/prereqs.py",
282
284
  "coord/progress.py",
@@ -680,6 +682,7 @@
680
682
  "tests/test_platform_paths.py",
681
683
  "tests/test_portal_bridge.py",
682
684
  "tests/test_portal_config.py",
685
+ "tests/test_portal_sync.py",
683
686
  "tests/test_pr_body_lint.py",
684
687
  "tests/test_prereqs.py",
685
688
  "tests/test_production_db_guard.py",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.85",
2
+ "tag": "0.5.87",
3
3
  "distance": 0,
4
- "node": "g87a8be6dfe549ad5607352dbdda991a3ed87f1fd",
4
+ "node": "g4f4b41ca5d91aa713ccb5b36e1cb66e4f631fca1",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-14"
@@ -317,6 +317,101 @@ def _dispatch_revalidation_conflicts(conflicted, config, *, dry_run: bool) -> No
317
317
  _dispatch_conflict_fixes(events, config, dry_run=False)
318
318
 
319
319
 
320
+ def _sweep_sibling_conflicts(events, items, config, gh_ops, *, dry_run: bool) -> list:
321
+ """#2246: after a merge lands, ask GitHub which sibling PRs it just broke.
322
+
323
+ A merge into ``target_branch`` can invalidate every other open PR against
324
+ that same branch. GitHub computes exactly which ones, asynchronously and
325
+ for free, and until #2246 nothing asked at the moment it matters —
326
+ ``mergeable`` was consulted only at *merge* time, i.e. one drive attempt
327
+ too late. On 2026-08-14 that cost four terminal ``blocked`` entries across
328
+ two repos: quadraui #306/#309 presented as "smoke gate — test verdict
329
+ stale", claude-coordinator #2234 as "checks_failed … (unknown)" with
330
+ ``coord fix`` asserting "CI is RED" for a PR whose CI had never run at all
331
+ (GitHub builds ``pull_request`` workflows from ``refs/pull/N/merge``, which
332
+ cannot exist while the PR conflicts, so *zero* check-suites were queued and
333
+ the absence was read as failure — #2244). No surface said *conflict*.
334
+
335
+ Two things happen for each sibling GitHub now reports ``CONFLICTING``,
336
+ both inside :func:`coord.merge_queue.sweep_sibling_conflicts` and the
337
+ dispatch call below:
338
+
339
+ 1. The entry is parked at ``CONFLICT`` with an error naming the merge that
340
+ broke it — so the next surface to read it says the true thing instead of
341
+ re-deriving whichever gate happened to be failing for an unrelated
342
+ reason, and ``coord drive``'s #1738 re-test arm stops answering a
343
+ conflict with a suite run.
344
+ 2. It is handed to :func:`_dispatch_conflict_fixes` as an ordinary
345
+ ``conflict`` event — the SAME call the post-``process()`` path makes —
346
+ so #241's conflict-fix worker is dispatched with every guard intact:
347
+ :func:`coord.merge_queue.classify_conflict` must still read the error as
348
+ ``rebaseable``, the #241/#784 retry cap still flips a second failure to
349
+ ``HUMAN_REQUIRED``, and ``dispatch_conflict_fix``'s in-flight check
350
+ still refuses a duplicate. Routed through that function rather than
351
+ calling ``dispatch_conflict_fix`` directly for the reason #2231 gives:
352
+ a second dispatch site with its own copy of those guards is how they
353
+ drift apart. That dispatch call can advance ``ev.entry.state`` a
354
+ second time (e.g. to ``HUMAN_REQUIRED`` on a retry-cap hit) — this
355
+ function persists that too, scoped to just the swept entries, so a
356
+ sibling this caller doesn't hold in ``items`` (the ``--only`` path)
357
+ doesn't have its escalation silently dropped on the floor while the
358
+ audit log claims it happened (#2246 review).
359
+
360
+ Skipped entirely under ``--dry-run`` — ``process()`` emits ``merged``
361
+ events there too, but nothing actually landed, so no sibling's mergeability
362
+ can have changed and marking one would be a lie written to the queue.
363
+
364
+ Returns the conflict events so the caller can fold them into its summary;
365
+ never raises (the sweep itself fails open — see its docstring). The merge
366
+ that triggered this has already succeeded and must not be undone or
367
+ obscured by a failed read afterwards.
368
+ """
369
+ if dry_run:
370
+ return []
371
+ from coord import merge_queue as _mq # noqa: PLC0415
372
+
373
+ try:
374
+ sweep_events = _mq.sweep_sibling_conflicts(events, items, gh_ops)
375
+ except Exception as e: # noqa: BLE001 — never let the sweep undo a merge
376
+ click.echo(
377
+ f" sibling-conflict sweep failed (merge itself is unaffected): {e!r}",
378
+ err=True,
379
+ )
380
+ return []
381
+ for ev in sweep_events:
382
+ e = ev.entry
383
+ click.echo(
384
+ f" {e.repo_name} #{e.issue_number} ({e.branch}): {ev.kind} — "
385
+ f"{ev.message}"
386
+ )
387
+ _dispatch_conflict_fixes(sweep_events, config, dry_run=False)
388
+ # #2246 review: `_dispatch_conflict_fixes` can advance a swept sibling's
389
+ # state a second time in place — e.g. `entry.state = HUMAN_REQUIRED` when
390
+ # `has_prior_conflict_fix` finds this sibling already burned a
391
+ # conflict-fix attempt against an earlier conflict. `mq.sweep_sibling_
392
+ # conflicts` above already persisted its own CONFLICT write, but for a
393
+ # sibling this caller doesn't hold in `items` (the `--only` path, the
394
+ # exact one #2246 targets), nothing after that dispatch call ever writes
395
+ # the newer HUMAN_REQUIRED back — `merge()`'s own final save keys only on
396
+ # `only_entry`. Without this, the audit log records "manual resolution
397
+ # required" while the board/queue still say CONFLICT: the split-brain
398
+ # class this repo's CLAUDE.md calls out (#1832/#2085). Persist here,
399
+ # scoped to just the entries this sweep touched — never the full queue —
400
+ # so a fresh conflict elsewhere isn't clobbered.
401
+ if sweep_events:
402
+ try:
403
+ fresh = _mq.load_queue()
404
+ by_id = {ev.entry.assignment_id: ev.entry for ev in sweep_events}
405
+ _mq.save_queue([by_id.get(x.assignment_id, x) for x in fresh])
406
+ except Exception as e: # noqa: BLE001 — fail open, per the sweep's own contract
407
+ click.echo(
408
+ " sibling-conflict fix-dispatch state failed to persist "
409
+ f"(merge itself is unaffected): {e!r}",
410
+ err=True,
411
+ )
412
+ return sweep_events
413
+
414
+
320
415
  def _dispatch_conflict_fixes(events, config, *, dry_run: bool) -> None:
321
416
  """#241: classify any conflict events and dispatch a conflict-fix worker
322
417
  for the eligible ones. Mutates each conflict event's ``ev.entry.state``
@@ -1691,6 +1786,16 @@ def merge(
1691
1786
  # before the save below so a retry-cap/non-rebaseable HUMAN_REQUIRED
1692
1787
  # mutation on only_entry.state is persisted, not lost.
1693
1788
  _dispatch_conflict_fixes(events_only, cfg_only, dry_run=dry_run)
1789
+ # #2246: `--only` merges one entry, but the branch it just moved is
1790
+ # shared — every OTHER queued PR based on it may have become
1791
+ # CONFLICTING a second ago. This is the drive-queue's path (`coord
1792
+ # drive` and the TUI both merge via `--only`), so it is exactly where
1793
+ # the 2026-08-14 collisions were minted. The sweep persists any
1794
+ # sibling it parks itself: the save below deliberately writes back
1795
+ # only `only_entry`.
1796
+ _sweep_sibling_conflicts(
1797
+ events_only, only_items, cfg_only, gh_ops, dry_run=dry_run,
1798
+ )
1694
1799
  if not dry_run:
1695
1800
  # Save only the modified entry back; all other entries are untouched.
1696
1801
  all_items_only = mq.load_queue()
@@ -2003,6 +2108,13 @@ def merge(
2003
2108
  # review, so the --only path below can share it).
2004
2109
  _dispatch_conflict_fixes(events, cfg, dry_run=dry_run)
2005
2110
 
2111
+ # #2246: whatever just landed may have invalidated its siblings — ask
2112
+ # GitHub now, while the merge that caused it is still the obvious
2113
+ # explanation, rather than letting the next drive attempt discover it as
2114
+ # some unrelated gate failure. Entries it parks are in `items`, so the
2115
+ # save below carries the mutation through naturally.
2116
+ _sweep_sibling_conflicts(events, items, cfg, gh_ops, dry_run=dry_run)
2117
+
2006
2118
  # Save state only when we actually moved
2007
2119
  if not dry_run:
2008
2120
  # Persist the updated entries by merging back over the on-disk queue.
@@ -0,0 +1,405 @@
1
+ """``coord portal`` — operate the coord-portal sync bridge (#2179, #1982).
2
+
3
+ #2179 shipped the thin HTTP client (``coord/portal_bridge.py``) and the three
4
+ commands that prove a credential pair works by hand: ``status``,
5
+ ``heartbeat``, ``push``.
6
+
7
+ #1982 added the loop those calls were missing — ``coord/portal_sync.py``,
8
+ running on the daemon's ``_tick_loop`` — and with it the commands that let an
9
+ operator see and drive it without waiting for a tick:
10
+
11
+ * ``sync`` runs one full pass now (pull → push → heartbeat);
12
+ * ``outbox`` shows what is queued, held, or rejected, and why;
13
+ * ``events`` shows what has been pulled in;
14
+ * ``enqueue-*`` puts a coord-owned fact on the queue, which is the supported
15
+ way to push one — unlike ``push``, the queue enforces the ordering rule
16
+ that keeps a customer from being emailed toward an empty screen (#835);
17
+ * ``requeue`` revives a row the drain retired after burning its retry budget.
18
+
19
+ The state-touching commands (``sync``, ``outbox``, ``events``, ``enqueue-*``,
20
+ ``requeue``)
21
+ read and write the daemon's own ``~/.coord/coord.db`` and are therefore
22
+ **daemon-host commands**. Run from a thin client they operate on that box's
23
+ empty local DB, which is not where the bridge lives.
24
+ """
25
+
26
+ from __future__ import annotations
27
+
28
+ import json
29
+
30
+ import click
31
+
32
+ from coord.commands._common import _CONFIG_OPTION, _load_config
33
+ from coord.portal_bridge import (
34
+ PortalBridgeError,
35
+ SUBMISSION_STATUSES,
36
+ client_from_config,
37
+ )
38
+
39
+
40
+ @click.group("portal")
41
+ def portal_group() -> None:
42
+ """coord-portal sync bridge — status, manual push, heartbeat (#2179)."""
43
+
44
+
45
+ @portal_group.command("status")
46
+ @_CONFIG_OPTION
47
+ @click.option("--json", "as_json", is_flag=True, default=False)
48
+ def portal_status(config_path, as_json: bool) -> None:
49
+ """Show whether the portal bridge is configured, without sending anything."""
50
+ cfg = _load_config(config_path).portal
51
+ payload = {
52
+ "enabled": cfg.enabled,
53
+ "base_url": cfg.base_url,
54
+ "credentials_set": bool(cfg.bridge_client_id and cfg.bridge_client_secret),
55
+ "timeout_secs": cfg.timeout_secs,
56
+ "max_retries": cfg.max_retries,
57
+ }
58
+ if as_json:
59
+ click.echo(json.dumps(payload, indent=2, sort_keys=True))
60
+ return
61
+ if not cfg.enabled:
62
+ click.echo("portal: disabled (no 'portal:' block, or portal.enabled: false)")
63
+ return
64
+ click.echo(f"portal: ENABLED base_url={cfg.base_url} "
65
+ f"credentials={'set' if payload['credentials_set'] else 'MISSING'}")
66
+
67
+
68
+ @portal_group.command("heartbeat")
69
+ @_CONFIG_OPTION
70
+ def portal_heartbeat(config_path) -> None:
71
+ """Send one heartbeat, proving the credential pair and base_url work.
72
+
73
+ Exits non-zero on failure — a 401 here means BRIDGE_CLIENT_ID/SECRET on
74
+ this side do not match what the portal has (or Cloudflare Access is
75
+ rejecting the request before it even gets there).
76
+ """
77
+ cfg = _load_config(config_path).portal
78
+ client = client_from_config(cfg)
79
+ if client is None:
80
+ click.secho(
81
+ "portal is not enabled — nothing to do (see `coord portal status`)",
82
+ fg="yellow",
83
+ )
84
+ raise SystemExit(1)
85
+ try:
86
+ ok = client.heartbeat()
87
+ except PortalBridgeError as exc:
88
+ click.secho(f"heartbeat failed: {exc}", fg="red")
89
+ raise SystemExit(1) from exc
90
+ if ok:
91
+ click.secho("heartbeat sent", fg="green")
92
+ return
93
+ click.secho("heartbeat sent but portal did not confirm 'ok'", fg="red")
94
+ raise SystemExit(1)
95
+
96
+
97
+ @portal_group.command("push")
98
+ @_CONFIG_OPTION
99
+ @click.argument("submission_id")
100
+ @click.argument("revision", type=int)
101
+ @click.argument("status", type=click.Choice(SUBMISSION_STATUSES))
102
+ def portal_push(config_path, submission_id: str, revision: int, status: str) -> None:
103
+ """Push one status update by hand: SUBMISSION_ID REVISION STATUS.
104
+
105
+ REVISION must be strictly greater than whatever the portal last accepted
106
+ for this submission, or the push comes back `already_applied` (a
107
+ success, not an error — see coord-portal's src/bridge/updates.ts).
108
+
109
+ ESCAPE HATCH: this sends immediately and bypasses the outbox, so it also
110
+ bypasses the ordering guard `coord portal enqueue-status` applies.
111
+ Pushing `awaiting-signoff` or `needs-input` this way emails the customer
112
+ whether or not the thing it announces exists (#835). It also leaves the
113
+ local revision allocator behind the portal's watermark until the next
114
+ pull re-seeds it. Prefer `enqueue-status` for anything a customer sees.
115
+ """
116
+ cfg = _load_config(config_path).portal
117
+ client = client_from_config(cfg)
118
+ if client is None:
119
+ click.secho(
120
+ "portal is not enabled — nothing to do (see `coord portal status`)",
121
+ fg="yellow",
122
+ )
123
+ raise SystemExit(1)
124
+ try:
125
+ result = client.push_status(submission_id, revision, status)
126
+ except PortalBridgeError as exc:
127
+ click.secho(f"push failed: {exc}", fg="red")
128
+ raise SystemExit(1) from exc
129
+ if result.ok:
130
+ click.secho(f"{result.outcome}: {submission_id}@{revision} -> {status}", fg="green")
131
+ return
132
+ click.secho(
133
+ f"rejected: {submission_id}@{revision} -> {status} ({result.reason})", fg="red"
134
+ )
135
+ raise SystemExit(1)
136
+
137
+
138
+ # ── #1982: the sync loop's operator surface ─────────────────────────────────
139
+
140
+
141
+ @portal_group.command("sync")
142
+ @_CONFIG_OPTION
143
+ @click.option("--json", "as_json", is_flag=True, default=False)
144
+ def portal_sync_once(config_path, as_json: bool) -> None:
145
+ """Run one full sync pass now: pull, then push, then heartbeat.
146
+
147
+ The same pass the daemon runs on its tick — this just does not wait for
148
+ it. Exits non-zero if the pass reported any error, so it can be used as a
149
+ smoke check; the pass itself never raises, and a failure in one phase
150
+ does not stop the other two.
151
+
152
+ Daemon-host command: it reads and writes the daemon's ~/.coord/coord.db.
153
+ """
154
+ from coord import portal_sync as _sync # noqa: PLC0415
155
+
156
+ config = _load_config(config_path)
157
+ if not config.portal.enabled:
158
+ click.secho(
159
+ "portal is not enabled — nothing to do (see `coord portal status`)",
160
+ fg="yellow",
161
+ )
162
+ raise SystemExit(1)
163
+ result = _sync.sync_tick(config)
164
+ if as_json:
165
+ click.echo(
166
+ json.dumps(
167
+ {
168
+ "enabled": result.enabled,
169
+ "pulled": result.pulled,
170
+ "applied": result.applied,
171
+ "rejected": result.rejected,
172
+ "held": result.held,
173
+ "heartbeat_ok": result.heartbeat_ok,
174
+ "errors": result.errors,
175
+ },
176
+ indent=2,
177
+ sort_keys=True,
178
+ )
179
+ )
180
+ else:
181
+ click.echo(result.summary())
182
+ for err in result.errors:
183
+ click.secho(f" {err}", fg="red")
184
+ if result.errors:
185
+ raise SystemExit(1)
186
+
187
+
188
+ @portal_group.command("outbox")
189
+ @click.option("--json", "as_json", is_flag=True, default=False)
190
+ @click.option(
191
+ "--all", "show_all", is_flag=True, default=False,
192
+ help="Include applied/rejected rows, not just what is still queued.",
193
+ )
194
+ def portal_outbox(as_json: bool, show_all: bool) -> None:
195
+ """List queued coord-owned pushes and why any of them are held.
196
+
197
+ A `pending` row with a reason is HELD, not failing: the ordering guard is
198
+ refusing to announce something to the customer before the thing it
199
+ announces has been confirmed applied.
200
+ """
201
+ from coord import portal_store # noqa: PLC0415
202
+ from coord.portal_sync import ordering_block_reason # noqa: PLC0415
203
+
204
+ if show_all:
205
+ rows = [
206
+ row
207
+ for sub in portal_store.list_submissions()
208
+ for row in portal_store.outbox_for_submission(sub.submission_id)
209
+ ]
210
+ else:
211
+ rows = portal_store.pending_outbox()
212
+
213
+ state = portal_store.get_sync_state()
214
+ if as_json:
215
+ click.echo(
216
+ json.dumps(
217
+ {
218
+ "cursor": state.pull_cursor,
219
+ "last_pull_at": state.last_pull_at,
220
+ "last_push_at": state.last_push_at,
221
+ "last_heartbeat_at": state.last_heartbeat_at,
222
+ "last_error": state.last_error,
223
+ "rows": [
224
+ {
225
+ "submission_id": r.submission_id,
226
+ "seq": r.seq,
227
+ "revision": r.revision,
228
+ "kind": r.kind,
229
+ "state": r.state,
230
+ "announces": r.announces,
231
+ "attempts": r.attempts,
232
+ "reason": r.reason,
233
+ "held_because": (
234
+ ordering_block_reason(r)
235
+ if r.state == portal_store.STATE_PENDING
236
+ else None
237
+ ),
238
+ }
239
+ for r in rows
240
+ ],
241
+ },
242
+ indent=2,
243
+ sort_keys=True,
244
+ )
245
+ )
246
+ return
247
+
248
+ click.echo(
249
+ f"cursor={state.pull_cursor or '-'} "
250
+ f"last_heartbeat_at={state.last_heartbeat_at or '-'}"
251
+ )
252
+ if state.last_error:
253
+ click.secho(f"last error: {state.last_error}", fg="red")
254
+ if not rows:
255
+ click.echo("outbox: empty")
256
+ return
257
+ for r in rows:
258
+ held = (
259
+ ordering_block_reason(r)
260
+ if r.state == portal_store.STATE_PENDING
261
+ else None
262
+ )
263
+ line = (
264
+ f"{r.submission_id} seq={r.seq} rev={r.revision} "
265
+ f"{r.kind:<13} {r.state}"
266
+ )
267
+ if held:
268
+ click.secho(f"{line} HELD — {held}", fg="yellow")
269
+ elif r.state == portal_store.STATE_REJECTED:
270
+ click.secho(f"{line} {r.reason}", fg="red")
271
+ else:
272
+ click.echo(line)
273
+
274
+
275
+ @portal_group.command("events")
276
+ @click.option("--json", "as_json", is_flag=True, default=False)
277
+ @click.option("--limit", type=int, default=20, show_default=True)
278
+ def portal_events(as_json: bool, limit: int) -> None:
279
+ """List pulled, not-yet-consumed customer events (the inbound half)."""
280
+ from coord import portal_store # noqa: PLC0415
281
+
282
+ events = portal_store.unhandled_events(limit=limit)
283
+ if as_json:
284
+ click.echo(
285
+ json.dumps(
286
+ [
287
+ {
288
+ "event_id": e.event_id,
289
+ "submission_id": e.submission_id,
290
+ "kind": e.kind,
291
+ "occurred_at": e.occurred_at,
292
+ "payload": e.payload,
293
+ }
294
+ for e in events
295
+ ],
296
+ indent=2,
297
+ sort_keys=True,
298
+ )
299
+ )
300
+ return
301
+ if not events:
302
+ click.echo("no unhandled portal events")
303
+ return
304
+ for e in events:
305
+ click.echo(f"{e.occurred_at or '-'} {e.submission_id} {e.kind} {e.event_id}")
306
+
307
+
308
+ @portal_group.command("enqueue-status")
309
+ @click.argument("submission_id")
310
+ @click.argument("status", type=click.Choice(SUBMISSION_STATUSES))
311
+ def portal_enqueue_status(submission_id: str, status: str) -> None:
312
+ """Queue an up-mapped status for SUBMISSION_ID (sent on the next sync).
313
+
314
+ Unlike `push`, this allocates the revision for you and refuses a status
315
+ that would summon the customer to an empty screen — `awaiting-signoff`
316
+ with no design round queued, `needs-input` with no question (#835).
317
+ """
318
+ from coord.portal_sync import PortalSyncError, enqueue_status # noqa: PLC0415
319
+
320
+ try:
321
+ row = enqueue_status(submission_id, status)
322
+ except PortalSyncError as exc:
323
+ click.secho(str(exc), fg="red")
324
+ raise SystemExit(1) from exc
325
+ click.secho(
326
+ f"queued: {row.submission_id} seq={row.seq} rev={row.revision} status={status}",
327
+ fg="green",
328
+ )
329
+
330
+
331
+ @portal_group.command("enqueue-design-round")
332
+ @click.argument("submission_id")
333
+ @click.argument("payload_json")
334
+ def portal_enqueue_design_round(submission_id: str, payload_json: str) -> None:
335
+ """Queue a design round for SUBMISSION_ID. PAYLOAD_JSON is the D1 metadata.
336
+
337
+ The mock bundle is an R2 object uploaded out of band; PAYLOAD_JSON is
338
+ expected to carry whatever reference the customer's browser follows, plus
339
+ a `round` number if this is not the first.
340
+ """
341
+ from coord.portal_sync import PortalSyncError, enqueue_design_round # noqa: PLC0415
342
+
343
+ try:
344
+ payload = json.loads(payload_json)
345
+ except ValueError as exc:
346
+ click.secho(f"PAYLOAD_JSON is not valid JSON: {exc}", fg="red")
347
+ raise SystemExit(1) from exc
348
+ try:
349
+ row = enqueue_design_round(submission_id, payload)
350
+ except PortalSyncError as exc:
351
+ click.secho(str(exc), fg="red")
352
+ raise SystemExit(1) from exc
353
+ click.secho(
354
+ f"queued: {row.submission_id} seq={row.seq} rev={row.revision} design_round",
355
+ fg="green",
356
+ )
357
+
358
+
359
+ @portal_group.command("enqueue-question")
360
+ @click.argument("submission_id")
361
+ @click.argument("question")
362
+ def portal_enqueue_question(submission_id: str, question: str) -> None:
363
+ """Queue an open question for SUBMISSION_ID (sent on the next sync)."""
364
+ from coord.portal_sync import PortalSyncError, enqueue_question # noqa: PLC0415
365
+
366
+ try:
367
+ row = enqueue_question(submission_id, question)
368
+ except PortalSyncError as exc:
369
+ click.secho(str(exc), fg="red")
370
+ raise SystemExit(1) from exc
371
+ click.secho(
372
+ f"queued: {row.submission_id} seq={row.seq} rev={row.revision} question",
373
+ fg="green",
374
+ )
375
+
376
+
377
+ @portal_group.command("requeue")
378
+ @click.argument("submission_id")
379
+ @click.argument("seq", type=int)
380
+ def portal_requeue(submission_id: str, seq: int) -> None:
381
+ """Put a retired outbox row (SUBMISSION_ID SEQ) back in the queue.
382
+
383
+ The drain retires a row that has burned its retry budget — a payload the
384
+ portal keeps refusing, or an outage that outlasted the budget. That state
385
+ is terminal by design (it also keeps any announcement behind it held,
386
+ which is the fail-closed half of #835), so this is the lever that clears
387
+ it once the underlying problem is fixed. The row gets a fresh revision,
388
+ since the old one may be below the portal's watermark by now.
389
+
390
+ Find the seq with `coord portal outbox --all`.
391
+ """
392
+ from coord import portal_store # noqa: PLC0415
393
+
394
+ row = portal_store.requeue(submission_id, seq)
395
+ if row is None:
396
+ click.secho(
397
+ f"no outbox row for {submission_id} seq={seq} "
398
+ f"(list them with `coord portal outbox --all`)",
399
+ fg="red",
400
+ )
401
+ raise SystemExit(1)
402
+ click.secho(
403
+ f"requeued: {row.submission_id} seq={row.seq} rev={row.revision} {row.kind}",
404
+ fg="green",
405
+ )