code-coordinator 0.5.86__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.86 → code_coordinator-0.5.87}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/code_coordinator.egg-info/SOURCES.txt +3 -0
  4. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/code_coordinator.egg-info/scm_file_list.json +3 -0
  5. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/code_coordinator.egg-info/scm_version.json +2 -2
  6. code_coordinator-0.5.87/coord/commands/portal.py +405 -0
  7. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/db.py +110 -0
  8. code_coordinator-0.5.87/coord/portal_store.py +756 -0
  9. code_coordinator-0.5.87/coord/portal_sync.py +618 -0
  10. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/serve_app.py +84 -1
  11. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coordinator.example.yml +16 -7
  12. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/docs/CUSTOMER_PORTAL.md +15 -0
  13. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_agent_app.py +42 -1
  14. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_portal.py +99 -0
  15. code_coordinator-0.5.87/tests/test_portal_sync.py +716 -0
  16. code_coordinator-0.5.86/coord/commands/portal.py +0 -120
  17. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/.claude/commands/board.md +0 -0
  18. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/.claude/commands/complete-session.md +0 -0
  19. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/.claude/commands/coordinator.md +0 -0
  20. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/.githooks/_lib.sh +0 -0
  21. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/.githooks/post-checkout +0 -0
  22. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/.githooks/post-commit +0 -0
  23. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/.githooks/post-merge +0 -0
  24. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  25. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/.github/coord-ci-acceptance.yml +0 -0
  26. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/.github/workflows/auto-release.yml +0 -0
  27. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/.github/workflows/cargo-test.yml +0 -0
  28. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/.github/workflows/publish.yml +0 -0
  29. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/.github/workflows/release-tui.yml +0 -0
  30. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/.github/workflows/test.yml +0 -0
  31. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/.gitignore +0 -0
  32. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/CLAUDE.md +0 -0
  33. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/GOAL.md +0 -0
  34. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/LICENSE +0 -0
  35. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/MANIFEST.in +0 -0
  36. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/README.md +0 -0
  37. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/code_coordinator.egg-info/dependency_links.txt +0 -0
  38. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/code_coordinator.egg-info/entry_points.txt +0 -0
  39. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/code_coordinator.egg-info/requires.txt +0 -0
  40. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/code_coordinator.egg-info/top_level.txt +0 -0
  41. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/__init__.py +0 -0
  42. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/_board_mapping.py +0 -0
  43. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/acceptance.py +0 -0
  44. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/acceptance_drivers.py +0 -0
  45. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/agent.py +0 -0
  46. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/agent_app.py +0 -0
  47. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/agent_update.py +0 -0
  48. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/agents/opencode/.gitignore +0 -0
  49. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/agents/opencode/agents/work.md +0 -0
  50. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/agents/opencode/routing.jsonc +0 -0
  51. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/audit.py +0 -0
  52. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/auto_loop.py +0 -0
  53. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/board_bool_guard.py +0 -0
  54. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/board_service.py +0 -0
  55. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/board_wire.py +0 -0
  56. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/brain.py +0 -0
  57. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/branch_model.py +0 -0
  58. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/bug_intake.py +0 -0
  59. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/cargo_cache.py +0 -0
  60. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/ci_github.py +0 -0
  61. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/ci_store.py +0 -0
  62. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/claim.py +0 -0
  63. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/cli.py +0 -0
  64. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/client.py +0 -0
  65. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/commands/__init__.py +0 -0
  66. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/commands/_common.py +0 -0
  67. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/commands/acceptance.py +0 -0
  68. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/commands/agent_ops.py +0 -0
  69. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/commands/audit.py +0 -0
  70. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/commands/chat.py +0 -0
  71. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/commands/dispatch.py +0 -0
  72. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/commands/dispatch_workers.py +0 -0
  73. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/commands/drive.py +0 -0
  74. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/commands/drive_queue.py +0 -0
  75. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/commands/gate_a.py +0 -0
  76. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/commands/gates.py +0 -0
  77. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/commands/issues.py +0 -0
  78. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/commands/lifecycle.py +0 -0
  79. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/commands/merge.py +0 -0
  80. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/commands/milestone.py +0 -0
  81. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/commands/plan_followup.py +0 -0
  82. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/commands/plans.py +0 -0
  83. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/commands/release.py +0 -0
  84. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/commands/repo.py +0 -0
  85. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/commands/report.py +0 -0
  86. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/commands/review.py +0 -0
  87. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/commands/scorecard.py +0 -0
  88. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/commands/sessions.py +0 -0
  89. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/commands/setup.py +0 -0
  90. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/commands/status.py +0 -0
  91. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/commands/terminal.py +0 -0
  92. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/commands/test_gate.py +0 -0
  93. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/commands/tui.py +0 -0
  94. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/comments.py +0 -0
  95. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/config.py +0 -0
  96. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/conflict_fix.py +0 -0
  97. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dao.py +0 -0
  98. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/__init__.py +0 -0
  99. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/fixture.py +0 -0
  100. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/index.html +0 -0
  101. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/server.py +0 -0
  102. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/terminal.py +0 -0
  103. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/.gitignore +0 -0
  104. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/components.json +0 -0
  105. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/dist/assets/Gallery-Cq84itDE.js +0 -0
  106. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  107. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/dist/assets/Terminal-DOXLcMue.js +0 -0
  108. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/dist/assets/index-DHn-RIJ8.js +0 -0
  109. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  110. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  111. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  112. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  113. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  114. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/dist/index.html +0 -0
  115. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  116. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/dist/sw.js +0 -0
  117. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  118. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  119. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  120. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  121. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  122. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  123. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  124. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  125. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  126. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  127. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/eslint.config.js +0 -0
  128. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/index.html +0 -0
  129. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  130. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/package-lock.json +0 -0
  131. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/package.json +0 -0
  132. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  133. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/playwright.config.ts +0 -0
  134. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/postcss.config.js +0 -0
  135. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  136. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  137. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  138. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/App.tsx +0 -0
  139. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/api/client.ts +0 -0
  140. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  141. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  142. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  143. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  144. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  145. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  146. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  147. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  148. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  149. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  150. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  151. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  152. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  153. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  154. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  155. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  156. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  157. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  158. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  159. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  160. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  161. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  162. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  163. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  164. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  165. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  166. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  167. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  168. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  169. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  170. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  171. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  172. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  173. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  174. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  175. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/index.css +0 -0
  176. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  177. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  178. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/main.tsx +0 -0
  179. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  180. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  181. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  182. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  183. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  184. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  185. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  186. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  187. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  188. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  189. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  190. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  191. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  192. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  193. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  194. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  195. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  196. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  197. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  198. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  199. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  200. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  201. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  202. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/tailwind.config.js +0 -0
  203. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/tsconfig.json +0 -0
  204. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  205. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dashboard/webapp/vite.config.ts +0 -0
  206. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dead_end.py +0 -0
  207. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/deploy/README.md +0 -0
  208. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/deploy/coord-agent.service +0 -0
  209. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/deploy/coord-db-backup.service +0 -0
  210. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/deploy/coord-db-backup.sh +0 -0
  211. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/deploy/coord-db-backup.timer +0 -0
  212. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/deploy/coord-drive-queue.service +0 -0
  213. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/deploy/coord-drive-queue.timer +0 -0
  214. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/deploy/coord-notify.service +0 -0
  215. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/deploy/coord-notify.timer +0 -0
  216. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/deploy/coord-release-propagate.service +0 -0
  217. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/deploy/coord-release-propagate.timer +0 -0
  218. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/deploy/coord-release-window.service +0 -0
  219. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/deploy/coord-release-window.timer +0 -0
  220. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/deploy/coord-serve.service +0 -0
  221. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/deploy/coord-web-dist-build.service +0 -0
  222. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/deploy/coord-web-dist-build.timer +0 -0
  223. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/deploy/coord-web.service +0 -0
  224. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/deploy_manifest.py +0 -0
  225. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/deploy_units.py +0 -0
  226. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/deps.py +0 -0
  227. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/diagnose.py +0 -0
  228. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dispatch.py +0 -0
  229. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/dist_name.py +0 -0
  230. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/drive.py +0 -0
  231. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/drive_queue.py +0 -0
  232. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/drive_state.py +0 -0
  233. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/events.py +0 -0
  234. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/failure_class.py +0 -0
  235. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/filelock.py +0 -0
  236. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/fleet_config_health.py +0 -0
  237. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/freshness.py +0 -0
  238. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/gate_a.py +0 -0
  239. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/gate_b.py +0 -0
  240. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/gate_snapshot.py +0 -0
  241. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/gates.py +0 -0
  242. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/github_ops.py +0 -0
  243. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/goal.py +0 -0
  244. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/graph_health.py +0 -0
  245. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/health/__init__.py +0 -0
  246. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/health/aggregate.py +0 -0
  247. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/health/checks/__init__.py +0 -0
  248. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/health/checks/agent_install.py +0 -0
  249. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/health/checks/cargo_targets.py +0 -0
  250. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/health/checks/claude_binary.py +0 -0
  251. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/health/checks/deploy_lane_facts.py +0 -0
  252. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/health/checks/disk.py +0 -0
  253. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/health/checks/fleet_board.py +0 -0
  254. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  255. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/health/checks/fleet_phantom.py +0 -0
  256. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/health/checks/fleet_unit_drift.py +0 -0
  257. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/health/checks/graph.py +0 -0
  258. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/health/checks/graphify_cli.py +0 -0
  259. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/health/checks/plan_usage.py +0 -0
  260. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/health/checks/repo_state.py +0 -0
  261. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/health/checks/spawned_coord.py +0 -0
  262. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/health/checks/timer_active.py +0 -0
  263. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/health/checks/toolchain.py +0 -0
  264. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/health/checks/unit_drift.py +0 -0
  265. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/health/checks/unit_enablement.py +0 -0
  266. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/health/checks/worktrees.py +0 -0
  267. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/health/cli.py +0 -0
  268. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/health/context.py +0 -0
  269. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/health/fleet_snapshot.py +0 -0
  270. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/health/models.py +0 -0
  271. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/health/pypi.py +0 -0
  272. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/health/registry.py +0 -0
  273. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/health/render.py +0 -0
  274. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/health/units.py +0 -0
  275. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/hooks.py +0 -0
  276. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/housekeeping.py +0 -0
  277. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/interactive.py +0 -0
  278. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/issue_store.py +0 -0
  279. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/liveness_auditor.py +0 -0
  280. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/machine_pause.py +0 -0
  281. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/merge_queue.py +0 -0
  282. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/milestone_chat.py +0 -0
  283. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/milestone_dispatch.py +0 -0
  284. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/milestone_gate.py +0 -0
  285. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/milestone_order.py +0 -0
  286. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/mock_author.py +0 -0
  287. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/models.py +0 -0
  288. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/network.py +0 -0
  289. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/new_issue_chat.py +0 -0
  290. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/notifier/__init__.py +0 -0
  291. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/notifier/baseline.py +0 -0
  292. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/notifier/cli.py +0 -0
  293. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/notifier/collect.py +0 -0
  294. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/notifier/digest.py +0 -0
  295. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/notifier/models.py +0 -0
  296. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/notifier/predicate.py +0 -0
  297. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/notifier/service.py +0 -0
  298. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/notifier/store.py +0 -0
  299. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/notifier/transport.py +0 -0
  300. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/notify.py +0 -0
  301. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/openapi.py +0 -0
  302. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/overlap_fence.py +0 -0
  303. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/parentage.py +0 -0
  304. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/parentage_github.py +0 -0
  305. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/pipeline.py +0 -0
  306. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/plan_parser.py +0 -0
  307. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/plans.py +0 -0
  308. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/platform_paths.py +0 -0
  309. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/portal_bridge.py +0 -0
  310. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/pr_body_lint.py +0 -0
  311. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/prereqs.py +0 -0
  312. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/progress.py +0 -0
  313. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/providers/__init__.py +0 -0
  314. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/providers/base.py +0 -0
  315. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/providers/claude.py +0 -0
  316. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/providers/claude_pty.py +0 -0
  317. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/providers/opencode.py +0 -0
  318. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/reconcile.py +0 -0
  319. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/refine_chat.py +0 -0
  320. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/release_cordon.py +0 -0
  321. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/release_propagate.py +0 -0
  322. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/release_verify.py +0 -0
  323. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/release_window.py +0 -0
  324. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/repo_edit.py +0 -0
  325. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/repo_onboard.py +0 -0
  326. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/reports.py +0 -0
  327. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/revalidate.py +0 -0
  328. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/review.py +0 -0
  329. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/scorecard.py +0 -0
  330. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/skills/update-issue/SKILL.md +0 -0
  331. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/smoke.py +0 -0
  332. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/spend_ceiling.py +0 -0
  333. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/split_work.py +0 -0
  334. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/stage_projection.py +0 -0
  335. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/state.py +0 -0
  336. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/test_author.py +0 -0
  337. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/test_chat.py +0 -0
  338. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/test_orchestrator.py +0 -0
  339. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/test_report.py +0 -0
  340. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/tui_release.py +0 -0
  341. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/usage.py +0 -0
  342. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/usage_limits.py +0 -0
  343. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/usage_rollup.py +0 -0
  344. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/coord/worker_events.py +0 -0
  345. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/deploy/coord-agent.service +0 -0
  346. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/deploy/coord-db-backup.service +0 -0
  347. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/deploy/coord-db-backup.sh +0 -0
  348. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/deploy/coord-db-backup.timer +0 -0
  349. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/deploy/coord-drive-queue.service +0 -0
  350. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/deploy/coord-drive-queue.timer +0 -0
  351. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/deploy/coord-notify.service +0 -0
  352. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/deploy/coord-notify.timer +0 -0
  353. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/deploy/coord-release-propagate.service +0 -0
  354. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/deploy/coord-release-propagate.timer +0 -0
  355. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/deploy/coord-release-window.service +0 -0
  356. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/deploy/coord-release-window.timer +0 -0
  357. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/deploy/coord-serve.service +0 -0
  358. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/deploy/coord-web-dist-build.service +0 -0
  359. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/deploy/coord-web-dist-build.sh +0 -0
  360. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/deploy/coord-web-dist-build.timer +0 -0
  361. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/deploy/coord-web-rollback.sh +0 -0
  362. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/deploy/coord-web.service +0 -0
  363. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/deploy/node-shim.sh +0 -0
  364. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/docs/AGENT_OPERATIONS.md +0 -0
  365. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/docs/ARCHITECTURE.md +0 -0
  366. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/docs/ARCH_SECURITY_GATES.md +0 -0
  367. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/docs/COCKPIT.md +0 -0
  368. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/docs/CONTROL_CENTER.md +0 -0
  369. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/docs/COST_DISCIPLINE.md +0 -0
  370. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/docs/CROSS_PLATFORM.md +0 -0
  371. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/docs/DRIVE_QUEUE.md +0 -0
  372. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/docs/EPHEMERAL_WORKERS.md +0 -0
  373. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/docs/FORGE_MIGRATION.md +0 -0
  374. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/docs/GRAPHIFY_SETUP.md +0 -0
  375. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/docs/ISSUE_GUIDANCE.md +0 -0
  376. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/docs/MAC_MINI.md +0 -0
  377. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  378. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/docs/NOTIFIER.md +0 -0
  379. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/docs/OPENCODE_VERIFICATION.md +0 -0
  380. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/docs/OPERATING_GOTCHAS.md +0 -0
  381. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/docs/ORACLE_LOOP.md +0 -0
  382. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/docs/PHONE_WEBAPP.md +0 -0
  383. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/docs/PIPELINE_V2.md +0 -0
  384. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/docs/PLATFORM_EVOLUTION.md +0 -0
  385. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/docs/SECOND_BACKEND.md +0 -0
  386. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/docs/STORE_SERVICE.md +0 -0
  387. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  388. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/docs/WEB_CONTROL_CENTER.md +0 -0
  389. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/docs/mocks/web/README.md +0 -0
  390. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/docs/mocks/web/_tokens.css +0 -0
  391. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/docs/mocks/web/issue-detail.html +0 -0
  392. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/docs/mocks/web/pipeline-narrow.html +0 -0
  393. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/docs/mocks/web/pipeline-wide.html +0 -0
  394. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/graphify-out/.gitignore +0 -0
  395. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/install-agent.sh +0 -0
  396. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/pyproject.toml +0 -0
  397. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/scripts/audit_review_verdict_overrides.py +0 -0
  398. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  399. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/scripts/azure-workers/build-worker-image.sh +0 -0
  400. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/scripts/azure-workers/coordinator-machine.py +0 -0
  401. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/scripts/azure-workers/epic-down.sh +0 -0
  402. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/scripts/azure-workers/epic-up.sh +0 -0
  403. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/scripts/azure-workers/preflight.sh +0 -0
  404. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/scripts/azure-workers/provision-worker.sh +0 -0
  405. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  406. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  407. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/scripts/azure-workers/verify-github-token.sh +0 -0
  408. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/scripts/codegen.py +0 -0
  409. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/scripts/coord-test-runner.sh +0 -0
  410. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/scripts/drive-batch.sh +0 -0
  411. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/scripts/gen_board_fixture.py +0 -0
  412. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/scripts/next_release_tag.py +0 -0
  413. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/scripts/run_tests_in_populated_home.sh +0 -0
  414. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/scripts/run_tests_without_gh.sh +0 -0
  415. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/scripts/smoke_437_interactive.py +0 -0
  416. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/scripts/verify_878_review_capture.py +0 -0
  417. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/scripts/verify_release_published.py +0 -0
  418. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/scripts/verify_release_wheel.py +0 -0
  419. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/setup.cfg +0 -0
  420. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/SMOKE_SET.md +0 -0
  421. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/__init__.py +0 -0
  422. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  423. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/acceptance/ms-33/contract.md +0 -0
  424. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/acceptance/ms-33/manifest.yml +0 -0
  425. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  426. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  427. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  428. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  429. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/acceptance/ms-37/conftest.py +0 -0
  430. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/acceptance/ms-37/contract.md +0 -0
  431. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/acceptance/ms-37/manifest.yml +0 -0
  432. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  433. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  434. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/acceptance/ms-38/contract.md +0 -0
  435. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/acceptance/ms-38/manifest.yml +0 -0
  436. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  437. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  438. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  439. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  440. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  441. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  442. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  443. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  444. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  445. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  446. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/acceptance/ms-51/contract.md +0 -0
  447. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  448. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  449. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/acceptance/ms-51/manifest.yml +0 -0
  450. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  451. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/acceptance/ms-51/tsconfig.json +0 -0
  452. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  453. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/conftest.py +0 -0
  454. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/fixtures/board-pipeline-basic.json +0 -0
  455. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  456. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  457. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  458. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/fixtures/playwright/all_pass.json +0 -0
  459. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  460. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/fixtures/playwright/mixed_fail.json +0 -0
  461. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  462. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  463. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/fixtures/playwright/skip.json +0 -0
  464. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/fixtures/playwright/truncated.json +0 -0
  465. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  466. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  467. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  468. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  469. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  470. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  471. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  472. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  473. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_acceptance.py +0 -0
  474. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_acceptance_drivers.py +0 -0
  475. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_agent.py +0 -0
  476. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_agent_api_error.py +0 -0
  477. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_agent_branch_base.py +0 -0
  478. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_agent_branch_capture.py +0 -0
  479. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_agent_config_free_1712.py +0 -0
  480. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_agent_deploy_units_endpoint.py +0 -0
  481. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_agent_dirty_worktree.py +0 -0
  482. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_agent_graph_self_heal.py +0 -0
  483. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_agent_health_h3.py +0 -0
  484. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_agent_idle_restart.py +0 -0
  485. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_agent_push_failure.py +0 -0
  486. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_agent_reap.py +0 -0
  487. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_agent_repos_and_pull.py +0 -0
  488. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_agent_restart_services_endpoint.py +0 -0
  489. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_agent_startup_diagnostics.py +0 -0
  490. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_agent_update.py +0 -0
  491. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_agent_update_bluegreen.py +0 -0
  492. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_agent_usage_limit.py +0 -0
  493. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_agent_zero_commit.py +0 -0
  494. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_ambient_home_isolation.py +0 -0
  495. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_approve_reject_plan.py +0 -0
  496. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_approve_usage_gate.py +0 -0
  497. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_assignment_already_recorded_daemon.py +0 -0
  498. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_audit_log.py +0 -0
  499. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_audit_outcome.py +0 -0
  500. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_audit_query.py +0 -0
  501. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_auto_loop.py +0 -0
  502. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_auto_release_publish_2035.py +0 -0
  503. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_base_checkout_restore.py +0 -0
  504. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_board_cap_762.py +0 -0
  505. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_board_fixture.py +0 -0
  506. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_board_read_path.py +0 -0
  507. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_board_service.py +0 -0
  508. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_board_state.py +0 -0
  509. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_board_wire.py +0 -0
  510. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_brain.py +0 -0
  511. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_branch_model.py +0 -0
  512. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_bug_intake.py +0 -0
  513. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_build_worker_image_env_update.py +0 -0
  514. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cargo_cache.py +0 -0
  515. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_ci_acceptance_gate_1950.py +0 -0
  516. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_ci_parity_2091.py +0 -0
  517. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_ci_store.py +0 -0
  518. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_claim.py +0 -0
  519. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_acceptance.py +0 -0
  520. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_assign.py +0 -0
  521. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  522. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_assign_interactive_remote.py +0 -0
  523. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_assign_provider.py +0 -0
  524. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  525. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_audit.py +0 -0
  526. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_chat_continue.py +0 -0
  527. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_diagnose_config_provenance.py +0 -0
  528. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_diagnose_graph.py +0 -0
  529. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_doctor.py +0 -0
  530. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_doctor_config_free_1801.py +0 -0
  531. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  532. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_drive.py +0 -0
  533. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_drive_queue.py +0 -0
  534. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_escalate.py +0 -0
  535. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_fix_headless_review.py +0 -0
  536. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_gate_a.py +0 -0
  537. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_install_drift.py +0 -0
  538. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_install_skills.py +0 -0
  539. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_issue_create_label.py +0 -0
  540. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_issue_reopen.py +0 -0
  541. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_merge.py +0 -0
  542. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_milestone_assign.py +0 -0
  543. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_milestone_capture.py +0 -0
  544. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_milestone_chat_add_child.py +0 -0
  545. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_milestone_dispatch.py +0 -0
  546. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_milestone_gate_b.py +0 -0
  547. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_milestone_gate_c.py +0 -0
  548. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_milestone_order.py +0 -0
  549. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  550. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_milestone_ship.py +0 -0
  551. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_network.py +0 -0
  552. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_new_issue_chat.py +0 -0
  553. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_plans.py +0 -0
  554. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_pull_artifact.py +0 -0
  555. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_queue.py +0 -0
  556. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_reattach_sessions.py +0 -0
  557. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_refine_board.py +0 -0
  558. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_release_preflight.py +0 -0
  559. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_release_propagate.py +0 -0
  560. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_release_window.py +0 -0
  561. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_repo_2220.py +0 -0
  562. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_scorecard.py +0 -0
  563. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_set_review_findings.py +0 -0
  564. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_status_advisory_terminal.py +0 -0
  565. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_status_merge_queue.py +0 -0
  566. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_status_provider.py +0 -0
  567. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_status_review_finalizing.py +0 -0
  568. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_status_test_failed_tag.py +0 -0
  569. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_status_usage_limit.py +0 -0
  570. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_sync_comments_873.py +0 -0
  571. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_test_plan.py +0 -0
  572. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_track.py +0 -0
  573. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_tui_update.py +0 -0
  574. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cli_wait.py +0 -0
  575. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_client_base_install.py +0 -0
  576. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_comments.py +0 -0
  577. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_completion_summary.py +0 -0
  578. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_config.py +0 -0
  579. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_config_acceptance.py +0 -0
  580. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_config_audit.py +0 -0
  581. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_config_pricing.py +0 -0
  582. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_config_usage_gate.py +0 -0
  583. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_conflict_fix.py +0 -0
  584. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_conflict_fix_semantic.py +0 -0
  585. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_coord_test.py +0 -0
  586. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_coord_test_runner_baseline.py +0 -0
  587. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_coord_test_runner_routing.py +0 -0
  588. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_coord_test_runner_toolchain.py +0 -0
  589. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_coord_web_sse_restart_live.py +0 -0
  590. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_coordinator_machine.py +0 -0
  591. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_cross_platform_imports.py +0 -0
  592. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_dashboard.py +0 -0
  593. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_dashboard_fixture.py +0 -0
  594. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_dashboard_terminal.py +0 -0
  595. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_dashboard_terminal_live.py +0 -0
  596. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_db.py +0 -0
  597. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_dead_end.py +0 -0
  598. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_deploy_coord_db_backup.py +0 -0
  599. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_deploy_coord_web_dist.py +0 -0
  600. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_deploy_coord_web_rollback.py +0 -0
  601. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_deploy_drive_queue_unit.py +0 -0
  602. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_deploy_manifest.py +0 -0
  603. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_deploy_units_lane.py +0 -0
  604. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_deploy_web_unit.py +0 -0
  605. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_deps.py +0 -0
  606. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_diagnose.py +0 -0
  607. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_dispatch.py +0 -0
  608. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_dispatch_target_validation.py +0 -0
  609. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_dist_name.py +0 -0
  610. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_done_housekeeping.py +0 -0
  611. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_drive.py +0 -0
  612. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_drive_queue.py +0 -0
  613. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_drive_state.py +0 -0
  614. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_drive_tmux.py +0 -0
  615. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_epic_up_capability_detection.py +0 -0
  616. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  617. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_epic_up_image_provenance.py +0 -0
  618. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_errors.py +0 -0
  619. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_events.py +0 -0
  620. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_failure_class.py +0 -0
  621. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_filelock.py +0 -0
  622. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  623. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_fix_of_force_override.py +0 -0
  624. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_fleet_config_health.py +0 -0
  625. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_fleet_health_probes.py +0 -0
  626. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_fleet_health_snapshot.py +0 -0
  627. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_freshness.py +0 -0
  628. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_gate_a.py +0 -0
  629. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_gate_b.py +0 -0
  630. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_gate_snapshot_staleness.py +0 -0
  631. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_gates.py +0 -0
  632. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  633. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_generated_types_fixture.py +0 -0
  634. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_github_ops.py +0 -0
  635. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_goal.py +0 -0
  636. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_graph_health.py +0 -0
  637. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_graph_selfheal_absent_2237.py +0 -0
  638. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_handoff.py +0 -0
  639. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_health_checks.py +0 -0
  640. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_health_cli.py +0 -0
  641. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_health_cli_graph.py +0 -0
  642. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_health_config.py +0 -0
  643. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_health_context.py +0 -0
  644. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_health_deploy_lane_facts.py +0 -0
  645. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_health_incident_regression.py +0 -0
  646. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_health_pypi.py +0 -0
  647. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_health_registry.py +0 -0
  648. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_health_timer_active.py +0 -0
  649. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_health_toolchain.py +0 -0
  650. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_health_unit_drift.py +0 -0
  651. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_health_unit_enablement.py +0 -0
  652. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_hooks.py +0 -0
  653. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_human_attended_437.py +0 -0
  654. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_init.py +0 -0
  655. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_integration.py +0 -0
  656. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_interactive_briefing_echo.py +0 -0
  657. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_interactive_prefill_state.py +0 -0
  658. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_interactive_session_relaunch.py +0 -0
  659. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_interactive_test_verdict_backstop.py +0 -0
  660. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_interactive_token_attribution.py +0 -0
  661. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_interactive_worktree.py +0 -0
  662. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_issue_store_seam.py +0 -0
  663. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_liveness_auditor.py +0 -0
  664. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_liveness_notify.py +0 -0
  665. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_machine_pause.py +0 -0
  666. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_merge_queue.py +0 -0
  667. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_merge_verify.py +0 -0
  668. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_milestone_chat.py +0 -0
  669. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_milestone_dispatch.py +0 -0
  670. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_milestone_gate.py +0 -0
  671. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_milestone_order.py +0 -0
  672. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_milestone_seam.py +0 -0
  673. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_mock_author.py +0 -0
  674. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_model_tiering.py +0 -0
  675. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_models.py +0 -0
  676. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_models_config_labels.py +0 -0
  677. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_needs_attention.py +0 -0
  678. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_network.py +0 -0
  679. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_new_issue_chat.py +0 -0
  680. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_next_release_tag.py +0 -0
  681. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_no_direct_gh_calls.py +0 -0
  682. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_node_shim.py +0 -0
  683. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_notifier_baseline.py +0 -0
  684. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_notifier_cli.py +0 -0
  685. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_notifier_collect.py +0 -0
  686. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_notifier_config.py +0 -0
  687. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_notifier_drive_seam.py +0 -0
  688. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_notifier_isolation.py +0 -0
  689. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_notifier_predicate.py +0 -0
  690. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_notifier_quiet_hours.py +0 -0
  691. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_notifier_service.py +0 -0
  692. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_notify.py +0 -0
  693. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_notify_drain.py +0 -0
  694. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_openapi.py +0 -0
  695. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_operational_defaults.py +0 -0
  696. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_overlap_fence.py +0 -0
  697. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_packaged_deploy_units.py +0 -0
  698. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_parentage.py +0 -0
  699. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_paste_landed.py +0 -0
  700. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_pipeline.py +0 -0
  701. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_plan_followup_approve_plan_command.py +0 -0
  702. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_plan_followup_pr_command.py +0 -0
  703. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_plan_followup_review_command.py +0 -0
  704. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_plan_only.py +0 -0
  705. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_plan_parser.py +0 -0
  706. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_platform_paths.py +0 -0
  707. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_portal_bridge.py +0 -0
  708. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_portal_config.py +0 -0
  709. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_pr_body_lint.py +0 -0
  710. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_prereqs.py +0 -0
  711. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_production_db_guard.py +0 -0
  712. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_progress.py +0 -0
  713. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_provider_seam.py +0 -0
  714. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_providers.py +0 -0
  715. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_providers_config_labels.py +0 -0
  716. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_providers_pty.py +0 -0
  717. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_quiet_hours.py +0 -0
  718. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_quiet_hours_store_2146.py +0 -0
  719. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_reap_merged_sessions.py +0 -0
  720. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_reap_stale_interactive_tick.py +0 -0
  721. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_reconcile_branch.py +0 -0
  722. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_reconcile_completions.py +0 -0
  723. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_reconcile_merges.py +0 -0
  724. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_reconcile_usage_limit_done.py +0 -0
  725. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_refine_chat.py +0 -0
  726. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_release_cordon_2101.py +0 -0
  727. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_release_cordon_deadlock_2240.py +0 -0
  728. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_release_propagate.py +0 -0
  729. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_release_unified_1242.py +0 -0
  730. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_release_verify.py +0 -0
  731. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_release_window.py +0 -0
  732. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_remote_auto_prune.py +0 -0
  733. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_remote_interactive_reaper.py +0 -0
  734. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_repo_edit_2220.py +0 -0
  735. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_repo_graph_fleet_2237.py +0 -0
  736. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_repo_onboard_2220.py +0 -0
  737. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_report_result_push.py +0 -0
  738. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_reports.py +0 -0
  739. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_retry.py +0 -0
  740. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_retry_advisory_1606.py +0 -0
  741. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_retry_type_1636.py +0 -0
  742. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_revalidate.py +0 -0
  743. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_review.py +0 -0
  744. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_review_end_review_without_verdict.py +0 -0
  745. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_review_parse_failure_diagnostic.py +0 -0
  746. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_review_reaffirm.py +0 -0
  747. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_review_state.py +0 -0
  748. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_review_verdict_backstop.py +0 -0
  749. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_review_verdict_override_audit.py +0 -0
  750. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_review_verdict_relay.py +0 -0
  751. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_review_zero_commits.py +0 -0
  752. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_scoped_review_wiring.py +0 -0
  753. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_scorecard.py +0 -0
  754. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_serve.py +0 -0
  755. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_serve_app_board_trim.py +0 -0
  756. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_session.py +0 -0
  757. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_slice_issue_attribution.py +0 -0
  758. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_smoke.py +0 -0
  759. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_smoke_live_checkout_restore.py +0 -0
  760. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_smoke_workflow.py +0 -0
  761. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_spend_ceiling.py +0 -0
  762. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_spend_ceiling_coordinator.py +0 -0
  763. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_split.py +0 -0
  764. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_split_work.py +0 -0
  765. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_stage_projection.py +0 -0
  766. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_stalled_pipeline.py +0 -0
  767. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_state.py +0 -0
  768. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_state_review_findings_daemon.py +0 -0
  769. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_status_fleet_footer.py +0 -0
  770. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_stop_1567.py +0 -0
  771. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_stuck.py +0 -0
  772. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_terminal_command.py +0 -0
  773. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_test_author.py +0 -0
  774. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_test_chat.py +0 -0
  775. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_test_orchestrator.py +0 -0
  776. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_test_report.py +0 -0
  777. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_test_verdict_parsing.py +0 -0
  778. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_test_verdict_transcript_floor.py +0 -0
  779. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_thin_client_board_audit.py +0 -0
  780. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_thin_client_config_load_1080.py +0 -0
  781. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_thin_client_daemon_routing_906.py +0 -0
  782. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_tmux_host.py +0 -0
  783. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_tmux_session.py +0 -0
  784. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_transcript_floor.py +0 -0
  785. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_usage.py +0 -0
  786. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_usage_limits.py +0 -0
  787. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_usage_rollup.py +0 -0
  788. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_venv_live_install_2121.py +0 -0
  789. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_version_single_source.py +0 -0
  790. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_watch.py +0 -0
  791. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_worker_events.py +0 -0
  792. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_worker_image_pin_sync.py +0 -0
  793. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_worker_safety.py +0 -0
  794. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_worker_test_scoping.py +0 -0
  795. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_worktree.py +0 -0
  796. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  797. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/Cargo.lock +0 -0
  798. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/Cargo.toml +0 -0
  799. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/cargo-config-local-quadraui.toml.example +0 -0
  800. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/app/audit.rs +0 -0
  801. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/app/chat.rs +0 -0
  802. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/app/data.rs +0 -0
  803. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/app/dialogs.rs +0 -0
  804. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/app/drive.rs +0 -0
  805. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/app/drive_queue.rs +0 -0
  806. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/app/escalation.rs +0 -0
  807. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/app/events.rs +0 -0
  808. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/app/fixtures.rs +0 -0
  809. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/app/fleet_health.rs +0 -0
  810. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/app/fleet_sessions.rs +0 -0
  811. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/app/fleet_terminals.rs +0 -0
  812. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/app/format.rs +0 -0
  813. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/app/milestone_dag.rs +0 -0
  814. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/app/mod.rs +0 -0
  815. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/app/msv.rs +0 -0
  816. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/app/pipeline.rs +0 -0
  817. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/app/plans.rs +0 -0
  818. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/app/render.rs +0 -0
  819. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/app/reports.rs +0 -0
  820. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/app/sessions.rs +0 -0
  821. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/app/settings_ui.rs +0 -0
  822. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/app/sidebar.rs +0 -0
  823. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/app/terminal.rs +0 -0
  824. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/app/tests.rs +0 -0
  825. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/app/types.rs +0 -0
  826. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/app/workspace.rs +0 -0
  827. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/bin/gtk.rs +0 -0
  828. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/commands.rs +0 -0
  829. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/lib.rs +0 -0
  830. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/main.rs +0 -0
  831. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/src/settings.rs +0 -0
  832. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/tests/acceptance.rs +0 -0
  833. {code_coordinator-0.5.86 → code_coordinator-0.5.87}/tui/tests/cli.rs +0 -0
  834. {code_coordinator-0.5.86 → 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.86
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.86
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.86",
2
+ "tag": "0.5.87",
3
3
  "distance": 0,
4
- "node": "g38313e96b2a9fecca7cffcdcfc0c9f15b86ea28b",
4
+ "node": "g4f4b41ca5d91aa713ccb5b36e1cb66e4f631fca1",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-14"
@@ -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
+ )
@@ -463,6 +463,110 @@ def _ensure_schema(conn: sqlite3.Connection) -> None:
463
463
  raised INTEGER NOT NULL DEFAULT 0
