code-coordinator 0.5.96__tar.gz → 0.5.97__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 (840) hide show
  1. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dead_end.py +36 -7
  5. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/notify.py +52 -17
  6. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/reconcile.py +20 -2
  7. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/smoke.py +163 -3
  8. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/stage_projection.py +10 -0
  9. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_dead_end.py +38 -0
  10. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_notify.py +289 -0
  11. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_smoke.py +234 -0
  12. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/.claude/commands/board.md +0 -0
  13. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/.claude/commands/complete-session.md +0 -0
  14. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/.claude/commands/coordinator.md +0 -0
  15. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/.githooks/_lib.sh +0 -0
  16. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/.githooks/post-checkout +0 -0
  17. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/.githooks/post-commit +0 -0
  18. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/.githooks/post-merge +0 -0
  19. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  20. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/.github/coord-ci-acceptance.yml +0 -0
  21. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/.github/workflows/auto-release.yml +0 -0
  22. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/.github/workflows/cargo-test.yml +0 -0
  23. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/.github/workflows/publish.yml +0 -0
  24. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/.github/workflows/release-tui.yml +0 -0
  25. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/.github/workflows/test.yml +0 -0
  26. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/.gitignore +0 -0
  27. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/CLAUDE.md +0 -0
  28. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/GOAL.md +0 -0
  29. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/LICENSE +0 -0
  30. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/MANIFEST.in +0 -0
  31. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/README.md +0 -0
  32. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/code_coordinator.egg-info/SOURCES.txt +0 -0
  33. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/code_coordinator.egg-info/dependency_links.txt +0 -0
  34. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/code_coordinator.egg-info/entry_points.txt +0 -0
  35. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/code_coordinator.egg-info/requires.txt +0 -0
  36. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/code_coordinator.egg-info/scm_file_list.json +0 -0
  37. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/code_coordinator.egg-info/top_level.txt +0 -0
  38. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/__init__.py +0 -0
  39. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/_board_mapping.py +0 -0
  40. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/acceptance.py +0 -0
  41. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/acceptance_drivers.py +0 -0
  42. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/agent.py +0 -0
  43. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/agent_app.py +0 -0
  44. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/agent_update.py +0 -0
  45. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/agents/opencode/.gitignore +0 -0
  46. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/agents/opencode/agents/work.md +0 -0
  47. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/agents/opencode/routing.jsonc +0 -0
  48. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/audit.py +0 -0
  49. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/auto_loop.py +0 -0
  50. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/block_log.py +0 -0
  51. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/board_bool_guard.py +0 -0
  52. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/board_service.py +0 -0
  53. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/board_wire.py +0 -0
  54. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/brain.py +0 -0
  55. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/branch_model.py +0 -0
  56. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/bug_intake.py +0 -0
  57. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/cargo_cache.py +0 -0
  58. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/ci_github.py +0 -0
  59. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/ci_store.py +0 -0
  60. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/claim.py +0 -0
  61. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/cli.py +0 -0
  62. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/client.py +0 -0
  63. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/__init__.py +0 -0
  64. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/_common.py +0 -0
  65. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/acceptance.py +0 -0
  66. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/agent_ops.py +0 -0
  67. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/audit.py +0 -0
  68. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/chat.py +0 -0
  69. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/dispatch.py +0 -0
  70. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/dispatch_workers.py +0 -0
  71. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/drive.py +0 -0
  72. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/drive_queue.py +0 -0
  73. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/gate_a.py +0 -0
  74. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/gates.py +0 -0
  75. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/issues.py +0 -0
  76. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/lifecycle.py +0 -0
  77. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/merge.py +0 -0
  78. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/milestone.py +0 -0
  79. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/plan_followup.py +0 -0
  80. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/plans.py +0 -0
  81. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/portal.py +0 -0
  82. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/release.py +0 -0
  83. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/repo.py +0 -0
  84. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/report.py +0 -0
  85. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/review.py +0 -0
  86. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/scorecard.py +0 -0
  87. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/sessions.py +0 -0
  88. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/setup.py +0 -0
  89. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/status.py +0 -0
  90. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/terminal.py +0 -0
  91. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/test_gate.py +0 -0
  92. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/commands/tui.py +0 -0
  93. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/comments.py +0 -0
  94. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/config.py +0 -0
  95. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/conflict_fix.py +0 -0
  96. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dao.py +0 -0
  97. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/__init__.py +0 -0
  98. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/fixture.py +0 -0
  99. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/index.html +0 -0
  100. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/server.py +0 -0
  101. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/terminal.py +0 -0
  102. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/.gitignore +0 -0
  103. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/components.json +0 -0
  104. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/dist/assets/Gallery-Cq84itDE.js +0 -0
  105. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  106. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/dist/assets/Terminal-DOXLcMue.js +0 -0
  107. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/dist/assets/index-DHn-RIJ8.js +0 -0
  108. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  109. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  110. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  111. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  112. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  113. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/dist/index.html +0 -0
  114. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  115. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/dist/sw.js +0 -0
  116. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  117. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  118. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  119. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  120. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  121. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  122. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  123. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  124. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  125. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  126. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/eslint.config.js +0 -0
  127. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/index.html +0 -0
  128. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  129. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/package-lock.json +0 -0
  130. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/package.json +0 -0
  131. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  132. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/playwright.config.ts +0 -0
  133. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/postcss.config.js +0 -0
  134. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  135. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  136. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  137. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/App.tsx +0 -0
  138. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/api/client.ts +0 -0
  139. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  140. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  141. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  142. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  143. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  144. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  145. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  146. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  147. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  148. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  149. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  150. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  151. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  152. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  153. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  154. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  155. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  156. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  157. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  158. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  159. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  160. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  161. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  162. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  163. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  164. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  165. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  166. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  167. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  168. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  169. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  170. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  171. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  172. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  173. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  174. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/index.css +0 -0
  175. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  176. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  177. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/main.tsx +0 -0
  178. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  179. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  180. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  181. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  182. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  183. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  184. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  185. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  186. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  187. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  188. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  189. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  190. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  191. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  192. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  193. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  194. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  195. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  196. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  197. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  198. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  199. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  200. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  201. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/tailwind.config.js +0 -0
  202. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/tsconfig.json +0 -0
  203. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  204. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dashboard/webapp/vite.config.ts +0 -0
  205. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/db.py +0 -0
  206. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/README.md +0 -0
  207. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-agent.service +0 -0
  208. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-db-backup.service +0 -0
  209. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-db-backup.sh +0 -0
  210. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-db-backup.timer +0 -0
  211. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-drive-queue.service +0 -0
  212. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-drive-queue.timer +0 -0
  213. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-notify.service +0 -0
  214. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-notify.timer +0 -0
  215. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-release-propagate.service +0 -0
  216. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-release-propagate.timer +0 -0
  217. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-release-window.service +0 -0
  218. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-release-window.timer +0 -0
  219. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-serve.service +0 -0
  220. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-web-dist-build.service +0 -0
  221. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-web-dist-build.timer +0 -0
  222. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy/coord-web.service +0 -0
  223. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy_manifest.py +0 -0
  224. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deploy_units.py +0 -0
  225. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/deps.py +0 -0
  226. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/diagnose.py +0 -0
  227. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dispatch.py +0 -0
  228. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/dist_name.py +0 -0
  229. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/drive.py +0 -0
  230. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/drive_queue.py +0 -0
  231. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/drive_state.py +0 -0
  232. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/events.py +0 -0
  233. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/failure_class.py +0 -0
  234. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/filelock.py +0 -0
  235. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/fleet_config_health.py +0 -0
  236. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/freshness.py +0 -0
  237. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/gate_a.py +0 -0
  238. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/gate_b.py +0 -0
  239. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/gate_snapshot.py +0 -0
  240. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/gates.py +0 -0
  241. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/github_ops.py +0 -0
  242. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/goal.py +0 -0
  243. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/graph_health.py +0 -0
  244. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/__init__.py +0 -0
  245. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/aggregate.py +0 -0
  246. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/__init__.py +0 -0
  247. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/agent_install.py +0 -0
  248. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/cargo_targets.py +0 -0
  249. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/claude_binary.py +0 -0
  250. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/deploy_lane_facts.py +0 -0
  251. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/disk.py +0 -0
  252. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/fleet_board.py +0 -0
  253. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  254. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/fleet_phantom.py +0 -0
  255. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/fleet_unit_drift.py +0 -0
  256. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/graph.py +0 -0
  257. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/graphify_cli.py +0 -0
  258. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/index_lock.py +0 -0
  259. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/plan_usage.py +0 -0
  260. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/repo_state.py +0 -0
  261. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/spawned_coord.py +0 -0
  262. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/timer_active.py +0 -0
  263. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/toolchain.py +0 -0
  264. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/unit_drift.py +0 -0
  265. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/unit_enablement.py +0 -0
  266. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/checks/worktrees.py +0 -0
  267. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/cli.py +0 -0
  268. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/context.py +0 -0
  269. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/fleet_snapshot.py +0 -0
  270. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/models.py +0 -0
  271. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/pypi.py +0 -0
  272. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/registry.py +0 -0
  273. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/render.py +0 -0
  274. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/health/units.py +0 -0
  275. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/hooks.py +0 -0
  276. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/housekeeping.py +0 -0
  277. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/interactive.py +0 -0
  278. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/issue_store.py +0 -0
  279. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/liveness_auditor.py +0 -0
  280. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/machine_pause.py +0 -0
  281. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/merge_queue.py +0 -0
  282. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/milestone_chat.py +0 -0
  283. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/milestone_dispatch.py +0 -0
  284. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/milestone_gate.py +0 -0
  285. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/milestone_order.py +0 -0
  286. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/mock_author.py +0 -0
  287. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/models.py +0 -0
  288. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/network.py +0 -0
  289. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/new_issue_chat.py +0 -0
  290. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/notifier/__init__.py +0 -0
  291. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/notifier/baseline.py +0 -0
  292. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/notifier/cli.py +0 -0
  293. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/notifier/collect.py +0 -0
  294. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/notifier/digest.py +0 -0
  295. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/notifier/models.py +0 -0
  296. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/notifier/predicate.py +0 -0
  297. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/notifier/service.py +0 -0
  298. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/notifier/store.py +0 -0
  299. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/notifier/transport.py +0 -0
  300. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/openapi.py +0 -0
  301. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/overlap_fence.py +0 -0
  302. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/overlap_predict.py +0 -0
  303. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/parentage.py +0 -0
  304. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/parentage_github.py +0 -0
  305. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/pipeline.py +0 -0
  306. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/plan_parser.py +0 -0
  307. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/plans.py +0 -0
  308. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/platform_paths.py +0 -0
  309. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/portal_bridge.py +0 -0
  310. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/portal_store.py +0 -0
  311. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/portal_sync.py +0 -0
  312. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/pr_body_lint.py +0 -0
  313. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/prereqs.py +0 -0
  314. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/progress.py +0 -0
  315. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/providers/__init__.py +0 -0
  316. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/providers/base.py +0 -0
  317. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/providers/claude.py +0 -0
  318. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/providers/claude_pty.py +0 -0
  319. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/providers/opencode.py +0 -0
  320. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/refine_chat.py +0 -0
  321. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/release_cordon.py +0 -0
  322. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/release_propagate.py +0 -0
  323. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/release_verify.py +0 -0
  324. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/release_window.py +0 -0
  325. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/repo_edit.py +0 -0
  326. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/repo_onboard.py +0 -0
  327. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/reports.py +0 -0
  328. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/revalidate.py +0 -0
  329. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/review.py +0 -0
  330. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/scorecard.py +0 -0
  331. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/serve_app.py +0 -0
  332. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/skills/update-issue/SKILL.md +0 -0
  333. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/spend_ceiling.py +0 -0
  334. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/split_work.py +0 -0
  335. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/state.py +0 -0
  336. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/test_author.py +0 -0
  337. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/test_chat.py +0 -0
  338. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/test_orchestrator.py +0 -0
  339. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/test_report.py +0 -0
  340. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/tui_release.py +0 -0
  341. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/usage.py +0 -0
  342. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/usage_limits.py +0 -0
  343. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/usage_rollup.py +0 -0
  344. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coord/worker_events.py +0 -0
  345. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/coordinator.example.yml +0 -0
  346. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-agent.service +0 -0
  347. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-db-backup.service +0 -0
  348. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-db-backup.sh +0 -0
  349. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-db-backup.timer +0 -0
  350. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-drive-queue.service +0 -0
  351. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-drive-queue.timer +0 -0
  352. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-notify.service +0 -0
  353. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-notify.timer +0 -0
  354. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-release-propagate.service +0 -0
  355. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-release-propagate.timer +0 -0
  356. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-release-window.service +0 -0
  357. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-release-window.timer +0 -0
  358. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-serve.service +0 -0
  359. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-web-dist-build.service +0 -0
  360. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-web-dist-build.sh +0 -0
  361. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-web-dist-build.timer +0 -0
  362. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-web-rollback.sh +0 -0
  363. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/coord-web.service +0 -0
  364. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/deploy/node-shim.sh +0 -0
  365. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/AGENT_OPERATIONS.md +0 -0
  366. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/ARCHITECTURE.md +0 -0
  367. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/ARCH_SECURITY_GATES.md +0 -0
  368. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/COCKPIT.md +0 -0
  369. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/CONTROL_CENTER.md +0 -0
  370. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/COST_DISCIPLINE.md +0 -0
  371. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/CROSS_PLATFORM.md +0 -0
  372. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/CUSTOMER_PORTAL.md +0 -0
  373. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/DRIVE_QUEUE.md +0 -0
  374. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/EPHEMERAL_WORKERS.md +0 -0
  375. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/FORGE_MIGRATION.md +0 -0
  376. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/GRAPHIFY_SETUP.md +0 -0
  377. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/ISSUE_GUIDANCE.md +0 -0
  378. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/MAC_MINI.md +0 -0
  379. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  380. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/NOTIFIER.md +0 -0
  381. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/OPENCODE_VERIFICATION.md +0 -0
  382. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/OPERATING_GOTCHAS.md +0 -0
  383. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/ORACLE_LOOP.md +0 -0
  384. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/PHONE_WEBAPP.md +0 -0
  385. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/PIPELINE_V2.md +0 -0
  386. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/PLATFORM_EVOLUTION.md +0 -0
  387. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/SECOND_BACKEND.md +0 -0
  388. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/STORE_SERVICE.md +0 -0
  389. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  390. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/WEB_CONTROL_CENTER.md +0 -0
  391. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/mocks/web/README.md +0 -0
  392. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/mocks/web/_tokens.css +0 -0
  393. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/mocks/web/issue-detail.html +0 -0
  394. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/mocks/web/pipeline-narrow.html +0 -0
  395. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/docs/mocks/web/pipeline-wide.html +0 -0
  396. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/graphify-out/.gitignore +0 -0
  397. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/install-agent.sh +0 -0
  398. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/pyproject.toml +0 -0
  399. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/audit_review_verdict_overrides.py +0 -0
  400. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  401. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/azure-workers/build-worker-image.sh +0 -0
  402. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/azure-workers/coordinator-machine.py +0 -0
  403. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/azure-workers/epic-down.sh +0 -0
  404. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/azure-workers/epic-up.sh +0 -0
  405. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/azure-workers/preflight.sh +0 -0
  406. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/azure-workers/provision-worker.sh +0 -0
  407. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  408. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  409. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/azure-workers/verify-github-token.sh +0 -0
  410. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/codegen.py +0 -0
  411. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/coord-test-runner.sh +0 -0
  412. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/drive-batch.sh +0 -0
  413. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/gen_board_fixture.py +0 -0
  414. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/next_release_tag.py +0 -0
  415. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/run_tests_in_populated_home.sh +0 -0
  416. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/run_tests_without_gh.sh +0 -0
  417. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/smoke_437_interactive.py +0 -0
  418. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/verify_878_review_capture.py +0 -0
  419. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/verify_release_published.py +0 -0
  420. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/scripts/verify_release_wheel.py +0 -0
  421. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/setup.cfg +0 -0
  422. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/SMOKE_SET.md +0 -0
  423. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/__init__.py +0 -0
  424. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  425. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-33/contract.md +0 -0
  426. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-33/manifest.yml +0 -0
  427. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  428. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  429. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  430. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  431. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-37/conftest.py +0 -0
  432. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-37/contract.md +0 -0
  433. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-37/manifest.yml +0 -0
  434. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  435. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  436. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-38/contract.md +0 -0
  437. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-38/manifest.yml +0 -0
  438. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  439. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  440. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  441. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  442. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  443. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  444. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  445. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  446. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  447. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  448. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-51/contract.md +0 -0
  449. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  450. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  451. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-51/manifest.yml +0 -0
  452. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  453. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-51/tsconfig.json +0 -0
  454. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  455. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/conftest.py +0 -0
  456. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/board-pipeline-basic.json +0 -0
  457. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  458. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  459. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  460. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/playwright/all_pass.json +0 -0
  461. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  462. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/playwright/mixed_fail.json +0 -0
  463. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  464. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  465. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/playwright/skip.json +0 -0
  466. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/playwright/truncated.json +0 -0
  467. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  468. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  469. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  470. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  471. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  472. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  473. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  474. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  475. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_acceptance.py +0 -0
  476. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_acceptance_drivers.py +0 -0
  477. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent.py +0 -0
  478. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_api_error.py +0 -0
  479. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_app.py +0 -0
  480. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_branch_base.py +0 -0
  481. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_branch_capture.py +0 -0
  482. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_config_free_1712.py +0 -0
  483. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_deploy_units_endpoint.py +0 -0
  484. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_dirty_worktree.py +0 -0
  485. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_graph_self_heal.py +0 -0
  486. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_health_h3.py +0 -0
  487. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_idle_restart.py +0 -0
  488. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_push_failure.py +0 -0
  489. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_reap.py +0 -0
  490. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_repos_and_pull.py +0 -0
  491. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_restart_services_endpoint.py +0 -0
  492. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_startup_diagnostics.py +0 -0
  493. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_update.py +0 -0
  494. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_update_bluegreen.py +0 -0
  495. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_usage_limit.py +0 -0
  496. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_agent_zero_commit.py +0 -0
  497. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_ambient_home_isolation.py +0 -0
  498. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_approve_reject_plan.py +0 -0
  499. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_approve_usage_gate.py +0 -0
  500. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_assignment_already_recorded_daemon.py +0 -0
  501. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_audit_log.py +0 -0
  502. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_audit_outcome.py +0 -0
  503. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_audit_query.py +0 -0
  504. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_auto_loop.py +0 -0
  505. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_auto_release_publish_2035.py +0 -0
  506. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_base_checkout_restore.py +0 -0
  507. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_block_log.py +0 -0
  508. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_board_cap_762.py +0 -0
  509. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_board_fixture.py +0 -0
  510. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_board_read_path.py +0 -0
  511. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_board_service.py +0 -0
  512. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_board_state.py +0 -0
  513. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_board_wire.py +0 -0
  514. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_brain.py +0 -0
  515. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_branch_model.py +0 -0
  516. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_bug_intake.py +0 -0
  517. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_build_worker_image_env_update.py +0 -0
  518. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cargo_cache.py +0 -0
  519. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_ci_acceptance_gate_1950.py +0 -0
  520. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_ci_parity_2091.py +0 -0
  521. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_ci_store.py +0 -0
  522. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_claim.py +0 -0
  523. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_acceptance.py +0 -0
  524. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_assign.py +0 -0
  525. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  526. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_assign_interactive_remote.py +0 -0
  527. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_assign_provider.py +0 -0
  528. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  529. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_audit.py +0 -0
  530. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_chat_continue.py +0 -0
  531. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_diagnose_config_provenance.py +0 -0
  532. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_diagnose_graph.py +0 -0
  533. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_doctor.py +0 -0
  534. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_doctor_config_free_1801.py +0 -0
  535. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  536. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_drive.py +0 -0
  537. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_drive_queue.py +0 -0
  538. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_escalate.py +0 -0
  539. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_fix_headless_review.py +0 -0
  540. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_gate_a.py +0 -0
  541. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_install_drift.py +0 -0
  542. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_install_skills.py +0 -0
  543. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_issue_create_label.py +0 -0
  544. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_issue_reopen.py +0 -0
  545. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_merge.py +0 -0
  546. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_milestone_assign.py +0 -0
  547. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_milestone_capture.py +0 -0
  548. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_milestone_chat_add_child.py +0 -0
  549. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_milestone_dispatch.py +0 -0
  550. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_milestone_gate_b.py +0 -0
  551. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_milestone_gate_c.py +0 -0
  552. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_milestone_order.py +0 -0
  553. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  554. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_milestone_ship.py +0 -0
  555. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_network.py +0 -0
  556. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_new_issue_chat.py +0 -0
  557. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_plans.py +0 -0
  558. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_portal.py +0 -0
  559. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_pull_artifact.py +0 -0
  560. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_queue.py +0 -0
  561. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_reattach_sessions.py +0 -0
  562. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_refine_board.py +0 -0
  563. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_release_preflight.py +0 -0
  564. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_release_propagate.py +0 -0
  565. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_release_window.py +0 -0
  566. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_repo_2220.py +0 -0
  567. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_scorecard.py +0 -0
  568. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_set_review_findings.py +0 -0
  569. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_status_advisory_terminal.py +0 -0
  570. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_status_merge_queue.py +0 -0
  571. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_status_provider.py +0 -0
  572. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_status_review_finalizing.py +0 -0
  573. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_status_test_failed_tag.py +0 -0
  574. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_status_usage_limit.py +0 -0
  575. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_sync_comments_873.py +0 -0
  576. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_test_plan.py +0 -0
  577. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_track.py +0 -0
  578. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_tui_update.py +0 -0
  579. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cli_wait.py +0 -0
  580. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_client_base_install.py +0 -0
  581. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_comments.py +0 -0
  582. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_completion_summary.py +0 -0
  583. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_config.py +0 -0
  584. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_config_acceptance.py +0 -0
  585. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_config_audit.py +0 -0
  586. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_config_pricing.py +0 -0
  587. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  588. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_config_usage_gate.py +0 -0
  589. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_conflict_fix.py +0 -0
  590. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_conflict_fix_semantic.py +0 -0
  591. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_coord_test.py +0 -0
  592. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_coord_test_runner_baseline.py +0 -0
  593. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_coord_test_runner_routing.py +0 -0
  594. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_coord_test_runner_toolchain.py +0 -0
  595. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_coord_web_sse_restart_live.py +0 -0
  596. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_coordinator_machine.py +0 -0
  597. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_cross_platform_imports.py +0 -0
  598. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_dashboard.py +0 -0
  599. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_dashboard_fixture.py +0 -0
  600. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_dashboard_terminal.py +0 -0
  601. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_dashboard_terminal_live.py +0 -0
  602. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_db.py +0 -0
  603. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_deploy_coord_db_backup.py +0 -0
  604. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_deploy_coord_web_dist.py +0 -0
  605. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_deploy_coord_web_rollback.py +0 -0
  606. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_deploy_drive_queue_unit.py +0 -0
  607. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_deploy_manifest.py +0 -0
  608. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_deploy_units_lane.py +0 -0
  609. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_deploy_web_unit.py +0 -0
  610. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_deps.py +0 -0
  611. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_diagnose.py +0 -0
  612. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_dispatch.py +0 -0
  613. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_dispatch_target_validation.py +0 -0
  614. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_dist_name.py +0 -0
  615. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_done_housekeeping.py +0 -0
  616. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_drive.py +0 -0
  617. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_drive_queue.py +0 -0
  618. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_drive_state.py +0 -0
  619. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_drive_tmux.py +0 -0
  620. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_epic_up_capability_detection.py +0 -0
  621. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  622. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_epic_up_image_provenance.py +0 -0
  623. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_errors.py +0 -0
  624. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_events.py +0 -0
  625. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_failure_class.py +0 -0
  626. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_filelock.py +0 -0
  627. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  628. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_fix_of_force_override.py +0 -0
  629. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_fleet_config_health.py +0 -0
  630. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_fleet_health_probes.py +0 -0
  631. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_fleet_health_snapshot.py +0 -0
  632. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_freshness.py +0 -0
  633. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_gate_a.py +0 -0
  634. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_gate_b.py +0 -0
  635. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_gate_snapshot_staleness.py +0 -0
  636. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_gates.py +0 -0
  637. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  638. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_generated_types_fixture.py +0 -0
  639. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_github_ops.py +0 -0
  640. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_goal.py +0 -0
  641. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_graph_health.py +0 -0
  642. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_graph_selfheal_absent_2237.py +0 -0
  643. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_handoff.py +0 -0
  644. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_health_checks.py +0 -0
  645. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_health_cli.py +0 -0
  646. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_health_cli_graph.py +0 -0
  647. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_health_config.py +0 -0
  648. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_health_context.py +0 -0
  649. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_health_deploy_lane_facts.py +0 -0
  650. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_health_incident_regression.py +0 -0
  651. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_health_pypi.py +0 -0
  652. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_health_registry.py +0 -0
  653. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_health_timer_active.py +0 -0
  654. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_health_toolchain.py +0 -0
  655. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_health_unit_drift.py +0 -0
  656. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_health_unit_enablement.py +0 -0
  657. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_hooks.py +0 -0
  658. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_human_attended_437.py +0 -0
  659. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_init.py +0 -0
  660. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_integration.py +0 -0
  661. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_interactive_briefing_echo.py +0 -0
  662. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_interactive_prefill_state.py +0 -0
  663. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_interactive_session_relaunch.py +0 -0
  664. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_interactive_test_verdict_backstop.py +0 -0
  665. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_interactive_token_attribution.py +0 -0
  666. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_interactive_worktree.py +0 -0
  667. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_issue_store_seam.py +0 -0
  668. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_liveness_auditor.py +0 -0
  669. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_liveness_notify.py +0 -0
  670. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_machine_pause.py +0 -0
  671. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_merge_queue.py +0 -0
  672. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_merge_verify.py +0 -0
  673. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_milestone_chat.py +0 -0
  674. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_milestone_dispatch.py +0 -0
  675. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_milestone_gate.py +0 -0
  676. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_milestone_order.py +0 -0
  677. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_milestone_seam.py +0 -0
  678. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_mock_author.py +0 -0
  679. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_model_tiering.py +0 -0
  680. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_models.py +0 -0
  681. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_models_config_labels.py +0 -0
  682. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_needs_attention.py +0 -0
  683. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_network.py +0 -0
  684. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_new_issue_chat.py +0 -0
  685. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_next_release_tag.py +0 -0
  686. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_no_direct_gh_calls.py +0 -0
  687. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_node_shim.py +0 -0
  688. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_notifier_baseline.py +0 -0
  689. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_notifier_cli.py +0 -0
  690. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_notifier_collect.py +0 -0
  691. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_notifier_config.py +0 -0
  692. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_notifier_drive_seam.py +0 -0
  693. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_notifier_isolation.py +0 -0
  694. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_notifier_predicate.py +0 -0
  695. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_notifier_quiet_hours.py +0 -0
  696. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_notifier_service.py +0 -0
  697. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_notify_drain.py +0 -0
  698. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_openapi.py +0 -0
  699. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_operational_defaults.py +0 -0
  700. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_overlap_fence.py +0 -0
  701. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_overlap_predict.py +0 -0
  702. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_packaged_deploy_units.py +0 -0
  703. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_parentage.py +0 -0
  704. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_paste_landed.py +0 -0
  705. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_pipeline.py +0 -0
  706. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_plan_followup_approve_plan_command.py +0 -0
  707. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_plan_followup_pr_command.py +0 -0
  708. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_plan_followup_review_command.py +0 -0
  709. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_plan_only.py +0 -0
  710. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_plan_parser.py +0 -0
  711. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_platform_paths.py +0 -0
  712. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_portal_bridge.py +0 -0
  713. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_portal_config.py +0 -0
  714. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_portal_sync.py +0 -0
  715. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_pr_body_lint.py +0 -0
  716. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_prereqs.py +0 -0
  717. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_production_db_guard.py +0 -0
  718. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_progress.py +0 -0
  719. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_provider_seam.py +0 -0
  720. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_providers.py +0 -0
  721. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_providers_config_labels.py +0 -0
  722. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_providers_pty.py +0 -0
  723. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_quiet_hours.py +0 -0
  724. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_quiet_hours_store_2146.py +0 -0
  725. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_reap_merged_sessions.py +0 -0
  726. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_reap_stale_interactive_tick.py +0 -0
  727. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_reconcile_branch.py +0 -0
  728. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_reconcile_completions.py +0 -0
  729. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_reconcile_merges.py +0 -0
  730. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_reconcile_usage_limit_done.py +0 -0
  731. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_refine_chat.py +0 -0
  732. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_release_cordon_2101.py +0 -0
  733. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  734. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_release_cordon_deadlock_2240.py +0 -0
  735. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_release_propagate.py +0 -0
  736. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_release_unified_1242.py +0 -0
  737. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_release_verify.py +0 -0
  738. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_release_window.py +0 -0
  739. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_remote_auto_prune.py +0 -0
  740. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_remote_interactive_reaper.py +0 -0
  741. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_repo_edit_2220.py +0 -0
  742. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_repo_graph_fleet_2237.py +0 -0
  743. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_repo_onboard_2220.py +0 -0
  744. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_report_result_push.py +0 -0
  745. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_reports.py +0 -0
  746. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_retry.py +0 -0
  747. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_retry_advisory_1606.py +0 -0
  748. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_retry_type_1636.py +0 -0
  749. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_revalidate.py +0 -0
  750. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_review.py +0 -0
  751. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_review_end_review_without_verdict.py +0 -0
  752. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_review_parse_failure_diagnostic.py +0 -0
  753. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_review_reaffirm.py +0 -0
  754. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_review_state.py +0 -0
  755. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_review_verdict_backstop.py +0 -0
  756. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_review_verdict_override_audit.py +0 -0
  757. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_review_verdict_relay.py +0 -0
  758. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_review_zero_commits.py +0 -0
  759. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_scoped_review_wiring.py +0 -0
  760. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_scorecard.py +0 -0
  761. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_serve.py +0 -0
  762. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_serve_app_board_trim.py +0 -0
  763. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_session.py +0 -0
  764. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_slice_issue_attribution.py +0 -0
  765. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_smoke_live_checkout_restore.py +0 -0
  766. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_smoke_workflow.py +0 -0
  767. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_spend_ceiling.py +0 -0
  768. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_spend_ceiling_coordinator.py +0 -0
  769. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_split.py +0 -0
  770. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_split_work.py +0 -0
  771. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_stage_projection.py +0 -0
  772. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_stalled_pipeline.py +0 -0
  773. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_state.py +0 -0
  774. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_state_review_findings_daemon.py +0 -0
  775. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_status_fleet_footer.py +0 -0
  776. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_stop_1567.py +0 -0
  777. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_stuck.py +0 -0
  778. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_terminal_command.py +0 -0
  779. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_test_author.py +0 -0
  780. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_test_chat.py +0 -0
  781. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_test_orchestrator.py +0 -0
  782. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_test_report.py +0 -0
  783. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_test_verdict_parsing.py +0 -0
  784. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_test_verdict_transcript_floor.py +0 -0
  785. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_thin_client_board_audit.py +0 -0
  786. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_thin_client_config_load_1080.py +0 -0
  787. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_thin_client_daemon_routing_906.py +0 -0
  788. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_tmux_host.py +0 -0
  789. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_tmux_session.py +0 -0
  790. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_transcript_floor.py +0 -0
  791. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_usage.py +0 -0
  792. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_usage_limits.py +0 -0
  793. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_usage_rollup.py +0 -0
  794. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_venv_live_install_2121.py +0 -0
  795. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_version_single_source.py +0 -0
  796. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_watch.py +0 -0
  797. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_worker_events.py +0 -0
  798. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_worker_image_pin_sync.py +0 -0
  799. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_worker_safety.py +0 -0
  800. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_worker_test_scoping.py +0 -0
  801. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_worktree.py +0 -0
  802. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  803. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/Cargo.lock +0 -0
  804. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/Cargo.toml +0 -0
  805. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/cargo-config-local-quadraui.toml.example +0 -0
  806. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/audit.rs +0 -0
  807. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/chat.rs +0 -0
  808. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/data.rs +0 -0
  809. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/dialogs.rs +0 -0
  810. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/drive.rs +0 -0
  811. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/drive_queue.rs +0 -0
  812. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/escalation.rs +0 -0
  813. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/events.rs +0 -0
  814. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/fixtures.rs +0 -0
  815. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/fleet_health.rs +0 -0
  816. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/fleet_sessions.rs +0 -0
  817. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/fleet_terminals.rs +0 -0
  818. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/format.rs +0 -0
  819. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/milestone_dag.rs +0 -0
  820. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/mod.rs +0 -0
  821. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/msv.rs +0 -0
  822. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/pipeline.rs +0 -0
  823. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/plans.rs +0 -0
  824. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/render.rs +0 -0
  825. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/reports.rs +0 -0
  826. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/sessions.rs +0 -0
  827. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/settings_ui.rs +0 -0
  828. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/sidebar.rs +0 -0
  829. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/terminal.rs +0 -0
  830. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/tests.rs +0 -0
  831. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/types.rs +0 -0
  832. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/app/workspace.rs +0 -0
  833. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/bin/gtk.rs +0 -0
  834. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/commands.rs +0 -0
  835. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/lib.rs +0 -0
  836. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/main.rs +0 -0
  837. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/src/settings.rs +0 -0
  838. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/tests/acceptance.rs +0 -0
  839. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/tui/tests/cli.rs +0 -0
  840. {code_coordinator-0.5.96 → code_coordinator-0.5.97}/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.96
