code-coordinator 0.5.147__tar.gz → 0.5.148__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 (868) hide show
  1. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/PKG-INFO +3 -1
  2. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/README.md +2 -0
  3. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/code_coordinator.egg-info/PKG-INFO +3 -1
  4. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/code_coordinator.egg-info/SOURCES.txt +1 -0
  5. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/code_coordinator.egg-info/scm_file_list.json +1 -0
  6. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/code_coordinator.egg-info/scm_version.json +2 -2
  7. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/commands/lifecycle.py +21 -2
  8. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/server.py +17 -1
  9. code_coordinator-0.5.148/docs/ADR_COORD_WEB_DIST.md +158 -0
  10. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/PHONE_WEBAPP.md +6 -0
  11. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_dashboard.py +212 -1
  12. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/.claude/commands/board.md +0 -0
  13. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/.claude/commands/complete-session.md +0 -0
  14. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/.claude/commands/coordinator.md +0 -0
  15. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/.githooks/_lib.sh +0 -0
  16. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/.githooks/post-checkout +0 -0
  17. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/.githooks/post-commit +0 -0
  18. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/.githooks/post-merge +0 -0
  19. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  20. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/.github/coord-ci-acceptance.yml +0 -0
  21. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/.github/workflows/acceptance-web.yml +0 -0
  22. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/.github/workflows/auto-release.yml +0 -0
  23. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/.github/workflows/cargo-test.yml +0 -0
  24. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/.github/workflows/publish.yml +0 -0
  25. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/.github/workflows/release-tui.yml +0 -0
  26. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/.github/workflows/test.yml +0 -0
  27. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/.gitignore +0 -0
  28. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/CLAUDE.md +0 -0
  29. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/GOAL.md +0 -0
  30. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/LICENSE +0 -0
  31. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/MANIFEST.in +0 -0
  32. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/code_coordinator.egg-info/dependency_links.txt +0 -0
  33. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/code_coordinator.egg-info/entry_points.txt +0 -0
  34. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/code_coordinator.egg-info/requires.txt +0 -0
  35. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/code_coordinator.egg-info/top_level.txt +0 -0
  36. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/__init__.py +0 -0
  37. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/_board_mapping.py +0 -0
  38. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/acceptance.py +0 -0
  39. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/acceptance_drivers.py +0 -0
  40. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/agent.py +0 -0
  41. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/agent_app.py +0 -0
  42. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/agent_update.py +0 -0
  43. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/agents/opencode/.gitignore +0 -0
  44. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/agents/opencode/agents/work.md +0 -0
  45. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/agents/opencode/routing.jsonc +0 -0
  46. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/audit.py +0 -0
  47. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/auto_loop.py +0 -0
  48. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/block_log.py +0 -0
  49. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/board_bool_guard.py +0 -0
  50. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/board_service.py +0 -0
  51. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/board_wire.py +0 -0
  52. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/brain.py +0 -0
  53. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/branch_model.py +0 -0
  54. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/bug_intake.py +0 -0
  55. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/cargo_cache.py +0 -0
  56. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/ci_github.py +0 -0
  57. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/ci_store.py +0 -0
  58. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/claim.py +0 -0
  59. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/cli.py +0 -0
  60. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/client.py +0 -0
  61. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/commands/__init__.py +0 -0
  62. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/commands/_common.py +0 -0
  63. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/commands/acceptance.py +0 -0
  64. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/commands/agent_ops.py +0 -0
  65. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/commands/audit.py +0 -0
  66. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/commands/chat.py +0 -0
  67. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/commands/dispatch.py +0 -0
  68. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/commands/dispatch_workers.py +0 -0
  69. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/commands/drive.py +0 -0
  70. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/commands/drive_queue.py +0 -0
  71. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/commands/gate_a.py +0 -0
  72. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/commands/gates.py +0 -0
  73. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/commands/issues.py +0 -0
  74. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/commands/merge.py +0 -0
  75. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/commands/milestone.py +0 -0
  76. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/commands/plan_followup.py +0 -0
  77. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/commands/plans.py +0 -0
  78. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/commands/portal.py +0 -0
  79. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/commands/release.py +0 -0
  80. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/commands/repo.py +0 -0
  81. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/commands/report.py +0 -0
  82. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/commands/review.py +0 -0
  83. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/commands/scorecard.py +0 -0
  84. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/commands/sessions.py +0 -0
  85. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/commands/setup.py +0 -0
  86. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/commands/status.py +0 -0
  87. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/commands/terminal.py +0 -0
  88. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/commands/test_gate.py +0 -0
  89. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/commands/tui.py +0 -0
  90. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/comments.py +0 -0
  91. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/config.py +0 -0
  92. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/config_reload.py +0 -0
  93. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/conflict_fix.py +0 -0
  94. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dao.py +0 -0
  95. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/__init__.py +0 -0
  96. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/fixture.py +0 -0
  97. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/index.html +0 -0
  98. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/terminal.py +0 -0
  99. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/.gitignore +0 -0
  100. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/components.json +0 -0
  101. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/dist/assets/Gallery-BoKs3mpY.js +0 -0
  102. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  103. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/dist/assets/Terminal-CEsP08iX.js +0 -0
  104. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/dist/assets/index-CDHPlB6k.js +0 -0
  105. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  106. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  107. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  108. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  109. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  110. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/dist/index.html +0 -0
  111. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  112. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/dist/sw.js +0 -0
  113. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  114. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  115. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  116. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  117. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  118. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  119. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  120. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  121. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  122. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  123. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/eslint.config.js +0 -0
  124. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/index.html +0 -0
  125. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  126. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/package-lock.json +0 -0
  127. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/package.json +0 -0
  128. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  129. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/playwright.config.ts +0 -0
  130. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/postcss.config.js +0 -0
  131. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  132. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  133. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  134. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/App.tsx +0 -0
  135. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/api/client.ts +0 -0
  136. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  137. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  138. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  139. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  140. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  141. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  142. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  143. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  144. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  145. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  146. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  147. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  148. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  149. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  150. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  151. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  152. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  153. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  154. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  155. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  156. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  157. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  158. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  159. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  160. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  161. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  162. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  163. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  164. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  165. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  166. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  167. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  168. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  169. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  170. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  171. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/index.css +0 -0
  172. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  173. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  174. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/main.tsx +0 -0
  175. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  176. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  177. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  178. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  179. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  180. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  181. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  182. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  183. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  184. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  185. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  186. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  187. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  188. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  189. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  190. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  191. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  192. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  193. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  194. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  195. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  196. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  197. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  198. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/tailwind.config.js +0 -0
  199. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/tsconfig.json +0 -0
  200. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  201. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dashboard/webapp/vite.config.ts +0 -0
  202. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/db.py +0 -0
  203. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dead_end.py +0 -0
  204. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/deploy/README.md +0 -0
  205. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/deploy/coord-agent.service +0 -0
  206. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/deploy/coord-db-backup.service +0 -0
  207. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/deploy/coord-db-backup.sh +0 -0
  208. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/deploy/coord-db-backup.timer +0 -0
  209. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/deploy/coord-drive-queue.service +0 -0
  210. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/deploy/coord-drive-queue.timer +0 -0
  211. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/deploy/coord-notify.service +0 -0
  212. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/deploy/coord-notify.timer +0 -0
  213. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/deploy/coord-release-propagate.service +0 -0
  214. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/deploy/coord-release-propagate.timer +0 -0
  215. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/deploy/coord-release-window.service +0 -0
  216. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/deploy/coord-release-window.timer +0 -0
  217. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/deploy/coord-serve.service +0 -0
  218. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/deploy/coord-web-dist-build.service +0 -0
  219. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/deploy/coord-web-dist-build.timer +0 -0
  220. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/deploy/coord-web.service +0 -0
  221. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/deploy_manifest.py +0 -0
  222. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/deploy_units.py +0 -0
  223. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/deps.py +0 -0
  224. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/diagnose.py +0 -0
  225. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dispatch.py +0 -0
  226. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/dist_name.py +0 -0
  227. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/drive.py +0 -0
  228. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/drive_queue.py +0 -0
  229. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/drive_state.py +0 -0
  230. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/events.py +0 -0
  231. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/failure_class.py +0 -0
  232. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/filelock.py +0 -0
  233. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/fleet_config_health.py +0 -0
  234. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/freshness.py +0 -0
  235. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/gate_a.py +0 -0
  236. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/gate_b.py +0 -0
  237. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/gate_snapshot.py +0 -0
  238. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/gates.py +0 -0
  239. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/github_ops.py +0 -0
  240. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/goal.py +0 -0
  241. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/graph_health.py +0 -0
  242. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/health/__init__.py +0 -0
  243. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/health/aggregate.py +0 -0
  244. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/health/checks/__init__.py +0 -0
  245. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/health/checks/agent_install.py +0 -0
  246. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/health/checks/cargo_targets.py +0 -0
  247. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/health/checks/claude_binary.py +0 -0
  248. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/health/checks/deploy_lane_facts.py +0 -0
  249. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/health/checks/disk.py +0 -0
  250. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/health/checks/fleet_board.py +0 -0
  251. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  252. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/health/checks/fleet_phantom.py +0 -0
  253. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/health/checks/fleet_unit_drift.py +0 -0
  254. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/health/checks/graph.py +0 -0
  255. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/health/checks/graphify_cli.py +0 -0
  256. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/health/checks/index_lock.py +0 -0
  257. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/health/checks/plan_usage.py +0 -0
  258. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/health/checks/repo_state.py +0 -0
  259. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/health/checks/spawned_coord.py +0 -0
  260. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/health/checks/timer_active.py +0 -0
  261. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/health/checks/toolchain.py +0 -0
  262. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/health/checks/unit_drift.py +0 -0
  263. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/health/checks/unit_enablement.py +0 -0
  264. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/health/checks/worktrees.py +0 -0
  265. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/health/cli.py +0 -0
  266. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/health/context.py +0 -0
  267. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/health/fleet_snapshot.py +0 -0
  268. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/health/models.py +0 -0
  269. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/health/pypi.py +0 -0
  270. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/health/registry.py +0 -0
  271. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/health/render.py +0 -0
  272. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/health/units.py +0 -0
  273. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/hooks.py +0 -0
  274. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/housekeeping.py +0 -0
  275. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/interactive.py +0 -0
  276. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/issue_store.py +0 -0
  277. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/liveness_auditor.py +0 -0
  278. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/machine_pause.py +0 -0
  279. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/merge_queue.py +0 -0
  280. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/milestone_chat.py +0 -0
  281. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/milestone_dispatch.py +0 -0
  282. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/milestone_gate.py +0 -0
  283. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/milestone_order.py +0 -0
  284. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/mock_author.py +0 -0
  285. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/models.py +0 -0
  286. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/network.py +0 -0
  287. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/new_issue_chat.py +0 -0
  288. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/notifier/__init__.py +0 -0
  289. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/notifier/baseline.py +0 -0
  290. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/notifier/cli.py +0 -0
  291. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/notifier/collect.py +0 -0
  292. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/notifier/digest.py +0 -0
  293. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/notifier/models.py +0 -0
  294. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/notifier/predicate.py +0 -0
  295. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/notifier/service.py +0 -0
  296. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/notifier/store.py +0 -0
  297. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/notifier/transport.py +0 -0
  298. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/notify.py +0 -0
  299. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/openapi.py +0 -0
  300. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/overlap_fence.py +0 -0
  301. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/overlap_predict.py +0 -0
  302. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/parentage.py +0 -0
  303. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/parentage_github.py +0 -0
  304. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/pipeline.py +0 -0
  305. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/plan_parser.py +0 -0
  306. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/plans.py +0 -0
  307. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/platform_paths.py +0 -0
  308. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/portal_bridge.py +0 -0
  309. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/portal_store.py +0 -0
  310. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/portal_sync.py +0 -0
  311. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/pr_body_lint.py +0 -0
  312. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/prereqs.py +0 -0
  313. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/progress.py +0 -0
  314. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/providers/__init__.py +0 -0
  315. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/providers/base.py +0 -0
  316. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/providers/claude.py +0 -0
  317. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/providers/claude_pty.py +0 -0
  318. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/providers/opencode.py +0 -0
  319. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/queue_diagnose.py +0 -0
  320. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/reconcile.py +0 -0
  321. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/reconcile_tick.py +0 -0
  322. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/refine_chat.py +0 -0
  323. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/release_cordon.py +0 -0
  324. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/release_propagate.py +0 -0
  325. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/release_verify.py +0 -0
  326. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/release_window.py +0 -0
  327. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/repo_edit.py +0 -0
  328. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/repo_onboard.py +0 -0
  329. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/reports.py +0 -0
  330. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/revalidate.py +0 -0
  331. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/review.py +0 -0
  332. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/scorecard.py +0 -0
  333. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/serve_app.py +0 -0
  334. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/skills/portal-followup/SKILL.md +0 -0
  335. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/skills/update-issue/SKILL.md +0 -0
  336. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/smoke.py +0 -0
  337. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/spend_ceiling.py +0 -0
  338. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/split_work.py +0 -0
  339. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/stage_projection.py +0 -0
  340. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/state.py +0 -0
  341. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/test_author.py +0 -0
  342. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/test_chat.py +0 -0
  343. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/test_orchestrator.py +0 -0
  344. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/test_report.py +0 -0
  345. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/tui_release.py +0 -0
  346. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/usage.py +0 -0
  347. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/usage_limits.py +0 -0
  348. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/usage_rollup.py +0 -0
  349. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coord/worker_events.py +0 -0
  350. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/coordinator.example.yml +0 -0
  351. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/deploy/coord-agent.service +0 -0
  352. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/deploy/coord-db-backup.service +0 -0
  353. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/deploy/coord-db-backup.sh +0 -0
  354. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/deploy/coord-db-backup.timer +0 -0
  355. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/deploy/coord-drive-queue.service +0 -0
  356. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/deploy/coord-drive-queue.timer +0 -0
  357. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/deploy/coord-notify.service +0 -0
  358. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/deploy/coord-notify.timer +0 -0
  359. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/deploy/coord-release-propagate.service +0 -0
  360. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/deploy/coord-release-propagate.timer +0 -0
  361. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/deploy/coord-release-window.service +0 -0
  362. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/deploy/coord-release-window.timer +0 -0
  363. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/deploy/coord-serve.service +0 -0
  364. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/deploy/coord-web-dist-build.service +0 -0
  365. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/deploy/coord-web-dist-build.sh +0 -0
  366. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/deploy/coord-web-dist-build.timer +0 -0
  367. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/deploy/coord-web-rollback.sh +0 -0
  368. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/deploy/coord-web.service +0 -0
  369. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/deploy/node-shim.sh +0 -0
  370. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/AGENT_OPERATIONS.md +0 -0
  371. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/ARCHITECTURE.md +0 -0
  372. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/ARCH_SECURITY_GATES.md +0 -0
  373. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/COCKPIT.md +0 -0
  374. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/CONTROL_CENTER.md +0 -0
  375. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/COST_DISCIPLINE.md +0 -0
  376. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/CROSS_PLATFORM.md +0 -0
  377. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/CUSTOMER_PORTAL.md +0 -0
  378. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/DRIVE_QUEUE.md +0 -0
  379. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/EPHEMERAL_WORKERS.md +0 -0
  380. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/FORGE_MIGRATION.md +0 -0
  381. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/GRAPHIFY_SETUP.md +0 -0
  382. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/ISSUE_GUIDANCE.md +0 -0
  383. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/MAC_MINI.md +0 -0
  384. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  385. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/NOTIFIER.md +0 -0
  386. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/OPENCODE_VERIFICATION.md +0 -0
  387. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/OPERATING_GOTCHAS.md +0 -0
  388. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/ORACLE_LOOP.md +0 -0
  389. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/PIPELINE_V2.md +0 -0
  390. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/PLATFORM_EVOLUTION.md +0 -0
  391. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/SECOND_BACKEND.md +0 -0
  392. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/STORE_SERVICE.md +0 -0
  393. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  394. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/WEB_CONTROL_CENTER.md +0 -0
  395. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/WSL_WINDOWS_WORKER.md +0 -0
  396. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/mocks/web/README.md +0 -0
  397. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/mocks/web/_tokens.css +0 -0
  398. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/mocks/web/issue-detail.html +0 -0
  399. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/mocks/web/pipeline-narrow.html +0 -0
  400. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/docs/mocks/web/pipeline-wide.html +0 -0
  401. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/graphify-out/.gitignore +0 -0
  402. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/install-agent.sh +0 -0
  403. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/pyproject.toml +0 -0
  404. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/scripts/audit_review_verdict_overrides.py +0 -0
  405. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  406. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/scripts/azure-workers/build-worker-image.sh +0 -0
  407. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/scripts/azure-workers/coordinator-machine.py +0 -0
  408. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/scripts/azure-workers/epic-down.sh +0 -0
  409. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/scripts/azure-workers/epic-up.sh +0 -0
  410. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/scripts/azure-workers/preflight.sh +0 -0
  411. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/scripts/azure-workers/provision-worker.sh +0 -0
  412. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  413. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  414. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/scripts/azure-workers/verify-github-token.sh +0 -0
  415. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/scripts/codegen.py +0 -0
  416. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/scripts/coord-test-runner.sh +0 -0
  417. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/scripts/drive-batch.sh +0 -0
  418. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/scripts/gen_board_fixture.py +0 -0
  419. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/scripts/next_release_tag.py +0 -0
  420. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/scripts/run_tests_in_populated_home.sh +0 -0
  421. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/scripts/run_tests_without_gh.sh +0 -0
  422. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/scripts/smoke_437_interactive.py +0 -0
  423. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/scripts/verify_878_review_capture.py +0 -0
  424. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/scripts/verify_release_published.py +0 -0
  425. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/scripts/verify_release_wheel.py +0 -0
  426. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/setup.cfg +0 -0
  427. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/SMOKE_SET.md +0 -0
  428. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/__init__.py +0 -0
  429. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  430. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-33/contract.md +0 -0
  431. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-33/manifest.yml +0 -0
  432. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  433. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  434. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  435. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  436. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-37/conftest.py +0 -0
  437. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-37/contract.md +0 -0
  438. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-37/manifest.yml +0 -0
  439. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  440. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  441. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-38/contract.md +0 -0
  442. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-38/manifest.yml +0 -0
  443. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  444. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  445. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  446. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  447. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  448. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  449. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  450. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  451. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  452. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  453. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-51/contract.md +0 -0
  454. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  455. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  456. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-51/manifest.yml +0 -0
  457. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  458. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-51/tsconfig.json +0 -0
  459. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  460. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
  461. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-65/contract.md +0 -0
  462. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-65/manifest.yml +0 -0
  463. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  464. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  465. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  466. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  467. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  468. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  469. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  470. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  471. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  472. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/conftest.py +0 -0
  473. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/fixtures/board-pipeline-basic.json +0 -0
  474. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  475. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  476. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  477. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  478. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/fixtures/playwright/all_pass.json +0 -0
  479. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  480. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/fixtures/playwright/mixed_fail.json +0 -0
  481. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  482. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  483. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/fixtures/playwright/skip.json +0 -0
  484. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/fixtures/playwright/truncated.json +0 -0
  485. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  486. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  487. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  488. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  489. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  490. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  491. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  492. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  493. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_acceptance.py +0 -0
  494. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_acceptance_drivers.py +0 -0
  495. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_agent.py +0 -0
  496. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_agent_api_error.py +0 -0
  497. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_agent_app.py +0 -0
  498. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_agent_branch_base.py +0 -0
  499. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_agent_branch_capture.py +0 -0
  500. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_agent_config_free_1712.py +0 -0
  501. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_agent_deploy_units_endpoint.py +0 -0
  502. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_agent_dirty_worktree.py +0 -0
  503. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  504. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_agent_graph_self_heal.py +0 -0
  505. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_agent_health_h3.py +0 -0
  506. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_agent_idle_restart.py +0 -0
  507. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_agent_push_failure.py +0 -0
  508. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_agent_reap.py +0 -0
  509. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_agent_repos_and_pull.py +0 -0
  510. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_agent_restart_services_endpoint.py +0 -0
  511. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_agent_startup_diagnostics.py +0 -0
  512. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_agent_update.py +0 -0
  513. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_agent_update_bluegreen.py +0 -0
  514. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_agent_usage_limit.py +0 -0
  515. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_agent_zero_commit.py +0 -0
  516. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_ambient_home_isolation.py +0 -0
  517. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_approve_reject_plan.py +0 -0
  518. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_approve_usage_gate.py +0 -0
  519. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_assignment_already_recorded_daemon.py +0 -0
  520. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_audit_log.py +0 -0
  521. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_audit_outcome.py +0 -0
  522. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_audit_query.py +0 -0
  523. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_auto_loop.py +0 -0
  524. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_auto_release_publish_2035.py +0 -0
  525. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_base_checkout_restore.py +0 -0
  526. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_block_log.py +0 -0
  527. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_board_cap_762.py +0 -0
  528. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_board_fixture.py +0 -0
  529. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_board_read_path.py +0 -0
  530. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_board_service.py +0 -0
  531. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_board_state.py +0 -0
  532. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_board_wire.py +0 -0
  533. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_brain.py +0 -0
  534. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_branch_model.py +0 -0
  535. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_bug_intake.py +0 -0
  536. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_build_worker_image_env_update.py +0 -0
  537. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cargo_cache.py +0 -0
  538. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_ci_acceptance_gate_1950.py +0 -0
  539. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_ci_parity_2091.py +0 -0
  540. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_ci_store.py +0 -0
  541. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_claim.py +0 -0
  542. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_acceptance.py +0 -0
  543. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_assign.py +0 -0
  544. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  545. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_assign_interactive_remote.py +0 -0
  546. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_assign_provider.py +0 -0
  547. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  548. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_audit.py +0 -0
  549. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_chat_continue.py +0 -0
  550. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_decide.py +0 -0
  551. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_diagnose_config_provenance.py +0 -0
  552. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_diagnose_graph.py +0 -0
  553. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_doctor.py +0 -0
  554. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_doctor_config_free_1801.py +0 -0
  555. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  556. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_drive.py +0 -0
  557. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_drive_queue.py +0 -0
  558. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_escalate.py +0 -0
  559. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_fix_headless_review.py +0 -0
  560. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_gate_a.py +0 -0
  561. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_install_drift.py +0 -0
  562. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_install_skills.py +0 -0
  563. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_issue_create_label.py +0 -0
  564. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_issue_reopen.py +0 -0
  565. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_merge.py +0 -0
  566. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_milestone_assign.py +0 -0
  567. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_milestone_capture.py +0 -0
  568. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_milestone_chat_add_child.py +0 -0
  569. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_milestone_dispatch.py +0 -0
  570. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_milestone_gate_b.py +0 -0
  571. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_milestone_gate_c.py +0 -0
  572. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_milestone_order.py +0 -0
  573. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  574. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_milestone_ship.py +0 -0
  575. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_network.py +0 -0
  576. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_new_issue_chat.py +0 -0
  577. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_plans.py +0 -0
  578. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_portal.py +0 -0
  579. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_pull_artifact.py +0 -0
  580. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_queue.py +0 -0
  581. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_reattach_sessions.py +0 -0
  582. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_refine_board.py +0 -0
  583. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_release_preflight.py +0 -0
  584. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_release_propagate.py +0 -0
  585. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_release_window.py +0 -0
  586. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_repo_2220.py +0 -0
  587. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_scorecard.py +0 -0
  588. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_set_review_findings.py +0 -0
  589. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_status_advisory_terminal.py +0 -0
  590. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_status_merge_queue.py +0 -0
  591. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_status_provider.py +0 -0
  592. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_status_review_finalizing.py +0 -0
  593. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_status_test_failed_tag.py +0 -0
  594. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_status_usage_limit.py +0 -0
  595. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_sync_comments_873.py +0 -0
  596. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_test_plan.py +0 -0
  597. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_track.py +0 -0
  598. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_tui_update.py +0 -0
  599. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cli_wait.py +0 -0
  600. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_client_base_install.py +0 -0
  601. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_comments.py +0 -0
  602. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_completion_summary.py +0 -0
  603. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_config.py +0 -0
  604. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_config_acceptance.py +0 -0
  605. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_config_audit.py +0 -0
  606. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_config_pricing.py +0 -0
  607. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  608. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_config_usage_gate.py +0 -0
  609. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_conflict_fix.py +0 -0
  610. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_conflict_fix_semantic.py +0 -0
  611. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_coord_test.py +0 -0
  612. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_coord_test_runner_baseline.py +0 -0
  613. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_coord_test_runner_populated_home.py +0 -0
  614. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_coord_test_runner_routing.py +0 -0
  615. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_coord_test_runner_toolchain.py +0 -0
  616. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_coord_web_sse_restart_live.py +0 -0
  617. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_coordinator_machine.py +0 -0
  618. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_cross_platform_imports.py +0 -0
  619. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_dashboard_fixture.py +0 -0
  620. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_dashboard_terminal.py +0 -0
  621. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_dashboard_terminal_live.py +0 -0
  622. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_db.py +0 -0
  623. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_dead_end.py +0 -0
  624. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_deploy_coord_db_backup.py +0 -0
  625. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_deploy_coord_web_dist.py +0 -0
  626. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_deploy_coord_web_rollback.py +0 -0
  627. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_deploy_drive_queue_unit.py +0 -0
  628. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_deploy_manifest.py +0 -0
  629. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_deploy_units_lane.py +0 -0
  630. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_deploy_web_unit.py +0 -0
  631. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_deps.py +0 -0
  632. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_diagnose.py +0 -0
  633. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_dispatch.py +0 -0
  634. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_dispatch_target_validation.py +0 -0
  635. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_dist_name.py +0 -0
  636. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_done_housekeeping.py +0 -0
  637. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_drive.py +0 -0
  638. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_drive_queue.py +0 -0
  639. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_drive_state.py +0 -0
  640. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_drive_tmux.py +0 -0
  641. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_epic_up_capability_detection.py +0 -0
  642. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  643. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_epic_up_image_provenance.py +0 -0
  644. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_errors.py +0 -0
  645. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_events.py +0 -0
  646. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_failure_class.py +0 -0
  647. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_filelock.py +0 -0
  648. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  649. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_fix_of_force_override.py +0 -0
  650. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_fleet_config_health.py +0 -0
  651. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_fleet_health_probes.py +0 -0
  652. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_fleet_health_snapshot.py +0 -0
  653. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_freshness.py +0 -0
  654. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_gate_a.py +0 -0
  655. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_gate_b.py +0 -0
  656. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_gate_snapshot_staleness.py +0 -0
  657. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_gates.py +0 -0
  658. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  659. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_generated_types_fixture.py +0 -0
  660. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_github_ops.py +0 -0
  661. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_goal.py +0 -0
  662. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_graph_health.py +0 -0
  663. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_graph_selfheal_absent_2237.py +0 -0
  664. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_handoff.py +0 -0
  665. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_health_checks.py +0 -0
  666. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_health_cli.py +0 -0
  667. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_health_cli_graph.py +0 -0
  668. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_health_config.py +0 -0
  669. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_health_context.py +0 -0
  670. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_health_deploy_lane_facts.py +0 -0
  671. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_health_incident_regression.py +0 -0
  672. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_health_pypi.py +0 -0
  673. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_health_registry.py +0 -0
  674. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_health_timer_active.py +0 -0
  675. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_health_toolchain.py +0 -0
  676. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_health_unit_drift.py +0 -0
  677. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_health_unit_enablement.py +0 -0
  678. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_hooks.py +0 -0
  679. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_human_attended_437.py +0 -0
  680. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_init.py +0 -0
  681. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_integration.py +0 -0
  682. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_interactive_briefing_echo.py +0 -0
  683. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_interactive_prefill_state.py +0 -0
  684. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_interactive_session_relaunch.py +0 -0
  685. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_interactive_test_verdict_backstop.py +0 -0
  686. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_interactive_token_attribution.py +0 -0
  687. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_interactive_worktree.py +0 -0
  688. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_issue_store_seam.py +0 -0
  689. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_liveness_auditor.py +0 -0
  690. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_liveness_notify.py +0 -0
  691. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_machine_pause.py +0 -0
  692. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_merge_queue.py +0 -0
  693. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_merge_verify.py +0 -0
  694. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_milestone_chat.py +0 -0
  695. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_milestone_dispatch.py +0 -0
  696. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_milestone_gate.py +0 -0
  697. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_milestone_order.py +0 -0
  698. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_milestone_seam.py +0 -0
  699. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_mock_author.py +0 -0
  700. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_model_tiering.py +0 -0
  701. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_models.py +0 -0
  702. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_models_config_labels.py +0 -0
  703. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_needs_attention.py +0 -0
  704. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_network.py +0 -0
  705. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_new_issue_chat.py +0 -0
  706. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_next_release_tag.py +0 -0
  707. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_no_direct_gh_calls.py +0 -0
  708. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_node_shim.py +0 -0
  709. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_notifier_baseline.py +0 -0
  710. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_notifier_cli.py +0 -0
  711. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_notifier_collect.py +0 -0
  712. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_notifier_config.py +0 -0
  713. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_notifier_drive_seam.py +0 -0
  714. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_notifier_isolation.py +0 -0
  715. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_notifier_predicate.py +0 -0
  716. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_notifier_quiet_hours.py +0 -0
  717. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_notifier_service.py +0 -0
  718. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_notify.py +0 -0
  719. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_notify_drain.py +0 -0
  720. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_openapi.py +0 -0
  721. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_operational_defaults.py +0 -0
  722. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_overlap_fence.py +0 -0
  723. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_overlap_predict.py +0 -0
  724. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_packaged_deploy_units.py +0 -0
  725. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_parentage.py +0 -0
  726. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_paste_landed.py +0 -0
  727. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_pipeline.py +0 -0
  728. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_plan_followup_approve_plan_command.py +0 -0
  729. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_plan_followup_pr_command.py +0 -0
  730. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_plan_followup_review_command.py +0 -0
  731. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_plan_only.py +0 -0
  732. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_plan_parser.py +0 -0
  733. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_platform_paths.py +0 -0
  734. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_portal_bridge.py +0 -0
  735. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_portal_config.py +0 -0
  736. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_portal_sync.py +0 -0
  737. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_pr_body_lint.py +0 -0
  738. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_prereqs.py +0 -0
  739. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_production_db_guard.py +0 -0
  740. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_progress.py +0 -0
  741. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_provider_seam.py +0 -0
  742. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_providers.py +0 -0
  743. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_providers_config_labels.py +0 -0
  744. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_providers_pty.py +0 -0
  745. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_quiet_hours.py +0 -0
  746. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_quiet_hours_store_2146.py +0 -0
  747. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_reap_merged_sessions.py +0 -0
  748. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_reap_stale_interactive_tick.py +0 -0
  749. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_reconcile.py +0 -0
  750. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_reconcile_branch.py +0 -0
  751. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_reconcile_completions.py +0 -0
  752. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_reconcile_merges.py +0 -0
  753. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_reconcile_no_agent_record.py +0 -0
  754. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_reconcile_tick.py +0 -0
  755. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_reconcile_usage_limit_done.py +0 -0
  756. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_refine_chat.py +0 -0
  757. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_release_cordon_2101.py +0 -0
  758. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  759. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_release_cordon_deadlock_2240.py +0 -0
  760. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_release_propagate.py +0 -0
  761. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_release_unified_1242.py +0 -0
  762. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_release_verify.py +0 -0
  763. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_release_window.py +0 -0
  764. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_remote_auto_prune.py +0 -0
  765. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_remote_interactive_reaper.py +0 -0
  766. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_repo_edit_2220.py +0 -0
  767. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_repo_graph_fleet_2237.py +0 -0
  768. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_repo_onboard_2220.py +0 -0
  769. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_report_result_push.py +0 -0
  770. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_reports.py +0 -0
  771. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_retry.py +0 -0
  772. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_retry_advisory_1606.py +0 -0
  773. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_retry_type_1636.py +0 -0
  774. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_revalidate.py +0 -0
  775. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_review.py +0 -0
  776. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_review_end_review_without_verdict.py +0 -0
  777. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_review_parse_failure_diagnostic.py +0 -0
  778. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_review_reaffirm.py +0 -0
  779. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_review_state.py +0 -0
  780. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_review_verdict_backstop.py +0 -0
  781. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_review_verdict_override_audit.py +0 -0
  782. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_review_verdict_relay.py +0 -0
  783. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_review_zero_commits.py +0 -0
  784. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_scoped_review_wiring.py +0 -0
  785. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_scorecard.py +0 -0
  786. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_serve.py +0 -0
  787. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_serve_app_board_trim.py +0 -0
  788. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_session.py +0 -0
  789. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_slice_issue_attribution.py +0 -0
  790. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_smoke.py +0 -0
  791. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_smoke_live_checkout_restore.py +0 -0
  792. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_smoke_workflow.py +0 -0
  793. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_spend_ceiling.py +0 -0
  794. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_spend_ceiling_coordinator.py +0 -0
  795. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_split.py +0 -0
  796. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_split_work.py +0 -0
  797. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_stage_projection.py +0 -0
  798. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_stalled_pipeline.py +0 -0
  799. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_state.py +0 -0
  800. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_state_review_findings_daemon.py +0 -0
  801. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_status_fleet_footer.py +0 -0
  802. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_stop_1567.py +0 -0
  803. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_stuck.py +0 -0
  804. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_terminal_command.py +0 -0
  805. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_test_author.py +0 -0
  806. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_test_chat.py +0 -0
  807. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_test_orchestrator.py +0 -0
  808. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_test_report.py +0 -0
  809. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_test_verdict_parsing.py +0 -0
  810. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_test_verdict_transcript_floor.py +0 -0
  811. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_thin_client_board_audit.py +0 -0
  812. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_thin_client_config_load_1080.py +0 -0
  813. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_thin_client_daemon_routing_906.py +0 -0
  814. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_tmux_host.py +0 -0
  815. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_tmux_session.py +0 -0
  816. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_transcript_floor.py +0 -0
  817. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_usage.py +0 -0
  818. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_usage_limits.py +0 -0
  819. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_usage_rollup.py +0 -0
  820. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_venv_live_install_2121.py +0 -0
  821. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_version_single_source.py +0 -0
  822. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_watch.py +0 -0
  823. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  824. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_worker_events.py +0 -0
  825. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_worker_image_pin_sync.py +0 -0
  826. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_worker_safety.py +0 -0
  827. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_worker_test_scoping.py +0 -0
  828. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_worktree.py +0 -0
  829. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  830. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/Cargo.lock +0 -0
  831. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/Cargo.toml +0 -0
  832. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/cargo-config-local-quadraui.toml.example +0 -0
  833. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/app/audit.rs +0 -0
  834. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/app/chat.rs +0 -0
  835. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/app/data.rs +0 -0
  836. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/app/dialogs.rs +0 -0
  837. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/app/doc_tabs.rs +0 -0
  838. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/app/drive.rs +0 -0
  839. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/app/drive_queue.rs +0 -0
  840. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/app/escalation.rs +0 -0
  841. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/app/events.rs +0 -0
  842. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/app/fixtures.rs +0 -0
  843. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/app/fleet_health.rs +0 -0
  844. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/app/fleet_sessions.rs +0 -0
  845. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/app/fleet_terminals.rs +0 -0
  846. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/app/format.rs +0 -0
  847. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/app/milestone_dag.rs +0 -0
  848. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/app/mod.rs +0 -0
  849. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/app/msv.rs +0 -0
  850. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/app/pipeline.rs +0 -0
  851. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/app/plans.rs +0 -0
  852. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/app/render.rs +0 -0
  853. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/app/reports.rs +0 -0
  854. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/app/sessions.rs +0 -0
  855. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/app/settings_ui.rs +0 -0
  856. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/app/sidebar.rs +0 -0
  857. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/app/terminal.rs +0 -0
  858. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/app/tests.rs +0 -0
  859. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/app/types.rs +0 -0
  860. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/app/workspace.rs +0 -0
  861. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/bin/gtk.rs +0 -0
  862. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/commands.rs +0 -0
  863. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/lib.rs +0 -0
  864. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/main.rs +0 -0
  865. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/src/settings.rs +0 -0
  866. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/tests/acceptance.rs +0 -0
  867. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/tui/tests/cli.rs +0 -0
  868. {code_coordinator-0.5.147 → code_coordinator-0.5.148}/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.147