464
464
  );
465
465
 
466
+ -- #1982 (epic #836): the coord-side half of the portal sync bridge —
467
+ -- see coord/portal_sync.py for the loop that reads/writes these three
468
+ -- tables and docs/CUSTOMER_PORTAL.md ("The sync bridge") for why the
469
+ -- bridge is outbound-only.
470
+ --
471
+ -- OWNERSHIP, which is the whole reason there are two tables and not
472
+ -- one: the portal is the SOLE WRITER of customer-authored facts
473
+ -- (intake text, sign-off verdicts, answers) and coord is the SOLE
474
+ -- WRITER of engineer-authored facts (status, design rounds,
475
+ -- questions). `portal_events` below is a read-only MIRROR of the
476
+ -- former — nothing in coord ever pushes a row of it back — and
477
+ -- `portal_outbox` is the queue of the latter. Nothing is co-written,
478
+ -- so there is no merge problem and no split-brain.
479
+
480
+ -- Inbound mirror: one row per event pulled from
481
+ -- `GET /api/bridge/pull`, keyed on the portal's own stable event id
482
+ -- so a replay from a stale cursor is a no-op (`INSERT OR IGNORE`,
483
+ -- coord/portal_store.py `record_events`). The cursor only advances
484
+ -- AFTER the page's rows commit, so a crash mid-page replays the page
485
+ -- rather than skipping it — a submission made while the daemon was
486
+ -- down queues, it does not vanish. `payload_json` is the raw event
487
+ -- verbatim: this table is an inbox, and parsing an event into
488
+ -- coord-side work is a separate (downstream) concern that must be
489
+ -- able to re-read the original. `handled_at` is NULL until
490
+ -- something downstream consumes the event.
491
+ CREATE TABLE IF NOT EXISTS portal_events (
492
+ event_id TEXT PRIMARY KEY,
493
+ submission_id TEXT NOT NULL DEFAULT '',
494
+ kind TEXT NOT NULL DEFAULT '',
495
+ occurred_at TEXT NOT NULL DEFAULT '',
496
+ payload_json TEXT NOT NULL DEFAULT '{}',
497
+ received_at REAL NOT NULL,
498
+ handled_at REAL
499
+ );
500
+
501
+ -- Outbound queue: one row per coord-owned fact waiting to be pushed.
502
+ --
503
+ -- `seq` is a DENSE per-submission FIFO order and `revision` the
504
+ -- monotonic counter the portal dedupes on (its `applyUpdate`
505
+ -- watermark ignores anything at or below what it already stored, so
506
+ -- re-pushing an unconfirmed row is safe). Both are allocated at
507
+ -- ENQUEUE time and never rewritten, which is what makes a retry
508
+ -- idempotent rather than a second write at a new revision.
509
+ --
510
+ -- `announces` is the ordering safety belt and the reason this is a
511
+ -- queue instead of a direct call. A status like `awaiting-signoff`
512
+ -- does not merely display — the portal EMAILS the customer "your
513
+ -- design is ready, go look at it". Pushing it before the design
514
+ -- round it announces lands the customer on an empty screen (measured
515
+ -- in production on 2026-08-14, dogfood #835). status and
516
+ -- design_round are separate coord-owned fields and the portal
517
+ -- enforces no ordering between them because it cannot — both are
518
+ -- ours. So an announcing row names the `requires_kind` row that
519
+ -- must be CONFIRMED applied first, and coord/portal_sync.py refuses
520
+ -- to send it until that is true. '' for a row that announces
521
+ -- nothing.
522
+ CREATE TABLE IF NOT EXISTS portal_outbox (
523
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
524
+ submission_id TEXT NOT NULL,
525
+ seq INTEGER NOT NULL,
526
+ revision INTEGER NOT NULL,
527
+ kind TEXT NOT NULL,
528
+ fields_json TEXT NOT NULL DEFAULT '{}',
529
+ announces TEXT NOT NULL DEFAULT '',
530
+ requires_kind TEXT NOT NULL DEFAULT '',
531
+ state TEXT NOT NULL DEFAULT 'pending',
532
+ reason TEXT NOT NULL DEFAULT '',
533
+ attempts INTEGER NOT NULL DEFAULT 0,
534
+ enqueued_at REAL NOT NULL,
535
+ sent_at REAL,
536
+ UNIQUE(submission_id, seq)
537
+ );
538
+
539
+ -- Per-submission bookkeeping: the revision/seq allocators, plus what
540
+ -- coord has CONFIRMED the portal applied (not what it hoped to
541
+ -- send). `design_round` is the highest round number confirmed
542
+ -- applied, which is exactly what the `awaiting-signoff` guard above
543
+ -- consults. `customer_json` is the mirrored, read-only customer
544
+ -- half — written only from pulled events, never pushed back.
545
+ CREATE TABLE IF NOT EXISTS portal_submissions (
546
+ submission_id TEXT PRIMARY KEY,
547
+ last_revision INTEGER NOT NULL DEFAULT 0,
548
+ last_seq INTEGER NOT NULL DEFAULT 0,
549
+ last_status TEXT NOT NULL DEFAULT '',
550
+ design_round INTEGER NOT NULL DEFAULT 0,
551
+ open_question TEXT NOT NULL DEFAULT '',
552
+ customer_json TEXT NOT NULL DEFAULT '{}',
553
+ first_seen_at REAL NOT NULL,
554
+ updated_at REAL NOT NULL
555
+ );
556
+
557
+ -- Single-row cursor + liveness bookkeeping for the bridge (the
558
+ -- CHECK pins it to one row so "which cursor?" can never be a
559
+ -- question). `pull_cursor` is opaque to coord — it is whatever the
560
+ -- portal handed back — and is the replay point on daemon restart.
561
+ CREATE TABLE IF NOT EXISTS portal_sync_state (
562
+ id INTEGER PRIMARY KEY CHECK (id = 1),
563
+ pull_cursor TEXT,
564
+ last_pull_at REAL,
565
+ last_push_at REAL,
566
+ last_heartbeat_at REAL,
567
+ last_error TEXT NOT NULL DEFAULT ''
568
+ );
569
+
466
570
  CREATE INDEX IF NOT EXISTS idx_assignments_status ON assignments(status);
467
571
  CREATE INDEX IF NOT EXISTS idx_assignments_machine ON assignments(machine_name);
468
572
  CREATE INDEX IF NOT EXISTS idx_merge_queue_state ON merge_queue(state);
@@ -476,6 +580,12 @@ def _ensure_schema(conn: sqlite3.Connection) -> None:
476
580
  ON drive_escalations(repo_name, issue_number);
477
581
  CREATE INDEX IF NOT EXISTS idx_drive_queue_state
478
582
  ON drive_queue(state, position);
583
+ -- #1982: the push loop's hot read is "pending rows, oldest first,
584
+ -- grouped by submission" — see coord.portal_store.pending_outbox.
585
+ CREATE INDEX IF NOT EXISTS idx_portal_outbox_pending
586
+ ON portal_outbox(state, submission_id, seq);
587
+ CREATE INDEX IF NOT EXISTS idx_portal_events_submission
588
+ ON portal_events(submission_id);
479
589
 
480
590
  INSERT OR IGNORE INTO schema_version VALUES (1);
481
591
  """)