code-coordinator 0.5.119__tar.gz → 0.5.121__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 (856) hide show
  1. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/code_coordinator.egg-info/SOURCES.txt +1 -0
  4. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/code_coordinator.egg-info/scm_file_list.json +1 -0
  5. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/acceptance.py +47 -1
  7. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/acceptance.py +10 -1
  8. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/portal.py +78 -5
  9. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/config.py +25 -0
  10. code_coordinator-0.5.121/coord/skills/portal-followup/SKILL.md +84 -0
  11. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_acceptance.py +45 -0
  12. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_portal.py +100 -0
  13. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_portal_config.py +20 -1
  14. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/.claude/commands/board.md +0 -0
  15. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/.claude/commands/complete-session.md +0 -0
  16. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/.claude/commands/coordinator.md +0 -0
  17. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/.githooks/_lib.sh +0 -0
  18. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/.githooks/post-checkout +0 -0
  19. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/.githooks/post-commit +0 -0
  20. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/.githooks/post-merge +0 -0
  21. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  22. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/.github/coord-ci-acceptance.yml +0 -0
  23. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/.github/workflows/auto-release.yml +0 -0
  24. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/.github/workflows/cargo-test.yml +0 -0
  25. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/.github/workflows/publish.yml +0 -0
  26. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/.github/workflows/release-tui.yml +0 -0
  27. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/.github/workflows/test.yml +0 -0
  28. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/.gitignore +0 -0
  29. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/CLAUDE.md +0 -0
  30. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/GOAL.md +0 -0
  31. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/LICENSE +0 -0
  32. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/MANIFEST.in +0 -0
  33. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/README.md +0 -0
  34. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/code_coordinator.egg-info/dependency_links.txt +0 -0
  35. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/code_coordinator.egg-info/entry_points.txt +0 -0
  36. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/code_coordinator.egg-info/requires.txt +0 -0
  37. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/code_coordinator.egg-info/top_level.txt +0 -0
  38. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/__init__.py +0 -0
  39. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/_board_mapping.py +0 -0
  40. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/acceptance_drivers.py +0 -0
  41. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/agent.py +0 -0
  42. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/agent_app.py +0 -0
  43. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/agent_update.py +0 -0
  44. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/agents/opencode/.gitignore +0 -0
  45. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/agents/opencode/agents/work.md +0 -0
  46. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/agents/opencode/routing.jsonc +0 -0
  47. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/audit.py +0 -0
  48. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/auto_loop.py +0 -0
  49. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/block_log.py +0 -0
  50. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/board_bool_guard.py +0 -0
  51. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/board_service.py +0 -0
  52. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/board_wire.py +0 -0
  53. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/brain.py +0 -0
  54. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/branch_model.py +0 -0
  55. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/bug_intake.py +0 -0
  56. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/cargo_cache.py +0 -0
  57. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/ci_github.py +0 -0
  58. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/ci_store.py +0 -0
  59. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/claim.py +0 -0
  60. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/cli.py +0 -0
  61. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/client.py +0 -0
  62. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/__init__.py +0 -0
  63. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/_common.py +0 -0
  64. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/agent_ops.py +0 -0
  65. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/audit.py +0 -0
  66. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/chat.py +0 -0
  67. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/dispatch.py +0 -0
  68. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/dispatch_workers.py +0 -0
  69. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/drive.py +0 -0
  70. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/drive_queue.py +0 -0
  71. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/gate_a.py +0 -0
  72. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/gates.py +0 -0
  73. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/issues.py +0 -0
  74. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/lifecycle.py +0 -0
  75. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/merge.py +0 -0
  76. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/milestone.py +0 -0
  77. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/plan_followup.py +0 -0
  78. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/plans.py +0 -0
  79. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/release.py +0 -0
  80. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/repo.py +0 -0
  81. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/report.py +0 -0
  82. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/review.py +0 -0
  83. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/scorecard.py +0 -0
  84. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/sessions.py +0 -0
  85. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/setup.py +0 -0
  86. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/status.py +0 -0
  87. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/terminal.py +0 -0
  88. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/test_gate.py +0 -0
  89. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/commands/tui.py +0 -0
  90. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/comments.py +0 -0
  91. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/config_reload.py +0 -0
  92. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/conflict_fix.py +0 -0
  93. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dao.py +0 -0
  94. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/__init__.py +0 -0
  95. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/fixture.py +0 -0
  96. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/index.html +0 -0
  97. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/server.py +0 -0
  98. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/terminal.py +0 -0
  99. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/.gitignore +0 -0
  100. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/components.json +0 -0
  101. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/dist/assets/Gallery-BoKs3mpY.js +0 -0
  102. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  103. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/dist/assets/Terminal-CEsP08iX.js +0 -0
  104. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/dist/assets/index-CDHPlB6k.js +0 -0
  105. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  106. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  107. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  108. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  109. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  110. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/dist/index.html +0 -0
  111. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  112. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/dist/sw.js +0 -0
  113. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  114. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  115. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  116. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  117. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  118. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  119. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  120. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  121. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  122. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  123. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/eslint.config.js +0 -0
  124. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/index.html +0 -0
  125. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  126. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/package-lock.json +0 -0
  127. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/package.json +0 -0
  128. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  129. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/playwright.config.ts +0 -0
  130. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/postcss.config.js +0 -0
  131. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  132. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  133. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  134. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/App.tsx +0 -0
  135. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/api/client.ts +0 -0
  136. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  137. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  138. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  139. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  140. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  141. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  142. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  143. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  144. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  145. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  146. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  147. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  148. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  149. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  150. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  151. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  152. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  153. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  154. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  155. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  156. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  157. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  158. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  159. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  160. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  161. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  162. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  163. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  164. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  165. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  166. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  167. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  168. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  169. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  170. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  171. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/index.css +0 -0
  172. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  173. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  174. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/main.tsx +0 -0
  175. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  176. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  177. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  178. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  179. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  180. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  181. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  182. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  183. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  184. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  185. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  186. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  187. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  188. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  189. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  190. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  191. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  192. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  193. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  194. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  195. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  196. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  197. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  198. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/tailwind.config.js +0 -0
  199. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/tsconfig.json +0 -0
  200. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  201. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dashboard/webapp/vite.config.ts +0 -0
  202. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/db.py +0 -0
  203. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dead_end.py +0 -0
  204. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/README.md +0 -0
  205. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-agent.service +0 -0
  206. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-db-backup.service +0 -0
  207. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-db-backup.sh +0 -0
  208. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-db-backup.timer +0 -0
  209. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-drive-queue.service +0 -0
  210. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-drive-queue.timer +0 -0
  211. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-notify.service +0 -0
  212. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-notify.timer +0 -0
  213. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-release-propagate.service +0 -0
  214. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-release-propagate.timer +0 -0
  215. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-release-window.service +0 -0
  216. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-release-window.timer +0 -0
  217. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-serve.service +0 -0
  218. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-web-dist-build.service +0 -0
  219. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-web-dist-build.timer +0 -0
  220. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy/coord-web.service +0 -0
  221. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy_manifest.py +0 -0
  222. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deploy_units.py +0 -0
  223. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/deps.py +0 -0
  224. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/diagnose.py +0 -0
  225. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dispatch.py +0 -0
  226. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/dist_name.py +0 -0
  227. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/drive.py +0 -0
  228. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/drive_queue.py +0 -0
  229. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/drive_state.py +0 -0
  230. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/events.py +0 -0
  231. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/failure_class.py +0 -0
  232. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/filelock.py +0 -0
  233. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/fleet_config_health.py +0 -0
  234. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/freshness.py +0 -0
  235. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/gate_a.py +0 -0
  236. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/gate_b.py +0 -0
  237. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/gate_snapshot.py +0 -0
  238. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/gates.py +0 -0
  239. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/github_ops.py +0 -0
  240. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/goal.py +0 -0
  241. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/graph_health.py +0 -0
  242. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/__init__.py +0 -0
  243. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/aggregate.py +0 -0
  244. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/__init__.py +0 -0
  245. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/agent_install.py +0 -0
  246. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/cargo_targets.py +0 -0
  247. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/claude_binary.py +0 -0
  248. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/deploy_lane_facts.py +0 -0
  249. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/disk.py +0 -0
  250. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/fleet_board.py +0 -0
  251. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  252. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/fleet_phantom.py +0 -0
  253. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/fleet_unit_drift.py +0 -0
  254. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/graph.py +0 -0
  255. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/graphify_cli.py +0 -0
  256. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/index_lock.py +0 -0
  257. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/plan_usage.py +0 -0
  258. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/repo_state.py +0 -0
  259. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/spawned_coord.py +0 -0
  260. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/timer_active.py +0 -0
  261. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/toolchain.py +0 -0
  262. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/unit_drift.py +0 -0
  263. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/unit_enablement.py +0 -0
  264. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/checks/worktrees.py +0 -0
  265. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/cli.py +0 -0
  266. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/context.py +0 -0
  267. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/fleet_snapshot.py +0 -0
  268. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/models.py +0 -0
  269. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/pypi.py +0 -0
  270. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/registry.py +0 -0
  271. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/render.py +0 -0
  272. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/health/units.py +0 -0
  273. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/hooks.py +0 -0
  274. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/housekeeping.py +0 -0
  275. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/interactive.py +0 -0
  276. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/issue_store.py +0 -0
  277. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/liveness_auditor.py +0 -0
  278. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/machine_pause.py +0 -0
  279. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/merge_queue.py +0 -0
  280. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/milestone_chat.py +0 -0
  281. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/milestone_dispatch.py +0 -0
  282. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/milestone_gate.py +0 -0
  283. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/milestone_order.py +0 -0
  284. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/mock_author.py +0 -0
  285. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/models.py +0 -0
  286. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/network.py +0 -0
  287. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/new_issue_chat.py +0 -0
  288. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/notifier/__init__.py +0 -0
  289. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/notifier/baseline.py +0 -0
  290. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/notifier/cli.py +0 -0
  291. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/notifier/collect.py +0 -0
  292. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/notifier/digest.py +0 -0
  293. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/notifier/models.py +0 -0
  294. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/notifier/predicate.py +0 -0
  295. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/notifier/service.py +0 -0
  296. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/notifier/store.py +0 -0
  297. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/notifier/transport.py +0 -0
  298. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/notify.py +0 -0
  299. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/openapi.py +0 -0
  300. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/overlap_fence.py +0 -0
  301. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/overlap_predict.py +0 -0
  302. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/parentage.py +0 -0
  303. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/parentage_github.py +0 -0
  304. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/pipeline.py +0 -0
  305. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/plan_parser.py +0 -0
  306. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/plans.py +0 -0
  307. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/platform_paths.py +0 -0
  308. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/portal_bridge.py +0 -0
  309. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/portal_store.py +0 -0
  310. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/portal_sync.py +0 -0
  311. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/pr_body_lint.py +0 -0
  312. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/prereqs.py +0 -0
  313. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/progress.py +0 -0
  314. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/providers/__init__.py +0 -0
  315. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/providers/base.py +0 -0
  316. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/providers/claude.py +0 -0
  317. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/providers/claude_pty.py +0 -0
  318. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/providers/opencode.py +0 -0
  319. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/queue_diagnose.py +0 -0
  320. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/reconcile.py +0 -0
  321. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/refine_chat.py +0 -0
  322. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/release_cordon.py +0 -0
  323. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/release_propagate.py +0 -0
  324. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/release_verify.py +0 -0
  325. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/release_window.py +0 -0
  326. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/repo_edit.py +0 -0
  327. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/repo_onboard.py +0 -0
  328. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/reports.py +0 -0
  329. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/revalidate.py +0 -0
  330. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/review.py +0 -0
  331. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/scorecard.py +0 -0
  332. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/serve_app.py +0 -0
  333. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/skills/update-issue/SKILL.md +0 -0
  334. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/smoke.py +0 -0
  335. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/spend_ceiling.py +0 -0
  336. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/split_work.py +0 -0
  337. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/stage_projection.py +0 -0
  338. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/state.py +0 -0
  339. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/test_author.py +0 -0
  340. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/test_chat.py +0 -0
  341. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/test_orchestrator.py +0 -0
  342. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/test_report.py +0 -0
  343. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/tui_release.py +0 -0
  344. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/usage.py +0 -0
  345. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/usage_limits.py +0 -0
  346. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/usage_rollup.py +0 -0
  347. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coord/worker_events.py +0 -0
  348. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/coordinator.example.yml +0 -0
  349. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-agent.service +0 -0
  350. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-db-backup.service +0 -0
  351. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-db-backup.sh +0 -0
  352. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-db-backup.timer +0 -0
  353. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-drive-queue.service +0 -0
  354. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-drive-queue.timer +0 -0
  355. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-notify.service +0 -0
  356. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-notify.timer +0 -0
  357. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-release-propagate.service +0 -0
  358. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-release-propagate.timer +0 -0
  359. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-release-window.service +0 -0
  360. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-release-window.timer +0 -0
  361. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-serve.service +0 -0
  362. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-web-dist-build.service +0 -0
  363. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-web-dist-build.sh +0 -0
  364. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-web-dist-build.timer +0 -0
  365. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-web-rollback.sh +0 -0
  366. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/coord-web.service +0 -0
  367. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/deploy/node-shim.sh +0 -0
  368. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/AGENT_OPERATIONS.md +0 -0
  369. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/ARCHITECTURE.md +0 -0
  370. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/ARCH_SECURITY_GATES.md +0 -0
  371. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/COCKPIT.md +0 -0
  372. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/CONTROL_CENTER.md +0 -0
  373. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/COST_DISCIPLINE.md +0 -0
  374. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/CROSS_PLATFORM.md +0 -0
  375. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/CUSTOMER_PORTAL.md +0 -0
  376. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/DRIVE_QUEUE.md +0 -0
  377. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/EPHEMERAL_WORKERS.md +0 -0
  378. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/FORGE_MIGRATION.md +0 -0
  379. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/GRAPHIFY_SETUP.md +0 -0
  380. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/ISSUE_GUIDANCE.md +0 -0
  381. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/MAC_MINI.md +0 -0
  382. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  383. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/NOTIFIER.md +0 -0
  384. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/OPENCODE_VERIFICATION.md +0 -0
  385. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/OPERATING_GOTCHAS.md +0 -0
  386. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/ORACLE_LOOP.md +0 -0
  387. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/PHONE_WEBAPP.md +0 -0
  388. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/PIPELINE_V2.md +0 -0
  389. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/PLATFORM_EVOLUTION.md +0 -0
  390. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/SECOND_BACKEND.md +0 -0
  391. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/STORE_SERVICE.md +0 -0
  392. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  393. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/WEB_CONTROL_CENTER.md +0 -0
  394. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/mocks/web/README.md +0 -0
  395. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/mocks/web/_tokens.css +0 -0
  396. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/mocks/web/issue-detail.html +0 -0
  397. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/mocks/web/pipeline-narrow.html +0 -0
  398. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/docs/mocks/web/pipeline-wide.html +0 -0
  399. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/graphify-out/.gitignore +0 -0
  400. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/install-agent.sh +0 -0
  401. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/pyproject.toml +0 -0
  402. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/audit_review_verdict_overrides.py +0 -0
  403. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  404. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/azure-workers/build-worker-image.sh +0 -0
  405. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/azure-workers/coordinator-machine.py +0 -0
  406. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/azure-workers/epic-down.sh +0 -0
  407. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/azure-workers/epic-up.sh +0 -0
  408. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/azure-workers/preflight.sh +0 -0
  409. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/azure-workers/provision-worker.sh +0 -0
  410. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  411. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  412. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/azure-workers/verify-github-token.sh +0 -0
  413. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/codegen.py +0 -0
  414. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/coord-test-runner.sh +0 -0
  415. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/drive-batch.sh +0 -0
  416. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/gen_board_fixture.py +0 -0
  417. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/next_release_tag.py +0 -0
  418. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/run_tests_in_populated_home.sh +0 -0
  419. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/run_tests_without_gh.sh +0 -0
  420. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/smoke_437_interactive.py +0 -0
  421. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/verify_878_review_capture.py +0 -0
  422. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/verify_release_published.py +0 -0
  423. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/scripts/verify_release_wheel.py +0 -0
  424. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/setup.cfg +0 -0
  425. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/SMOKE_SET.md +0 -0
  426. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/__init__.py +0 -0
  427. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  428. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-33/contract.md +0 -0
  429. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-33/manifest.yml +0 -0
  430. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  431. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  432. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  433. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  434. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-37/conftest.py +0 -0
  435. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-37/contract.md +0 -0
  436. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-37/manifest.yml +0 -0
  437. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  438. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  439. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-38/contract.md +0 -0
  440. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-38/manifest.yml +0 -0
  441. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  442. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  443. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  444. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  445. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  446. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  447. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  448. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  449. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  450. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  451. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-51/contract.md +0 -0
  452. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  453. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  454. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-51/manifest.yml +0 -0
  455. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  456. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-51/tsconfig.json +0 -0
  457. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-65/contract.md +0 -0
  458. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  459. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  460. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  461. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  462. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  463. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  464. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  465. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  466. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  467. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/conftest.py +0 -0
  468. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/board-pipeline-basic.json +0 -0
  469. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  470. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  471. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  472. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  473. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/playwright/all_pass.json +0 -0
  474. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  475. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/playwright/mixed_fail.json +0 -0
  476. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  477. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  478. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/playwright/skip.json +0 -0
  479. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/playwright/truncated.json +0 -0
  480. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  481. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  482. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  483. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  484. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  485. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  486. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  487. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  488. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_acceptance_drivers.py +0 -0
  489. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent.py +0 -0
  490. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_api_error.py +0 -0
  491. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_app.py +0 -0
  492. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_branch_base.py +0 -0
  493. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_branch_capture.py +0 -0
  494. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_config_free_1712.py +0 -0
  495. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_deploy_units_endpoint.py +0 -0
  496. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_dirty_worktree.py +0 -0
  497. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_graph_self_heal.py +0 -0
  498. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_health_h3.py +0 -0
  499. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_idle_restart.py +0 -0
  500. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_push_failure.py +0 -0
  501. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_reap.py +0 -0
  502. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_repos_and_pull.py +0 -0
  503. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_restart_services_endpoint.py +0 -0
  504. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_startup_diagnostics.py +0 -0
  505. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_update.py +0 -0
  506. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_update_bluegreen.py +0 -0
  507. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_usage_limit.py +0 -0
  508. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_agent_zero_commit.py +0 -0
  509. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_ambient_home_isolation.py +0 -0
  510. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_approve_reject_plan.py +0 -0
  511. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_approve_usage_gate.py +0 -0
  512. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_assignment_already_recorded_daemon.py +0 -0
  513. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_audit_log.py +0 -0
  514. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_audit_outcome.py +0 -0
  515. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_audit_query.py +0 -0
  516. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_auto_loop.py +0 -0
  517. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_auto_release_publish_2035.py +0 -0
  518. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_base_checkout_restore.py +0 -0
  519. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_block_log.py +0 -0
  520. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_board_cap_762.py +0 -0
  521. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_board_fixture.py +0 -0
  522. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_board_read_path.py +0 -0
  523. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_board_service.py +0 -0
  524. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_board_state.py +0 -0
  525. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_board_wire.py +0 -0
  526. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_brain.py +0 -0
  527. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_branch_model.py +0 -0
  528. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_bug_intake.py +0 -0
  529. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_build_worker_image_env_update.py +0 -0
  530. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cargo_cache.py +0 -0
  531. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_ci_acceptance_gate_1950.py +0 -0
  532. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_ci_parity_2091.py +0 -0
  533. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_ci_store.py +0 -0
  534. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_claim.py +0 -0
  535. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_acceptance.py +0 -0
  536. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_assign.py +0 -0
  537. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  538. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_assign_interactive_remote.py +0 -0
  539. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_assign_provider.py +0 -0
  540. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  541. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_audit.py +0 -0
  542. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_chat_continue.py +0 -0
  543. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_diagnose_config_provenance.py +0 -0
  544. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_diagnose_graph.py +0 -0
  545. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_doctor.py +0 -0
  546. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_doctor_config_free_1801.py +0 -0
  547. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  548. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_drive.py +0 -0
  549. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_drive_queue.py +0 -0
  550. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_escalate.py +0 -0
  551. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_fix_headless_review.py +0 -0
  552. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_gate_a.py +0 -0
  553. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_install_drift.py +0 -0
  554. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_install_skills.py +0 -0
  555. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_issue_create_label.py +0 -0
  556. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_issue_reopen.py +0 -0
  557. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_merge.py +0 -0
  558. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_milestone_assign.py +0 -0
  559. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_milestone_capture.py +0 -0
  560. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_milestone_chat_add_child.py +0 -0
  561. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_milestone_dispatch.py +0 -0
  562. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_milestone_gate_b.py +0 -0
  563. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_milestone_gate_c.py +0 -0
  564. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_milestone_order.py +0 -0
  565. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  566. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_milestone_ship.py +0 -0
  567. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_network.py +0 -0
  568. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_new_issue_chat.py +0 -0
  569. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_plans.py +0 -0
  570. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_pull_artifact.py +0 -0
  571. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_queue.py +0 -0
  572. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_reattach_sessions.py +0 -0
  573. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_refine_board.py +0 -0
  574. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_release_preflight.py +0 -0
  575. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_release_propagate.py +0 -0
  576. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_release_window.py +0 -0
  577. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_repo_2220.py +0 -0
  578. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_scorecard.py +0 -0
  579. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_set_review_findings.py +0 -0
  580. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_status_advisory_terminal.py +0 -0
  581. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_status_merge_queue.py +0 -0
  582. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_status_provider.py +0 -0
  583. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_status_review_finalizing.py +0 -0
  584. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_status_test_failed_tag.py +0 -0
  585. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_status_usage_limit.py +0 -0
  586. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_sync_comments_873.py +0 -0
  587. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_test_plan.py +0 -0
  588. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_track.py +0 -0
  589. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_tui_update.py +0 -0
  590. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cli_wait.py +0 -0
  591. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_client_base_install.py +0 -0
  592. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_comments.py +0 -0
  593. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_completion_summary.py +0 -0
  594. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_config.py +0 -0
  595. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_config_acceptance.py +0 -0
  596. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_config_audit.py +0 -0
  597. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_config_pricing.py +0 -0
  598. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  599. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_config_usage_gate.py +0 -0
  600. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_conflict_fix.py +0 -0
  601. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_conflict_fix_semantic.py +0 -0
  602. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_coord_test.py +0 -0
  603. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_coord_test_runner_baseline.py +0 -0
  604. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_coord_test_runner_routing.py +0 -0
  605. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_coord_test_runner_toolchain.py +0 -0
  606. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_coord_web_sse_restart_live.py +0 -0
  607. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_coordinator_machine.py +0 -0
  608. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_cross_platform_imports.py +0 -0
  609. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_dashboard.py +0 -0
  610. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_dashboard_fixture.py +0 -0
  611. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_dashboard_terminal.py +0 -0
  612. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_dashboard_terminal_live.py +0 -0
  613. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_db.py +0 -0
  614. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_dead_end.py +0 -0
  615. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_deploy_coord_db_backup.py +0 -0
  616. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_deploy_coord_web_dist.py +0 -0
  617. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_deploy_coord_web_rollback.py +0 -0
  618. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_deploy_drive_queue_unit.py +0 -0
  619. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_deploy_manifest.py +0 -0
  620. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_deploy_units_lane.py +0 -0
  621. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_deploy_web_unit.py +0 -0
  622. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_deps.py +0 -0
  623. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_diagnose.py +0 -0
  624. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_dispatch.py +0 -0
  625. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_dispatch_target_validation.py +0 -0
  626. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_dist_name.py +0 -0
  627. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_done_housekeeping.py +0 -0
  628. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_drive.py +0 -0
  629. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_drive_queue.py +0 -0
  630. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_drive_state.py +0 -0
  631. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_drive_tmux.py +0 -0
  632. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_epic_up_capability_detection.py +0 -0
  633. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  634. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_epic_up_image_provenance.py +0 -0
  635. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_errors.py +0 -0
  636. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_events.py +0 -0
  637. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_failure_class.py +0 -0
  638. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_filelock.py +0 -0
  639. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  640. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_fix_of_force_override.py +0 -0
  641. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_fleet_config_health.py +0 -0
  642. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_fleet_health_probes.py +0 -0
  643. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_fleet_health_snapshot.py +0 -0
  644. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_freshness.py +0 -0
  645. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_gate_a.py +0 -0
  646. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_gate_b.py +0 -0
  647. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_gate_snapshot_staleness.py +0 -0
  648. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_gates.py +0 -0
  649. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  650. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_generated_types_fixture.py +0 -0
  651. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_github_ops.py +0 -0
  652. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_goal.py +0 -0
  653. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_graph_health.py +0 -0
  654. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_graph_selfheal_absent_2237.py +0 -0
  655. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_handoff.py +0 -0
  656. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_health_checks.py +0 -0
  657. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_health_cli.py +0 -0
  658. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_health_cli_graph.py +0 -0
  659. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_health_config.py +0 -0
  660. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_health_context.py +0 -0
  661. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_health_deploy_lane_facts.py +0 -0
  662. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_health_incident_regression.py +0 -0
  663. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_health_pypi.py +0 -0
  664. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_health_registry.py +0 -0
  665. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_health_timer_active.py +0 -0
  666. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_health_toolchain.py +0 -0
  667. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_health_unit_drift.py +0 -0
  668. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_health_unit_enablement.py +0 -0
  669. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_hooks.py +0 -0
  670. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_human_attended_437.py +0 -0
  671. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_init.py +0 -0
  672. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_integration.py +0 -0
  673. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_interactive_briefing_echo.py +0 -0
  674. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_interactive_prefill_state.py +0 -0
  675. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_interactive_session_relaunch.py +0 -0
  676. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_interactive_test_verdict_backstop.py +0 -0
  677. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_interactive_token_attribution.py +0 -0
  678. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_interactive_worktree.py +0 -0
  679. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_issue_store_seam.py +0 -0
  680. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_liveness_auditor.py +0 -0
  681. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_liveness_notify.py +0 -0
  682. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_machine_pause.py +0 -0
  683. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_merge_queue.py +0 -0
  684. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_merge_verify.py +0 -0
  685. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_milestone_chat.py +0 -0
  686. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_milestone_dispatch.py +0 -0
  687. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_milestone_gate.py +0 -0
  688. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_milestone_order.py +0 -0
  689. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_milestone_seam.py +0 -0
  690. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_mock_author.py +0 -0
  691. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_model_tiering.py +0 -0
  692. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_models.py +0 -0
  693. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_models_config_labels.py +0 -0
  694. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_needs_attention.py +0 -0
  695. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_network.py +0 -0
  696. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_new_issue_chat.py +0 -0
  697. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_next_release_tag.py +0 -0
  698. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_no_direct_gh_calls.py +0 -0
  699. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_node_shim.py +0 -0
  700. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_notifier_baseline.py +0 -0
  701. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_notifier_cli.py +0 -0
  702. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_notifier_collect.py +0 -0
  703. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_notifier_config.py +0 -0
  704. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_notifier_drive_seam.py +0 -0
  705. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_notifier_isolation.py +0 -0
  706. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_notifier_predicate.py +0 -0
  707. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_notifier_quiet_hours.py +0 -0
  708. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_notifier_service.py +0 -0
  709. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_notify.py +0 -0
  710. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_notify_drain.py +0 -0
  711. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_openapi.py +0 -0
  712. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_operational_defaults.py +0 -0
  713. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_overlap_fence.py +0 -0
  714. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_overlap_predict.py +0 -0
  715. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_packaged_deploy_units.py +0 -0
  716. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_parentage.py +0 -0
  717. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_paste_landed.py +0 -0
  718. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_pipeline.py +0 -0
  719. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_plan_followup_approve_plan_command.py +0 -0
  720. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_plan_followup_pr_command.py +0 -0
  721. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_plan_followup_review_command.py +0 -0
  722. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_plan_only.py +0 -0
  723. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_plan_parser.py +0 -0
  724. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_platform_paths.py +0 -0
  725. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_portal_bridge.py +0 -0
  726. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_portal_sync.py +0 -0
  727. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_pr_body_lint.py +0 -0
  728. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_prereqs.py +0 -0
  729. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_production_db_guard.py +0 -0
  730. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_progress.py +0 -0
  731. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_provider_seam.py +0 -0
  732. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_providers.py +0 -0
  733. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_providers_config_labels.py +0 -0
  734. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_providers_pty.py +0 -0
  735. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_quiet_hours.py +0 -0
  736. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_quiet_hours_store_2146.py +0 -0
  737. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_reap_merged_sessions.py +0 -0
  738. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_reap_stale_interactive_tick.py +0 -0
  739. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_reconcile.py +0 -0
  740. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_reconcile_branch.py +0 -0
  741. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_reconcile_completions.py +0 -0
  742. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_reconcile_merges.py +0 -0
  743. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_reconcile_no_agent_record.py +0 -0
  744. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_reconcile_usage_limit_done.py +0 -0
  745. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_refine_chat.py +0 -0
  746. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_release_cordon_2101.py +0 -0
  747. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  748. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_release_cordon_deadlock_2240.py +0 -0
  749. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_release_propagate.py +0 -0
  750. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_release_unified_1242.py +0 -0
  751. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_release_verify.py +0 -0
  752. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_release_window.py +0 -0
  753. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_remote_auto_prune.py +0 -0
  754. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_remote_interactive_reaper.py +0 -0
  755. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_repo_edit_2220.py +0 -0
  756. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_repo_graph_fleet_2237.py +0 -0
  757. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_repo_onboard_2220.py +0 -0
  758. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_report_result_push.py +0 -0
  759. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_reports.py +0 -0
  760. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_retry.py +0 -0
  761. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_retry_advisory_1606.py +0 -0
  762. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_retry_type_1636.py +0 -0
  763. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_revalidate.py +0 -0
  764. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_review.py +0 -0
  765. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_review_end_review_without_verdict.py +0 -0
  766. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_review_parse_failure_diagnostic.py +0 -0
  767. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_review_reaffirm.py +0 -0
  768. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_review_state.py +0 -0
  769. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_review_verdict_backstop.py +0 -0
  770. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_review_verdict_override_audit.py +0 -0
  771. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_review_verdict_relay.py +0 -0
  772. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_review_zero_commits.py +0 -0
  773. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_scoped_review_wiring.py +0 -0
  774. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_scorecard.py +0 -0
  775. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_serve.py +0 -0
  776. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_serve_app_board_trim.py +0 -0
  777. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_session.py +0 -0
  778. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_slice_issue_attribution.py +0 -0
  779. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_smoke.py +0 -0
  780. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_smoke_live_checkout_restore.py +0 -0
  781. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_smoke_workflow.py +0 -0
  782. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_spend_ceiling.py +0 -0
  783. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_spend_ceiling_coordinator.py +0 -0
  784. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_split.py +0 -0
  785. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_split_work.py +0 -0
  786. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_stage_projection.py +0 -0
  787. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_stalled_pipeline.py +0 -0
  788. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_state.py +0 -0
  789. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_state_review_findings_daemon.py +0 -0
  790. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_status_fleet_footer.py +0 -0
  791. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_stop_1567.py +0 -0
  792. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_stuck.py +0 -0
  793. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_terminal_command.py +0 -0
  794. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_test_author.py +0 -0
  795. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_test_chat.py +0 -0
  796. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_test_orchestrator.py +0 -0
  797. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_test_report.py +0 -0
  798. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_test_verdict_parsing.py +0 -0
  799. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_test_verdict_transcript_floor.py +0 -0
  800. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_thin_client_board_audit.py +0 -0
  801. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_thin_client_config_load_1080.py +0 -0
  802. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_thin_client_daemon_routing_906.py +0 -0
  803. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_tmux_host.py +0 -0
  804. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_tmux_session.py +0 -0
  805. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_transcript_floor.py +0 -0
  806. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_usage.py +0 -0
  807. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_usage_limits.py +0 -0
  808. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_usage_rollup.py +0 -0
  809. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_venv_live_install_2121.py +0 -0
  810. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_version_single_source.py +0 -0
  811. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_watch.py +0 -0
  812. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  813. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_worker_events.py +0 -0
  814. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_worker_image_pin_sync.py +0 -0
  815. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_worker_safety.py +0 -0
  816. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_worker_test_scoping.py +0 -0
  817. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_worktree.py +0 -0
  818. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  819. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/Cargo.lock +0 -0
  820. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/Cargo.toml +0 -0
  821. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/cargo-config-local-quadraui.toml.example +0 -0
  822. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/audit.rs +0 -0
  823. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/chat.rs +0 -0
  824. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/data.rs +0 -0
  825. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/dialogs.rs +0 -0
  826. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/drive.rs +0 -0
  827. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/drive_queue.rs +0 -0
  828. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/escalation.rs +0 -0
  829. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/events.rs +0 -0
  830. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/fixtures.rs +0 -0
  831. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/fleet_health.rs +0 -0
  832. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/fleet_sessions.rs +0 -0
  833. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/fleet_terminals.rs +0 -0
  834. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/format.rs +0 -0
  835. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/milestone_dag.rs +0 -0
  836. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/mod.rs +0 -0
  837. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/msv.rs +0 -0
  838. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/pipeline.rs +0 -0
  839. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/plans.rs +0 -0
  840. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/render.rs +0 -0
  841. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/reports.rs +0 -0
  842. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/sessions.rs +0 -0
  843. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/settings_ui.rs +0 -0
  844. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/sidebar.rs +0 -0
  845. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/terminal.rs +0 -0
  846. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/tests.rs +0 -0
  847. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/types.rs +0 -0
  848. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/app/workspace.rs +0 -0
  849. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/bin/gtk.rs +0 -0
  850. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/commands.rs +0 -0
  851. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/lib.rs +0 -0
  852. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/main.rs +0 -0
  853. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/src/settings.rs +0 -0
  854. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/tests/acceptance.rs +0 -0
  855. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/tui/tests/cli.rs +0 -0
  856. {code_coordinator-0.5.119 → code_coordinator-0.5.121}/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.119
