code-coordinator 0.5.66__tar.gz → 0.5.67__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 (817) hide show
  1. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/PKG-INFO +3 -1
  2. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/README.md +2 -0
  3. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/code_coordinator.egg-info/PKG-INFO +3 -1
  4. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/code_coordinator.egg-info/SOURCES.txt +1 -0
  5. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/code_coordinator.egg-info/scm_file_list.json +1 -0
  6. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/code_coordinator.egg-info/scm_version.json +2 -2
  7. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/commands/plan_followup.py +164 -29
  8. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/config.py +12 -0
  9. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/models.py +15 -0
  10. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/revalidate.py +14 -1
  11. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/smoke.py +101 -4
  12. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coordinator.example.yml +17 -0
  13. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/docs/OPERATING_GOTCHAS.md +35 -0
  14. code_coordinator-0.5.67/tests/test_ci_parity_2091.py +441 -0
  15. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/.claude/commands/board.md +0 -0
  16. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/.claude/commands/complete-session.md +0 -0
  17. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/.claude/commands/coordinator.md +0 -0
  18. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/.githooks/_lib.sh +0 -0
  19. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/.githooks/post-checkout +0 -0
  20. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/.githooks/post-commit +0 -0
  21. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/.githooks/post-merge +0 -0
  22. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  23. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/.github/coord-ci-acceptance.yml +0 -0
  24. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/.github/workflows/auto-release.yml +0 -0
  25. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/.github/workflows/cargo-test.yml +0 -0
  26. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/.github/workflows/publish.yml +0 -0
  27. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/.github/workflows/release-tui.yml +0 -0
  28. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/.github/workflows/test.yml +0 -0
  29. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/.gitignore +0 -0
  30. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/CLAUDE.md +0 -0
  31. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/GOAL.md +0 -0
  32. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/LICENSE +0 -0
  33. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/MANIFEST.in +0 -0
  34. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/code_coordinator.egg-info/dependency_links.txt +0 -0
  35. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/code_coordinator.egg-info/entry_points.txt +0 -0
  36. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/code_coordinator.egg-info/requires.txt +0 -0
  37. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/code_coordinator.egg-info/top_level.txt +0 -0
  38. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/__init__.py +0 -0
  39. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/_board_mapping.py +0 -0
  40. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/acceptance.py +0 -0
  41. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/acceptance_drivers.py +0 -0
  42. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/agent.py +0 -0
  43. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/agent_app.py +0 -0
  44. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/agent_update.py +0 -0
  45. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/agents/opencode/.gitignore +0 -0
  46. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/agents/opencode/agents/work.md +0 -0
  47. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/agents/opencode/routing.jsonc +0 -0
  48. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/audit.py +0 -0
  49. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/auto_loop.py +0 -0
  50. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/board_bool_guard.py +0 -0
  51. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/board_service.py +0 -0
  52. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/board_wire.py +0 -0
  53. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/brain.py +0 -0
  54. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/branch_model.py +0 -0
  55. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/bug_intake.py +0 -0
  56. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/cargo_cache.py +0 -0
  57. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/ci_github.py +0 -0
  58. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/ci_store.py +0 -0
  59. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/claim.py +0 -0
  60. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/cli.py +0 -0
  61. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/client.py +0 -0
  62. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/commands/__init__.py +0 -0
  63. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/commands/_common.py +0 -0
  64. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/commands/acceptance.py +0 -0
  65. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/commands/agent_ops.py +0 -0
  66. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/commands/audit.py +0 -0
  67. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/commands/chat.py +0 -0
  68. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/commands/dispatch.py +0 -0
  69. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/commands/dispatch_workers.py +0 -0
  70. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/commands/drive.py +0 -0
  71. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/commands/drive_queue.py +0 -0
  72. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/commands/gate_a.py +0 -0
  73. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/commands/gates.py +0 -0
  74. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/commands/issues.py +0 -0
  75. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/commands/lifecycle.py +0 -0
  76. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/commands/merge.py +0 -0
  77. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/commands/milestone.py +0 -0
  78. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/commands/plans.py +0 -0
  79. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/commands/portal.py +0 -0
  80. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/commands/release.py +0 -0
  81. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/commands/report.py +0 -0
  82. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/commands/review.py +0 -0
  83. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/commands/scorecard.py +0 -0
  84. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/commands/sessions.py +0 -0
  85. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/commands/setup.py +0 -0
  86. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/commands/status.py +0 -0
  87. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/commands/terminal.py +0 -0
  88. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/commands/test_gate.py +0 -0
  89. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/commands/tui.py +0 -0
  90. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/comments.py +0 -0
  91. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/conflict_fix.py +0 -0
  92. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dao.py +0 -0
  93. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/__init__.py +0 -0
  94. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/fixture.py +0 -0
  95. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/index.html +0 -0
  96. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/server.py +0 -0
  97. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/terminal.py +0 -0
  98. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/.gitignore +0 -0
  99. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/components.json +0 -0
  100. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js +0 -0
  101. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  102. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js +0 -0
  103. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js +0 -0
  104. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  105. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  106. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  107. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  108. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  109. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/dist/index.html +0 -0
  110. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  111. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/dist/sw.js +0 -0
  112. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  113. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  114. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  115. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  116. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  117. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  118. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  119. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  120. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  121. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  122. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/eslint.config.js +0 -0
  123. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/index.html +0 -0
  124. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  125. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/package-lock.json +0 -0
  126. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/package.json +0 -0
  127. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  128. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/playwright.config.ts +0 -0
  129. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/postcss.config.js +0 -0
  130. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  131. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  132. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  133. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/App.tsx +0 -0
  134. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/api/client.ts +0 -0
  135. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  136. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  137. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  138. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  139. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  140. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  141. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  142. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  143. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  144. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  145. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  146. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  147. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  148. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  149. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  150. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  151. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  152. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  153. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  154. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  155. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  156. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  157. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  158. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  159. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  160. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  161. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  162. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  163. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  164. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  165. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  166. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  167. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  168. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  169. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  170. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/index.css +0 -0
  171. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  172. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  173. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/main.tsx +0 -0
  174. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  175. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  176. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  177. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  178. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  179. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  180. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  181. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  182. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  183. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  184. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  185. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  186. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  187. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  188. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  189. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  190. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  191. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  192. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  193. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  194. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  195. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  196. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  197. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/tailwind.config.js +0 -0
  198. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/tsconfig.json +0 -0
  199. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  200. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dashboard/webapp/vite.config.ts +0 -0
  201. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/db.py +0 -0
  202. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dead_end.py +0 -0
  203. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/deploy/README.md +0 -0
  204. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/deploy/coord-agent.service +0 -0
  205. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/deploy/coord-db-backup.service +0 -0
  206. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/deploy/coord-db-backup.sh +0 -0
  207. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/deploy/coord-db-backup.timer +0 -0
  208. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/deploy/coord-drive-queue.service +0 -0
  209. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/deploy/coord-drive-queue.timer +0 -0
  210. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/deploy/coord-notify.service +0 -0
  211. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/deploy/coord-notify.timer +0 -0
  212. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/deploy/coord-release-propagate.service +0 -0
  213. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/deploy/coord-release-propagate.timer +0 -0
  214. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/deploy/coord-release-window.service +0 -0
  215. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/deploy/coord-release-window.timer +0 -0
  216. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/deploy/coord-serve.service +0 -0
  217. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/deploy/coord-web-dist-build.service +0 -0
  218. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/deploy/coord-web-dist-build.timer +0 -0
  219. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/deploy/coord-web.service +0 -0
  220. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/deploy_manifest.py +0 -0
  221. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/deploy_units.py +0 -0
  222. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/deps.py +0 -0
  223. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/diagnose.py +0 -0
  224. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dispatch.py +0 -0
  225. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/dist_name.py +0 -0
  226. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/drive.py +0 -0
  227. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/drive_queue.py +0 -0
  228. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/drive_state.py +0 -0
  229. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/events.py +0 -0
  230. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/failure_class.py +0 -0
  231. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/filelock.py +0 -0
  232. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/fleet_config_health.py +0 -0
  233. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/freshness.py +0 -0
  234. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/gate_a.py +0 -0
  235. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/gate_b.py +0 -0
  236. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/gate_snapshot.py +0 -0
  237. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/gates.py +0 -0
  238. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/github_ops.py +0 -0
  239. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/goal.py +0 -0
  240. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/graph_health.py +0 -0
  241. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/health/__init__.py +0 -0
  242. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/health/aggregate.py +0 -0
  243. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/health/checks/__init__.py +0 -0
  244. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/health/checks/agent_install.py +0 -0
  245. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/health/checks/cargo_targets.py +0 -0
  246. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/health/checks/claude_binary.py +0 -0
  247. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/health/checks/deploy_lane_facts.py +0 -0
  248. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/health/checks/disk.py +0 -0
  249. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/health/checks/fleet_board.py +0 -0
  250. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  251. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/health/checks/fleet_phantom.py +0 -0
  252. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/health/checks/fleet_unit_drift.py +0 -0
  253. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/health/checks/graph.py +0 -0
  254. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/health/checks/plan_usage.py +0 -0
  255. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/health/checks/repo_state.py +0 -0
  256. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/health/checks/spawned_coord.py +0 -0
  257. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/health/checks/timer_active.py +0 -0
  258. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/health/checks/toolchain.py +0 -0
  259. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/health/checks/unit_drift.py +0 -0
  260. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/health/checks/unit_enablement.py +0 -0
  261. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/health/checks/worktrees.py +0 -0
  262. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/health/cli.py +0 -0
  263. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/health/context.py +0 -0
  264. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/health/fleet_snapshot.py +0 -0
  265. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/health/models.py +0 -0
  266. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/health/pypi.py +0 -0
  267. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/health/registry.py +0 -0
  268. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/health/render.py +0 -0
  269. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/health/units.py +0 -0
  270. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/hooks.py +0 -0
  271. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/housekeeping.py +0 -0
  272. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/interactive.py +0 -0
  273. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/issue_store.py +0 -0
  274. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/liveness_auditor.py +0 -0
  275. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/machine_pause.py +0 -0
  276. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/merge_queue.py +0 -0
  277. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/milestone_chat.py +0 -0
  278. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/milestone_dispatch.py +0 -0
  279. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/milestone_gate.py +0 -0
  280. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/milestone_order.py +0 -0
  281. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/mock_author.py +0 -0
  282. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/network.py +0 -0
  283. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/new_issue_chat.py +0 -0
  284. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/notifier/__init__.py +0 -0
  285. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/notifier/baseline.py +0 -0
  286. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/notifier/cli.py +0 -0
  287. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/notifier/collect.py +0 -0
  288. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/notifier/digest.py +0 -0
  289. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/notifier/models.py +0 -0
  290. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/notifier/predicate.py +0 -0
  291. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/notifier/service.py +0 -0
  292. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/notifier/store.py +0 -0
  293. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/notifier/transport.py +0 -0
  294. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/notify.py +0 -0
  295. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/openapi.py +0 -0
  296. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/overlap_fence.py +0 -0
  297. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/parentage.py +0 -0
  298. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/parentage_github.py +0 -0
  299. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/pipeline.py +0 -0
  300. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/plan_parser.py +0 -0
  301. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/plans.py +0 -0
  302. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/platform_paths.py +0 -0
  303. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/portal_bridge.py +0 -0
  304. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/pr_body_lint.py +0 -0
  305. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/prereqs.py +0 -0
  306. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/progress.py +0 -0
  307. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/providers/__init__.py +0 -0
  308. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/providers/base.py +0 -0
  309. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/providers/claude.py +0 -0
  310. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/providers/claude_pty.py +0 -0
  311. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/providers/opencode.py +0 -0
  312. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/reconcile.py +0 -0
  313. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/refine_chat.py +0 -0
  314. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/release_cordon.py +0 -0
  315. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/release_propagate.py +0 -0
  316. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/release_verify.py +0 -0
  317. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/release_window.py +0 -0
  318. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/reports.py +0 -0
  319. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/review.py +0 -0
  320. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/scorecard.py +0 -0
  321. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/serve_app.py +0 -0
  322. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/skills/update-issue/SKILL.md +0 -0
  323. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/spend_ceiling.py +0 -0
  324. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/split_work.py +0 -0
  325. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/stage_projection.py +0 -0
  326. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/state.py +0 -0
  327. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/test_author.py +0 -0
  328. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/test_chat.py +0 -0
  329. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/test_orchestrator.py +0 -0
  330. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/test_report.py +0 -0
  331. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/tui_release.py +0 -0
  332. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/usage.py +0 -0
  333. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/usage_limits.py +0 -0
  334. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/usage_rollup.py +0 -0
  335. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/coord/worker_events.py +0 -0
  336. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/deploy/coord-agent.service +0 -0
  337. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/deploy/coord-db-backup.service +0 -0
  338. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/deploy/coord-db-backup.sh +0 -0
  339. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/deploy/coord-db-backup.timer +0 -0
  340. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/deploy/coord-drive-queue.service +0 -0
  341. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/deploy/coord-drive-queue.timer +0 -0
  342. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/deploy/coord-notify.service +0 -0
  343. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/deploy/coord-notify.timer +0 -0
  344. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/deploy/coord-release-propagate.service +0 -0
  345. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/deploy/coord-release-propagate.timer +0 -0
  346. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/deploy/coord-release-window.service +0 -0
  347. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/deploy/coord-release-window.timer +0 -0
  348. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/deploy/coord-serve.service +0 -0
  349. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/deploy/coord-web-dist-build.service +0 -0
  350. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/deploy/coord-web-dist-build.sh +0 -0
  351. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/deploy/coord-web-dist-build.timer +0 -0
  352. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/deploy/coord-web-rollback.sh +0 -0
  353. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/deploy/coord-web.service +0 -0
  354. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/deploy/node-shim.sh +0 -0
  355. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/docs/AGENT_OPERATIONS.md +0 -0
  356. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/docs/ARCHITECTURE.md +0 -0
  357. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/docs/ARCH_SECURITY_GATES.md +0 -0
  358. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/docs/COCKPIT.md +0 -0
  359. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/docs/CONTROL_CENTER.md +0 -0
  360. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/docs/CROSS_PLATFORM.md +0 -0
  361. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/docs/CUSTOMER_PORTAL.md +0 -0
  362. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/docs/DRIVE_QUEUE.md +0 -0
  363. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/docs/EPHEMERAL_WORKERS.md +0 -0
  364. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/docs/FORGE_MIGRATION.md +0 -0
  365. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/docs/GRAPHIFY_SETUP.md +0 -0
  366. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/docs/ISSUE_GUIDANCE.md +0 -0
  367. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/docs/MAC_MINI.md +0 -0
  368. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  369. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/docs/NOTIFIER.md +0 -0
  370. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/docs/OPENCODE_VERIFICATION.md +0 -0
  371. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/docs/ORACLE_LOOP.md +0 -0
  372. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/docs/PHONE_WEBAPP.md +0 -0
  373. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/docs/PIPELINE_V2.md +0 -0
  374. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/docs/PLATFORM_EVOLUTION.md +0 -0
  375. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/docs/SECOND_BACKEND.md +0 -0
  376. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/docs/STORE_SERVICE.md +0 -0
  377. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  378. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/docs/WEB_CONTROL_CENTER.md +0 -0
  379. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/docs/mocks/web/README.md +0 -0
  380. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/docs/mocks/web/_tokens.css +0 -0
  381. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/docs/mocks/web/issue-detail.html +0 -0
  382. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/docs/mocks/web/pipeline-narrow.html +0 -0
  383. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/docs/mocks/web/pipeline-wide.html +0 -0
  384. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/graphify-out/.gitignore +0 -0
  385. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/install-agent.sh +0 -0
  386. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/pyproject.toml +0 -0
  387. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/scripts/audit_review_verdict_overrides.py +0 -0
  388. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  389. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/scripts/azure-workers/build-worker-image.sh +0 -0
  390. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/scripts/azure-workers/coordinator-machine.py +0 -0
  391. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/scripts/azure-workers/epic-down.sh +0 -0
  392. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/scripts/azure-workers/epic-up.sh +0 -0
  393. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/scripts/azure-workers/preflight.sh +0 -0
  394. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/scripts/azure-workers/provision-worker.sh +0 -0
  395. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  396. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  397. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/scripts/azure-workers/verify-github-token.sh +0 -0
  398. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/scripts/codegen.py +0 -0
  399. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/scripts/coord-test-runner.sh +0 -0
  400. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/scripts/drive-batch.sh +0 -0
  401. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/scripts/gen_board_fixture.py +0 -0
  402. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/scripts/next_release_tag.py +0 -0
  403. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/scripts/run_tests_in_populated_home.sh +0 -0
  404. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/scripts/run_tests_without_gh.sh +0 -0
  405. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/scripts/smoke_437_interactive.py +0 -0
  406. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/scripts/verify_878_review_capture.py +0 -0
  407. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/scripts/verify_release_published.py +0 -0
  408. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/scripts/verify_release_wheel.py +0 -0
  409. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/setup.cfg +0 -0
  410. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/SMOKE_SET.md +0 -0
  411. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/__init__.py +0 -0
  412. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  413. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/acceptance/ms-33/contract.md +0 -0
  414. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/acceptance/ms-33/manifest.yml +0 -0
  415. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  416. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  417. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  418. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  419. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/acceptance/ms-37/conftest.py +0 -0
  420. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/acceptance/ms-37/contract.md +0 -0
  421. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/acceptance/ms-37/manifest.yml +0 -0
  422. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  423. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  424. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/acceptance/ms-38/contract.md +0 -0
  425. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/acceptance/ms-38/manifest.yml +0 -0
  426. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  427. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  428. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  429. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  430. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  431. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  432. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  433. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  434. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  435. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  436. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/acceptance/ms-51/contract.md +0 -0
  437. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  438. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  439. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/acceptance/ms-51/manifest.yml +0 -0
  440. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  441. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/acceptance/ms-51/tsconfig.json +0 -0
  442. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  443. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/conftest.py +0 -0
  444. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/fixtures/board-pipeline-basic.json +0 -0
  445. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  446. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  447. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  448. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/fixtures/playwright/all_pass.json +0 -0
  449. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  450. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/fixtures/playwright/mixed_fail.json +0 -0
  451. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  452. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  453. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/fixtures/playwright/skip.json +0 -0
  454. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/fixtures/playwright/truncated.json +0 -0
  455. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  456. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  457. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  458. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  459. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  460. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  461. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  462. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  463. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_acceptance.py +0 -0
  464. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_acceptance_drivers.py +0 -0
  465. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_agent.py +0 -0
  466. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_agent_api_error.py +0 -0
  467. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_agent_app.py +0 -0
  468. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_agent_branch_base.py +0 -0
  469. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_agent_branch_capture.py +0 -0
  470. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_agent_config_free_1712.py +0 -0
  471. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_agent_deploy_units_endpoint.py +0 -0
  472. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_agent_dirty_worktree.py +0 -0
  473. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_agent_graph_self_heal.py +0 -0
  474. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_agent_health_h3.py +0 -0
  475. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_agent_idle_restart.py +0 -0
  476. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_agent_push_failure.py +0 -0
  477. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_agent_reap.py +0 -0
  478. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_agent_repos_and_pull.py +0 -0
  479. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_agent_restart_services_endpoint.py +0 -0
  480. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_agent_startup_diagnostics.py +0 -0
  481. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_agent_update.py +0 -0
  482. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_agent_update_bluegreen.py +0 -0
  483. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_agent_usage_limit.py +0 -0
  484. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_agent_zero_commit.py +0 -0
  485. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_ambient_home_isolation.py +0 -0
  486. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_approve_reject_plan.py +0 -0
  487. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_approve_usage_gate.py +0 -0
  488. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_assignment_already_recorded_daemon.py +0 -0
  489. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_audit_log.py +0 -0
  490. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_audit_outcome.py +0 -0
  491. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_audit_query.py +0 -0
  492. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_auto_loop.py +0 -0
  493. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_auto_release_publish_2035.py +0 -0
  494. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_base_checkout_restore.py +0 -0
  495. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_board_cap_762.py +0 -0
  496. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_board_fixture.py +0 -0
  497. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_board_read_path.py +0 -0
  498. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_board_service.py +0 -0
  499. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_board_state.py +0 -0
  500. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_board_wire.py +0 -0
  501. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_brain.py +0 -0
  502. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_branch_model.py +0 -0
  503. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_bug_intake.py +0 -0
  504. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_build_worker_image_env_update.py +0 -0
  505. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cargo_cache.py +0 -0
  506. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_ci_acceptance_gate_1950.py +0 -0
  507. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_ci_store.py +0 -0
  508. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_claim.py +0 -0
  509. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_acceptance.py +0 -0
  510. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_assign.py +0 -0
  511. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  512. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_assign_interactive_remote.py +0 -0
  513. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_assign_provider.py +0 -0
  514. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_audit.py +0 -0
  515. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_chat_continue.py +0 -0
  516. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_diagnose_config_provenance.py +0 -0
  517. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_diagnose_graph.py +0 -0
  518. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_doctor.py +0 -0
  519. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_doctor_config_free_1801.py +0 -0
  520. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  521. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_drive.py +0 -0
  522. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_drive_queue.py +0 -0
  523. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_escalate.py +0 -0
  524. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_fix_headless_review.py +0 -0
  525. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_gate_a.py +0 -0
  526. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_install_drift.py +0 -0
  527. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_install_skills.py +0 -0
  528. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_issue_create_label.py +0 -0
  529. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_issue_reopen.py +0 -0
  530. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_merge.py +0 -0
  531. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_milestone_assign.py +0 -0
  532. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_milestone_capture.py +0 -0
  533. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_milestone_chat_add_child.py +0 -0
  534. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_milestone_dispatch.py +0 -0
  535. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_milestone_gate_b.py +0 -0
  536. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_milestone_gate_c.py +0 -0
  537. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_milestone_order.py +0 -0
  538. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  539. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_milestone_ship.py +0 -0
  540. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_network.py +0 -0
  541. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_new_issue_chat.py +0 -0
  542. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_plans.py +0 -0
  543. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_portal.py +0 -0
  544. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_pull_artifact.py +0 -0
  545. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_queue.py +0 -0
  546. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_reattach_sessions.py +0 -0
  547. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_refine_board.py +0 -0
  548. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_release_preflight.py +0 -0
  549. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_release_propagate.py +0 -0
  550. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_release_window.py +0 -0
  551. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_scorecard.py +0 -0
  552. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_set_review_findings.py +0 -0
  553. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_status_advisory_terminal.py +0 -0
  554. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_status_merge_queue.py +0 -0
  555. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_status_provider.py +0 -0
  556. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_status_review_finalizing.py +0 -0
  557. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_status_test_failed_tag.py +0 -0
  558. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_status_usage_limit.py +0 -0
  559. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_sync_comments_873.py +0 -0
  560. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_test_plan.py +0 -0
  561. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_track.py +0 -0
  562. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_tui_update.py +0 -0
  563. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cli_wait.py +0 -0
  564. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_client_base_install.py +0 -0
  565. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_comments.py +0 -0
  566. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_completion_summary.py +0 -0
  567. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_config.py +0 -0
  568. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_config_acceptance.py +0 -0
  569. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_config_audit.py +0 -0
  570. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_config_pricing.py +0 -0
  571. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_config_usage_gate.py +0 -0
  572. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_conflict_fix.py +0 -0
  573. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_conflict_fix_semantic.py +0 -0
  574. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_coord_test.py +0 -0
  575. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_coord_test_runner_baseline.py +0 -0
  576. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_coord_test_runner_routing.py +0 -0
  577. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_coord_test_runner_toolchain.py +0 -0
  578. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_coord_web_sse_restart_live.py +0 -0
  579. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_coordinator_machine.py +0 -0
  580. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_cross_platform_imports.py +0 -0
  581. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_dashboard.py +0 -0
  582. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_dashboard_fixture.py +0 -0
  583. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_dashboard_terminal.py +0 -0
  584. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_dashboard_terminal_live.py +0 -0
  585. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_db.py +0 -0
  586. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_dead_end.py +0 -0
  587. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_deploy_coord_db_backup.py +0 -0
  588. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_deploy_coord_web_dist.py +0 -0
  589. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_deploy_coord_web_rollback.py +0 -0
  590. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_deploy_drive_queue_unit.py +0 -0
  591. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_deploy_manifest.py +0 -0
  592. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_deploy_units_lane.py +0 -0
  593. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_deploy_web_unit.py +0 -0
  594. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_deps.py +0 -0
  595. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_diagnose.py +0 -0
  596. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_dispatch.py +0 -0
  597. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_dispatch_target_validation.py +0 -0
  598. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_dist_name.py +0 -0
  599. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_done_housekeeping.py +0 -0
  600. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_drive.py +0 -0
  601. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_drive_queue.py +0 -0
  602. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_drive_state.py +0 -0
  603. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_drive_tmux.py +0 -0
  604. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_epic_up_capability_detection.py +0 -0
  605. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  606. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_epic_up_image_provenance.py +0 -0
  607. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_errors.py +0 -0
  608. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_events.py +0 -0
  609. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_failure_class.py +0 -0
  610. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_filelock.py +0 -0
  611. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  612. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_fix_of_force_override.py +0 -0
  613. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_fleet_config_health.py +0 -0
  614. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_fleet_health_probes.py +0 -0
  615. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_fleet_health_snapshot.py +0 -0
  616. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_freshness.py +0 -0
  617. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_gate_a.py +0 -0
  618. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_gate_b.py +0 -0
  619. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_gate_snapshot_staleness.py +0 -0
  620. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_gates.py +0 -0
  621. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_generated_types_fixture.py +0 -0
  622. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_github_ops.py +0 -0
  623. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_goal.py +0 -0
  624. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_graph_health.py +0 -0
  625. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_handoff.py +0 -0
  626. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_health_checks.py +0 -0
  627. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_health_cli.py +0 -0
  628. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_health_cli_graph.py +0 -0
  629. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_health_config.py +0 -0
  630. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_health_context.py +0 -0
  631. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_health_deploy_lane_facts.py +0 -0
  632. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_health_incident_regression.py +0 -0
  633. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_health_pypi.py +0 -0
  634. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_health_registry.py +0 -0
  635. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_health_timer_active.py +0 -0
  636. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_health_toolchain.py +0 -0
  637. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_health_unit_drift.py +0 -0
  638. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_health_unit_enablement.py +0 -0
  639. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_hooks.py +0 -0
  640. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_human_attended_437.py +0 -0
  641. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_init.py +0 -0
  642. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_integration.py +0 -0
  643. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_interactive_briefing_echo.py +0 -0
  644. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_interactive_prefill_state.py +0 -0
  645. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_interactive_session_relaunch.py +0 -0
  646. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_interactive_test_verdict_backstop.py +0 -0
  647. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_interactive_token_attribution.py +0 -0
  648. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_interactive_worktree.py +0 -0
  649. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_issue_store_seam.py +0 -0
  650. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_liveness_auditor.py +0 -0
  651. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_liveness_notify.py +0 -0
  652. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_machine_pause.py +0 -0
  653. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_merge_queue.py +0 -0
  654. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_merge_verify.py +0 -0
  655. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_milestone_chat.py +0 -0
  656. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_milestone_dispatch.py +0 -0
  657. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_milestone_gate.py +0 -0
  658. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_milestone_order.py +0 -0
  659. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_milestone_seam.py +0 -0
  660. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_mock_author.py +0 -0
  661. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_model_tiering.py +0 -0
  662. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_models.py +0 -0
  663. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_models_config_labels.py +0 -0
  664. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_needs_attention.py +0 -0
  665. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_network.py +0 -0
  666. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_new_issue_chat.py +0 -0
  667. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_next_release_tag.py +0 -0
  668. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_no_direct_gh_calls.py +0 -0
  669. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_node_shim.py +0 -0
  670. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_notifier_baseline.py +0 -0
  671. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_notifier_cli.py +0 -0
  672. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_notifier_collect.py +0 -0
  673. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_notifier_config.py +0 -0
  674. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_notifier_drive_seam.py +0 -0
  675. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_notifier_isolation.py +0 -0
  676. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_notifier_predicate.py +0 -0
  677. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_notifier_quiet_hours.py +0 -0
  678. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_notifier_service.py +0 -0
  679. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_notify.py +0 -0
  680. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_notify_drain.py +0 -0
  681. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_openapi.py +0 -0
  682. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_operational_defaults.py +0 -0
  683. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_overlap_fence.py +0 -0
  684. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_packaged_deploy_units.py +0 -0
  685. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_parentage.py +0 -0
  686. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_paste_landed.py +0 -0
  687. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_pipeline.py +0 -0
  688. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_plan_followup_approve_plan_command.py +0 -0
  689. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_plan_followup_pr_command.py +0 -0
  690. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_plan_followup_review_command.py +0 -0
  691. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_plan_only.py +0 -0
  692. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_plan_parser.py +0 -0
  693. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_platform_paths.py +0 -0
  694. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_portal_bridge.py +0 -0
  695. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_portal_config.py +0 -0
  696. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_pr_body_lint.py +0 -0
  697. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_prereqs.py +0 -0
  698. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_production_db_guard.py +0 -0
  699. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_progress.py +0 -0
  700. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_provider_seam.py +0 -0
  701. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_providers.py +0 -0
  702. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_providers_config_labels.py +0 -0
  703. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_providers_pty.py +0 -0
  704. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_quiet_hours.py +0 -0
  705. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_quiet_hours_store_2146.py +0 -0
  706. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_reap_merged_sessions.py +0 -0
  707. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_reap_stale_interactive_tick.py +0 -0
  708. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_reconcile_branch.py +0 -0
  709. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_reconcile_completions.py +0 -0
  710. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_reconcile_merges.py +0 -0
  711. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_reconcile_usage_limit_done.py +0 -0
  712. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_refine_chat.py +0 -0
  713. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_release_cordon_2101.py +0 -0
  714. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_release_propagate.py +0 -0
  715. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_release_unified_1242.py +0 -0
  716. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_release_verify.py +0 -0
  717. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_release_window.py +0 -0
  718. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_remote_auto_prune.py +0 -0
  719. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_remote_interactive_reaper.py +0 -0
  720. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_report_result_push.py +0 -0
  721. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_reports.py +0 -0
  722. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_retry.py +0 -0
  723. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_retry_advisory_1606.py +0 -0
  724. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_retry_type_1636.py +0 -0
  725. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_revalidate.py +0 -0
  726. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_review.py +0 -0
  727. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_review_end_review_without_verdict.py +0 -0
  728. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_review_parse_failure_diagnostic.py +0 -0
  729. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_review_reaffirm.py +0 -0
  730. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_review_state.py +0 -0
  731. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_review_verdict_backstop.py +0 -0
  732. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_review_verdict_override_audit.py +0 -0
  733. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_review_verdict_relay.py +0 -0
  734. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_review_zero_commits.py +0 -0
  735. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_scoped_review_wiring.py +0 -0
  736. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_scorecard.py +0 -0
  737. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_serve.py +0 -0
  738. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_serve_app_board_trim.py +0 -0
  739. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_session.py +0 -0
  740. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_slice_issue_attribution.py +0 -0
  741. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_smoke.py +0 -0
  742. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_smoke_live_checkout_restore.py +0 -0
  743. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_smoke_workflow.py +0 -0
  744. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_spend_ceiling.py +0 -0
  745. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_spend_ceiling_coordinator.py +0 -0
  746. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_split.py +0 -0
  747. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_split_work.py +0 -0
  748. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_stage_projection.py +0 -0
  749. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_stalled_pipeline.py +0 -0
  750. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_state.py +0 -0
  751. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_state_review_findings_daemon.py +0 -0
  752. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_status_fleet_footer.py +0 -0
  753. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_stop_1567.py +0 -0
  754. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_stuck.py +0 -0
  755. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_terminal_command.py +0 -0
  756. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_test_author.py +0 -0
  757. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_test_chat.py +0 -0
  758. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_test_orchestrator.py +0 -0
  759. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_test_report.py +0 -0
  760. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_test_verdict_parsing.py +0 -0
  761. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_test_verdict_transcript_floor.py +0 -0
  762. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_thin_client_board_audit.py +0 -0
  763. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_thin_client_config_load_1080.py +0 -0
  764. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_thin_client_daemon_routing_906.py +0 -0
  765. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_tmux_host.py +0 -0
  766. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_tmux_session.py +0 -0
  767. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_transcript_floor.py +0 -0
  768. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_usage.py +0 -0
  769. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_usage_limits.py +0 -0
  770. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_usage_rollup.py +0 -0
  771. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_venv_live_install_2121.py +0 -0
  772. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_version_single_source.py +0 -0
  773. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_watch.py +0 -0
  774. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_worker_events.py +0 -0
  775. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_worker_image_pin_sync.py +0 -0
  776. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_worker_safety.py +0 -0
  777. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_worker_test_scoping.py +0 -0
  778. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_worktree.py +0 -0
  779. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  780. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/Cargo.lock +0 -0
  781. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/Cargo.toml +0 -0
  782. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/cargo-config-local-quadraui.toml.example +0 -0
  783. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/app/audit.rs +0 -0
  784. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/app/chat.rs +0 -0
  785. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/app/data.rs +0 -0
  786. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/app/dialogs.rs +0 -0
  787. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/app/drive.rs +0 -0
  788. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/app/drive_queue.rs +0 -0
  789. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/app/escalation.rs +0 -0
  790. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/app/events.rs +0 -0
  791. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/app/fixtures.rs +0 -0
  792. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/app/fleet_health.rs +0 -0
  793. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/app/fleet_sessions.rs +0 -0
  794. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/app/fleet_terminals.rs +0 -0
  795. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/app/format.rs +0 -0
  796. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/app/milestone_dag.rs +0 -0
  797. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/app/mod.rs +0 -0
  798. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/app/msv.rs +0 -0
  799. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/app/pipeline.rs +0 -0
  800. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/app/plans.rs +0 -0
  801. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/app/render.rs +0 -0
  802. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/app/reports.rs +0 -0
  803. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/app/sessions.rs +0 -0
  804. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/app/settings_ui.rs +0 -0
  805. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/app/sidebar.rs +0 -0
  806. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/app/terminal.rs +0 -0
  807. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/app/tests.rs +0 -0
  808. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/app/types.rs +0 -0
  809. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/app/workspace.rs +0 -0
  810. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/bin/gtk.rs +0 -0
  811. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/commands.rs +0 -0
  812. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/lib.rs +0 -0
  813. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/main.rs +0 -0
  814. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/src/settings.rs +0 -0
  815. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/tests/acceptance.rs +0 -0
  816. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/tui/tests/cli.rs +0 -0
  817. {code_coordinator-0.5.66 → code_coordinator-0.5.67}/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.66