3
+ Version: 0.5.148
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
@@ -506,6 +506,8 @@ after publication.
506
506
  overnight drives.
507
507
  - [`docs/PHONE_WEBAPP.md`](docs/PHONE_WEBAPP.md) — build and serve the phone control-center PWA
508
508
  over Tailscale.
509
+ - [`docs/ADR_COORD_WEB_DIST.md`](docs/ADR_COORD_WEB_DIST.md) — how a built `coord-web` bundle
510
+ reaches the daemon host, and the alternatives rejected.
509
511
  - [`docs/AGENT_OPERATIONS.md`](docs/AGENT_OPERATIONS.md) — agent install, upgrade, and
510
512
  releasing to PyPI.
511
513
  - [`docs/OPERATING_GOTCHAS.md`](docs/OPERATING_GOTCHAS.md) — traps that cost a real dispatch or
@@ -466,6 +466,8 @@ after publication.
466
466
  overnight drives.
467
467
  - [`docs/PHONE_WEBAPP.md`](docs/PHONE_WEBAPP.md) — build and serve the phone control-center PWA
468
468
  over Tailscale.
469
+ - [`docs/ADR_COORD_WEB_DIST.md`](docs/ADR_COORD_WEB_DIST.md) — how a built `coord-web` bundle
470
+ reaches the daemon host, and the alternatives rejected.
469
471
  - [`docs/AGENT_OPERATIONS.md`](docs/AGENT_OPERATIONS.md) — agent install, upgrade, and
470
472
  releasing to PyPI.
471
473
  - [`docs/OPERATING_GOTCHAS.md`](docs/OPERATING_GOTCHAS.md) — traps that cost a real dispatch or
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.147
3
+ Version: 0.5.148
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
@@ -506,6 +506,8 @@ after publication.
506
506
  overnight drives.
507
507
  - [`docs/PHONE_WEBAPP.md`](docs/PHONE_WEBAPP.md) — build and serve the phone control-center PWA
508
508
  over Tailscale.
509
+ - [`docs/ADR_COORD_WEB_DIST.md`](docs/ADR_COORD_WEB_DIST.md) — how a built `coord-web` bundle
510
+ reaches the daemon host, and the alternatives rejected.
509
511
  - [`docs/AGENT_OPERATIONS.md`](docs/AGENT_OPERATIONS.md) — agent install, upgrade, and
510
512
  releasing to PyPI.
511
513
  - [`docs/OPERATING_GOTCHAS.md`](docs/OPERATING_GOTCHAS.md) — traps that cost a real dispatch or
@@ -365,6 +365,7 @@ deploy/coord-web-dist-build.timer
365
365
  deploy/coord-web-rollback.sh
366
366
  deploy/coord-web.service
367
367
  deploy/node-shim.sh
368
+ docs/ADR_COORD_WEB_DIST.md
368
369
  docs/AGENT_OPERATIONS.md