3
+ Version: 0.5.121
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.119
3
+ Version: 0.5.121
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
@@ -342,6 +342,7 @@ coord/providers/base.py
342
342
  coord/providers/claude.py
343
343
  coord/providers/claude_pty.py
344
344
  coord/providers/opencode.py
345
+ coord/skills/portal-followup/SKILL.md
345
346
  coord/skills/update-issue/SKILL.md
346
347
  deploy/coord-agent.service
347
348
  deploy/coord-db-backup.service
@@ -305,6 +305,7 @@
305
305
  "coord/review.py",
306
306
  "coord/scorecard.py",
307
307
  "coord/serve_app.py",
308
+ "coord/skills/portal-followup/SKILL.md",
308
309
  "coord/skills/update-issue/SKILL.md",
309
310
  "coord/smoke.py",
310
311
  "coord/spend_ceiling.py",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.119",
2
+ "tag": "0.5.121",
3
3
  "distance": 0,
4
- "node": "gb23236717c72c8a9be1338d9e8084ff44e2ae589",
4
+ "node": "gfcdd7f8f7839bc92680284bc0e829ec126748357",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-17"
@@ -361,7 +361,34 @@ def load_manifest(acceptance_root: Path) -> dict[str, int]:
361
361
  return mapping
362
362
 