3
+ Version: 0.5.67
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
@@ -101,6 +101,7 @@ Every issue moves through four gated stages:
101
101
 
102
102
  Two rules shape the flow:
103
103
 
104
+ - **A green Test verdict is only worth the suite behind it.** The Test stage runs `repos[].ci_command` when set, else `smoke_tests.default_command`, else `repos[].test_command`. If CI runs a *wider* suite than the gate does, "Test passed" means "some tests passed", not "the branch is good" — declare `ci_command` so the two agree (#2091). `dispatch_smoke` logs a warning for any GitHub-backed repo that hasn't.
104
105
  - **Test precedes Review.** The smoke test runs *before* the PR/review — the natural order. Review auto-dispatch is **held** until the work has a `passed`/`skipped` Test verdict. A work item left at *Pending Test* gets no review, so it never merges — this is the single most common reason a story silently stalls. Record the verdict with `coord test <id> --passed|--skipped|--fail`, or the **P / S / F** keys on the Test stage in the TUI. The displayed stage order and this gate both come from `pipeline.default_gates` in `coordinator.yml` (default `[test, review, merge]`).
105
106
  - **A failed test routes exactly like a request-changes review.** Both drop the issue back to a fix on the *same* branch (`coord fix`, or the interactive `--fix-of`), never an orphan.
106
107
 
@@ -427,6 +428,7 @@ repos:
427
428
  develop_branch: develop # opt in to the milestone feature-branch model (see Milestones)
428
429
  build_command: "npm run build"
429
430
  test_command: "npm test"
431
+ ci_command: "npm run test:e2e" # what CI actually runs — the Test gate prefers this (#2091)
430
432
  artifact_paths: # stash built binaries so `coord pull-artifact` can rsync them
431
433
  - dist/
432
434
 
@@ -61,6 +61,7 @@ Every issue moves through four gated stages:
61
61
 
62
62
  Two rules shape the flow:
63
63
 
64
+ - **A green Test verdict is only worth the suite behind it.** The Test stage runs `repos[].ci_command` when set, else `smoke_tests.default_command`, else `repos[].test_command`. If CI runs a *wider* suite than the gate does, "Test passed" means "some tests passed", not "the branch is good" — declare `ci_command` so the two agree (#2091). `dispatch_smoke` logs a warning for any GitHub-backed repo that hasn't.
64
65
  - **Test precedes Review.** The smoke test runs *before* the PR/review — the natural order. Review auto-dispatch is **held** until the work has a `passed`/`skipped` Test verdict. A work item left at *Pending Test* gets no review, so it never merges — this is the single most common reason a story silently stalls. Record the verdict with `coord test <id> --passed|--skipped|--fail`, or the **P / S / F** keys on the Test stage in the TUI. The displayed stage order and this gate both come from `pipeline.default_gates` in `coordinator.yml` (default `[test, review, merge]`).
65
66
  - **A failed test routes exactly like a request-changes review.** Both drop the issue back to a fix on the *same* branch (`coord fix`, or the interactive `--fix-of`), never an orphan.
66
67
 
@@ -387,6 +388,7 @@ repos:
387
388
  develop_branch: develop # opt in to the milestone feature-branch model (see Milestones)
388
389
  build_command: "npm run build"
389
390
  test_command: "npm test"
391
+ ci_command: "npm run test:e2e" # what CI actually runs — the Test gate prefers this (#2091)
390
392
  artifact_paths: # stash built binaries so `coord pull-artifact` can rsync them
391
393
  - dist/
392
394
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.66
3
+ Version: 0.5.67
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
@@ -101,6 +101,7 @@ Every issue moves through four gated stages:
101
101
 
102
102
  Two rules shape the flow:
103
103
 
104
+ - **A green Test verdict is only worth the suite behind it.** The Test stage runs `repos[].ci_command` when set, else `smoke_tests.default_command`, else `repos[].test_command`. If CI runs a *wider* suite than the gate does, "Test passed" means "some tests passed", not "the branch is good" — declare `ci_command` so the two agree (#2091). `dispatch_smoke` logs a warning for any GitHub-backed repo that hasn't.
104
105
  - **Test precedes Review.** The smoke test runs *before* the PR/review — the natural order. Review auto-dispatch is **held** until the work has a `passed`/`skipped` Test verdict. A work item left at *Pending Test* gets no review, so it never merges — this is the single most common reason a story silently stalls. Record the verdict with `coord test <id> --passed|--skipped|--fail`, or the **P / S / F** keys on the Test stage in the TUI. The displayed stage order and this gate both come from `pipeline.default_gates` in `coordinator.yml` (default `[test, review, merge]`).
105
106
  - **A failed test routes exactly like a request-changes review.** Both drop the issue back to a fix on the *same* branch (`coord fix`, or the interactive `--fix-of`), never an orphan.
106
107
 
@@ -427,6 +428,7 @@ repos:
427
428
  develop_branch: develop # opt in to the milestone feature-branch model (see Milestones)
428
429
  build_command: "npm run build"
429
430
  test_command: "npm test"
431
+ ci_command: "npm run test:e2e" # what CI actually runs — the Test gate prefers this (#2091)
430
432
  artifact_paths: # stash built binaries so `coord pull-artifact` can rsync them
431
433
  - dist/
432
434
 
@@ -451,6 +451,7 @@ tests/test_bug_intake.py
451
451
  tests/test_build_worker_image_env_update.py
452
452
  tests/test_cargo_cache.py
453
453
  tests/test_ci_acceptance_gate_1950.py
454
+ tests/test_ci_parity_2091.py
454
455
  tests/test_ci_store.py
455
456
  tests/test_claim.py
456
457
  tests/test_cli_acceptance.py
@@ -481,6 +481,7 @@
481
481
  "tests/test_build_worker_image_env_update.py",
482
482
  "tests/test_cargo_cache.py",
483
483
  "tests/test_ci_acceptance_gate_1950.py",
484
+ "tests/test_ci_parity_2091.py",
484
485
  "tests/test_ci_store.py",
485
486
  "tests/test_claim.py",
486
487
  "tests/test_cli_acceptance.py",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.66",
2
+ "tag": "0.5.67",
3
3
  "distance": 0,
4
- "node": "g2a4b596d92f5df37f20c5e4da4b887658112a74f",
4
+ "node": "g24273de7c436f9fc913f05fd3536c014eca80c25",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-14"
@@ -5,6 +5,7 @@ from __future__ import annotations
5
5
 
6
6
  import sys
7
7
  import time
8
+ from dataclasses import dataclass
8
9
  from pathlib import Path
9
10
 
10
11
  import click
@@ -470,7 +471,69 @@ def review(assignment_id: str, config_path: Path) -> None:
470
471
  click.echo(f" pr: {assignment.pr_url}")
471
472
 
472
473
 
473
- def _ci_failure_story(cfg: Config, assignment) -> str | None:
474
+ @dataclass(frozen=True)
475
+ class CiRead:
476
+ """#2091: the outcome of the live-CI read, with "did not read" separated
477
+ from "read it, it was green".
478
+
479
+ Before #2091 this path collapsed both into a bare ``None``, and the
480
+ refusal message told the operator only that no red CI was found. In
481
+ coord-portal #14 the PR *was* red (``gh pr checks 42`` said so) — the
482
+ read had simply never happened, and the operator was left to guess which
483
+ of six silent short-circuits fired. ``unread_reason`` names it.
484
+
485
+ Invariants:
486
+
487
+ * ``story`` set → CI was read and is RED.
488
+ * ``story is None`` and no ``unread_reason`` → CI was read, nothing red.
489
+ * ``unread_reason`` set → **no read happened**; this is
490
+ not evidence of green, and callers must say so out loud.
491
+ """
492
+
493
+ story: str | None = None
494
+ unread_reason: str | None = None
495
+ pr_number: int | None = None
496
+
497
+ @property
498
+ def is_red(self) -> bool:
499
+ return self.story is not None
500
+
501
+ @property
502
+ def was_read(self) -> bool:
503
+ return self.unread_reason is None
504
+
505
+
506
+ def _resolve_pr_number(repo_github: str, assignment) -> int | None:
507
+ """PR number for *assignment*, from its ``pr_url`` or (#2091) its branch.
508
+
509
+ The stored ``pr_url`` is missing on any row whose PR was opened out of
510
+ band, or that predates PR creation — and that alone used to silently
511
+ disable the whole live-CI fallback. Fall back to asking GitHub which PR
512
+ has this branch as its head, which is the same question ``gh pr checks``
513
+ answers from a checkout.
514
+ """
515
+ from coord.drive import _extract_pr_number
516
+
517
+ pr_number = _extract_pr_number(getattr(assignment, "pr_url", None) or "")
518
+ if pr_number is not None:
519
+ return pr_number
520
+
521
+ branch = getattr(assignment, "branch", None)
522
+ if not branch:
523
+ return None
524
+ try:
525
+ from coord import github_ops # noqa: PLC0415
526
+
527
+ pr = github_ops.find_pr_for_branch(repo_github, branch)
528
+ except Exception: # noqa: BLE001 — advisory lookup, never fatal
529
+ return None
530
+ if not isinstance(pr, dict):
531
+ return None
532
+ number = pr.get("number")
533
+ return number if isinstance(number, int) else None
534
+
535
+
536
+ def _read_ci(cfg: Config, assignment) -> CiRead:
474
537
  """#1622 (part 3): a rendered summary of *assignment*'s FAILED CI checks.
475
538
 
476
539
  The third legitimate fix trigger, alongside a request-changes review and a
@@ -479,37 +542,70 @@ def _ci_failure_story(cfg: Config, assignment) -> str | None:
479
542
  checkout — and the fix has to land on the *existing* branch, because the
480
543
  thing being fixed is what gates the merge.
481
544
 
482
- Read-only and fail-quiet: returns ``None`` when CI is not configured
483
- (``ci_store.type: none`` :class:`coord.ci_store.NoOpCi`, whose
484
- ``is_available`` is False), when the branch has no PR to read checks for,
485
- when the read raises, or when every completed check is affirmatively
486
- passing. ``None`` therefore means "no CI evidence of a failure", never
487
- "CI is green" — the caller must not treat it as a verdict.
545
+ Read-only and fail-quiet, but no longer fail-*silent* (#2091): every path
546
+ that declines to read returns a :class:`CiRead` carrying the reason, so
547
+ the caller can distinguish "CI is green" from "nobody looked".
488
548
  """
489
549
  from coord.ci_store import build_ci_store, failed_checks, summarize
490
- from coord.drive import _extract_pr_number
491
550
 
492
551
  repo = cfg.repo(assignment.repo_name)
493
- if repo is None or not repo.github:
494
- return None
495
-
496
- pr_number = _extract_pr_number(assignment.pr_url or "")
497
- if pr_number is None:
498
- return None
552
+ if repo is None:
553
+ return CiRead(unread_reason=f"repo {assignment.repo_name!r} is not in coordinator.yml")
554
+ if not repo.github:
555
+ return CiRead(
556
+ unread_reason=f"repo {repo.name!r} has no `github:` slug configured"
557
+ )
499
558
 
559
+ # Availability first (#2091): `_resolve_pr_number`'s branch fallback can
560
+ # shell out to `gh`, and there is no point paying for that when the store
561
+ # will refuse to read anything anyway.
500
562
  store = build_ci_store(cfg.ci_store.type)
501
563
  if not store.is_available:
502
- return None
564
+ return CiRead(
565
+ unread_reason=(
566
+ f"ci_store.type is {cfg.ci_store.type!r}, so live CI is never "
567
+ "read — set it to 'github' in coordinator.yml"
568
+ ),
569
+ )
570
+
571
+ pr_number = _resolve_pr_number(repo.github, assignment)
572
+ if pr_number is None:
573
+ return CiRead(
574
+ unread_reason=(
575
+ "no PR could be resolved for this row (its `pr_url` is empty "
576
+ f"and no open PR has head branch {getattr(assignment, 'branch', None)!r})"
577
+ )
578
+ )
503
579
 
504
580
  try:
505
581
  checks = store.list_checks_for_pr(repo.github, pr_number)
506
582
  except Exception as exc: # noqa: BLE001 — CI read is advisory, never fatal
507
583
  click.echo(f"warning: could not read CI checks for PR #{pr_number}: {exc}", err=True)
508
- return None
584
+ return CiRead(
585
+ pr_number=pr_number,
586
+ unread_reason=f"the CI read for PR #{pr_number} raised: {exc}",
587
+ )
588
+
589
+ if not checks:
590
+ return CiRead(
591
+ pr_number=pr_number,
592
+ unread_reason=f"PR #{pr_number} reported no checks at all",
593
+ )
509
594
 
510
595
  failed = failed_checks(checks)
511
596
  if not failed:
512
- return None
597
+ # A genuine read that found nothing red. Note this still includes the
598
+ # case where every check is *pending* — `failed_checks` only considers
599
+ # completed ones — so say which, rather than implying a settled green.
600
+ if not any(c.status == "completed" for c in checks):
601
+ return CiRead(
602
+ pr_number=pr_number,
603
+ unread_reason=(
604
+ f"every check on PR #{pr_number} is still running "
605
+ f"({summarize(checks)}) — no completed verdict yet"
606
+ ),
607
+ )
608
+ return CiRead(pr_number=pr_number)
513
609
 
514
610
  lines = [
515
611
  f"CI on PR #{pr_number} is RED ({summarize(checks)}).",
@@ -525,7 +621,7 @@ def _ci_failure_story(cfg: Config, assignment) -> str | None:
525
621
  "reproduce locally where you can, and fix the root cause on THIS "
526
622
  "branch — a new branch would not carry the change CI is gating on.",
527
623
  ]
528
- return "\n".join(lines)
624
+ return CiRead(story="\n".join(lines), pr_number=pr_number)
529
625
 
530
626
 
531
627
  def _fix_from_review(
@@ -695,8 +791,10 @@ def _fix_from_review(
695
791
  "work that ran under claude-pty, or (#2051) dispatch a WORK-row fix "
696
792
  "when neither the test verdict nor a live CI read shows a failure — "
697
793
  "for when the caller knows the PR is red but the check missed it "
698
- "(ci_store not configured, a transient read error). Does NOT override "
699
- "max_review_iterations or the #522 terminal-work guard."
794
+ "(ci_store not configured, a transient read error). Since #2091 the "
795
+ "refusal names which of those it was, so check the `note:` line "
796
+ "before reaching for this. Does NOT override max_review_iterations "
797
+ "or the #522 terminal-work guard."
700
798
  ),
701
799
  )
702
800
  def fix(assignment_id: str, config_path: Path, guidance: str, force: bool) -> None:
@@ -729,17 +827,37 @@ def fix(assignment_id: str, config_path: Path, guidance: str, force: bool) -> No
729
827
  # #1622 (part 3): red CI is the third trigger. Only consulted when the
730
828
  # local test gate has NOT already failed, so the cheap in-DB path stays
731
829
  # zero-I/O and the existing failure story keeps priority.
732
- ci_story = None if test_failed else _ci_failure_story(cfg, assignment)
830
+ ci_read = CiRead() if test_failed else _read_ci(cfg, assignment)
831
+ ci_story = ci_read.story
832
+
833
+ # #2091: the stored Test verdict says PASSED while the branch's live CI
834
+ # says RED — the coord-portal #14 shape. Both are "the tests", and they
835
+ # disagree; that is a fact about the Test gate (it ran a narrower suite
836
+ # than CI), not a detail of this dispatch, so name it rather than
837
+ # quietly preferring one.
838
+ if ci_read.is_red and (
839
+ assignment.test_state == "passed" or assignment.smoke_test == "pass"
840
+ ):
841
+ stored_verdict = assignment.test_state or assignment.smoke_test
842
+ click.echo(
843
+ f"conflict (#2091): assignment {assignment_id} has a stored Test "
844
+ f"verdict of {stored_verdict!r} "
845
+ f"but CI on PR #{ci_read.pr_number} is RED on the same branch. "
846
+ "The Test stage ran a narrower suite than CI — set "
847
+ f"repos[{assignment.repo_name}].ci_command to what CI runs so "
848
+ "the gate stops reporting green on a red branch.",
849
+ err=True,
850
+ )
733
851
 
734
852
  # #2051: none of the three doors (failed test verdict, red CI, or the
735
- # review-id door handled above) is open. `_ci_failure_story` is
736
- # read-only and fail-quiet (see its docstring) — it returns `None` for
737
- # "no evidence of a failure", never "CI is green" — so a caller who
738
- # KNOWS the PR is red (ci_store not configured for this repo, a
739
- # transient GitHub API error, a check that hasn't reported yet) would
740
- # otherwise be stranded with no headless door onto the ORIGINAL branch.
741
- # `--force` is that caller's release valve; it is NOT a way to skip the
742
- # #555 / #522 / max_review_iterations guards, which sit elsewhere.
853
+ # review-id door handled above) is open. `_read_ci` is read-only and
854
+ # fail-quiet (see :class:`CiRead`) — a missing story means "no CI
855
+ # evidence of a failure", never "CI is green" — so a caller who KNOWS
856
+ # the PR is red (ci_store not configured for this repo, a transient
857
+ # GitHub API error, a check that hasn't reported yet) would otherwise be
858
+ # stranded with no headless door onto the ORIGINAL branch. `--force` is
859
+ # that caller's release valve; it is NOT a way to skip the #555 / #522 /
860
+ # max_review_iterations guards, which sit elsewhere.
743
861
  forced_without_evidence = False
744
862
  if not test_failed and ci_story is None:
745
863
  if not force:
@@ -752,6 +870,23 @@ def fix(assignment_id: str, config_path: Path, guidance: str, force: bool) -> No
752
870
  "with --force.",
753
871
  err=True,
754
872
  )
873
+ # #2091: say WHY there is no CI evidence. Before this, six
874
+ # distinct short-circuits (unconfigured ci_store, a row with no
875
+ # pr_url, an unknown repo, ...) were all indistinguishable from
876
+ # "CI is green", so an operator staring at a red `gh pr checks`
877
+ # had no way to tell that the documented fallback never ran.
878
+ if not ci_read.was_read:
879
+ click.echo(
880
+ " note: live CI was NOT read for this row, so this is "
881
+ f"not a green-CI finding — {ci_read.unread_reason}.",
882
+ err=True,
883
+ )
884
+ elif ci_read.pr_number is not None:
885
+ click.echo(
886
+ f" note: live CI on PR #{ci_read.pr_number} was read and "
887
+ "reported no failing completed check.",
888
+ err=True,
889
+ )
755
890
  sys.exit(1)
756
891
  if not guidance:
757
892
  # There's no failed verdict, CI read, or test-output file to
@@ -1880,6 +1880,17 @@ def _parse_repos(raw: Any) -> list[Repo]:
1880
1880
  test_command = entry.get("test_command")
1881
1881
  if test_command is not None and not isinstance(test_command, str):
1882
1882
  raise ConfigError(f"repos[{i}].test_command must be a string")
1883
+ # #2091: ci_command — the command this repo's CI actually runs. The
1884
+ # Test stage prefers it over `test_command` so a green Test verdict
1885
+ # is CI-equivalent instead of "some subset of CI passed".
1886
+ ci_command = entry.get("ci_command")
1887
+ if ci_command is not None and not isinstance(ci_command, str):
1888
+ raise ConfigError(f"repos[{i}].ci_command must be a string")
1889
+ if isinstance(ci_command, str) and not ci_command.strip():
1890
+ raise ConfigError(
1891
+ f"repos[{i}].ci_command must be a non-empty string (omit the "
1892
+ "key entirely to fall back to test_command)"
1893
+ )
1883
1894
  # #296: run_cmd — optional shell command to launch the app for manual
1884
1895
  # smoke testing. Surfaced in the TUI Test stage detail panel.
1885
1896
  run_cmd = entry.get("run_cmd")
@@ -1933,6 +1944,7 @@ def _parse_repos(raw: Any) -> list[Repo]:
1933
1944
  develop_branch=develop_branch,
1934
1945
  build_command=build_command,
1935
1946
  test_command=test_command,
1947
+ ci_command=ci_command,
1936
1948
  run_cmd=run_cmd,
1937
1949
  worker_permissions=worker_permissions,
1938
1950
  housekeeping=housekeeping,
@@ -56,6 +56,21 @@ class Repo:
56
56
  develop_branch: str | None = None
57
57
  build_command: str | None = None
58
58
  test_command: str | None = None
59
+ # #2091: the command this repo's CI actually runs — the "CI-equivalent"
60
+ # suite. The Test stage (`coord.smoke`) prefers this over
61
+ # `test_command`/`smoke_tests.default_command`, so a green Test verdict
62
+ # means the same thing a green CI run does.
63
+ #
64
+ # Why this is a SEPARATE field and not just "set test_command to the CI
65
+ # command": `test_command` is also what a human runs locally and what
66
+ # several narrower call sites use; it is routinely (and legitimately) a
67
+ # fast subset — coord-portal's was a ~2 min slice while CI ran a 45 min
68
+ # `npm run test:e2e` across two Playwright projects. That divergence is
69
+ # fine as long as the Test GATE runs the wider one, which is what this
70
+ # field declares. Leave it unset and the gate falls back to the old
71
+ # behaviour, but `dispatch_smoke` logs that the verdict it is about to
72
+ # produce is narrower than CI (see `resolve_smoke_command`).
73
+ ci_command: str | None = None
59
74
  # #296: optional shell command to interactively run the app for manual
60
75
  # smoke testing. Surfaced in the TUI Test stage detail panel so the
61
76
  # tester knows exactly what to launch.
@@ -656,7 +656,20 @@ def revalidate(
656
656
  ok=False, kind=KIND_SETUP,
657
657
  reason=f"no repo config for {repo_name!r}",
658
658
  )
659
- test_command = repo_cfg.test_command
659
+ # #2091: revalidation WRITES a test verdict, so it is bound by the same
660
+ # rule as the Test stage — a verdict is only worth what the suite behind
661
+ # it is worth. When the repo declares what CI runs, re-verify with THAT;
662
+ # otherwise nothing changes (`ci_command` is unset for every repo that
663
+ # has not opted in). Deliberately narrower than
664
+ # `coord.smoke.resolve_smoke_command`: this path has never consulted
665
+ # `smoke_tests.default_command` and #2091 is not the issue to change that.
666
+ # `getattr`: *config* here is duck-typed (`coord merge --revalidate` passes
667
+ # the real Config; tests and the daemon pass lighter stand-ins), so a
668
+ # hard attribute read would turn a missing shim into an AttributeError
669
+ # mid-revalidation.
670
+ test_command = (
671
+ getattr(repo_cfg, "ci_command", None) or ""
672
+ ).strip() or repo_cfg.test_command
660
673
  if not test_command:
661
674
  # Refusing here is the safe direction: with nothing to run, "passed"
662
675
  # would be a claim about a suite that never executed — the exact lie
@@ -378,6 +378,75 @@ def _capability_probe_reasons(
378
378
  return unmet_capabilities(required_caps, probes)
379
379
 
380
380
 
381
+ # ── CI-equivalence of the Test-stage command (#2091) ────────────────────────
382
+
383
+
384
+ @dataclass(frozen=True)
385
+ class SmokeCommand:
386
+ """Which command the Test stage will run, and how faithful it is to CI.
387
+
388
+ #2091: the Test verdict is what gates review and merge, so what it
389
+ *means* depends entirely on which suite produced it. coord-portal #14
390
+ recorded ``test_passed`` in 1m51s on a commit whose CI failed
391
+ deterministically after 44m57s — the gate simply never ran the suite
392
+ (``npm run test:e2e``) that catches it. Resolution is therefore no
393
+ longer an anonymous ``a or b``: the chosen command carries its
394
+ provenance so callers can say out loud whether a green verdict is
395
+ CI-equivalent or merely "some tests passed".
396
+
397
+ ``ci_equivalent`` is a *declaration*, not a proof — it is True exactly
398
+ when the operator pointed ``repos[].ci_command`` at what CI runs. It
399
+ can still be a lie if the config drifts from the workflow file; what it
400
+ buys is that the un-declared case stops looking identical to the
401
+ declared one.
402
+ """
403
+
404
+ command: str | None
405
+ source: str
406
+ ci_equivalent: bool
407
+
408
+ def briefing_note(self) -> str:
409
+ """One line for the smoke agent's briefing naming the command's origin."""
410
+ if self.ci_equivalent:
411
+ return (
412
+ f"- Suite: `{self.source}` — this is the repo's declared "
413
+ "CI-equivalent command, so this verdict carries the same "
414
+ "weight as a CI run."
415
+ )
416
+ return (
417
+ f"- Suite: `{self.source}` — this repo has not declared a "
418
+ "`ci_command`, so this run may be NARROWER than CI (#2091). "
419
+ "Passing here does not prove CI is green."
420
+ )
421
+
422
+
423
+ def resolve_smoke_command(repo, smoke_cfg: SmokeTestsConfig) -> SmokeCommand:
424
+ """Pick the Test-stage command for *repo*, best (most CI-faithful) first.
425
+
426
+ Precedence, deliberately with the per-repo CI declaration on top:
427
+
428
+ 1. ``repos[].ci_command`` — what this repo's CI actually runs (#2091).
429
+ 2. ``smoke_tests.default_command`` — the fleet-wide fallback.
430
+ 3. ``repos[].test_command`` — the local/quick suite.
431
+
432
+ ``smoke_tests.default_command`` outranking ``test_command`` is the
433
+ pre-existing #1021 behaviour and is preserved; ``ci_command`` is inserted
434
+ *above* both because a global default cannot possibly be more faithful to
435
+ one repo's CI than that repo's own declaration.
436
+ """
437
+ ci_command = (getattr(repo, "ci_command", None) or "").strip() or None
438
+ if ci_command:
439
+ return SmokeCommand(ci_command, f"repos[{repo.name}].ci_command", True)
440
+ if smoke_cfg.default_command:
441
+ return SmokeCommand(
442
+ smoke_cfg.default_command, "smoke_tests.default_command", False
443
+ )
444
+ test_command = getattr(repo, "test_command", None)
445
+ if test_command:
446
+ return SmokeCommand(test_command, f"repos[{repo.name}].test_command", False)
447
+ return SmokeCommand(None, "unconfigured", False)
448
+
449
+
381
450
  # ── Briefing ────────────────────────────────────────────────────────────────
382
451
 
383
452
 
@@ -392,6 +461,7 @@ def build_smoke_briefing(
392
461
  required_caps: list[str],
393
462
  timeout_seconds: int,
394
463
  is_worker: bool,
464
+ command_source: SmokeCommand | None = None,
395
465
  ) -> str:
396
466
  lines: list[str] = []
397
467
  lines.append(f"# Smoke test: {repo_github} branch `{branch}`")
@@ -403,6 +473,11 @@ def build_smoke_briefing(
403
473
  lines.append("## Context")
404
474
  lines.append(f"- Repo: {repo_github} (local name: {repo_name})")
405
475
  lines.append(f"- Branch: {branch}")
476
+ if command_source is not None:
477
+ # #2091: name the suite's provenance so a reader of the transcript can
478
+ # tell a CI-equivalent green from a narrower one without going back to
479
+ # coordinator.yml.
480
+ lines.append(command_source.briefing_note())
406
481
  if required_caps:
407
482
  lines.append(f"- Required capabilities: {', '.join(required_caps)}")
408
483
  if is_worker:
@@ -716,7 +791,10 @@ def dispatch_smoke(
716
791
 
717
792
  touched = diff_lookup(repo.github, completed.branch)
718
793
  required_caps = match_rules(touched, smoke_cfg.capability_rules)
719
- smoke_command = smoke_cfg.default_command or repo.test_command
794
+ # #2091: resolve *with* provenance — the Test verdict this dispatch will
795
+ # produce is only as meaningful as the suite behind it.
796
+ resolved = resolve_smoke_command(repo, smoke_cfg)
797
+ smoke_command = resolved.command
720
798
 
721
799
  if not required_caps:
722
800
  # #1426: a capability-rule miss used to mean "skip silently" — the
@@ -746,13 +824,31 @@ def dispatch_smoke(
746
824
  if smoke_command is None:
747
825
  logger.warning(
748
826
  "dispatch_smoke: %s#%s needs capabilities %s but no smoke "
749
- "command is configured (smoke_tests.default_command or this "
750
- "repo's test_command) — skipping. Configure one so the Test "
751
- "stage stops silently no-oping for this repo.",
827
+ "command is configured (repos[].ci_command, "
828
+ "smoke_tests.default_command, or this repo's test_command) — "
829
+ "skipping. Configure one so the Test stage stops silently "
830
+ "no-oping for this repo.",
752
831
  completed.repo_name, completed.issue_number, required_caps,
753
832
  )
754
833
  return None
755
834
 
835
+ if not resolved.ci_equivalent and repo.github:
836
+ # #2091: the repo HAS CI (it has a `github:` slug, so a PR gets
837
+ # checks) but has not declared what CI runs, so the verdict this
838
+ # dispatch produces is "some tests passed", not "the branch is
839
+ # good". That is exactly the coord-portal #14 shape — a 1m51s green
840
+ # Test verdict on a commit whose 44m57s CI run was red — so say it
841
+ # once per dispatch rather than letting the gap stay invisible.
842
+ logger.warning(
843
+ "dispatch_smoke: %s#%s Test verdict will NOT be CI-equivalent — "
844
+ "running %s (%s) while CI runs whatever %s's workflows say. Set "
845
+ "repos[%s].ci_command to the command CI runs so a green Test "
846
+ "verdict means the branch is good, not just that a subset "
847
+ "passed (#2091).",
848
+ completed.repo_name, completed.issue_number,
849
+ smoke_command, resolved.source, repo.github, repo.name,
850
+ )
851
+
756
852
  # #1672: the FULL capability-matched candidate list, best first. Picking
757
853
  # one machine and giving up on it meant a single bad candidate ended the
758
854
  # whole Test stage — #1678, where the router re-chose the same unhealthy
@@ -823,6 +919,7 @@ def dispatch_smoke(
823
919
  required_caps=required_caps,
824
920
  timeout_seconds=smoke_cfg.timeout_seconds,
825
921
  is_worker=choice.is_worker,
922
+ command_source=resolved,
826
923
  )
827
924
 
828
925
  # #2168: pin the Test stage's model to avoid the agent falling
@@ -61,6 +61,23 @@ repos:
61
61
  # machine's repo_paths checkout needs a `quadraui` sibling directory —
62
62
  # true for every machine below (repo_paths list quadraui alongside it).
63
63
  test_command: "scripts/coord-test-runner.sh . --base-ref origin/main --repo code-coordinator"
64
+ # #2091: `ci_command` is the command THIS REPO'S CI actually runs. The
65
+ # Test stage prefers it over `test_command` (and over
66
+ # `smoke_tests.default_command`), so a green Test verdict means the same
67
+ # thing a green CI run does.
68
+ #
69
+ # Set it whenever CI runs a WIDER suite than `test_command` — that gap is
70
+ # a silent false green: coord-portal #14 recorded `test_passed` in 1m51s
71
+ # on a commit whose CI `npm run test:e2e` failed deterministically after
72
+ # 44m57s (36 mobile Playwright tests, every click ~70px off target). The
73
+ # Test verdict gates review and merge, so a gate running a strict subset
74
+ # of CI means "some tests passed", not "the branch is good".
75
+ #
76
+ # Leave it unset when `test_command` IS what CI runs — as here, where
77
+ # .github/workflows points at the same coord-test-runner.sh arms.
78
+ # `dispatch_smoke` logs a warning for any repo with a `github:` slug and
79
+ # no `ci_command`, naming the verdict as narrower than CI.
80
+ # ci_command: "npm run test:e2e"
64
81
  # artifact_paths: [] # no compiled binaries to stash for a Python package
65
82
 
66
83
  machines:
@@ -340,6 +340,41 @@ Two config keys are load-bearing for that, both on the **daemon host's**
340
340
  `scripts/coord-test-runner.sh`, because the repo is two codebases and a bare
341
341
  `pytest` or `cargo test` would run the wrong suite or miss half the diff.
342
342
 
343
+ **The Test gate is only as good as the command it runs (#2091).** The gate does
344
+ not discover a repo's CI; it runs whatever `coordinator.yml` names, and nothing
345
+ previously checked that against what CI runs. coord-portal #14 is the worked
346
+ example: the Test stage recorded `test_passed` in **1m51s** while CI's
347
+ `npm run test:e2e` on the *same commit* failed after **44m57s** — 36 `[mobile]`
348
+ Playwright tests, all deterministic, none of them in the suite the gate ran.
349
+ Because `pipeline.default_gates` puts Test *before* Review, that false green
350
+ green-lit broken code into review; only the separate CI check gate stopped the
351
+ merge.
352
+
353
+ Resolution order is now `repos[].ci_command` → `smoke_tests.default_command` →
354
+ `repos[].test_command`. **Set `ci_command` to the command your CI workflow
355
+ runs** whenever it is wider than `test_command` (which is legitimately a fast
356
+ local subset). `dispatch_smoke` logs a warning naming the gap for any repo with
357
+ a `github:` slug and no `ci_command`, and the smoke agent's briefing states
358
+ whether the run is CI-equivalent, so a transcript answers the question on its
359
+ own. `coord merge --revalidate` follows the same preference — a re-verify that
360
+ overwrote a verdict with a *narrower* suite would reintroduce the same lie.
361
+
362
+ The declaration is not proof: nothing diffs `ci_command` against
363
+ `.github/workflows/**`, so it can drift. What it buys is that the undeclared
364
+ case stops looking identical to the declared one.
365
+
366
+ **`coord fix` used to say "no red CI" when it never looked (#2091, same
367
+ episode).** The live-CI fallback short-circuits for six distinct reasons —
368
+ `ci_store.type: none`, a row with no `pr_url`, an unconfigured repo, a repo with
369
+ no `github:` slug, a read that raised, checks that are all still pending — and
370
+ every one of them used to render as the same refusal text as a genuinely green
371
+ PR. The refusal now names the short-circuit (`note: live CI was NOT read for
372
+ this row … because …`) and distinguishes it from `note: live CI on PR #N was
373
+ read and reported no failing completed check`. A row with no `pr_url` also falls
374
+ back to resolving the PR from its branch. If the stored verdict says `passed`
375
+ while the live read says RED, `coord fix` prints an explicit `conflict (#2091)`
376
+ line rather than silently preferring one.
377
+
343
378
  **A systemd user unit's PATH is not a login shell's (#1814).** `coord serve`
344
379
  runs as a systemd *user* unit, and `coord merge --revalidate` runs its composed
345
380
  suite inside that daemon process. systemd never sources `~/.profile`, so