369
370
  docs/ARCHITECTURE.md
370
371
  docs/ARCH_SECURITY_GATES.md
@@ -343,6 +343,7 @@
343
343
  "deploy/coord-web-rollback.sh",
344
344
  "deploy/coord-web.service",
345
345
  "deploy/node-shim.sh",
346
+ "docs/ADR_COORD_WEB_DIST.md",
346
347
  "docs/AGENT_OPERATIONS.md",
347
348
  "docs/ARCHITECTURE.md",
348
349
  "docs/ARCH_SECURITY_GATES.md",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.147",
2
+ "tag": "0.5.148",
3
3
  "distance": 0,
4
- "node": "gbf9c09b2b36fbbb594b25c03bc8ef7844050cd84",
4
+ "node": "gc274183d70afe3f92607c261ef1ba839d2fb672a",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-18"
@@ -404,7 +404,7 @@ def web(
404
404
  # #1237: function-local + guarded — see _start_agent_server for why.
405
405
  with server_extra_guard("web"):
406
406
  import uvicorn
407
- from coord.dashboard.server import build_app
407
+ from coord.dashboard.server import build_app, dist_has_bundle
408
408
  from coord.dashboard.terminal import resolve_web_token
409
409
 
410
410
  fixture = None
@@ -438,7 +438,26 @@ def web(
438
438
  app = build_app(cfg, token=token, fixture=fixture, dist_path=dist_path)
439
439
  click.echo(f"coord web: dashboard at http://{bind_host}:{bind_port}")
440
440
  if dist_path is not None:
441
- click.echo(f" serving webapp bundle from {dist_path} (#1543)")
441
+ # #2003: this used to unconditionally claim "serving webapp bundle
442
+ # from {dist_path}" even when that path was missing or empty — the
443
+ # server itself silently falls back to the legacy single-file
444
+ # dashboard in that case (build_app / index()), so the operator saw
445
+ # a success message for what was actually a silent regression to the
446
+ # legacy UI. Share the exact predicate build_app's index() route uses
447
+ # (dist_has_bundle) so this message can never drift from what
448
+ # actually gets served (#2096: two surfaces answering the same
449
+ # question must call the same function).
450
+ if dist_has_bundle(dist_path):
451
+ click.echo(f" serving webapp bundle from {dist_path} (#1543)")
452
+ else:
453
+ click.echo(
454
+ f" warning: --dist {dist_path} has no index.html (missing "
455
+ "or empty directory) — falling back to the legacy "
456
+ "single-file dashboard, NOT the bundle you pointed at. "
457
+ "Check the path / the build hook that populates it "
458
+ "(#2003).",
459
+ err=True,
460
+ )
442
461
  if fixture is not None:
443
462
  click.echo(
444
463
  f" fixture mode: seeded board from {fixture_path} — reads are "
@@ -46,6 +46,22 @@ DASHBOARD_DIR = Path(__file__).parent
46
46
  # that existing behaviour (and the test suite) is completely unaffected.
47
47
  WEBAPP_DIST = DASHBOARD_DIR / "webapp" / "dist"
48
48
 
49
+
50
+ def dist_has_bundle(dist_path: Path) -> bool:
51
+ """Does ``dist_path`` contain a servable built webapp bundle?
52
+
53
+ This is the single definition of "valid bundle" for the dashboard: the
54
+ ``index()`` route below uses it to decide whether to serve the built
55
+ React app or fall back to the legacy single-file dashboard, and
56
+ ``coord web``'s CLI (coord/commands/lifecycle.py) uses it to decide
57
+ whether to print a success or warning message. Both call sites MUST
58
+ share this function rather than re-deriving the check, so the CLI's
59
+ message can never drift from what the server actually serves (#2003,
60
+ epic #2096).
61
+ """
62
+ return (dist_path / "index.html").exists()
63
+
64
+
49
65
  # How often (seconds) the background poller queries agent servers.
50
66
  _POLL_INTERVAL = 30.0
51
67
  # How long (seconds) an assignment must be running with no agent record before
@@ -698,7 +714,7 @@ def build_app(
698
714
  # Serve the built React webapp when available; fall back to the legacy
699
715
  # single-file dashboard so existing behaviour is entirely unchanged.
700
716
  spa_index = webapp_dist / "index.html"
701
- html = spa_index.read_text() if spa_index.exists() else (DASHBOARD_DIR / "index.html").read_text()
717
+ html = spa_index.read_text() if dist_has_bundle(webapp_dist) else (DASHBOARD_DIR / "index.html").read_text()
702
718
  return HTMLResponse(html)
703
719
 
704
720
  async def api_board(request: Request) -> JSONResponse:
@@ -0,0 +1,158 @@
1
+ # ADR: How a built `coord-web` bundle reaches the daemon host
2
+
3
+ **Status:** Accepted
4
+ **Date:** 2026-08-18
5
+ **Issue:** #2004 (UX-2, Phase 1 of milestone #62, epic #2002). Blocks UX-4
6
+ ("CI must know what it publishes") and UX-7.
7
+
8
+ ## Context
9
+
10
+ `coord/dashboard/webapp/**` is moving out of this repo into its own
11
+ `coord-web` repo. Today, before that split, the same question already has a
12
+ shipped answer: **[`docs/PHONE_WEBAPP.md`](PHONE_WEBAPP.md), "Going live
13
+ automatically (#1543)."** `deploy/coord-web-dist-build.timer` fires every 10
14
+ minutes (retuned from 1 minute by #2122; see that unit's header), fetches
15
+ `origin/main` read-only, builds it in a dedicated worktree
16
+ (`~/.coord-web-checkout`), health-checks the result on a scratch port before
17
+ ever publishing it (#1560), and atomically repoints `~/coord-web-dist` —
18
+ which `coord web --dist` serves — at the new release. A one-command rollback
19
+ (`coord-web-rollback.sh`) with a rollback-sentinel anti-flap guard exists for
20
+ the class of bug the health check can't see. `coord release verify` already
21
+ has a lane for it: `webapp_bundle` (#1834 lane 5), which grades the live
22
+ bundle's staleness against the `coord/dashboard/webapp/` source tree it
23
+ claims to be built from — deliberately *not* against `--expected`/PyPI,
24
+ because the bundle is versioned by `origin/main`'s SHA on its own continuous
25
+ publish timer, decoupled on purpose from the `~/.coord-venv` release
26
+ cadence. `webapp_build_heartbeat` (#2122) catches the timer going silently
27
+ dead, independent of whether there's unbuilt source to expose it.
28
+
29
+ The question #2004 poses is really: **once the thing that timer builds lives
30
+ in a different repo, does any of this change in kind, or only in which
31
+ repo(s) it points at?**
32
+
33
+ ## Decision
34
+
35
+ **Extend the existing mechanism to track `coord-web`'s `main`, instead of
36
+ `coord/dashboard/webapp/` inside this repo.** This is Option 1 from the
37
+ issue, and it is not a new lane so much as a redirection of a lane this
38
+ fleet already built, hardened, and has a release-verify check for.
39
+
40
+ Concretely, once the split lands:
41
+
42
+ - `coord-web-dist-build.sh`'s `BASE_CHECKOUT`/`WEBAPP_CHECKOUT` point at a
43
+ dedicated clone of `coord-web` (never the operator's own checkout, same
44
+ rule #1543 already enforces) instead of a worktree of this repo.
45
+ - The build step becomes `npm ci && npm run build` at `coord-web`'s repo
46
+ root instead of `coord/dashboard/webapp/`.
47
+ - The health-check-before-cutover, atomic symlink publish, rollback script,
48
+ and rollback-sentinel guard carry over **unchanged** — none of that logic
49
+ is specific to which repo it's building.
50
+ - `coord.health.checks.deploy_lane_facts.resolve_webapp_source_dir` (which
51
+ scans `ctx.checkouts` for a directory that looks like the webapp source)
52
+ gets pointed at a `coord-web` checkout's layout instead of
53
+ `<checkout>/coord/dashboard/webapp/src`. The `webapp_bundle` check's
54
+ *shape* — dist mtime vs. source mtime, WARN on staleness, never a version
55
+ comparison — does not change; only the path it looks under does.
56
+ - The PyPI-wheel-bundled fallback path (`coord/dashboard/webapp/dist`
57
+ vendored into `claude-coordinator`'s own release, #758) stays, unchanged
58
+ in role: it is the answer for `pip install code-coordinator` on a machine
59
+ with no `--dist` configured (fresh installs, CI, one-off dev boxes), not
60
+ the primary path to a running daemon host. This is Option 4, kept
61
+ deliberately as the fallback it already is today rather than promoted to
62
+ primary — see "Rejected alternatives" below for why it can't be primary
63
+ post-split.
64
+
65
+ ## Rejected alternatives
66
+
67
+ **Option 2 — GitHub release artifact (tarball per `coord-web` release).**
68
+ Versioned and auditable, but it reintroduces exactly the coupling #1543 was
69
+ built to remove: a webapp fix would sit merged-but-not-live until someone
70
+ cuts a release, and nothing today gives that step the ~10-minute, unattended
71
+ cadence the timer already provides. It would also need the health-check
72
+ gate and rollback machinery rebuilt around a fetch/verify/unpack step
73
+ instead of a `git fetch` + worktree build — real new surface for no
74
+ capability the current mechanism lacks. Revisit if `coord-web` ever needs a
75
+ public, pinned distribution channel independent of the daemon host (it
76
+ doesn't today).
77
+
78
+ **Option 3 — npm package.** Same coupling-to-publish-cadence problem as
79
+ Option 2, plus it adds a registry-auth and install-on-host step to a
80
+ deploy path that currently needs neither. No requirement in this issue
81
+ calls for the bundle to be consumable outside this fleet's own daemon host,
82
+ which is the only scenario where an npm package would earn its cost back.
83
+
84
+ **Option 4 — vendored at `claude-coordinator` release time, promoted to
85
+ primary.** Rejected as the *primary* path because it re-couples the two
86
+ repos' release cadences — the coupling the split (epic #2002) exists to
87
+ remove. A `coord/dashboard/webapp/**` merge would go live only on
88
+ `claude-coordinator`'s next PyPI release, not within ~10 minutes of merging.
89
+ Kept as the fallback, because that's a real, already-solved problem
90
+ (bootstrapping a `--dist`-less host, or a fresh install) distinct from
91
+ "how does a live daemon host stay current," and downgrading it doesn't cost
92
+ anything the fleet needs today.
93
+
94
+ **Why Option 1 is not "a fifth silent lane."** The issue's core objection —
95
+ this fleet already has four deploy lanes that go stale with no signal
96
+ (agent venv, `coord-serve`, local `cargo build`, `~/.coord-cli-venv`) — is
97
+ real, but those four go stale because going live requires an *operator* to
98
+ re-run an install step (`pip install --upgrade`, `cargo build`) and nothing
99
+ polls to catch it if they don't. The webapp-dist lane is structurally
100
+ different: it already has (a) an autonomous timer instead of an
101
+ operator-triggered pull, (b) a pre-cutover health check that refuses to
102
+ publish a broken build in the first place, (c) a heartbeat file
103
+ `coord health`/`coord release verify` already read to distinguish "up to
104
+ date" from "the trigger died silently," and (d) a release-verify lane
105
+ (`webapp_bundle`) already wired into the fleet health surface. Extending it
106
+ to a second repo carries all four properties across unchanged — it doesn't
107
+ have to invent them the way a from-scratch Option 2/3 pipeline would.
108
+
109
+ ## Staleness across the split is a different question than staleness today
110
+
111
+ Pre-split, `coord-web-dist-build.timer` and `~/.coord-venv` build off the
112
+ *same* repo, so "is the live bundle SHA an ancestor of what the daemon was
113
+ built from" is at least answerable in principle. Post-split, `coord-serve`
114
+ (from `claude-coordinator`, versioned by PyPI release) and the webapp bundle
115
+ (from `coord-web`, versioned by its own `main` SHA) are two independently
116
+ released artifacts with **no shared version number** — and per the
117
+ `webapp_bundle` design already in `release_verify.py`, that's intentional:
118
+ grading the bundle against `--expected`/PyPI would "manufacture permanent,
119
+ meaningless skew rather than report a real one." That reasoning holds even
120
+ harder once the source repos are different.
121
+
122
+ What that does *not* cover, and what genuinely is new here: a phone hitting
123
+ `http://dellserver:7434` can land on a `coord-web` bundle that expects an
124
+ API shape `coord-serve` hasn't shipped yet (or vice versa), because nothing
125
+ before this ADR pins a compatibility floor between the two repos'
126
+ independent cadences. This is a real risk the split introduces — it isn't
127
+ solved by choosing Option 1 over 2/3/4, and it isn't this ADR's job to
128
+ solve, but it should be named so UX-4/UX-7 pick it up rather than
129
+ rediscover it: the daemon already reports its own version
130
+ (`coord/dashboard/server.py`'s `version=__version__`); the cheapest fix is
131
+ likely a minimum-compatible-API marker the webapp checks against that value
132
+ at load and degrades visibly (banner, not a silent break) on mismatch,
133
+ rather than trying to keep the two repos' releases in lockstep.
134
+
135
+ Propagation lag itself (a phone briefly on a bundle one merge behind the
136
+ daemon, or vice versa) is not new and not a defect — it's the same ~10-minute
137
+ window the timer already runs at for the single-repo case (retuned from the
138
+ original 1-minute cadence #1543 documents; see #2122 and
139
+ `deploy/coord-web-dist-build.timer`'s header for why). It stays detectable
140
+ the same way: the release directory is named after the
141
+ `coord-web` SHA it was built from, and `webapp_build_heartbeat` proves the
142
+ timer is still alive.
143
+
144
+ ## Consequences
145
+
146
+ - `coord release verify`'s `webapp_bundle` lane keeps working post-split
147
+ with a path/repo-target change, not a redesign — satisfying this issue's
148
+ "whichever option wins should be assertable by it" requirement at close
149
+ to zero incremental cost.
150
+ - The daemon host needs a second dedicated checkout (`coord-web`, alongside
151
+ whatever `claude-coordinator` checkout it already keeps for other lanes)
152
+ and a second instance of the build-timer/rollback pairing pointed at it.
153
+ That's real setup work, tracked under UX-4/UX-7, not a design question.
154
+ - A `coord-web`↔`coord-serve` compatibility floor is an explicitly named
155
+ open follow-up, not solved here.
156
+ - Options 2 and 3 remain available to revisit if `coord-web` ever needs a
157
+ distribution channel independent of this fleet's own daemon host — no
158
+ requirement in scope today calls for that.
@@ -126,6 +126,12 @@ cd coord/dashboard/webapp && npm run build
126
126
 
127
127
  ---
128
128
 
129
+ > **Repo split (#2004):** `coord/dashboard/webapp/**` is moving to its own
130
+ > `coord-web` repo (epic #2002). The mechanism below is the answer for how a
131
+ > built bundle reaches this daemon host both before and after that move —
132
+ > see [`docs/ADR_COORD_WEB_DIST.md`](ADR_COORD_WEB_DIST.md) for the decision
133
+ > and the rejected alternatives.
134
+
129
135
  ## Going live automatically (#1543): merged main, not release cadence
130
136
 
131
137
  **On dellserver in production, a merged `coord/dashboard/webapp/**` change
@@ -11,7 +11,7 @@ import pytest
11
11
  from starlette.testclient import TestClient
12
12
 
13
13
  from coord.config import Config
14
- from coord.dashboard.server import build_app
14
+ from coord.dashboard.server import build_app, dist_has_bundle
15
15
  from coord.models import Assignment, Board, Machine, Proposal, Repo
16
16
  from coord.state import save_board
17
17
 
@@ -1559,6 +1559,151 @@ class TestCLI:
1559
1559
  )
1560
1560
  assert captured.get("dist_path") == Path("/tmp/some-dist-dir")
1561
1561
 
1562
+ @staticmethod
1563
+ def _config_file(tmp_path: Path) -> Path:
1564
+ config_file = tmp_path / "coordinator.yml"
1565
+ config_file.write_text(
1566
+ "repos:\n"
1567
+ " - name: api\n"
1568
+ " github: acme/api\n"
1569
+ " default_branch: main\n"
1570
+ "machines:\n"
1571
+ " - name: laptop\n"
1572
+ " host: laptop.tailnet\n"
1573
+ " repos: [api]\n"
1574
+ " repo_paths:\n"
1575
+ " api: /tmp/api\n"
1576
+ )
1577
+ return config_file
1578
+
1579
+ def test_web_dist_env_var_honored(self, tmp_path: Path, coord_db) -> None:
1580
+ """#2003: ``$COORD_WEB_DIST`` alone (no ``--dist`` flag) must thread
1581
+ through to ``build_app(dist_path=...)`` -- the env-var half of the
1582
+ seam a systemd unit / build-hook timer relies on, since it can't pass
1583
+ a CLI flag."""
1584
+ from click.testing import CliRunner
1585
+ from coord.cli import main
1586
+
1587
+ config_file = self._config_file(tmp_path)
1588
+ env_dist = tmp_path / "env-dist"
1589
+
1590
+ captured = {}
1591
+
1592
+ def _fake_build_app(config, *, token=None, session_attacher=None, fixture=None, dist_path=None):
1593
+ captured["dist_path"] = dist_path
1594
+ raise SystemExit(0)
1595
+
1596
+ runner = CliRunner()
1597
+ with patch("coord.dashboard.server.build_app", _fake_build_app):
1598
+ runner.invoke(
1599
+ main,
1600
+ ["web", "--config", str(config_file)],
1601
+ env={"COORD_WEB_DIST": str(env_dist)},
1602
+ catch_exceptions=True,
1603
+ )
1604
+ assert captured.get("dist_path") == env_dist
1605
+
1606
+ def test_web_dist_flag_overrides_env_var(self, tmp_path: Path, coord_db) -> None:
1607
+ """#2003: precedence when both are set -- ``--dist`` wins over
1608
+ ``$COORD_WEB_DIST`` (click's normal flag-over-envvar resolution,
1609
+ pinned here since this is the exact seam a misconfigured deploy
1610
+ would trip over silently)."""
1611
+ from click.testing import CliRunner
1612
+ from coord.cli import main
1613
+
1614
+ config_file = self._config_file(tmp_path)
1615
+ env_dist = tmp_path / "env-dist"
1616
+ flag_dist = tmp_path / "flag-dist"
1617
+
1618
+ captured = {}
1619
+
1620
+ def _fake_build_app(config, *, token=None, session_attacher=None, fixture=None, dist_path=None):
1621
+ captured["dist_path"] = dist_path
1622
+ raise SystemExit(0)
1623
+
1624
+ runner = CliRunner()
1625
+ with patch("coord.dashboard.server.build_app", _fake_build_app):
1626
+ runner.invoke(
1627
+ main,
1628
+ ["web", "--config", str(config_file), "--dist", str(flag_dist)],
1629
+ env={"COORD_WEB_DIST": str(env_dist)},
1630
+ catch_exceptions=True,
1631
+ )
1632
+ assert captured.get("dist_path") == flag_dist
1633
+ assert captured.get("dist_path") != env_dist
1634
+
1635
+ def test_web_dist_missing_prints_loud_warning(self, tmp_path: Path, coord_db) -> None:
1636
+ """#2003: the operationally important case -- ``--dist`` pointing at
1637
+ a directory that doesn't exist must print a clear warning, not the
1638
+ same success message a valid ``--dist`` gets. Before this fix `coord
1639
+ web` printed "serving webapp bundle from {path}" unconditionally,
1640
+ even though the server was silently falling back to the legacy
1641
+ single-file dashboard -- exactly the invisible regression #2003
1642
+ warns about."""
1643
+ from click.testing import CliRunner
1644
+ from coord.cli import main
1645
+
1646
+ config_file = self._config_file(tmp_path)
1647
+ missing_dist = tmp_path / "does-not-exist"
1648
+
1649
+ runner = CliRunner()
1650
+ # Let the real build_app run (cheap, no network); only bail out
1651
+ # before uvicorn.run would block forever serving the app.
1652
+ with patch("uvicorn.run", side_effect=SystemExit(0)):
1653
+ result = runner.invoke(
1654
+ main,
1655
+ ["web", "--config", str(config_file), "--dist", str(missing_dist)],
1656
+ catch_exceptions=True,
1657
+ )
1658
+ assert "warning" in result.output.lower()
1659
+ assert str(missing_dist) in result.output
1660
+ assert "legacy" in result.output.lower()
1661
+ assert f"serving webapp bundle from {missing_dist}" not in result.output
1662
+
1663
+ def test_web_dist_empty_dir_prints_loud_warning(self, tmp_path: Path, coord_db) -> None:
1664
+ """Same as above but the directory exists and is merely empty (no
1665
+ index.html) -- an interrupted/failed build, not a typo'd path."""
1666
+ from click.testing import CliRunner
1667
+ from coord.cli import main
1668
+
1669
+ config_file = self._config_file(tmp_path)
1670
+ empty_dist = tmp_path / "empty-dist"
1671
+ empty_dist.mkdir()
1672
+
1673
+ runner = CliRunner()
1674
+ with patch("uvicorn.run", side_effect=SystemExit(0)):
1675
+ result = runner.invoke(
1676
+ main,
1677
+ ["web", "--config", str(config_file), "--dist", str(empty_dist)],
1678
+ catch_exceptions=True,
1679
+ )
1680
+ assert "warning" in result.output.lower()
1681
+ assert f"serving webapp bundle from {empty_dist}" not in result.output
1682
+
1683
+ def test_web_dist_valid_prints_success_not_warning(self, tmp_path: Path, coord_db) -> None:
1684
+ """Contrast case: a valid ``--dist`` (real index.html present) keeps
1685
+ printing the plain success message with no warning noise."""
1686
+ from click.testing import CliRunner
1687
+ from coord.cli import main
1688
+
1689
+ config_file = self._config_file(tmp_path)
1690
+ valid_dist = tmp_path / "valid-dist"
1691
+ valid_dist.mkdir()
1692
+ (valid_dist / "index.html").write_text("<html></html>")
1693
+
1694
+ runner = CliRunner()
1695
+ with patch("uvicorn.run", side_effect=SystemExit(0)):
1696
+ result = runner.invoke(
1697
+ main,
1698
+ ["web", "--config", str(config_file), "--dist", str(valid_dist)],
1699
+ catch_exceptions=True,
1700
+ )
1701
+ assert f"serving webapp bundle from {valid_dist}" in result.output
1702
+ # No dist-related warning noise -- the unrelated "no bearer token"
1703
+ # warning is expected (no --token passed) and out of scope here.
1704
+ assert "no index.html" not in result.output.lower()
1705
+ assert "falling back to the legacy" not in result.output.lower()
1706
+
1562
1707
 
1563
1708
  class TestSSEEvents:
1564
1709
  """Tests for /events SSE endpoint (issue #214)."""
@@ -1804,3 +1949,69 @@ class TestDistPathOverride:
1804
1949
  r = client.get("/")
1805
1950
  assert r.status_code == 200
1806
1951
  assert "coord module default" in r.text
1952
+
1953
+ def test_dist_path_wins_over_bundled_webapp_dist(self, tmp_path: Path) -> None:
1954
+ """#2003: when BOTH the bundled ``coord/dashboard/webapp/dist`` and an
1955
+ explicit ``dist_path`` resolve to real bundles, the explicit override
1956
+ wins -- pinning the precedence a `coord-web-dist-build.sh` release
1957
+ depends on (it must not silently keep serving a stale packaged
1958
+ dist/ that happens to also exist in the venv)."""
1959
+ bundled = tmp_path / "bundled"
1960
+ bundled.mkdir()
1961
+ (bundled / "index.html").write_text("<html><title>stale bundled dist</title></html>")
1962
+
1963
+ override = self._make_dist(tmp_path, "<html><title>coord dist override</title></html>")
1964
+
1965
+ with patch("coord.dashboard.server.WEBAPP_DIST", bundled):
1966
+ client = TestClient(build_app(_config(), dist_path=override))
1967
+ r = client.get("/")
1968
+ assert r.status_code == 200
1969
+ assert "coord dist override" in r.text
1970
+ assert "stale bundled dist" not in r.text
1971
+
1972
+ def test_missing_dist_path_falls_back_to_legacy_dashboard(self, tmp_path: Path) -> None:
1973
+ """#2003: a ``--dist`` pointing at a directory that does not exist at
1974
+ all must not error or serve a stale bundle -- it falls back to the
1975
+ legacy single-file dashboard, same as the no-override default. This
1976
+ pins the HTTP-layer half of the fallback; ``TestCLI`` below pins that
1977
+ the CLI surfaces a loud warning for this case rather than the plain
1978
+ success message it prints for a valid ``--dist``."""
1979
+ missing = tmp_path / "does-not-exist"
1980
+ client = TestClient(build_app(_config(), dist_path=missing))
1981
+ r = client.get("/")
1982
+ assert r.status_code == 200
1983
+ assert "coord dashboard" in r.text
1984
+ assert "coord dist override" not in r.text
1985
+
1986
+ def test_empty_dist_path_directory_falls_back_to_legacy_dashboard(self, tmp_path: Path) -> None:
1987
+ """Same as above but the directory exists (e.g. an interrupted build
1988
+ left an empty dir) rather than being wholly absent -- both must fail
1989
+ the same way, not just the "doesn't exist" case."""
1990
+ empty = tmp_path / "empty-dist"
1991
+ empty.mkdir()
1992
+ client = TestClient(build_app(_config(), dist_path=empty))
1993
+ r = client.get("/")
1994
+ assert r.status_code == 200
1995
+ assert "coord dashboard" in r.text
1996
+
1997
+
1998
+ class TestDistHasBundle:
1999
+ """#2003 (epic #2096): `dist_has_bundle` is the ONE predicate both
2000
+ `index()` (this module) and `coord web`'s CLI (coord/commands/lifecycle.py)
2001
+ call to decide whether a dist directory has a servable bundle -- pinning
2002
+ it directly here guards against the two call sites drifting back apart
2003
+ into independent re-derivations of the same check."""
2004
+
2005
+ def test_true_when_index_html_present(self, tmp_path: Path) -> None:
2006
+ dist = tmp_path / "dist"
2007
+ dist.mkdir()
2008
+ (dist / "index.html").write_text("<html></html>")
2009
+ assert dist_has_bundle(dist) is True
2010
+
2011
+ def test_false_when_directory_missing(self, tmp_path: Path) -> None:
2012
+ assert dist_has_bundle(tmp_path / "does-not-exist") is False
2013
+
2014
+ def test_false_when_directory_empty(self, tmp_path: Path) -> None:
2015
+ empty = tmp_path / "empty"
2016
+ empty.mkdir()
2017
+ assert dist_has_bundle(empty) is False