363
363
 
364
- def load_expected_red(acceptance_root: Path) -> dict[str, int]:
364
+ def _driver_kind_for_manifest_dir(ms_dir: Path) -> str | None:
365
+ """Best-effort LOCAL driver-kind lookup for one ``ms-NN``/``issue-NN``
366
+ acceptance directory, via its ``mocks/`` file extensions
367
+ (:data:`MOCK_EXT_TO_DRIVER_KIND`) — the filesystem counterpart of
368
+ :func:`resolve_for_path`'s GitHub-backed lookup, for callers that
369
+ already have a local checkout and don't want a network round trip.
370
+
371
+ Returns ``None`` (unknown) rather than guessing when ``mocks/`` is
372
+ absent, empty, or its files imply more than one kind — callers MUST
373
+ treat ``None`` as "don't exclude", never as "safe to skip": this feeds
374
+ a hard-failure check (:func:`load_expected_red`), and silently
375
+ dropping a manifest because its kind couldn't be determined would hide
376
+ the exact class of bug that check exists to catch.
377
+ """
378
+ mocks_dir = ms_dir / "mocks"
379
+ if not mocks_dir.is_dir():
380
+ return None
381
+ kinds = {
382
+ MOCK_EXT_TO_DRIVER_KIND[p.suffix]
383
+ for p in mocks_dir.iterdir()
384
+ if p.suffix in MOCK_EXT_TO_DRIVER_KIND
385
+ }
386
+ return next(iter(kinds)) if len(kinds) == 1 else None
387
+
388
+
389
+ def load_expected_red(
390
+ acceptance_root: Path, *, driver_kind: str | None = None
391
+ ) -> dict[str, int]:
365
392
  """Merge every ``ms-NN/manifest.(yml|json)``'s ``expected_red:`` block
366
393
  under *acceptance_root* into one ``{test_id: issue_number}`` mapping
367
394
  (#2164) — the flat shape :func:`apply_expected_red` and the ``coord
@@ -369,9 +396,28 @@ def load_expected_red(acceptance_root: Path) -> dict[str, int]:
369
396
 
370
397
  Mirrors :func:`load_manifest`'s merge/empty-dict/last-writer-wins
371
398
  conventions exactly, just reading ``expected_red`` instead of ``tests``.
399
+
400
+ *driver_kind* (#2339): when given, a manifest whose own directory
401
+ resolves (via :func:`_driver_kind_for_manifest_dir`) to a DIFFERENT
402
+ driver kind is skipped entirely. A repo routes different milestones to
403
+ different drivers (``coord/**`` -> cli-pytest, ``tui/**`` ->
404
+ tui-tuidriver, ...), but a single ``coord acceptance run --for-path X
405
+ --all`` invocation only ever executes ONE of them — before this
406
+ parameter existed, the merged registry always spanned every driver, so
407
+ every milestone's ``expected_red`` ids that belonged to a DIFFERENT
408
+ driver than the one actually running were reported as
409
+ ``missing_expected_red_ids`` (a hard, un-waivable CI failure) on every
410
+ single run, for every repo with more than one routed driver kind, the
411
+ moment two milestones used different drivers. A directory whose kind
412
+ can't be determined (see above) is always included, matching the
413
+ unfiltered (``driver_kind=None``) behaviour this defaults to.
372
414
  """
373
415
  mapping: dict[str, int] = {}
374
416
  for path in _manifest_paths(acceptance_root):
417
+ if driver_kind is not None:
418
+ resolved = _driver_kind_for_manifest_dir(path.parent)
419
+ if resolved is not None and resolved != driver_kind:
420
+ continue
375
421
  try:
376
422
  data = parse_manifest_text(path.read_text(), source=str(path))
377
423
  except OSError as e:
@@ -301,7 +301,16 @@ def acceptance_run(
301
301
  )
302
302
 
303
303
  if ci_mode:
304
- expected_red = load_expected_red(cwd / ACCEPTANCE_DIRNAME)
304
+ # #2339: scope the expected_red registry to milestones this run's
305
+ # OWN driver could actually produce results for — a routed repo's
306
+ # `--all --ci` used to merge every milestone's expected_red
307
+ # regardless of which driver `--for-path` resolved, so every OTHER
308
+ # driver's ids always came back `missing_expected_red_ids` (a hard
309
+ # CI failure) the moment the repo had more than one driver kind in
310
+ # use. See coord.acceptance.load_expected_red's docstring.
311
+ expected_red = load_expected_red(
312
+ cwd / ACCEPTANCE_DIRNAME, driver_kind=driver_cfg.kind,
313
+ )
305
314
  verdict = apply_expected_red(verdict, set(expected_red))
306
315
  click.echo(json.dumps(verdict, indent=2))
307
316
  hard_failure = expected_red_failure_summary(verdict)
@@ -17,10 +17,16 @@ operator see and drive it without waiting for a tick:
17
17
  * ``requeue`` revives a row the drain retired after burning its retry budget.
18
18
 
19
19
  The state-touching commands (``sync``, ``outbox``, ``events``, ``enqueue-*``,
20
- ``requeue``)
21
- read and write the daemon's own ``~/.coord/coord.db`` and are therefore
22
- **daemon-host commands**. Run from a thin client they operate on that box's
23
- empty local DB, which is not where the bridge lives.
20
+ ``requeue``) read and write the daemon's own ``~/.coord/coord.db`` and are
21
+ therefore **daemon-host commands**. Run from a thin client they used to silently
22
+ operate on that box's empty local DB, which is not where the bridge lives —
23
+ producing a normal-looking "nothing pending" instead of an error (#2336).
24
+ Every one of them now calls :func:`_refuse_if_thin_client` first, which
25
+ raises a loud, explicit error instead when ``board_service`` is configured
26
+ (i.e. this machine is a thin client per ``coord/client.py``'s bootstrap
27
+ contract) rather than silently reading the wrong box's empty tables. There is
28
+ no daemon-proxy for these yet (Option A in #2336 — a bigger lift, left for a
29
+ follow-up); this is the "fail loud instead of running wrong" half.
24
30
  """
25
31
 
26
32
  from __future__ import annotations
@@ -30,6 +36,7 @@ import json
30
36
  import click
31
37
 
32
38
  from coord.commands._common import _CONFIG_OPTION, _load_config
39
+ from coord.config import has_unexpanded_env_var
33
40
  from coord.portal_bridge import (
34
41
  PortalBridgeError,
35
42
  SUBMISSION_STATUSES,
@@ -37,6 +44,48 @@ from coord.portal_bridge import (
37
44
  )
38
45
 
39
46
 
47
+ def _refuse_if_thin_client(cmd_name: str) -> None:
48
+ """Refuse *cmd_name* when this machine isn't the daemon host (#2336).
49
+
50
+ ``sync``/``outbox``/``events``/``enqueue-*``/``requeue`` read and write
51
+ the daemon's own ``~/.coord/coord.db`` directly — there is no daemon
52
+ proxy for portal state yet (unlike ``coord status``/``coord log``/etc,
53
+ which already route through ``board_service`` when it's configured; see
54
+ ``coord/client.py``'s module docstring for the bootstrap contract). Run
55
+ on a machine that has ``board_service`` set in ``~/.coord/client.toml``
56
+ (a thin client, by definition — every other machine in the fleet that
57
+ isn't the daemon host), these commands would read/write that machine's
58
+ own empty local DB and report a normal-looking, silently wrong result
59
+ (2026-08-16 incident: a customer ``signoff.approved`` event sat
60
+ unnoticed on the daemon host for over an hour because every portal
61
+ command run from a thin client reported nothing pending).
62
+
63
+ Mirrors the guard already used for the same reason in
64
+ ``coord.commands.drive_queue``'s ``diagnose`` command (#615/#906), which
65
+ refuses rather than "diagnose an empty queue" on a thin client. The
66
+ local-vs-daemon decision goes through ``coord.board_service`` — the #749
67
+ facade that exists precisely so call sites stop hand-rolling
68
+ ``resolve_board_service()`` — rather than importing ``coord.client``
69
+ directly. ``resolve()`` and not ``is_remote()`` because the error names
70
+ the host the operator should ssh to, which needs the resolved URL.
71
+ """
72
+ from coord.board_service import resolve # noqa: PLC0415
73
+
74
+ svc = resolve()
75
+ if svc is None:
76
+ return
77
+ from urllib.parse import urlparse # noqa: PLC0415
78
+
79
+ host = urlparse(svc.url).hostname or svc.url
80
+ raise click.ClickException(
81
+ f"coord portal {cmd_name} must run on the daemon host ({host}) — "
82
+ "this machine's ~/.coord/coord.db is not where the bridge lives "
83
+ "(board_service is configured in ~/.coord/client.toml, making this "
84
+ "a thin client). Run it over `ssh` on the daemon host instead. "
85
+ "See coord/skills/portal-followup/SKILL.md."
86
+ )
87
+
88
+
40
89
  @click.group("portal")
41
90
  def portal_group() -> None:
42
91
  """coord-portal sync bridge — status, manual push, heartbeat (#2179)."""
@@ -48,10 +97,20 @@ def portal_group() -> None:
48
97
  def portal_status(config_path, as_json: bool) -> None:
49
98
  """Show whether the portal bridge is configured, without sending anything."""
50
99
  cfg = _load_config(config_path).portal
100
+ # #2336: a non-empty-string check alone can't tell "resolved to a real
101
+ # secret" from "the ${VAR} placeholder was never expanded because the
102
+ # env var wasn't set in this shell" — both are non-empty strings. Reject
103
+ # either credential if it still carries an unexpanded placeholder.
104
+ credentials_set = bool(
105
+ cfg.bridge_client_id
106
+ and cfg.bridge_client_secret
107
+ and not has_unexpanded_env_var(cfg.bridge_client_id)
108
+ and not has_unexpanded_env_var(cfg.bridge_client_secret)
109
+ )
51
110
  payload = {
52
111
  "enabled": cfg.enabled,
53
112
  "base_url": cfg.base_url,
54
- "credentials_set": bool(cfg.bridge_client_id and cfg.bridge_client_secret),
113
+ "credentials_set": credentials_set,
55
114
  "timeout_secs": cfg.timeout_secs,
56
115
  "max_retries": cfg.max_retries,
57
116
  }
@@ -151,6 +210,8 @@ def portal_sync_once(config_path, as_json: bool) -> None:
151
210
 
152
211
  Daemon-host command: it reads and writes the daemon's ~/.coord/coord.db.
153
212
  """
213
+ _refuse_if_thin_client("sync")
214
+
154
215
  from coord import portal_sync as _sync # noqa: PLC0415
155
216
 
156
217
  config = _load_config(config_path)
@@ -198,6 +259,8 @@ def portal_outbox(as_json: bool, show_all: bool) -> None:
198
259
  refusing to announce something to the customer before the thing it
199
260
  announces has been confirmed applied.
200
261
  """
262
+ _refuse_if_thin_client("outbox")
263
+
201
264
  from coord import portal_store # noqa: PLC0415
202
265
  from coord.portal_sync import ordering_block_reason # noqa: PLC0415
203
266
 
@@ -277,6 +340,8 @@ def portal_outbox(as_json: bool, show_all: bool) -> None:
277
340
  @click.option("--limit", type=int, default=20, show_default=True)
278
341
  def portal_events(as_json: bool, limit: int) -> None:
279
342
  """List pulled, not-yet-consumed customer events (the inbound half)."""
343
+ _refuse_if_thin_client("events")
344
+
280
345
  from coord import portal_store # noqa: PLC0415
281
346
 
282
347
  events = portal_store.unhandled_events(limit=limit)
@@ -315,6 +380,8 @@ def portal_enqueue_status(submission_id: str, status: str) -> None:
315
380
  that would summon the customer to an empty screen — `awaiting-signoff`
316
381
  with no design round queued, `needs-input` with no question (#835).
317
382
  """
383
+ _refuse_if_thin_client("enqueue-status")
384
+
318
385
  from coord.portal_sync import PortalSyncError, enqueue_status # noqa: PLC0415
319
386
 
320
387
  try:
@@ -338,6 +405,8 @@ def portal_enqueue_design_round(submission_id: str, payload_json: str) -> None:
338
405
  expected to carry whatever reference the customer's browser follows, plus
339
406
  a `round` number if this is not the first.
340
407
  """
408
+ _refuse_if_thin_client("enqueue-design-round")
409
+
341
410
  from coord.portal_sync import PortalSyncError, enqueue_design_round # noqa: PLC0415
342
411
 
343
412
  try:
@@ -361,6 +430,8 @@ def portal_enqueue_design_round(submission_id: str, payload_json: str) -> None:
361
430
  @click.argument("question")
362
431
  def portal_enqueue_question(submission_id: str, question: str) -> None:
363
432
  """Queue an open question for SUBMISSION_ID (sent on the next sync)."""
433
+ _refuse_if_thin_client("enqueue-question")
434
+
364
435
  from coord.portal_sync import PortalSyncError, enqueue_question # noqa: PLC0415
365
436
 
366
437
  try:
@@ -389,6 +460,8 @@ def portal_requeue(submission_id: str, seq: int) -> None:
389
460
 
390
461
  Find the seq with `coord portal outbox --all`.
391
462
  """
463
+ _refuse_if_thin_client("requeue")
464
+
392
465
  from coord import portal_store # noqa: PLC0415
393
466
 
394
467
  row = portal_store.requeue(submission_id, seq)
@@ -3372,6 +3372,31 @@ def _expand_env_vars(value: str) -> str:
3372
3372
  return _ENV_VAR_RE.sub(_replace, value)
3373
3373
 
3374
3374
 
3375
+ def has_unexpanded_env_var(value: str | None) -> bool:
3376
+ """Whether *value* still contains an unexpanded ``${VAR}`` placeholder.
3377
+
3378
+ #2336: :func:`_expand_env_vars` leaves an unset variable's placeholder
3379
+ untouched — ``${MISSING}`` stays the literal string ``"${MISSING}"`` —
3380
+ so a plain ``bool(value)`` check on the *result* can't tell "this
3381
+ resolved to a real secret" from "the env var was never set in this
3382
+ process's environment": both are non-empty strings. This is the
3383
+ "actually resolved" check the config's own env-var expansion needs a
3384
+ caller to run afterward — e.g. ``coord portal status``'s
3385
+ ``credentials_set`` used to report ``true`` for
3386
+ ``portal.bridge_client_id: "${BRIDGE_CLIENT_ID}"`` even when
3387
+ ``BRIDGE_CLIENT_ID`` was never exported into the shell the command ran
3388
+ in, which read as "credentials fine" while troubleshooting what was
3389
+ actually a missing-env-var problem.
3390
+
3391
+ ``None`` is treated as not-a-placeholder (``False``) — an unset field is
3392
+ a separate "not configured" state, distinct from "configured but the
3393
+ env var didn't resolve".
3394
+ """
3395
+ if value is None:
3396
+ return False
3397
+ return bool(_ENV_VAR_RE.search(value))
3398
+
3399
+
3375
3400
  #: Matches exactly what opencode's own ``OPENCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX``
3376
3401
  #: parser (#2321) accepts as a *string form* of a number: one or more ASCII
3377
3402
  #: digits, nothing else — no sign, no decimal point, no whitespace, no
@@ -0,0 +1,84 @@
1
+ # portal-followup skill
2
+
3
+ **Trigger:** Investigating a customer-portal signoff/event that "hasn't shown up"
4
+ — a submission stuck on an old status, a customer event (e.g.
5
+ `signoff.approved`) that doesn't seem to have registered, or any troubleshooting
6
+ of `coord portal` state.
7
+
8
+ **Purpose:** Get a straight answer out of `coord portal outbox`/`events`/`sync`
9
+ without re-discovering #2336 the hard way — a normal-looking "nothing pending"
10
+ from these commands used to be indistinguishable from "the bridge genuinely has
11
+ nothing pending," because they read/write **the local machine's**
12
+ `~/.coord/coord.db` directly, and only the daemon host's copy is real.
13
+
14
+ ---
15
+
16
+ ## The one thing to know
17
+
18
+ `coord portal status` / `heartbeat` / `push` touch only the config + the portal
19
+ API — safe to run from anywhere.
20
+
21
+ `coord portal sync` / `outbox` / `events` / `enqueue-*` / `requeue` touch the
22
+ daemon's own `~/.coord/coord.db`. **Run them on the daemon host directly**
23
+ (`ssh <daemon-host>` first — check `~/.coord/client.toml`'s `board_service` for
24
+ which host that is, or ask `coord status` on this machine, which already routes
25
+ through it).
26
+
27
+ Since #2336, running one of these from a thin client (any machine with
28
+ `board_service` configured) no longer silently reads that machine's empty local
29
+ DB — it refuses outright:
30
+
31
+ ```
32
+ Error: coord portal outbox must run on the daemon host (dellserver) — this
33
+ machine's ~/.coord/coord.db is not where the bridge lives (board_service is
34
+ configured in ~/.coord/client.toml, making this a thin client). Run it over
35
+ `ssh` on the daemon host instead. See coord/skills/portal-followup/SKILL.md.
36
+ ```
37
+
38
+ If you see that error, you have your answer: SSH to the named host and re-run
39
+ the same command there.
40
+
41
+ ## Steps
42
+
43
+ 1. **Identify the daemon host.** `cat ~/.coord/client.toml` (if present) shows
44
+ `board_service = "http://<host>:<port>"` — that host is where the real
45
+ `coord.db` lives. If this machine has no `client.toml` at all, it may *be*
46
+ the daemon host already; try the command locally first.
47
+
48
+ 2. **Run the portal command on that host** (over `ssh`, or directly if you're
49
+ already on it):
50
+
51
+ ```
52
+ ssh <daemon-host> 'coord portal outbox --all'
53
+ ssh <daemon-host> 'coord portal events'
54
+ ssh <daemon-host> 'coord portal sync --json'
55
+ ```
56
+
57
+ 3. **Cross-check credentials separately if a push/heartbeat looks like a 401.**
58
+ `coord portal status --json` reports `credentials_set: false` whenever
59
+ `BRIDGE_CLIENT_ID`/`BRIDGE_CLIENT_SECRET` are unset in *this shell's*
60
+ environment, even if `coordinator.yml` has non-empty `${VAR}` strings for
61
+ them (#2336) — a bare interactive `ssh <host> '...'` does not source
62
+ `~/.coord/coord-serve.env`, but the actual `coord-serve` systemd unit does
63
+ via `EnvironmentFile=`. A 401 from a manual `ssh` + `coord portal heartbeat`
64
+ check does not necessarily mean the credential itself is bad — check
65
+ `credentials_set` first before assuming the secret rotated.
66
+
67
+ 4. **If a submission's outbox row is `HELD`,** that's the #835 ordering guard
68
+ working as intended (announcing a status like `awaiting-signoff` before its
69
+ design round applied would email the customer toward an empty screen), not
70
+ a bug — resolve the blocking condition rather than trying to force the push.
71
+
72
+ 5. **If a row is terminal (retired) after burning its retry budget,** fix the
73
+ underlying cause first, then `coord portal requeue <submission_id> <seq>`
74
+ (find the seq with `coord portal outbox --all`) — also a daemon-host command.
75
+
76
+ ## Rules
77
+
78
+ - Never try to work around the "must run on the daemon host" error by editing
79
+ `~/.coord/client.toml` to unset `board_service` on a thin client — that
80
+ changes what *every other* `coord` command on that machine reads too, not
81
+ just `portal`.
82
+ - Prefer `coord portal enqueue-status`/`enqueue-design-round`/`enqueue-question`
83
+ over `coord portal push` for anything the customer will see — `push` bypasses
84
+ the #835 ordering guard entirely.
@@ -271,6 +271,51 @@ class TestLoadExpectedRed:
271
271
  (root / "ms11" / "manifest.yml").write_text("tests:\n a: 554\n")
272
272
  assert load_expected_red(root) == {}
273
273
 
274
+ def test_driver_kind_excludes_a_different_driver_milestone(
275
+ self, tmp_path: Path
276
+ ) -> None:
277
+ # #2339: a repo routing coord/** -> cli-pytest and tui/** ->
278
+ # tui-tuidriver must not merge a tui-tuidriver milestone's
279
+ # expected_red into a cli-pytest run's registry (or vice versa) —
280
+ # the other driver can never produce those test-ids, so an unscoped
281
+ # merge always reported them `missing_expected_red_ids`, a hard CI
282
+ # failure on every run of every OTHER driver the moment two
283
+ # milestones used different drivers.
284
+ root = tmp_path / "tests" / "acceptance"
285
+ ms_tui = root / "ms65"
286
+ ms_tui.mkdir(parents=True)
287
+ (ms_tui / "manifest.yml").write_text("expected_red:\n 2282:\n - board_tabs_2282::a\n")
288
+ (ms_tui / "mocks").mkdir()
289
+ (ms_tui / "mocks" / "board.screen").write_text("mock")
290
+
291
+ ms_cli = root / "ms37"
292
+ ms_cli.mkdir(parents=True)
293
+ (ms_cli / "manifest.yml").write_text("expected_red:\n 1118:\n - test_x\n")
294
+ (ms_cli / "mocks").mkdir()
295
+ (ms_cli / "mocks" / "usage.out").write_text("mock")
296
+
297
+ assert load_expected_red(root, driver_kind="cli-pytest") == {"test_x": 1118}
298
+ assert load_expected_red(root, driver_kind="tui-tuidriver") == {
299
+ "board_tabs_2282::a": 2282
300
+ }
301
+ # Unfiltered (default) behaviour is unchanged — everything merges.
302
+ assert load_expected_red(root) == {"board_tabs_2282::a": 2282, "test_x": 1118}
303
+
304
+ def test_driver_kind_includes_a_milestone_with_no_mocks_dir(
305
+ self, tmp_path: Path
306
+ ) -> None:
307
+ # A directory whose driver can't be determined (no mocks/, mixed
308
+ # kinds, ...) must never be silently dropped — "unknown" is not
309
+ # "safe to skip" for a hard-failure check.
310
+ root = tmp_path / "tests" / "acceptance"
311
+ (root / "issue-9").mkdir(parents=True)
312
+ (root / "issue-9" / "manifest.yml").write_text(
313
+ "expected_red:\n 9:\n - bare_bug_test\n"
314
+ )
315
+ assert load_expected_red(root, driver_kind="web-playwright") == {
316
+ "bare_bug_test": 9
317
+ }
318
+
274
319
 
275
320
  class TestApplyExpectedRed:
276
321
  def test_no_expected_red_ids_is_a_no_op(self) -> None:
@@ -34,6 +34,21 @@ DISABLED_CONFIG_YAML = textwrap.dedent("""
34
34
  repos: [coord]
35
35
  """)
36
36
 
37
+ ENV_VAR_CONFIG_YAML = textwrap.dedent("""
38
+ repos:
39
+ - name: coord
40
+ github: owner/coord
41
+ machines:
42
+ - name: dellserver
43
+ host: dellserver
44
+ repos: [coord]
45
+ portal:
46
+ enabled: true
47
+ base_url: https://intake.heurontech.com
48
+ bridge_client_id: ${BRIDGE_CLIENT_ID}
49
+ bridge_client_secret: ${BRIDGE_CLIENT_SECRET}
50
+ """)
51
+
37
52
 
38
53
  @pytest.fixture
39
54
  def config_path(tmp_path):
@@ -49,6 +64,19 @@ def disabled_config_path(tmp_path):
49
64
  return str(path)
50
65
 
51
66
 
67
+ @pytest.fixture
68
+ def env_var_config_path(tmp_path, monkeypatch):
69
+ # #2336: BRIDGE_CLIENT_ID/BRIDGE_CLIENT_SECRET deliberately left unset in
70
+ # this shell — mirrors a manual `ssh dellserver` session that never
71
+ # sourced ~/.coord/coord-serve.env, unlike the coord-serve systemd unit's
72
+ # EnvironmentFile=.
73
+ monkeypatch.delenv("BRIDGE_CLIENT_ID", raising=False)
74
+ monkeypatch.delenv("BRIDGE_CLIENT_SECRET", raising=False)
75
+ path = tmp_path / "coordinator.yml"
76
+ path.write_text(ENV_VAR_CONFIG_YAML)
77
+ return str(path)
78
+
79
+
52
80
  def run(*args):
53
81
  return CliRunner().invoke(main, list(args))
54
82
 
@@ -82,6 +110,23 @@ def test_status_reports_enabled_and_credentials(config_path):
82
110
  assert "credentials=set" in result.output
83
111
 
84
112
 
113
+ def test_status_reports_credentials_missing_for_unexpanded_env_var(env_var_config_path):
114
+ """#2336: portal.bridge_client_id/secret are non-empty '${VAR}' strings,
115
+ but the env var was never set in this shell — credentials_set must be
116
+ false, not true just because the placeholder text itself is non-empty."""
117
+ result = run("portal", "status", "--config", env_var_config_path, "--json")
118
+ assert result.exit_code == 0, result.output
119
+ assert '"credentials_set": false' in result.output
120
+
121
+
122
+ def test_status_reports_credentials_set_once_env_var_resolves(env_var_config_path, monkeypatch):
123
+ monkeypatch.setenv("BRIDGE_CLIENT_ID", "id-from-env")
124
+ monkeypatch.setenv("BRIDGE_CLIENT_SECRET", "secret-from-env")
125
+ result = run("portal", "status", "--config", env_var_config_path, "--json")
126
+ assert result.exit_code == 0, result.output
127
+ assert '"credentials_set": true' in result.output
128
+
129
+
85
130
  def test_heartbeat_refuses_when_disabled(disabled_config_path):
86
131
  result = run("portal", "heartbeat", "--config", disabled_config_path)
87
132
  assert result.exit_code != 0
@@ -260,3 +305,58 @@ def test_requeue_reports_an_unknown_row_cleanly():
260
305
  result = run("portal", "requeue", "sub_1", "1")
261
306
  assert result.exit_code != 0
262
307
  assert "no outbox row" in result.output
308
+
309
+
310
+ # ── #2336: state-touching commands refuse to run on a thin client ──────────
311
+
312
+
313
+ @pytest.fixture
314
+ def thin_client(monkeypatch):
315
+ """Simulate running on a machine with board_service configured — i.e. a
316
+ thin client, per coord/client.py's resolve_board_service() bootstrap
317
+ contract (flag > env > ~/.coord/client.toml)."""
318
+ monkeypatch.setenv("COORD_SERVICE_URL", "http://dellserver:7435")
319
+
320
+
321
+ @pytest.mark.parametrize(
322
+ "args",
323
+ [
324
+ ("portal", "sync"),
325
+ ("portal", "outbox"),
326
+ ("portal", "events"),
327
+ ("portal", "enqueue-status", "sub_1", "shipped"),
328
+ ("portal", "enqueue-design-round", "sub_1", "{}"),
329
+ ("portal", "enqueue-question", "sub_1", "why?"),
330
+ ("portal", "requeue", "sub_1", "1"),
331
+ ],
332
+ )
333
+ def test_state_touching_commands_refuse_on_a_thin_client(thin_client, args):
334
+ result = run(*args)
335
+ assert result.exit_code != 0
336
+ assert "must run on the daemon host" in result.output
337
+ assert "dellserver" in result.output
338
+
339
+
340
+ def test_status_heartbeat_and_push_do_not_call_the_thin_client_guard(thin_client):
341
+ """status/heartbeat/push never touch the local DB, so they must not be
342
+ gated by the #2336 guard — only sync/outbox/events/enqueue-*/requeue call
343
+ _refuse_if_thin_client. (A full CLI invocation isn't used here: setting
344
+ COORD_SERVICE_URL also reroutes _load_config's own config fetch to the
345
+ daemon per #1080, which is unrelated to this guard and would make the
346
+ assertion about a network error rather than about this guard.)"""
347
+ import coord.commands.portal as portal_mod
348
+
349
+ calls = []
350
+ real_guard = portal_mod._refuse_if_thin_client
351
+
352
+ def _tracking_guard(cmd_name):
353
+ calls.append(cmd_name)
354
+ return real_guard(cmd_name)
355
+
356
+ portal_mod._refuse_if_thin_client = _tracking_guard
357
+ try:
358
+ result = run("portal", "heartbeat", "--config", "/does/not/exist.yml")
359
+ finally:
360
+ portal_mod._refuse_if_thin_client = real_guard
361
+ assert result.exit_code != 0 # fails for an unrelated reason (bad --config)
362
+ assert calls == []
@@ -4,7 +4,7 @@ from __future__ import annotations
4
4
 
5
5
  import pytest
6
6
 
7
- from coord.config import ConfigError, PortalConfig, _parse_portal
7
+ from coord.config import ConfigError, PortalConfig, _parse_portal, has_unexpanded_env_var
8
8
 
9
9
  BASE = {
10
10
  "enabled": True,
@@ -119,6 +119,25 @@ def test_timeout_secs_must_be_a_number():
119
119
  _parse_portal({**BASE, "timeout_secs": "soon"})
120
120
 
121
121
 
122
+ # ── #2336: has_unexpanded_env_var — the "did this actually resolve" check ──
123
+
124
+
125
+ def test_has_unexpanded_env_var_true_for_a_placeholder_left_as_is():
126
+ assert has_unexpanded_env_var("${DEFINITELY_NOT_SET_XYZ}") is True
127
+
128
+
129
+ def test_has_unexpanded_env_var_false_for_a_resolved_value():
130
+ assert has_unexpanded_env_var("id-from-env") is False
131
+
132
+
133
+ def test_has_unexpanded_env_var_false_for_none():
134
+ assert has_unexpanded_env_var(None) is False
135
+
136
+
137
+ def test_has_unexpanded_env_var_false_for_empty_string():
138
+ assert has_unexpanded_env_var("") is False
139
+
140
+
122
141
  def test_max_retries_must_be_an_int_not_a_bool():
123
142
  with pytest.raises(ConfigError, match="non-negative integer"):
124
143
  _parse_portal({**BASE, "max_retries": True})