3
+ Version: 0.5.97
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.96
3
+ Version: 0.5.97
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.96",
2
+ "tag": "0.5.97",
3
3
  "distance": 0,
4
- "node": "g312293364325c98de0888c4de55e3f5f168662dd",
4
+ "node": "g2c2fb9bb30187ab30ecfca32a852de69332b37e9",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-15"
@@ -232,26 +232,55 @@ def detect_dead_end(state, *, can_waive_test_gate: bool = False) -> DeadEnd | No
232
232
  gates=_gates(state),
233
233
  )
234
234
 
235
- # ── shape 2: the Test stage is BLOCKED (#1672) ─────────────────────────
235
+ # ── shape 2: the Test stage is BLOCKED (#1672/#2272) ───────────────────
236
236
  # `dispatch_smoke` stamps `test_state="blocked"` when no capability-
237
237
  # matched machine could run the suite, and then REFUSES to re-probe on
238
238
  # every tick — deliberately, that spin is what #1672 closed. So the
239
239
  # driver polling for a verdict is polling for something the dispatcher
240
240
  # has already decided not to produce. vimcode#635's shape, in the one
241
241
  # variant the board makes provable.
242
+ #
243
+ # #2272 parks the SAME value for a second, unrelated cause: N Test-stage
244
+ # legs in a row finished without printing a `SMOKE:` marker and the retry
245
+ # budget ran out. Both are "no verdict is coming", which is why they
246
+ # share a state — but the recovery is completely different (fix the fleet
247
+ # vs. find out why the worker went mute, usually the 600s Bash ceiling),
248
+ # so they must not share a REASON. Telling the operator "no capability-
249
+ # matched machine" about a row whose machines were fine all along is the
250
+ # symptom-not-cause failure #2235 exists to measure, and it is one
251
+ # `mute_smoke_legs` call away from being avoided.
242
252
  if state.work_test_state == TEST_STATE_BLOCKED:
243
- return DeadEnd(
244
- kind="test_stage_blocked",
245
- stage="test",
246
- reason=(
247
- f"the Test stage for {state.work_aid} is BLOCKED: "
248
- f"{state.work_test_reason or 'no reason recorded'} "
253
+ from coord.smoke import mute_smoke_legs # noqa: PLC0415
254
+
255
+ mute_legs = mute_smoke_legs(state.work_test_reason)
256
+ if mute_legs:
257
+ cause = (
258
+ f"{mute_legs} Test-stage leg(s) in a row finished without "
259
+ "printing a `SMOKE:` verdict marker, exhausting the retry "
260
+ "budget, so coord.notify parked the row rather than "
261
+ "re-dispatching a cause that had already repeated identically "
262
+ "every lap (#2272). Nothing is known to be wrong with the "
263
+ "BRANCH — the commonest cause is the smoke command exceeding "
264
+ "the worker's 600s Bash ceiling, which backgrounds the run "
265
+ "and leaves the session with no exit status to report. Check "
266
+ "the last Test-stage transcript for a backgrounded command "
267
+ "before you blame the diff."
268
+ )
269
+ else:
270
+ cause = (
249
271
  "coord.smoke.dispatch_smoke found no capability-matched "
250
272
  "machine and recorded 'blocked' rather than re-probing a "
251
273
  "broken fleet on every tick (#1672). It will not try again "
252
274
  "on its own, so waiting for a verdict here waits forever "
253
275
  "(#2019). Fix the fleet (or the capability rules), then "
254
276
  "clear the marker."
277
+ )
278
+ return DeadEnd(
279
+ kind="test_stage_blocked",
280
+ stage="test",
281
+ reason=(
282
+ f"the Test stage for {state.work_aid} is BLOCKED: "
283
+ f"{state.work_test_reason or 'no reason recorded'} — {cause}"
255
284
  ),
256
285
  recovery=(
257
286
  f"coord diagnose {state.repo} {state.issue} --stage test --reset"
@@ -52,6 +52,16 @@ from coord.dispatch import (
52
52
  post_refused_policy,
53
53
  )
54
54
  from coord.progress import parse_progress
55
+
56
+ # #2272: the mute-Test-stage retry budget. Canonically in `coord.smoke`
57
+ # because `dispatch_smoke` is the writer that has to carry the tally across
58
+ # its own `running` stamp — a second definition here is exactly how the
59
+ # counter and the thing that clobbers it drift apart again. Safe as a
60
+ # module-level import: `coord.smoke` reaches config/dispatch/models/revalidate
61
+ # and none of them import this module.
62
+ from coord.smoke import MUTE_SMOKE_LEG_BUDGET, TEST_STATE_BLOCKED
63
+ from coord.smoke import NO_SMOKE_VERDICT_MARKER as _NO_SMOKE_VERDICT_MARKER
64
+ from coord.smoke import mute_smoke_legs, mute_smoke_tally
55
65
  from coord.state import (
56
66
  load_dispatched,
57
67
  load_done_reviews_needing_post,
@@ -1776,7 +1786,12 @@ def _smoke_worker_verdict(
1776
1786
  #: ``test_reason`` when a headless smoke produced no parseable verdict. Read
1777
1787
  #: back on the NEXT such reap to decide between "park for one automatic
1778
1788
  #: re-dispatch" and "block, an operator has to look" — see below.
1779
- NO_SMOKE_VERDICT_MARKER = "no-verdict (#2244)"
1789
+ #:
1790
+ #: #2272: canonically defined in :mod:`coord.smoke` (imported at the top of
1791
+ #: this module), next to `dispatch_smoke` — the function that has to carry the
1792
+ #: tally across its own ``running`` stamp for this counter to survive at all.
1793
+ #: Re-bound here because this is the name the reap path has always used.
1794
+ NO_SMOKE_VERDICT_MARKER = _NO_SMOKE_VERDICT_MARKER
1780
1795
 
1781
1796
 
1782
1797
  def _record_smoke_verdict(
@@ -1885,50 +1900,70 @@ def _record_smoke_verdict(
1885
1900
  return
1886
1901
 
1887
1902
  # No verdict line, clean session exit. NOT a pass.
1903
+ #
1904
+ # #2272: count the legs, don't just test for the marker's presence. The
1905
+ # tally lives at the FRONT of `test_reason` so a bounded `/board` preview
1906
+ # still carries it, and `dispatch_smoke` re-states it across the `running`
1907
+ # stamp that used to erase it. Together those two make this a real budget
1908
+ # rather than the never-firing one #2244 intended.
1888
1909
  previous_reason = load_assignment_test_reason(parent_id) or ""
1889
- already_mute_once = NO_SMOKE_VERDICT_MARKER in previous_reason
1910
+ legs = mute_smoke_legs(previous_reason) + 1
1890
1911
  reason = (
1891
- f"{NO_SMOKE_VERDICT_MARKER}: the Test-stage worker "
1912
+ f"{mute_smoke_tally(legs)}: the Test-stage worker "
1892
1913
  f"{transition.assignment_id} ended without printing a verdict marker "
1893
1914
  "line, and a `claude -p` exit code says only that the session ended — "
1894
1915
  "it is not a suite result."
1895
1916
  )
1896
- if already_mute_once:
1917
+ if legs >= MUTE_SMOKE_LEG_BUDGET:
1897
1918
  # The same park value `dispatch_smoke` uses for an unroutable stage
1898
1919
  # (#1672): every gate that wants "passed"/"skipped" keeps the merge
1899
1920
  # shut, `dispatch_pending_smoke` stops re-dispatching, and no fix
1900
1921
  # round is burned on a branch nothing has found fault with.
1901
- from coord.smoke import TEST_STATE_BLOCKED # noqa: PLC0415
1902
-
1922
+ #
1923
+ # #2272: the terminal reason NAMES the cause and the count. "N smoke
1924
+ # legs produced no verdict" is a statement an operator can act on; the
1925
+ # five-lap incident presented as "the branch is slow" precisely
1926
+ # because nothing on the row ever said how many legs had gone mute.
1903
1927
  record_test_verdict(
1904
1928
  assignment_id=parent_id,
1905
1929
  test_state=TEST_STATE_BLOCKED,
1906
1930
  test_reason=(
1907
- f"{reason} Second consecutive mute Test stageparked instead "
1908
- "of re-dispatched. Recover with `coord diagnose <repo> <issue> "
1909
- "--stage test --reset`, or record the verdict by hand with "
1910
- f"`coord test --passed|--fail {parent_id}`."
1931
+ f"{reason} {legs} smoke legs produced no verdict the "
1932
+ f"Test-stage retry budget ({MUTE_SMOKE_LEG_BUDGET}) is "
1933
+ "exhausted, so the row is parked instead of re-dispatched "
1934
+ "(#2272). A mute leg is not a failing branch: check whether "
1935
+ "the smoke command is exceeding the worker's 600s Bash "
1936
+ "ceiling before you blame the diff. Recover with `coord "
1937
+ "diagnose <repo> <issue> --stage test --reset`, or record the "
1938
+ f"verdict by hand with `coord test --passed|--fail "
1939
+ f"{parent_id}`."
1911
1940
  ),
1912
1941
  )
1913
1942
  log.warning(
1914
- "smoke %s: no SMOKE: verdict in the transcript for the SECOND "
1915
- "time on parent %s parking test_state='blocked' (#2244).",
1916
- transition.assignment_id, parent_id,
1943
+ "smoke %s: no SMOKE: verdict in the transcript that is %d mute "
1944
+ "Test-stage leg(s) on parent %s and the retry budget (%d) is "
1945
+ "exhausted, so parking test_state=%r instead of re-dispatching "
1946
+ "(#2272). Check the worker's 600s Bash ceiling first.",
1947
+ transition.assignment_id, legs, parent_id, MUTE_SMOKE_LEG_BUDGET,
1948
+ TEST_STATE_BLOCKED,
1917
1949
  )
1918
1950
  return
1919
1951
 
1952
+ remaining = MUTE_SMOKE_LEG_BUDGET - legs
1920
1953
  record_test_verdict(
1921
1954
  assignment_id=parent_id,
1922
1955
  test_state=None,
1923
1956
  test_reason=(
1924
- f"{reason} Cleared for one automatic Test-stage re-dispatch; a "
1925
- "second mute run parks the row instead."
1957
+ f"{reason} Cleared for a Test-stage re-dispatch; {remaining} of "
1958
+ f"{MUTE_SMOKE_LEG_BUDGET} legs left in the budget before the row "
1959
+ "parks instead (#2272)."
1926
1960
  ),
1927
1961
  )
1928
1962
  log.warning(
1929
1963
  "smoke %s: no SMOKE: verdict in the transcript — recording NO verdict "
1930
- "for parent %s (cleared for re-dispatch), never 'passed' (#2244).",
1931
- transition.assignment_id, parent_id,
1964
+ "for parent %s (mute leg %d of %d, cleared for re-dispatch), never "
1965
+ "'passed' (#2244).",
1966
+ transition.assignment_id, parent_id, legs, MUTE_SMOKE_LEG_BUDGET,
1932
1967
  )
1933
1968
 
1934
1969
 
@@ -365,15 +365,33 @@ def propagate_smoke_terminal_failure(
365
365
  if not parent_assignment_id:
366
366
  return
367
367
  from coord.failure_class import classify_failure # noqa: PLC0415
368
- from coord.state import record_test_verdict # noqa: PLC0415
368
+ from coord.smoke import mute_smoke_legs, mute_smoke_tally # noqa: PLC0415
369
+ from coord.state import ( # noqa: PLC0415
370
+ load_assignment_test_reason,
371
+ record_test_verdict,
372
+ )
369
373
 
370
374
  classification = classify_failure(failure_reason=failure_reason)
371
375
  if classification.is_environmental:
376
+ # #2272: this clear must CARRY the mute-leg tally, for exactly the
377
+ # reason `dispatch_smoke`'s `running` stamp must. `test_reason` is the
378
+ # only field that survives between Test-stage legs, so any writer that
379
+ # replaces it wholesale silently hands the row a fresh retry budget —
380
+ # and a row that alternates "mute leg" / "worker died environmentally"
381
+ # would then never reach the bound from either side. The tally is not
382
+ # incremented here (an environmental death is a different, genuinely
383
+ # self-healing cause and #1605's unbounded re-dispatch of it is
384
+ # deliberate) — it is only preserved, so mute legs keep counting
385
+ # across it.
386
+ carried = mute_smoke_legs(
387
+ load_assignment_test_reason(parent_assignment_id)
388
+ )
389
+ prefix = f"{mute_smoke_tally(carried)} — " if carried else ""
372
390
  record_test_verdict(
373
391
  assignment_id=parent_assignment_id,
374
392
  test_state=None,
375
393
  test_reason=(
376
- "Test stage worker died environmentally "
394
+ f"{prefix}Test stage worker died environmentally "
377
395
  f"({classification.reason}) — cleared for automatic "
378
396
  "re-dispatch, not recorded as a work failure (#1605)"
379
397
  ),
@@ -46,6 +46,7 @@ from __future__ import annotations
46
46
 
47
47
  import json
48
48
  import logging
49
+ import re
49
50
  import time
50
51
  import uuid
51
52
  from dataclasses import dataclass
@@ -102,6 +103,21 @@ session — the coordinator sees exit 0 either way, so a run whose suite failed
102
103
  and whose marker is missing is recorded as NO verdict (never a pass) and the \
103
104
  Test stage has to be re-run. Exit with the matching code as well, for the \
104
105
  non-headless lanes that do read it.
106
+ - NEVER END YOUR TURN WITH THE SUITE STILL RUNNING (#2272). Your smoke \
107
+ command can easily exceed the ~600s Bash ceiling; when it does, the harness \
108
+ moves it to the BACKGROUND and hands you a task id instead of an exit status. \
109
+ That is not a result — it is "no answer yet". Narrating that you kicked the \
110
+ suite off and stopping there prints no marker, so the Test stage records NO \
111
+ verdict and re-dispatches; because the ceiling is deterministic, every \
112
+ re-dispatch does exactly the same thing, which is why this loop bills \
113
+ indefinitely. Instead: POLL the backgrounded task to completion from THIS \
114
+ same session, in bounded steps (`BashOutput`/`TaskOutput` with the id, or \
115
+ `Monitor`), and read its REAL exit status before you report anything. Do NOT \
116
+ use a foreground `until ! pgrep ...; do sleep ...; done` wait — it hits the \
117
+ identical 600s wall. If you genuinely cannot obtain an exit status before you \
118
+ run out of room, print `SMOKE: fail <the smoke command never returned an exit \
119
+ status within this session>` rather than ending mute: a stated verdict is \
120
+ recoverable, silence is not.
105
121
 
106
122
  Where you are:
107
123
  - You are in a dedicated git worktree created for this run. Every git command \
@@ -114,7 +130,10 @@ fail (#1694).
114
130
  Steps:
115
131
  1. `git fetch origin && git checkout <branch>` (the branch is in your \
116
132
  briefing) — in your worktree, never in the base checkout.
117
- 2. Run the smoke command from the briefing. Capture stdout/stderr.
133
+ 2. Run the smoke command from the briefing. Capture stdout/stderr. If the \
134
+ harness backgrounds it for exceeding the 600s Bash ceiling, poll that task to \
135
+ completion and use ITS exit status below — "I started it" is not an outcome \
136
+ (#2272).
118
137
  3. If it exits 0 → print `SMOKE: pass` and exit 0.
119
138
  4. If it exits {RUNNER_BASELINE_RED_EXIT} AND its output contains a line \
120
139
  starting with literal text `{BASELINE_RED_OUTPUT_MARKER}` (#2170) — the smoke \
@@ -524,6 +543,33 @@ def build_smoke_briefing(
524
543
  lines.append(smoke_command)
525
544
  lines.append("```")
526
545
  lines.append("")
546
+ # #2272: the ceiling is the deterministic cause of a mute Test stage. A
547
+ # suite this size routinely runs past 600s, the harness backgrounds it,
548
+ # and an agent that narrates "I kicked it off" and stops prints no marker
549
+ # — so the stage records NO verdict and re-dispatches, forever, at ~$0.12
550
+ # a lap. Say it in the briefing as well as the system prompt: the briefing
551
+ # is what the worker re-reads while it is deciding what to do next.
552
+ lines.append("## If the suite runs past the 600s Bash ceiling (#2272)")
553
+ lines.append("")
554
+ lines.append(
555
+ "Claude Code moves any Bash call past ~600s to the **background** and "
556
+ "hands you a task id instead of an exit status. That is not a result. "
557
+ "**Do not end your turn there** — poll the backgrounded task to "
558
+ "completion from this same session (`BashOutput`/`TaskOutput` with "
559
+ "the id, in bounded steps) and read its real exit status before "
560
+ "reporting. A foreground `until ! pgrep ...; do sleep ...; done` wait "
561
+ "hits the identical wall, so don't."
562
+ )
563
+ lines.append("")
564
+ lines.append(
565
+ "A turn that ends with the suite still running prints no marker, the "
566
+ "Test stage records NO verdict, and it re-dispatches — and since the "
567
+ "ceiling is deterministic, every re-dispatch stalls identically. If "
568
+ "you truly cannot get an exit status, print `SMOKE: fail <the smoke "
569
+ "command never returned an exit status within this session>` rather "
570
+ "than ending mute."
571
+ )
572
+ lines.append("")
527
573
  lines.append(
528
574
  "## Reporting the verdict (#2244)"
529
575
  )
@@ -619,6 +665,91 @@ def _fetch_touched_files(repo_github: str, branch: str) -> list[str]:
619
665
  TEST_STATE_BLOCKED = "blocked"
620
666
 
621
667
 
668
+ # ── Mute Test-stage legs: the retry budget (#2244/#2272) ────────────────────
669
+ #
670
+ # A Test-stage leg that finishes without printing a `SMOKE:` marker records NO
671
+ # verdict — never a pass (#2244). That is the right call, and it assumes
672
+ # re-running is USEFUL. #2272 is the case where it is not: on 2026-08-15 five
673
+ # consecutive legs against one work row each ran the suite past Claude Code's
674
+ # 600s Bash ceiling, got backgrounded, and ended mute. Deterministic cause,
675
+ # identical every lap, ~$0.12 and ~10 minutes each, and the board showed a
676
+ # healthy `running` Test stage throughout. It was stopped by hand.
677
+ #
678
+ # #2244 already intended a bound — "a SECOND mute run parks the row" — but it
679
+ # stored the evidence in the parent's `test_reason` and `dispatch_smoke`'s own
680
+ # `running` stamp overwrote that field on the very next dispatch. The counter
681
+ # was reset by the retry it was supposed to be counting, so the bound never
682
+ # fired. Hence two things here rather than one:
683
+ #
684
+ # * a TALLY that is explicit and parseable (`no-verdict (#2244) x2`) rather
685
+ # than a bare marker whose presence is the whole signal, and
686
+ # * `dispatch_smoke` carrying that tally ACROSS its `running` stamp, so the
687
+ # count survives the thing that kept destroying it.
688
+ #
689
+ # The generalisation matters more than the ceiling: whatever future cause
690
+ # leaves a Test stage mute — a dead harness, a machine that reboots mid-run, a
691
+ # prompt regression — it now costs a bounded number of legs and then names
692
+ # itself on the row, instead of billing forever. A cause the system cannot
693
+ # diagnose must still be a cause the system stops paying for.
694
+
695
+ #: The marker left in the parent work row's ``test_reason`` when a headless
696
+ #: Test stage produced no parseable verdict. Suffixed with `` xN`` from the
697
+ #: second leg on (see :func:`mute_smoke_tally`).
698
+ NO_SMOKE_VERDICT_MARKER = "no-verdict (#2244)"
699
+
700
+ #: How many CONSECUTIVE mute Test-stage legs one work row may burn before the
701
+ #: row is parked terminally instead of re-dispatched (#2272). Two — one lap of
702
+ #: genuine self-heal (the #1605 environmental-death shape really does clear on
703
+ #: a retry), then stop. Pinned by test: raising it raises the unattended spend
704
+ #: ceiling for every no-verdict cause at once, which is exactly the decision
705
+ #: that should be deliberate.
706
+ MUTE_SMOKE_LEG_BUDGET = 2
707
+
708
+ #: Matches the marker with or without its `` xN`` tally, so a reason written by
709
+ #: a pre-#2272 coordinator (bare marker, no count) still reads back as one leg
710
+ #: rather than zero — an upgrade mid-loop must not hand the row a fresh budget.
711
+ _MUTE_TALLY_RE = re.compile(
712
+ re.escape(NO_SMOKE_VERDICT_MARKER) + r"(?:\s*x\s*(\d+))?", re.IGNORECASE
713
+ )
714
+
715
+
716
+ def mute_smoke_legs(test_reason: str | None) -> int:
717
+ """How many mute Test-stage legs *test_reason* records (0 if none).
718
+
719
+ Reads the tally back out of the parent work row's ``test_reason`` — the
720
+ one field that survives from one Test-stage leg to the next. Tolerates:
721
+
722
+ * ``None``/empty — no legs (the ordinary first dispatch),
723
+ * the bare pre-#2272 marker with no count — one leg,
724
+ * a truncated ``test_reason`` — the ``/board`` wire carries only a bounded
725
+ preview (:func:`coord.state.load_assignment_test_reason`), so the tally
726
+ is written at the FRONT of the reason where a preview still shows it.
727
+ """
728
+ if not test_reason:
729
+ return 0
730
+ match = _MUTE_TALLY_RE.search(test_reason)
731
+ if match is None:
732
+ return 0
733
+ raw = match.group(1)
734
+ if raw is None:
735
+ return 1
736
+ try:
737
+ return max(1, int(raw))
738
+ except ValueError: # pragma: no cover — regex only matches digits
739
+ return 1
740
+
741
+
742
+ def mute_smoke_tally(count: int) -> str:
743
+ """The marker for *count* mute legs — ``"no-verdict (#2244) x2"``.
744
+
745
+ A single leg renders as the bare marker, so an operator reading a row
746
+ mid-loop sees a count only once there is a count worth seeing.
747
+ """
748
+ if count <= 1:
749
+ return NO_SMOKE_VERDICT_MARKER
750
+ return f"{NO_SMOKE_VERDICT_MARKER} x{count}"
751
+
752
+
622
753
  #: Soft (transient) unroutable reports already logged this process, keyed by
623
754
  #: ``(assignment_id, message)``. Transient conditions — a machine that is
624
755
  #: merely unreachable right now — are left re-dispatchable so the stage
@@ -1095,17 +1226,46 @@ def dispatch_smoke(
1095
1226
  # `running` → the merge never fires → repeat. Dispatching a *fresh* run
1096
1227
  # must never, by itself, retract the previous answer; the new verdict
1097
1228
  # replaces the old one when it actually lands.
1229
+ #
1230
+ # #2272: ...and this stamp must CARRY THE MUTE-LEG TALLY FORWARD. That is
1231
+ # the whole bug behind the five-lap loop: `test_reason` is the only field
1232
+ # that survives between Test-stage legs, `_record_smoke_verdict` stores the
1233
+ # "this leg came back mute" evidence there, and this write used to replace
1234
+ # it with a flat literal. So the counter was erased by the very retry it
1235
+ # existed to count, `already_mute_once` read False forever, and #2244's
1236
+ # "a second mute run parks the row" bound could never fire. Re-reading and
1237
+ # re-stating the tally here also keeps the retry VISIBLE on the board:
1238
+ # before this, a row on its fifth mute lap rendered identically to one
1239
+ # whose Test stage had just started for the first time, which is why five
1240
+ # identical laps looked like progress.
1098
1241
  if completed.assignment_id is not None and completed.test_state not in (
1099
1242
  "passed", "skipped", "failed",
1100
1243
  ):
1101
- from coord.state import record_test_verdict
1244
+ from coord.state import load_assignment_test_reason, record_test_verdict
1245
+
1246
+ # Belt and braces: the authoritative single-row read, falling back to
1247
+ # the board-carried value when it is unavailable (thin client, remote
1248
+ # read failure). Both are bounded previews at worst and the tally is
1249
+ # written at the front of the reason, so either still carries it.
1250
+ prior_legs = max(
1251
+ mute_smoke_legs(load_assignment_test_reason(completed.assignment_id)),
1252
+ mute_smoke_legs(getattr(completed, "test_reason", None)),
1253
+ )
1254
+ running_reason = "dispatched: Test stage running (#1426)"
1255
+ if prior_legs:
1256
+ running_reason = (
1257
+ f"{mute_smoke_tally(prior_legs)} — {running_reason}; "
1258
+ f"retry {prior_legs + 1} of {MUTE_SMOKE_LEG_BUDGET} after "
1259
+ f"{prior_legs} Test-stage leg(s) produced no verdict (#2272)"
1260
+ )
1102
1261
 
1103
1262
  record_test_verdict(
1104
1263
  assignment_id=completed.assignment_id,
1105
1264
  test_state="running",
1106
- test_reason="dispatched: Test stage running (#1426)",
1265
+ test_reason=running_reason,
1107
1266
  )
1108
1267
  completed.test_state = "running"
1268
+ completed.test_reason = running_reason
1109
1269
 
1110
1270
  return smoke_assignment
1111
1271
 
@@ -276,6 +276,16 @@ def test_stage_status_for(
276
276
  # blocked reason reaches the operator through `test_reason` instead —
277
277
  # rendered by `coord gates` and, since no smoke row exists in this case,
278
278
  # by the TUI Summary tab's `board_assignment_reason` on the work row.
279
+ #
280
+ # #2272 parks the same ``"blocked"`` for a second cause — N Test-stage
281
+ # legs finished without printing a `SMOKE:` marker and the retry budget
282
+ # ran out — and it maps here for the identical reason: a mute leg says
283
+ # nothing about the branch, so FAILED would be a lie about the diff and
284
+ # would offer the operator a Work re-dispatch that fixes nothing. The
285
+ # count and the cause travel in `test_reason` (`coord.smoke.
286
+ # mute_smoke_legs` reads them back), which is what keeps a row on its
287
+ # last retry distinguishable from one whose Test stage never started —
288
+ # the confusion that let five identical mute laps look like progress.
279
289
  return PENDING
280
290
 
281
291
 
@@ -261,6 +261,44 @@ def test_a_blocked_test_stage_is_a_dead_end() -> None:
261
261
  assert found.recovery == (
262
262
  f"coord diagnose {REPO} {ISSUE} --stage test --reset"
263
263
  )
264
+ # The #1672 cause, stated as the #1672 cause.
265
+ assert "no capability-matched" in found.reason
266
+
267
+
268
+ def test_a_mute_exhausted_test_stage_names_its_own_cause() -> None:
269
+ """#2272: the mute-leg budget parks the SAME ``blocked`` value as #1672's
270
+ unroutable stage — both mean "no verdict is coming" — but the recovery is
271
+ completely different, so they must not share a reason.
272
+
273
+ Telling an operator "no capability-matched machine could run the suite"
274
+ about a row whose machines were healthy all along is the symptom-not-cause
275
+ failure #2235 exists to measure: the real answer is "N legs went mute,
276
+ almost certainly the 600s Bash ceiling".
277
+ """
278
+ from coord.smoke import mute_smoke_tally # noqa: PLC0415
279
+
280
+ found = detect_dead_end(
281
+ state(
282
+ work_aid="w2272",
283
+ work_status="done",
284
+ work_branch="issue-2272",
285
+ work_test_state=TEST_STATE_BLOCKED,
286
+ work_test_reason=(
287
+ f"{mute_smoke_tally(2)}: the Test-stage worker 9214dcb25204 "
288
+ "ended without printing a verdict marker line. 2 smoke legs "
289
+ "produced no verdict."
290
+ ),
291
+ active_count=0,
292
+ )
293
+ )
294
+ assert found is not None
295
+ assert found.kind == "test_stage_blocked"
296
+ assert "2 Test-stage leg(s)" in found.reason
297
+ assert "600s Bash ceiling" in found.reason
298
+ # It must NOT misattribute this to the fleet — the machines were fine.
299
+ assert "no capability-matched" not in found.reason
300
+ # And it must not read as a statement about the branch.
301
+ assert "Nothing is known to be wrong with the BRANCH" in found.reason
264
302
 
265
303
 
266
304
  def test_gates_carry_the_readings_that_proved_the_dead_end() -> None: