code-coordinator 0.5.94__tar.gz → 0.5.96__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.94 → code_coordinator-0.5.96}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/acceptance.py +44 -1
  5. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/commands/acceptance.py +127 -2
  6. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/commands/release.py +82 -8
  7. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/merge_queue.py +129 -27
  8. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/release_propagate.py +23 -1
  9. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_acceptance.py +54 -0
  10. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_acceptance.py +199 -0
  11. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_release_propagate.py +161 -0
  12. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_release_window.py +52 -0
  13. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_merge_queue.py +106 -4
  14. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/.claude/commands/board.md +0 -0
  15. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/.claude/commands/complete-session.md +0 -0
  16. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/.claude/commands/coordinator.md +0 -0
  17. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/.githooks/_lib.sh +0 -0
  18. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/.githooks/post-checkout +0 -0
  19. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/.githooks/post-commit +0 -0
  20. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/.githooks/post-merge +0 -0
  21. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  22. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/.github/coord-ci-acceptance.yml +0 -0
  23. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/.github/workflows/auto-release.yml +0 -0
  24. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/.github/workflows/cargo-test.yml +0 -0
  25. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/.github/workflows/publish.yml +0 -0
  26. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/.github/workflows/release-tui.yml +0 -0
  27. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/.github/workflows/test.yml +0 -0
  28. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/.gitignore +0 -0
  29. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/CLAUDE.md +0 -0
  30. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/GOAL.md +0 -0
  31. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/LICENSE +0 -0
  32. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/MANIFEST.in +0 -0
  33. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/README.md +0 -0
  34. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/code_coordinator.egg-info/SOURCES.txt +0 -0
  35. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/code_coordinator.egg-info/dependency_links.txt +0 -0
  36. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/code_coordinator.egg-info/entry_points.txt +0 -0
  37. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/code_coordinator.egg-info/requires.txt +0 -0
  38. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/code_coordinator.egg-info/scm_file_list.json +0 -0
  39. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/code_coordinator.egg-info/top_level.txt +0 -0
  40. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/__init__.py +0 -0
  41. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/_board_mapping.py +0 -0
  42. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/acceptance_drivers.py +0 -0
  43. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/agent.py +0 -0
  44. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/agent_app.py +0 -0
  45. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/agent_update.py +0 -0
  46. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/agents/opencode/.gitignore +0 -0
  47. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/agents/opencode/agents/work.md +0 -0
  48. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/agents/opencode/routing.jsonc +0 -0
  49. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/audit.py +0 -0
  50. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/auto_loop.py +0 -0
  51. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/block_log.py +0 -0
  52. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/board_bool_guard.py +0 -0
  53. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/board_service.py +0 -0
  54. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/board_wire.py +0 -0
  55. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/brain.py +0 -0
  56. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/branch_model.py +0 -0
  57. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/bug_intake.py +0 -0
  58. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/cargo_cache.py +0 -0
  59. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/ci_github.py +0 -0
  60. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/ci_store.py +0 -0
  61. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/claim.py +0 -0
  62. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/cli.py +0 -0
  63. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/client.py +0 -0
  64. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/commands/__init__.py +0 -0
  65. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/commands/_common.py +0 -0
  66. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/commands/agent_ops.py +0 -0
  67. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/commands/audit.py +0 -0
  68. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/commands/chat.py +0 -0
  69. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/commands/dispatch.py +0 -0
  70. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/commands/dispatch_workers.py +0 -0
  71. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/commands/drive.py +0 -0
  72. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/commands/drive_queue.py +0 -0
  73. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/commands/gate_a.py +0 -0
  74. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/commands/gates.py +0 -0
  75. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/commands/issues.py +0 -0
  76. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/commands/lifecycle.py +0 -0
  77. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/commands/merge.py +0 -0
  78. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/commands/milestone.py +0 -0
  79. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/commands/plan_followup.py +0 -0
  80. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/commands/plans.py +0 -0
  81. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/commands/portal.py +0 -0
  82. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/commands/repo.py +0 -0
  83. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/commands/report.py +0 -0
  84. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/commands/review.py +0 -0
  85. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/commands/scorecard.py +0 -0
  86. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/commands/sessions.py +0 -0
  87. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/commands/setup.py +0 -0
  88. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/commands/status.py +0 -0
  89. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/commands/terminal.py +0 -0
  90. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/commands/test_gate.py +0 -0
  91. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/commands/tui.py +0 -0
  92. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/comments.py +0 -0
  93. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/config.py +0 -0
  94. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/conflict_fix.py +0 -0
  95. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dao.py +0 -0
  96. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/__init__.py +0 -0
  97. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/fixture.py +0 -0
  98. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/index.html +0 -0
  99. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/server.py +0 -0
  100. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/terminal.py +0 -0
  101. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/.gitignore +0 -0
  102. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/components.json +0 -0
  103. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/dist/assets/Gallery-Cq84itDE.js +0 -0
  104. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  105. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/dist/assets/Terminal-DOXLcMue.js +0 -0
  106. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/dist/assets/index-DHn-RIJ8.js +0 -0
  107. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  108. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  109. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  110. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  111. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  112. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/dist/index.html +0 -0
  113. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  114. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/dist/sw.js +0 -0
  115. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  116. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  117. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  118. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  119. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  120. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  121. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  122. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  123. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  124. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  125. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/eslint.config.js +0 -0
  126. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/index.html +0 -0
  127. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  128. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/package-lock.json +0 -0
  129. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/package.json +0 -0
  130. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  131. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/playwright.config.ts +0 -0
  132. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/postcss.config.js +0 -0
  133. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  134. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  135. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  136. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/App.tsx +0 -0
  137. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/api/client.ts +0 -0
  138. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  139. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  140. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  141. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  142. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  143. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  144. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  145. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  146. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  147. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  148. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  149. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  150. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  151. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  152. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  153. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  154. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  155. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  156. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  157. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  158. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  159. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  160. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  161. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  162. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  163. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  164. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  165. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  166. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  167. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  168. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  169. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  170. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  171. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  172. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  173. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/index.css +0 -0
  174. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  175. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  176. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/main.tsx +0 -0
  177. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  178. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  179. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  180. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  181. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  182. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  183. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  184. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  185. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  186. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  187. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  188. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  189. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  190. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  191. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  192. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  193. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  194. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  195. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  196. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  197. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  198. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  199. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  200. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/tailwind.config.js +0 -0
  201. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/tsconfig.json +0 -0
  202. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  203. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dashboard/webapp/vite.config.ts +0 -0
  204. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/db.py +0 -0
  205. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dead_end.py +0 -0
  206. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/deploy/README.md +0 -0
  207. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/deploy/coord-agent.service +0 -0
  208. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/deploy/coord-db-backup.service +0 -0
  209. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/deploy/coord-db-backup.sh +0 -0
  210. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/deploy/coord-db-backup.timer +0 -0
  211. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/deploy/coord-drive-queue.service +0 -0
  212. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/deploy/coord-drive-queue.timer +0 -0
  213. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/deploy/coord-notify.service +0 -0
  214. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/deploy/coord-notify.timer +0 -0
  215. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/deploy/coord-release-propagate.service +0 -0
  216. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/deploy/coord-release-propagate.timer +0 -0
  217. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/deploy/coord-release-window.service +0 -0
  218. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/deploy/coord-release-window.timer +0 -0
  219. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/deploy/coord-serve.service +0 -0
  220. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/deploy/coord-web-dist-build.service +0 -0
  221. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/deploy/coord-web-dist-build.timer +0 -0
  222. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/deploy/coord-web.service +0 -0
  223. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/deploy_manifest.py +0 -0
  224. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/deploy_units.py +0 -0
  225. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/deps.py +0 -0
  226. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/diagnose.py +0 -0
  227. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dispatch.py +0 -0
  228. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/dist_name.py +0 -0
  229. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/drive.py +0 -0
  230. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/drive_queue.py +0 -0
  231. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/drive_state.py +0 -0
  232. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/events.py +0 -0
  233. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/failure_class.py +0 -0
  234. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/filelock.py +0 -0
  235. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/fleet_config_health.py +0 -0
  236. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/freshness.py +0 -0
  237. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/gate_a.py +0 -0
  238. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/gate_b.py +0 -0
  239. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/gate_snapshot.py +0 -0
  240. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/gates.py +0 -0
  241. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/github_ops.py +0 -0
  242. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/goal.py +0 -0
  243. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/graph_health.py +0 -0
  244. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/health/__init__.py +0 -0
  245. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/health/aggregate.py +0 -0
  246. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/health/checks/__init__.py +0 -0
  247. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/health/checks/agent_install.py +0 -0
  248. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/health/checks/cargo_targets.py +0 -0
  249. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/health/checks/claude_binary.py +0 -0
  250. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/health/checks/deploy_lane_facts.py +0 -0
  251. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/health/checks/disk.py +0 -0
  252. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/health/checks/fleet_board.py +0 -0
  253. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  254. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/health/checks/fleet_phantom.py +0 -0
  255. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/health/checks/fleet_unit_drift.py +0 -0
  256. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/health/checks/graph.py +0 -0
  257. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/health/checks/graphify_cli.py +0 -0
  258. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/health/checks/index_lock.py +0 -0
  259. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/health/checks/plan_usage.py +0 -0
  260. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/health/checks/repo_state.py +0 -0
  261. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/health/checks/spawned_coord.py +0 -0
  262. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/health/checks/timer_active.py +0 -0
  263. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/health/checks/toolchain.py +0 -0
  264. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/health/checks/unit_drift.py +0 -0
  265. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/health/checks/unit_enablement.py +0 -0
  266. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/health/checks/worktrees.py +0 -0
  267. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/health/cli.py +0 -0
  268. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/health/context.py +0 -0
  269. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/health/fleet_snapshot.py +0 -0
  270. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/health/models.py +0 -0
  271. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/health/pypi.py +0 -0
  272. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/health/registry.py +0 -0
  273. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/health/render.py +0 -0
  274. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/health/units.py +0 -0
  275. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/hooks.py +0 -0
  276. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/housekeeping.py +0 -0
  277. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/interactive.py +0 -0
  278. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/issue_store.py +0 -0
  279. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/liveness_auditor.py +0 -0
  280. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/machine_pause.py +0 -0
  281. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/milestone_chat.py +0 -0
  282. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/milestone_dispatch.py +0 -0
  283. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/milestone_gate.py +0 -0
  284. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/milestone_order.py +0 -0
  285. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/mock_author.py +0 -0
  286. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/models.py +0 -0
  287. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/network.py +0 -0
  288. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/new_issue_chat.py +0 -0
  289. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/notifier/__init__.py +0 -0
  290. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/notifier/baseline.py +0 -0
  291. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/notifier/cli.py +0 -0
  292. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/notifier/collect.py +0 -0
  293. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/notifier/digest.py +0 -0
  294. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/notifier/models.py +0 -0
  295. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/notifier/predicate.py +0 -0
  296. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/notifier/service.py +0 -0
  297. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/notifier/store.py +0 -0
  298. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/notifier/transport.py +0 -0
  299. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/notify.py +0 -0
  300. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/openapi.py +0 -0
  301. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/overlap_fence.py +0 -0
  302. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/overlap_predict.py +0 -0
  303. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/parentage.py +0 -0
  304. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/parentage_github.py +0 -0
  305. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/pipeline.py +0 -0
  306. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/plan_parser.py +0 -0
  307. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/plans.py +0 -0
  308. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/platform_paths.py +0 -0
  309. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/portal_bridge.py +0 -0
  310. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/portal_store.py +0 -0
  311. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/portal_sync.py +0 -0
  312. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/pr_body_lint.py +0 -0
  313. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/prereqs.py +0 -0
  314. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/progress.py +0 -0
  315. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/providers/__init__.py +0 -0
  316. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/providers/base.py +0 -0
  317. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/providers/claude.py +0 -0
  318. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/providers/claude_pty.py +0 -0
  319. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/providers/opencode.py +0 -0
  320. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/reconcile.py +0 -0
  321. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/refine_chat.py +0 -0
  322. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/release_cordon.py +0 -0
  323. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/release_verify.py +0 -0
  324. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/release_window.py +0 -0
  325. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/repo_edit.py +0 -0
  326. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/repo_onboard.py +0 -0
  327. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/reports.py +0 -0
  328. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/revalidate.py +0 -0
  329. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/review.py +0 -0
  330. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/scorecard.py +0 -0
  331. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/serve_app.py +0 -0
  332. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/skills/update-issue/SKILL.md +0 -0
  333. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/smoke.py +0 -0
  334. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/spend_ceiling.py +0 -0
  335. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/split_work.py +0 -0
  336. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/stage_projection.py +0 -0
  337. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/state.py +0 -0
  338. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/test_author.py +0 -0
  339. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/test_chat.py +0 -0
  340. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/test_orchestrator.py +0 -0
  341. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/test_report.py +0 -0
  342. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/tui_release.py +0 -0
  343. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/usage.py +0 -0
  344. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/usage_limits.py +0 -0
  345. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/usage_rollup.py +0 -0
  346. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coord/worker_events.py +0 -0
  347. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/coordinator.example.yml +0 -0
  348. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/deploy/coord-agent.service +0 -0
  349. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/deploy/coord-db-backup.service +0 -0
  350. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/deploy/coord-db-backup.sh +0 -0
  351. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/deploy/coord-db-backup.timer +0 -0
  352. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/deploy/coord-drive-queue.service +0 -0
  353. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/deploy/coord-drive-queue.timer +0 -0
  354. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/deploy/coord-notify.service +0 -0
  355. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/deploy/coord-notify.timer +0 -0
  356. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/deploy/coord-release-propagate.service +0 -0
  357. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/deploy/coord-release-propagate.timer +0 -0
  358. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/deploy/coord-release-window.service +0 -0
  359. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/deploy/coord-release-window.timer +0 -0
  360. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/deploy/coord-serve.service +0 -0
  361. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/deploy/coord-web-dist-build.service +0 -0
  362. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/deploy/coord-web-dist-build.sh +0 -0
  363. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/deploy/coord-web-dist-build.timer +0 -0
  364. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/deploy/coord-web-rollback.sh +0 -0
  365. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/deploy/coord-web.service +0 -0
  366. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/deploy/node-shim.sh +0 -0
  367. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/docs/AGENT_OPERATIONS.md +0 -0
  368. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/docs/ARCHITECTURE.md +0 -0
  369. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/docs/ARCH_SECURITY_GATES.md +0 -0
  370. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/docs/COCKPIT.md +0 -0
  371. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/docs/CONTROL_CENTER.md +0 -0
  372. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/docs/COST_DISCIPLINE.md +0 -0
  373. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/docs/CROSS_PLATFORM.md +0 -0
  374. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/docs/CUSTOMER_PORTAL.md +0 -0
  375. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/docs/DRIVE_QUEUE.md +0 -0
  376. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/docs/EPHEMERAL_WORKERS.md +0 -0
  377. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/docs/FORGE_MIGRATION.md +0 -0
  378. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/docs/GRAPHIFY_SETUP.md +0 -0
  379. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/docs/ISSUE_GUIDANCE.md +0 -0
  380. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/docs/MAC_MINI.md +0 -0
  381. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  382. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/docs/NOTIFIER.md +0 -0
  383. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/docs/OPENCODE_VERIFICATION.md +0 -0
  384. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/docs/OPERATING_GOTCHAS.md +0 -0
  385. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/docs/ORACLE_LOOP.md +0 -0
  386. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/docs/PHONE_WEBAPP.md +0 -0
  387. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/docs/PIPELINE_V2.md +0 -0
  388. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/docs/PLATFORM_EVOLUTION.md +0 -0
  389. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/docs/SECOND_BACKEND.md +0 -0
  390. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/docs/STORE_SERVICE.md +0 -0
  391. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  392. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/docs/WEB_CONTROL_CENTER.md +0 -0
  393. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/docs/mocks/web/README.md +0 -0
  394. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/docs/mocks/web/_tokens.css +0 -0
  395. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/docs/mocks/web/issue-detail.html +0 -0
  396. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/docs/mocks/web/pipeline-narrow.html +0 -0
  397. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/docs/mocks/web/pipeline-wide.html +0 -0
  398. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/graphify-out/.gitignore +0 -0
  399. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/install-agent.sh +0 -0
  400. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/pyproject.toml +0 -0
  401. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/scripts/audit_review_verdict_overrides.py +0 -0
  402. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  403. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/scripts/azure-workers/build-worker-image.sh +0 -0
  404. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/scripts/azure-workers/coordinator-machine.py +0 -0
  405. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/scripts/azure-workers/epic-down.sh +0 -0
  406. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/scripts/azure-workers/epic-up.sh +0 -0
  407. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/scripts/azure-workers/preflight.sh +0 -0
  408. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/scripts/azure-workers/provision-worker.sh +0 -0
  409. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  410. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  411. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/scripts/azure-workers/verify-github-token.sh +0 -0
  412. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/scripts/codegen.py +0 -0
  413. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/scripts/coord-test-runner.sh +0 -0
  414. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/scripts/drive-batch.sh +0 -0
  415. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/scripts/gen_board_fixture.py +0 -0
  416. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/scripts/next_release_tag.py +0 -0
  417. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/scripts/run_tests_in_populated_home.sh +0 -0
  418. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/scripts/run_tests_without_gh.sh +0 -0
  419. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/scripts/smoke_437_interactive.py +0 -0
  420. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/scripts/verify_878_review_capture.py +0 -0
  421. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/scripts/verify_release_published.py +0 -0
  422. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/scripts/verify_release_wheel.py +0 -0
  423. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/setup.cfg +0 -0
  424. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/SMOKE_SET.md +0 -0
  425. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/__init__.py +0 -0
  426. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  427. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/acceptance/ms-33/contract.md +0 -0
  428. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/acceptance/ms-33/manifest.yml +0 -0
  429. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  430. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  431. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  432. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  433. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/acceptance/ms-37/conftest.py +0 -0
  434. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/acceptance/ms-37/contract.md +0 -0
  435. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/acceptance/ms-37/manifest.yml +0 -0
  436. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  437. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  438. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/acceptance/ms-38/contract.md +0 -0
  439. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/acceptance/ms-38/manifest.yml +0 -0
  440. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  441. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  442. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  443. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  444. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  445. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  446. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  447. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  448. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  449. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  450. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/acceptance/ms-51/contract.md +0 -0
  451. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  452. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  453. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/acceptance/ms-51/manifest.yml +0 -0
  454. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  455. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/acceptance/ms-51/tsconfig.json +0 -0
  456. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  457. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/conftest.py +0 -0
  458. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/fixtures/board-pipeline-basic.json +0 -0
  459. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  460. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  461. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  462. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/fixtures/playwright/all_pass.json +0 -0
  463. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  464. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/fixtures/playwright/mixed_fail.json +0 -0
  465. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  466. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  467. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/fixtures/playwright/skip.json +0 -0
  468. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/fixtures/playwright/truncated.json +0 -0
  469. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  470. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  471. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  472. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  473. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  474. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  475. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  476. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  477. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_acceptance_drivers.py +0 -0
  478. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_agent.py +0 -0
  479. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_agent_api_error.py +0 -0
  480. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_agent_app.py +0 -0
  481. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_agent_branch_base.py +0 -0
  482. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_agent_branch_capture.py +0 -0
  483. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_agent_config_free_1712.py +0 -0
  484. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_agent_deploy_units_endpoint.py +0 -0
  485. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_agent_dirty_worktree.py +0 -0
  486. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_agent_graph_self_heal.py +0 -0
  487. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_agent_health_h3.py +0 -0
  488. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_agent_idle_restart.py +0 -0
  489. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_agent_push_failure.py +0 -0
  490. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_agent_reap.py +0 -0
  491. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_agent_repos_and_pull.py +0 -0
  492. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_agent_restart_services_endpoint.py +0 -0
  493. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_agent_startup_diagnostics.py +0 -0
  494. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_agent_update.py +0 -0
  495. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_agent_update_bluegreen.py +0 -0
  496. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_agent_usage_limit.py +0 -0
  497. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_agent_zero_commit.py +0 -0
  498. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_ambient_home_isolation.py +0 -0
  499. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_approve_reject_plan.py +0 -0
  500. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_approve_usage_gate.py +0 -0
  501. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_assignment_already_recorded_daemon.py +0 -0
  502. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_audit_log.py +0 -0
  503. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_audit_outcome.py +0 -0
  504. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_audit_query.py +0 -0
  505. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_auto_loop.py +0 -0
  506. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_auto_release_publish_2035.py +0 -0
  507. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_base_checkout_restore.py +0 -0
  508. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_block_log.py +0 -0
  509. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_board_cap_762.py +0 -0
  510. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_board_fixture.py +0 -0
  511. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_board_read_path.py +0 -0
  512. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_board_service.py +0 -0
  513. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_board_state.py +0 -0
  514. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_board_wire.py +0 -0
  515. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_brain.py +0 -0
  516. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_branch_model.py +0 -0
  517. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_bug_intake.py +0 -0
  518. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_build_worker_image_env_update.py +0 -0
  519. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cargo_cache.py +0 -0
  520. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_ci_acceptance_gate_1950.py +0 -0
  521. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_ci_parity_2091.py +0 -0
  522. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_ci_store.py +0 -0
  523. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_claim.py +0 -0
  524. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_assign.py +0 -0
  525. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  526. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_assign_interactive_remote.py +0 -0
  527. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_assign_provider.py +0 -0
  528. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  529. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_audit.py +0 -0
  530. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_chat_continue.py +0 -0
  531. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_diagnose_config_provenance.py +0 -0
  532. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_diagnose_graph.py +0 -0
  533. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_doctor.py +0 -0
  534. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_doctor_config_free_1801.py +0 -0
  535. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  536. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_drive.py +0 -0
  537. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_drive_queue.py +0 -0
  538. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_escalate.py +0 -0
  539. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_fix_headless_review.py +0 -0
  540. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_gate_a.py +0 -0
  541. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_install_drift.py +0 -0
  542. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_install_skills.py +0 -0
  543. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_issue_create_label.py +0 -0
  544. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_issue_reopen.py +0 -0
  545. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_merge.py +0 -0
  546. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_milestone_assign.py +0 -0
  547. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_milestone_capture.py +0 -0
  548. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_milestone_chat_add_child.py +0 -0
  549. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_milestone_dispatch.py +0 -0
  550. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_milestone_gate_b.py +0 -0
  551. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_milestone_gate_c.py +0 -0
  552. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_milestone_order.py +0 -0
  553. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  554. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_milestone_ship.py +0 -0
  555. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_network.py +0 -0
  556. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_new_issue_chat.py +0 -0
  557. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_plans.py +0 -0
  558. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_portal.py +0 -0
  559. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_pull_artifact.py +0 -0
  560. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_queue.py +0 -0
  561. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_reattach_sessions.py +0 -0
  562. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_refine_board.py +0 -0
  563. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_release_preflight.py +0 -0
  564. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_repo_2220.py +0 -0
  565. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_scorecard.py +0 -0
  566. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_set_review_findings.py +0 -0
  567. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_status_advisory_terminal.py +0 -0
  568. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_status_merge_queue.py +0 -0
  569. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_status_provider.py +0 -0
  570. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_status_review_finalizing.py +0 -0
  571. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_status_test_failed_tag.py +0 -0
  572. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_status_usage_limit.py +0 -0
  573. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_sync_comments_873.py +0 -0
  574. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_test_plan.py +0 -0
  575. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_track.py +0 -0
  576. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_tui_update.py +0 -0
  577. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cli_wait.py +0 -0
  578. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_client_base_install.py +0 -0
  579. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_comments.py +0 -0
  580. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_completion_summary.py +0 -0
  581. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_config.py +0 -0
  582. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_config_acceptance.py +0 -0
  583. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_config_audit.py +0 -0
  584. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_config_pricing.py +0 -0
  585. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  586. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_config_usage_gate.py +0 -0
  587. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_conflict_fix.py +0 -0
  588. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_conflict_fix_semantic.py +0 -0
  589. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_coord_test.py +0 -0
  590. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_coord_test_runner_baseline.py +0 -0
  591. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_coord_test_runner_routing.py +0 -0
  592. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_coord_test_runner_toolchain.py +0 -0
  593. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_coord_web_sse_restart_live.py +0 -0
  594. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_coordinator_machine.py +0 -0
  595. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_cross_platform_imports.py +0 -0
  596. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_dashboard.py +0 -0
  597. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_dashboard_fixture.py +0 -0
  598. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_dashboard_terminal.py +0 -0
  599. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_dashboard_terminal_live.py +0 -0
  600. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_db.py +0 -0
  601. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_dead_end.py +0 -0
  602. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_deploy_coord_db_backup.py +0 -0
  603. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_deploy_coord_web_dist.py +0 -0
  604. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_deploy_coord_web_rollback.py +0 -0
  605. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_deploy_drive_queue_unit.py +0 -0
  606. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_deploy_manifest.py +0 -0
  607. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_deploy_units_lane.py +0 -0
  608. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_deploy_web_unit.py +0 -0
  609. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_deps.py +0 -0
  610. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_diagnose.py +0 -0
  611. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_dispatch.py +0 -0
  612. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_dispatch_target_validation.py +0 -0
  613. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_dist_name.py +0 -0
  614. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_done_housekeeping.py +0 -0
  615. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_drive.py +0 -0
  616. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_drive_queue.py +0 -0
  617. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_drive_state.py +0 -0
  618. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_drive_tmux.py +0 -0
  619. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_epic_up_capability_detection.py +0 -0
  620. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  621. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_epic_up_image_provenance.py +0 -0
  622. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_errors.py +0 -0
  623. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_events.py +0 -0
  624. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_failure_class.py +0 -0
  625. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_filelock.py +0 -0
  626. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  627. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_fix_of_force_override.py +0 -0
  628. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_fleet_config_health.py +0 -0
  629. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_fleet_health_probes.py +0 -0
  630. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_fleet_health_snapshot.py +0 -0
  631. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_freshness.py +0 -0
  632. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_gate_a.py +0 -0
  633. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_gate_b.py +0 -0
  634. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_gate_snapshot_staleness.py +0 -0
  635. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_gates.py +0 -0
  636. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  637. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_generated_types_fixture.py +0 -0
  638. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_github_ops.py +0 -0
  639. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_goal.py +0 -0
  640. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_graph_health.py +0 -0
  641. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_graph_selfheal_absent_2237.py +0 -0
  642. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_handoff.py +0 -0
  643. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_health_checks.py +0 -0
  644. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_health_cli.py +0 -0
  645. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_health_cli_graph.py +0 -0
  646. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_health_config.py +0 -0
  647. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_health_context.py +0 -0
  648. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_health_deploy_lane_facts.py +0 -0
  649. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_health_incident_regression.py +0 -0
  650. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_health_pypi.py +0 -0
  651. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_health_registry.py +0 -0
  652. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_health_timer_active.py +0 -0
  653. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_health_toolchain.py +0 -0
  654. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_health_unit_drift.py +0 -0
  655. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_health_unit_enablement.py +0 -0
  656. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_hooks.py +0 -0
  657. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_human_attended_437.py +0 -0
  658. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_init.py +0 -0
  659. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_integration.py +0 -0
  660. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_interactive_briefing_echo.py +0 -0
  661. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_interactive_prefill_state.py +0 -0
  662. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_interactive_session_relaunch.py +0 -0
  663. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_interactive_test_verdict_backstop.py +0 -0
  664. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_interactive_token_attribution.py +0 -0
  665. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_interactive_worktree.py +0 -0
  666. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_issue_store_seam.py +0 -0
  667. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_liveness_auditor.py +0 -0
  668. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_liveness_notify.py +0 -0
  669. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_machine_pause.py +0 -0
  670. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_merge_verify.py +0 -0
  671. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_milestone_chat.py +0 -0
  672. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_milestone_dispatch.py +0 -0
  673. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_milestone_gate.py +0 -0
  674. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_milestone_order.py +0 -0
  675. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_milestone_seam.py +0 -0
  676. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_mock_author.py +0 -0
  677. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_model_tiering.py +0 -0
  678. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_models.py +0 -0
  679. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_models_config_labels.py +0 -0
  680. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_needs_attention.py +0 -0
  681. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_network.py +0 -0
  682. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_new_issue_chat.py +0 -0
  683. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_next_release_tag.py +0 -0
  684. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_no_direct_gh_calls.py +0 -0
  685. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_node_shim.py +0 -0
  686. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_notifier_baseline.py +0 -0
  687. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_notifier_cli.py +0 -0
  688. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_notifier_collect.py +0 -0
  689. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_notifier_config.py +0 -0
  690. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_notifier_drive_seam.py +0 -0
  691. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_notifier_isolation.py +0 -0
  692. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_notifier_predicate.py +0 -0
  693. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_notifier_quiet_hours.py +0 -0
  694. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_notifier_service.py +0 -0
  695. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_notify.py +0 -0
  696. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_notify_drain.py +0 -0
  697. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_openapi.py +0 -0
  698. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_operational_defaults.py +0 -0
  699. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_overlap_fence.py +0 -0
  700. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_overlap_predict.py +0 -0
  701. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_packaged_deploy_units.py +0 -0
  702. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_parentage.py +0 -0
  703. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_paste_landed.py +0 -0
  704. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_pipeline.py +0 -0
  705. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_plan_followup_approve_plan_command.py +0 -0
  706. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_plan_followup_pr_command.py +0 -0
  707. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_plan_followup_review_command.py +0 -0
  708. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_plan_only.py +0 -0
  709. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_plan_parser.py +0 -0
  710. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_platform_paths.py +0 -0
  711. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_portal_bridge.py +0 -0
  712. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_portal_config.py +0 -0
  713. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_portal_sync.py +0 -0
  714. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_pr_body_lint.py +0 -0
  715. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_prereqs.py +0 -0
  716. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_production_db_guard.py +0 -0
  717. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_progress.py +0 -0
  718. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_provider_seam.py +0 -0
  719. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_providers.py +0 -0
  720. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_providers_config_labels.py +0 -0
  721. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_providers_pty.py +0 -0
  722. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_quiet_hours.py +0 -0
  723. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_quiet_hours_store_2146.py +0 -0
  724. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_reap_merged_sessions.py +0 -0
  725. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_reap_stale_interactive_tick.py +0 -0
  726. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_reconcile_branch.py +0 -0
  727. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_reconcile_completions.py +0 -0
  728. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_reconcile_merges.py +0 -0
  729. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_reconcile_usage_limit_done.py +0 -0
  730. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_refine_chat.py +0 -0
  731. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_release_cordon_2101.py +0 -0
  732. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  733. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_release_cordon_deadlock_2240.py +0 -0
  734. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_release_propagate.py +0 -0
  735. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_release_unified_1242.py +0 -0
  736. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_release_verify.py +0 -0
  737. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_release_window.py +0 -0
  738. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_remote_auto_prune.py +0 -0
  739. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_remote_interactive_reaper.py +0 -0
  740. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_repo_edit_2220.py +0 -0
  741. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_repo_graph_fleet_2237.py +0 -0
  742. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_repo_onboard_2220.py +0 -0
  743. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_report_result_push.py +0 -0
  744. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_reports.py +0 -0
  745. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_retry.py +0 -0
  746. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_retry_advisory_1606.py +0 -0
  747. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_retry_type_1636.py +0 -0
  748. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_revalidate.py +0 -0
  749. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_review.py +0 -0
  750. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_review_end_review_without_verdict.py +0 -0
  751. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_review_parse_failure_diagnostic.py +0 -0
  752. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_review_reaffirm.py +0 -0
  753. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_review_state.py +0 -0
  754. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_review_verdict_backstop.py +0 -0
  755. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_review_verdict_override_audit.py +0 -0
  756. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_review_verdict_relay.py +0 -0
  757. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_review_zero_commits.py +0 -0
  758. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_scoped_review_wiring.py +0 -0
  759. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_scorecard.py +0 -0
  760. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_serve.py +0 -0
  761. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_serve_app_board_trim.py +0 -0
  762. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_session.py +0 -0
  763. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_slice_issue_attribution.py +0 -0
  764. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_smoke.py +0 -0
  765. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_smoke_live_checkout_restore.py +0 -0
  766. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_smoke_workflow.py +0 -0
  767. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_spend_ceiling.py +0 -0
  768. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_spend_ceiling_coordinator.py +0 -0
  769. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_split.py +0 -0
  770. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_split_work.py +0 -0
  771. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_stage_projection.py +0 -0
  772. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_stalled_pipeline.py +0 -0
  773. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_state.py +0 -0
  774. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_state_review_findings_daemon.py +0 -0
  775. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_status_fleet_footer.py +0 -0
  776. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_stop_1567.py +0 -0
  777. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_stuck.py +0 -0
  778. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_terminal_command.py +0 -0
  779. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_test_author.py +0 -0
  780. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_test_chat.py +0 -0
  781. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_test_orchestrator.py +0 -0
  782. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_test_report.py +0 -0
  783. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_test_verdict_parsing.py +0 -0
  784. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_test_verdict_transcript_floor.py +0 -0
  785. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_thin_client_board_audit.py +0 -0
  786. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_thin_client_config_load_1080.py +0 -0
  787. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_thin_client_daemon_routing_906.py +0 -0
  788. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_tmux_host.py +0 -0
  789. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_tmux_session.py +0 -0
  790. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_transcript_floor.py +0 -0
  791. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_usage.py +0 -0
  792. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_usage_limits.py +0 -0
  793. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_usage_rollup.py +0 -0
  794. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_venv_live_install_2121.py +0 -0
  795. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_version_single_source.py +0 -0
  796. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_watch.py +0 -0
  797. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_worker_events.py +0 -0
  798. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_worker_image_pin_sync.py +0 -0
  799. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_worker_safety.py +0 -0
  800. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_worker_test_scoping.py +0 -0
  801. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_worktree.py +0 -0
  802. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  803. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/Cargo.lock +0 -0
  804. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/Cargo.toml +0 -0
  805. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/cargo-config-local-quadraui.toml.example +0 -0
  806. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/app/audit.rs +0 -0
  807. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/app/chat.rs +0 -0
  808. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/app/data.rs +0 -0
  809. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/app/dialogs.rs +0 -0
  810. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/app/drive.rs +0 -0
  811. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/app/drive_queue.rs +0 -0
  812. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/app/escalation.rs +0 -0
  813. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/app/events.rs +0 -0
  814. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/app/fixtures.rs +0 -0
  815. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/app/fleet_health.rs +0 -0
  816. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/app/fleet_sessions.rs +0 -0
  817. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/app/fleet_terminals.rs +0 -0
  818. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/app/format.rs +0 -0
  819. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/app/milestone_dag.rs +0 -0
  820. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/app/mod.rs +0 -0
  821. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/app/msv.rs +0 -0
  822. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/app/pipeline.rs +0 -0
  823. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/app/plans.rs +0 -0
  824. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/app/render.rs +0 -0
  825. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/app/reports.rs +0 -0
  826. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/app/sessions.rs +0 -0
  827. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/app/settings_ui.rs +0 -0
  828. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/app/sidebar.rs +0 -0
  829. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/app/terminal.rs +0 -0
  830. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/app/tests.rs +0 -0
  831. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/app/types.rs +0 -0
  832. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/app/workspace.rs +0 -0
  833. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/bin/gtk.rs +0 -0
  834. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/commands.rs +0 -0
  835. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/lib.rs +0 -0
  836. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/main.rs +0 -0
  837. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/src/settings.rs +0 -0
  838. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/tests/acceptance.rs +0 -0
  839. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/tui/tests/cli.rs +0 -0
  840. {code_coordinator-0.5.94 → code_coordinator-0.5.96}/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.94
3
+ Version: 0.5.96
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.94
3
+ Version: 0.5.96
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.94",
2
+ "tag": "0.5.96",
3
3
  "distance": 0,
4
- "node": "gc872293016c9a4132c83fff7881956b707aacbf7",
4
+ "node": "g312293364325c98de0888c4de55e3f5f168662dd",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-15"
@@ -22,7 +22,7 @@ import json
22
22
  import re
23
23
  from dataclasses import dataclass, field
24
24
  from pathlib import Path
25
- from typing import Any, Callable
25
+ from typing import Any, Callable, Literal
26
26
 
27
27
  import yaml
28
28
 
@@ -1105,3 +1105,46 @@ def clear_expected_red_via_pr(
1105
1105
  f"cleared expected_red for #{issue_number}: {', '.join(sorted(ids))} "
1106
1106
  f"(PR #{pr['number']})"
1107
1107
  )
1108
+
1109
+
1110
+ ExpectedRedClearStatus = Literal["cleared", "no_op", "pending_retry", "failed"]
1111
+
1112
+
1113
+ def classify_expected_red_clear_result(msg: str) -> ExpectedRedClearStatus:
1114
+ """#2266 review (blocking finding 2): the single source of truth for
1115
+ interpreting :func:`clear_expected_red_via_pr`'s return string.
1116
+
1117
+ Before this, ``coord.merge_queue._maybe_clear_expected_red`` and
1118
+ ``coord.commands.acceptance._clear_stuck_expected_red`` each carried
1119
+ their own ``msg.startswith("cleared expected_red")`` check — two
1120
+ independent implementations of "did the clear succeed?" that agreed
1121
+ today but could silently desync the moment either
1122
+ :func:`clear_expected_red_via_pr`'s wording changed (the exact "One
1123
+ question, one answer" split-brain the epic #2096 review checklist
1124
+ warns about). Both call sites now classify through this function.
1125
+
1126
+ Returns one of four outcomes, not a bare bool — a binary
1127
+ cleared/not-cleared collapsed two very different "not cleared" cases
1128
+ into one (#2266 review, blocking finding 1):
1129
+
1130
+ * ``"cleared"`` — the PR opened *and* merged; entries are gone.
1131
+ * ``"no_op"`` — there was nothing to clear in the first place (no
1132
+ manifest found for this issue, or the issue has no ``expected_red``
1133
+ entries at all). This is the *common* case for an ordinary
1134
+ oracle-loop merge whose issue was never part of a deliberately-red
1135
+ slice — it must never read as a failure.
1136
+ * ``"pending_retry"`` — the clearing PR opened but did not merge yet
1137
+ (branch protection / required checks pending); the caller already
1138
+ knows this will retry on the next merge, not a hard failure.
1139
+ * ``"failed"`` — a genuine failure: everything ``clear_expected_red_via_pr``'s
1140
+ docstring says degrades to a ``"warning: ..."``-prefixed string
1141
+ (unresolvable branch tip, a commit/PR-open/PR-merge exception, an
1142
+ unsupported ``gh_ops``, a JSON manifest, or unchanged text).
1143
+ """
1144
+ if msg.startswith("cleared expected_red"):
1145
+ return "cleared"
1146
+ if msg.startswith("no expected_red entries"):
1147
+ return "no_op"
1148
+ if "did not merge" in msg and "will retry on the next merge" in msg:
1149
+ return "pending_retry"
1150
+ return "failed"
@@ -50,6 +50,7 @@ from coord.acceptance_drivers import DriverError, run_driver
50
50
  from coord.commands._common import _CONFIG_OPTION, _load_config
51
51
  from coord.comments import format_needs_attention
52
52
  from coord.dispatch import DispatchRefused
53
+ from coord.models import Repo
53
54
 
54
55
 
55
56
  @click.group("acceptance")
@@ -642,12 +643,42 @@ def acceptance_record(
642
643
  "merge` right after that issue's fix merges) may have failed, or "
643
644
  "the fix landed by some other path. A long-lived expected_red "
644
645
  "entry is exactly the invisible debt this command exists to "
645
- "surface."
646
+ "surface. #2266: `--clear` acts on it — for every STUCK entry this "
647
+ "listing finds, invoke the same `clear_expected_red_via_pr` PR "
648
+ "path `coord merge` uses, so a registry stuck because the merge-"
649
+ "time trust-gate guards never fired (acceptance never recorded, or "
650
+ "the PR merged out of band) has a re-fire path instead of only a "
651
+ "detector. Never touches an entry whose issue is still open — "
652
+ "those are read as legitimately red, not stuck."
646
653
  ),
647
654
  )
648
655
  @click.argument("repo")
649
656
  @_CONFIG_OPTION
650
- def acceptance_expected_red(repo: str, config_path: Path) -> None:
657
+ @click.option(
658
+ "--clear", "do_clear", is_flag=True, default=False,
659
+ help=(
660
+ "Open+merge the expected_red-clearing PR for every STUCK entry "
661
+ "this listing finds (issue closed, entries still live). Skips — "
662
+ "never clears — any entry whose issue is still open."
663
+ ),
664
+ )
665
+ @click.option(
666
+ "--issue", "only_issue", type=int, default=None,
667
+ help="With --clear, restrict clearing to this issue number.",
668
+ )
669
+ def acceptance_expected_red(
670
+ repo: str, config_path: Path, do_clear: bool, only_issue: int | None, # noqa: FBT001
671
+ ) -> None:
672
+ if only_issue is not None and not do_clear:
673
+ # #2266 review nit: `--issue` only narrows what `--clear` acts on
674
+ # (per its own help text) — silently accepting it without `--clear`
675
+ # looks like it did something when it didn't.
676
+ click.echo(
677
+ "warning: --issue has no effect without --clear; the listing "
678
+ "below covers every issue.",
679
+ err=True,
680
+ )
681
+
651
682
  cfg = _load_config(config_path)
652
683
  repo_entry = cfg.repo(repo)
653
684
  if repo_entry is None:
@@ -660,23 +691,117 @@ def acceptance_expected_red(repo: str, config_path: Path) -> None:
660
691
  return
661
692
 
662
693
  total = 0
694
+ # #2266: STUCK entries found while rendering the listing above — the
695
+ # exact set `--clear` acts on, so the remedy can never drift from the
696
+ # detector that names the debt.
697
+ stuck: list[tuple[str, int, frozenset[str]]] = []
663
698
  for ms, by_issue in sorted(by_ms.items()):
664
699
  click.echo(f"{ms}:")
665
700
  for issue_number, ids in sorted(by_issue.items()):
666
701
  total += len(ids)
667
702
  closed_note = ""
703
+ is_stuck = False
668
704
  try:
669
705
  issue_data = github_ops.get_issue(repo_entry.github, issue_number)
670
706
  if str((issue_data or {}).get("state", "")).lower() == "closed":
671
707
  closed_note = " [STUCK: issue is closed but entries remain]"
708
+ is_stuck = True
672
709
  except Exception: # noqa: BLE001 — a lookup hiccup shouldn't hide the entry itself
673
710
  pass
674
711
  click.echo(
675
712
  f" #{issue_number}: {', '.join(sorted(ids))}{closed_note}"
676
713
  )
714
+ if is_stuck:
715
+ stuck.append((ms, issue_number, ids))
677
716
  click.echo(f"\n{total} expected_red test-id(s) across "
678
717
  f"{sum(len(v) for v in by_ms.values())} issue(s).")
679
718
 
719
+ if not do_clear:
720
+ return
721
+
722
+ _clear_stuck_expected_red(repo, repo_entry, stuck, only_issue)
723
+
724
+
725
+ def _clear_stuck_expected_red(
726
+ repo: str, repo_entry: Repo, stuck: list[tuple[str, int, frozenset[str]]],
727
+ only_issue: int | None,
728
+ ) -> None:
729
+ """#2266: the remedy half of `coord acceptance expected-red --clear`.
730
+
731
+ Acts ONLY on *stuck* — the STUCK (issue closed, entries still live) set
732
+ the listing above already computed — never on an issue whose entries
733
+ are legitimately still red (still open). `--issue` narrows to one
734
+ issue but does not widen scope: naming an open issue's number here
735
+ finds nothing to clear, same as naming one that isn't in *stuck* at
736
+ all.
737
+
738
+ Exits non-zero when at least one entry hard-fails to clear (#2266
739
+ review, non-blocking finding: without this, a caller scripting this
740
+ command in CI/cron could only detect a fully-failed run by reading
741
+ stdout or separately querying the audit log).
742
+ """
743
+ from coord.acceptance import ( # noqa: PLC0415
744
+ classify_expected_red_clear_result,
745
+ clear_expected_red_via_pr,
746
+ )
747
+ from coord.audit import record_audit # noqa: PLC0415
748
+
749
+ if only_issue is not None:
750
+ stuck = [s for s in stuck if s[1] == only_issue]
751
+ if not stuck:
752
+ click.echo(
753
+ f"\n--issue {only_issue}: not STUCK (open, or no "
754
+ "expected_red entries recorded for it) — nothing to clear."
755
+ )
756
+ return
757
+
758
+ if not stuck:
759
+ click.echo("\nno STUCK entries to clear.")
760
+ return
761
+
762
+ click.echo(f"\nclearing {len(stuck)} STUCK issue(s)...")
763
+ # #2266 review (blocking finding 2): classify through the same shared
764
+ # helper `coord.merge_queue._maybe_clear_expected_red` uses, instead of
765
+ # each surface independently re-deriving "did this succeed?" from the
766
+ # message text — a split-brain waiting to happen if the message
767
+ # wording ever changes (epic #2096's "one question, one answer").
768
+ any_failed = False
769
+ for ms, issue_number, ids in stuck:
770
+ msg = clear_expected_red_via_pr(
771
+ repo_entry.github, repo, repo_entry.default_branch, issue_number,
772
+ gh_ops=github_ops,
773
+ )
774
+ click.echo(f" #{issue_number}: {msg}")
775
+ status = classify_expected_red_clear_result(msg)
776
+ if status == "no_op":
777
+ # These entries were just listed as STUCK, so this should be
778
+ # rare (e.g. a race — another process already cleared them) —
779
+ # but it's still not a failure worth a durable audit row.
780
+ continue
781
+ if status == "failed":
782
+ any_failed = True
783
+ event_type = {
784
+ "cleared": "expected_red_clear",
785
+ "pending_retry": "expected_red_clear_pending",
786
+ "failed": "expected_red_clear_failed",
787
+ }[status]
788
+ # #2266 scope 2: a failed clear must land somewhere durable — the
789
+ # audit log — so the next pass over this repo can say "this
790
+ # registry is still stuck" without anyone re-reading this output.
791
+ record_audit(
792
+ tier="business",
793
+ category="acceptance",
794
+ event_type=event_type,
795
+ actor="user",
796
+ summary=f"coord acceptance expected-red --clear {repo} #{issue_number}: {msg}",
797
+ repo=repo,
798
+ issue=issue_number,
799
+ details={"ms": ms, "test_ids": sorted(ids), "result": msg},
800
+ )
801
+
802
+ if any_failed:
803
+ sys.exit(1)
804
+
680
805
 
681
806
  def _acceptance_record_local(
682
807
  repo: str,
@@ -371,6 +371,66 @@ def _interactive_session_busy(config) -> list:
371
371
  return busy
372
372
 
373
373
 
374
+ def _paused_machine_busy(config) -> list:
375
+ """Operator pause / quiet-hours state as host-pinned `Busy` signals (#2174).
376
+
377
+ `release_propagate.assess_quiescence`'s ``extra_busy`` docstring has
378
+ named "a machine paused by an operator" as a seam producer since
379
+ #1835, but until now nothing fed it one: `coord pause <machine>` said
380
+ "leave this box alone" and `coord release propagate` read the machine
381
+ as quiescent anyway, restarting `coord-agent` (and, on the daemon
382
+ host, `coord-serve`) on it regardless.
383
+
384
+ `coord.machine_pause.follow_on_paused_set()` is explicit `coord pause`
385
+ UNION any quiet-hours window currently covering the machine — both
386
+ genuine "an operator or an operator-set policy said stay off this
387
+ box" facts — MINUS #2101 release cordons. Cordons are deliberately
388
+ excluded: a cordon is THIS command's own drain mechanism, set to make
389
+ a behind host quiescent, not a sign that it already is one; feeding a
390
+ cordon back in here as "busy" would make it defer the very roll it
391
+ exists to unblock.
392
+
393
+ Thin-client aware for free: `follow_on_paused_set` routes through the
394
+ daemon's `/pause` endpoint when a board service is configured (#1563),
395
+ so this reads the one copy of pause state that actually governs
396
+ dispatch — same as every other pause-aware call site in the fleet.
397
+ """
398
+ from coord.machine_pause import ( # noqa: PLC0415
399
+ describe_pause_state,
400
+ effective_quiet_hours,
401
+ follow_on_paused_set,
402
+ )
403
+ from coord import release_propagate as rp # noqa: PLC0415
404
+
405
+ machines = list(getattr(config, "machines", ()) or ())
406
+ if not machines:
407
+ return []
408
+ paused = follow_on_paused_set(machines)
409
+ if not paused:
410
+ return []
411
+ quiet_hours = effective_quiet_hours(machines)
412
+ busy = []
413
+ for machine in machines:
414
+ if machine.name not in paused:
415
+ continue
416
+ state = describe_pause_state(machine, paused, quiet_hours=quiet_hours)
417
+ if state is None:
418
+ continue # defensive: membership in `paused` implies a reason
419
+ detail = (
420
+ f"quiet hours {state.detail}" if state.kind == "quiet"
421
+ else "explicit `coord pause`"
422
+ )
423
+ busy.append(
424
+ rp.Busy(
425
+ kind="machine paused",
426
+ subject=machine.name,
427
+ detail=detail,
428
+ host=machine.name,
429
+ )
430
+ )
431
+ return busy
432
+
433
+
374
434
  def _daemon_machine_name(
375
435
  config, override: str | None, machine_health: dict | None = None
376
436
  ) -> str | None:
@@ -638,6 +698,10 @@ def release_propagate( # noqa: PLR0912, PLR0915 — a pipeline; the decisions a
638
698
  # probe `coord sessions --remote` uses, so a live session defers a roll
639
699
  # exactly like a live headless assignment does.
640
700
  extra_busy.extend(_interactive_session_busy(config))
701
+ # #2174: nor can it see `coord pause`/quiet-hours state — feed the same
702
+ # seam from the daemon-aware pause store, so an operator-paused machine
703
+ # defers exactly like a live assignment does instead of reading idle.
704
+ extra_busy.extend(_paused_machine_busy(config))
641
705
  quiescence = rp.assess_quiescence(
642
706
  queue_entries=board.get("drive_queue") or [],
643
707
  assignments=board.get("assignments") or [],
@@ -2163,14 +2227,19 @@ def _drain(
2163
2227
  #2228: ``extra_busy_fetch`` re-probes live interactive sessions on
2164
2228
  every poll (not just once) — a session that ends mid-drain should let
2165
2229
  the daemon host clear within THIS wait, not only on the next `coord
2166
- release propagate` tick. Deliberately keyed off the explicit *config*
2167
- param, never an implicit ``_load_config(config_path)`` fallback: this
2168
- function is called with ``config_path=None`` from unit tests that
2169
- inject their own clock/board silently resolving a real
2170
- ``coordinator.yml`` (and then SSH-probing whatever machines it names)
2230
+ release propagate` tick. #2174: the same default also re-reads
2231
+ `coord pause`/quiet-hours state on every poll, for the same reason
2232
+ an operator pausing the daemon host mid-drain must stop the drain from
2233
+ ever reporting "clear", and an operator lifting a pause mid-drain
2234
+ should let it clear within THIS wait rather than the next tick.
2235
+ Deliberately keyed off the explicit *config* param, never an implicit
2236
+ ``_load_config(config_path)`` fallback: this function is called with
2237
+ ``config_path=None`` from unit tests that inject their own clock/board
2238
+ — silently resolving a real ``coordinator.yml`` (and then SSH-probing
2239
+ whatever machines it names, or reading this host's own pause store)
2171
2240
  the moment ``config`` is omitted would make this loop non-hermetic by
2172
- default. No *config* simply means "no interactive-session signal this
2173
- call" — the caller opts in by passing one, as the real
2241
+ default. No *config* simply means "no interactive-session or pause
2242
+ signal this call" — the caller opts in by passing one, as the real
2174
2243
  ``coord release nightly-window`` call site does.
2175
2244
  """
2176
2245
  import time as _time # noqa: PLC0415
@@ -2184,7 +2253,12 @@ def _drain(
2184
2253
  fetch_fn = board_fetch or _fetch_board
2185
2254
  if extra_busy_fetch is None:
2186
2255
  if config is not None:
2187
- extra_busy_fetch = lambda: _interactive_session_busy(config) # noqa: E731
2256
+ # #2174: paused/quiet-hours state, same as the top-level
2257
+ # `propagate` call site — a paused daemon host must keep the
2258
+ # drain from ever reading "clear" just because tmux is quiet.
2259
+ extra_busy_fetch = lambda: ( # noqa: E731
2260
+ _interactive_session_busy(config) + _paused_machine_busy(config)
2261
+ )
2188
2262
  else:
2189
2263
  extra_busy_fetch = lambda: [] # noqa: E731
2190
2264
 
@@ -4387,26 +4387,36 @@ def _test_author_effective_issue_number(entry: QueuedMerge, board) -> int | None
4387
4387
  return None
4388
4388
 
4389
4389
 
4390
- def _issue_has_expected_red_entries(entry: QueuedMerge, gh_ops: GhOps) -> bool:
4391
- """#2199 review (blocking finding 2): whether *entry*'s issue has at
4392
- least one ``expected_red`` entry recorded against it in some
4393
- ``ms-*/manifest.yml`` on ``entry.target_branch`` — the scope check
4394
- that keeps :func:`_maybe_clear_expected_red`'s loud "no passing
4395
- trust-gate verdict" diagnostic from firing on every ordinary
4396
- ``CLOSES_ISSUE_TYPES`` merge fleet-wide (no driver configured, no
4397
- oracle-opted-in milestone, an ``oracle:exempt`` issue none of which
4398
- ever populate ``expected_red`` for their issue, #2191). Those merges
4399
- have nothing here for ``coord acceptance record`` to ever have cleared
4400
- and never will; before this check, the diagnostic branch below could
4401
- not tell them apart from an issue that genuinely IS in scope and
4402
- genuinely IS stuck red, so it printed the same actionable-looking
4403
- (and, for a driverless repo, un-followable) advice on every single one.
4390
+ def _expected_red_ids_for_entry(entry: QueuedMerge, gh_ops: GhOps) -> frozenset[str]:
4391
+ """#2199 review (blocking finding 2) / #2266 review (non-blocking
4392
+ finding): the ``expected_red`` test ids, if any, recorded against
4393
+ *entry*'s issue in some ``ms-*/manifest.yml`` on ``entry.target_branch``.
4394
+
4395
+ Two call sites need this:
4396
+
4397
+ * :func:`_issue_has_expected_red_entries` the scope check that keeps
4398
+ :func:`_maybe_clear_expected_red`'s loud "no passing trust-gate
4399
+ verdict" diagnostic from firing on every ordinary
4400
+ ``CLOSES_ISSUE_TYPES`` merge fleet-wide (no driver configured, no
4401
+ oracle-opted-in milestone, an ``oracle:exempt`` issue none of which
4402
+ ever populate ``expected_red`` for their issue, #2191). Those merges
4403
+ have nothing here for ``coord acceptance record`` to ever have
4404
+ cleared and never will; before this check, the diagnostic branch
4405
+ below could not tell them apart from an issue that genuinely IS in
4406
+ scope and genuinely IS stuck red, so it printed the same
4407
+ actionable-looking (and, for a driverless repo, un-followable)
4408
+ advice on every single one.
4409
+ * :func:`_maybe_clear_expected_red`'s clear branch, to put the actual
4410
+ test ids (not just a pr/branch pair) into the durable audit row —
4411
+ matching ``coord acceptance expected-red --clear``'s
4412
+ ``details["test_ids"]`` so a merge-queue-triggered clear is just as
4413
+ correlatable back to specific stuck tests as a CLI-triggered one.
4404
4414
 
4405
4415
  Reuses the exact API-only lookup ``coord.acceptance.
4406
4416
  clear_expected_red_via_pr`` already performs on the success path —
4407
4417
  best-effort/read-only like the rest of this sweep: any lookup failure
4408
4418
  (unreachable API, older ``gh_ops`` stub missing the list/get methods)
4409
- reads as "not in scope", matching :func:`coord.acceptance.
4419
+ reads as "nothing recorded", matching :func:`coord.acceptance.
4410
4420
  find_ms_manifest_for_issue_via_api`'s own fail-soft posture.
4411
4421
  """
4412
4422
  from coord.acceptance import find_ms_manifest_for_issue_via_api # noqa: PLC0415
@@ -4416,11 +4426,59 @@ def _issue_has_expected_red_entries(entry: QueuedMerge, gh_ops: GhOps) -> bool:
4416
4426
  entry.repo_github, entry.target_branch, entry.issue_number, gh_ops=gh_ops,
4417
4427
  )
4418
4428
  except Exception: # noqa: BLE001 — best-effort, same posture as callers
4419
- return False
4429
+ return frozenset()
4420
4430
  if found is None:
4421
- return False
4431
+ return frozenset()
4422
4432
  _path, _text, _blob_sha, data = found
4423
- return bool(data.expected_red.get(entry.issue_number))
4433
+ return frozenset(data.expected_red.get(entry.issue_number, frozenset()))
4434
+
4435
+
4436
+ def _issue_has_expected_red_entries(entry: QueuedMerge, gh_ops: GhOps) -> bool:
4437
+ """Whether *entry*'s issue has at least one ``expected_red`` entry
4438
+ recorded against it. See :func:`_expected_red_ids_for_entry` for why
4439
+ this scope check exists."""
4440
+ return bool(_expected_red_ids_for_entry(entry, gh_ops))
4441
+
4442
+
4443
+ def _record_expected_red_audit(
4444
+ entry: QueuedMerge,
4445
+ event_type: str,
4446
+ message: str,
4447
+ *,
4448
+ test_ids: frozenset[str] | None = None,
4449
+ ) -> None:
4450
+ """#2266: durable half of an `expected_red` clear/skip/failure — a
4451
+ `MergeEvent` alone only reaches the operator as a `coord merge` output
4452
+ line that scrolls past (issue #2266's framing: "nothing durable,
4453
+ nothing re-checked"). ``record_audit`` gives the same outcomes
4454
+ (cleared, skipped for one of two distinct reasons, pending retry, or
4455
+ attempted-and-failed) a queryable row (`coord audit` / `query_audit_log`)
4456
+ so a repo with a stuck registry is discoverable without re-reading
4457
+ merge output. Best-effort like every other audit call site in this
4458
+ module — ``record_audit`` itself never raises.
4459
+
4460
+ *test_ids*, when given, lands in ``details["test_ids"]`` — matching the
4461
+ CLI path's (`coord.commands.acceptance._clear_stuck_expected_red`)
4462
+ audit payload, per #2266 review non-blocking finding: without it,
4463
+ merge-queue-triggered audit rows were harder to correlate back to the
4464
+ specific stuck test ids than CLI-triggered ones.
4465
+ """
4466
+ details: dict[str, object] = {
4467
+ "pr_number": entry.pr_number, "target_branch": entry.target_branch,
4468
+ }
4469
+ if test_ids:
4470
+ details["test_ids"] = sorted(test_ids)
4471
+ record_audit(
4472
+ tier="business",
4473
+ category="acceptance",
4474
+ event_type=event_type,
4475
+ actor="system",
4476
+ summary=f"{entry.repo_name}#{entry.issue_number}: {message}",
4477
+ repo=entry.repo_name,
4478
+ issue=entry.issue_number,
4479
+ assignment_id=entry.assignment_id,
4480
+ details=details,
4481
+ )
4424
4482
 
4425
4483
 
4426
4484
  def _maybe_clear_expected_red(entry: QueuedMerge, board, gh_ops: GhOps) -> MergeEvent | None:
@@ -4462,21 +4520,29 @@ def _maybe_clear_expected_red(entry: QueuedMerge, board, gh_ops: GhOps) -> Merge
4462
4520
  )
4463
4521
  acceptance_state = getattr(work, "acceptance_state", None)
4464
4522
  if acceptance_state != "passed":
4465
- if not _issue_has_expected_red_entries(entry, gh_ops):
4523
+ ids = _expected_red_ids_for_entry(entry, gh_ops)
4524
+ if not ids:
4466
4525
  # Not in scope for the oracle loop at all — the pre-#2199
4467
4526
  # silent no-op is still correct here, not a regression (see
4468
4527
  # the docstring above and #2199 review finding 2).
4469
4528
  return None
4470
- return MergeEvent(
4471
- entry, "expected_red_clear_skipped_no_acceptance",
4529
+ msg = (
4472
4530
  f"no passing trust-gate verdict recorded on {work.assignment_id} "
4473
4531
  f"(acceptance_state={acceptance_state!r}) — the external `coord "
4474
4532
  "acceptance record` re-run either never happened or did not "
4475
4533
  "pass; skipping expected_red clear. Run `coord acceptance "
4476
4534
  f"record --repo {entry.repo_name} --issue {entry.issue_number} "
4477
4535
  "--sha <merged sha>` by hand, or re-drive the issue, to clear "
4478
- "any listed entries.",
4536
+ "any listed entries."
4537
+ )
4538
+ # #2266: distinct from the SHA-mismatch guard below — "acceptance
4539
+ # never recorded" and "recorded SHA is stale" are different
4540
+ # problems with different fixes, so they get distinct event types
4541
+ # rather than reaching the operator as the same silence.
4542
+ _record_expected_red_audit(
4543
+ entry, "expected_red_clear_skipped_no_acceptance", msg, test_ids=ids,
4479
4544
  )
4545
+ return MergeEvent(entry, "expected_red_clear_skipped_no_acceptance", msg)
4480
4546
  acceptance_sha = getattr(work, "acceptance_sha", None)
4481
4547
  if acceptance_sha is None or acceptance_sha != entry.branch_head_sha:
4482
4548
  # The recorded trust-gate verdict isn't for the exact commit that
@@ -4486,20 +4552,56 @@ def _maybe_clear_expected_red(entry: QueuedMerge, board, gh_ops: GhOps) -> Merge
4486
4552
  # fresh SHA and this issue's fix merges again... though ordinarily
4487
4553
  # a merge only happens once per issue, so a mismatch here more
4488
4554
  # likely means acceptance was simply never recorded for this SHA.
4489
- return MergeEvent(
4490
- entry, "expected_red_clear_skipped",
4555
+ msg = (
4491
4556
  "acceptance_sha does not match the merged commit — skipping "
4492
4557
  "expected_red clear (re-run `coord acceptance record` against "
4493
- "the merged SHA if entries should have cleared)",
4558
+ "the merged SHA if entries should have cleared)"
4494
4559
  )
4560
+ _record_expected_red_audit(
4561
+ entry, "expected_red_clear_skipped_sha_mismatch", msg,
4562
+ test_ids=_expected_red_ids_for_entry(entry, gh_ops),
4563
+ )
4564
+ return MergeEvent(entry, "expected_red_clear_skipped", msg)
4495
4565
 
4496
- from coord.acceptance import clear_expected_red_via_pr # noqa: PLC0415
4566
+ from coord.acceptance import ( # noqa: PLC0415
4567
+ classify_expected_red_clear_result,
4568
+ clear_expected_red_via_pr,
4569
+ )
4497
4570
 
4571
+ # Captured *before* the clear attempt: a successful clear edits the
4572
+ # manifest, so looking this up afterwards would just find the ids the
4573
+ # clear itself just removed (#2266 review non-blocking finding).
4574
+ ids = _expected_red_ids_for_entry(entry, gh_ops)
4498
4575
  msg = clear_expected_red_via_pr(
4499
4576
  entry.repo_github, entry.repo_name, entry.target_branch, entry.issue_number,
4500
4577
  gh_ops=gh_ops,
4501
4578
  )
4502
- return MergeEvent(entry, "expected_red_clear", msg)
4579
+ # #2266 review (blocking finding 1): a binary "did the message start
4580
+ # with 'cleared expected_red'" conflated a genuine failure with "there
4581
+ # was nothing to clear in the first place" — the *common* case for an
4582
+ # ordinary oracle-loop merge whose issue was never part of a
4583
+ # deliberately-red slice. `classify_expected_red_clear_result` (shared
4584
+ # with the CLI `--clear` path, review blocking finding 2) tells those
4585
+ # apart; the "no_op" case is reported back via `MergeEvent` for `coord
4586
+ # merge` output but never gets a durable audit row — recording one for
4587
+ # every ordinary passing merge would drown the genuinely actionable
4588
+ # `expected_red_clear_failed` rows this audit trail exists to surface.
4589
+ status = classify_expected_red_clear_result(msg)
4590
+ if status == "no_op":
4591
+ return MergeEvent(entry, "expected_red_clear_noop", msg)
4592
+ event_type = {
4593
+ "cleared": "expected_red_clear",
4594
+ "pending_retry": "expected_red_clear_pending",
4595
+ "failed": "expected_red_clear_failed",
4596
+ }[status]
4597
+ # #2266 review (non-blocking finding): `clear_expected_red_via_pr`
4598
+ # never raises — every genuine failure degrades to a "warning: ..."
4599
+ # string. Make that durable too, not just a merge-output line: a
4600
+ # repeated `expected_red_clear_failed` for the same issue is exactly
4601
+ # the signal `coord acceptance expected-red --clear` (the re-fire
4602
+ # path) exists for.
4603
+ _record_expected_red_audit(entry, event_type, msg, test_ids=ids)
4604
+ return MergeEvent(entry, event_type, msg)
4503
4605
 
4504
4606
 
4505
4607
  def process(
@@ -785,7 +785,29 @@ def assess_quiescence(
785
785
  #2228: the interactive-session half is wired from
786
786
  ``coord.commands.release._interactive_session_busy``, fed by the same
787
787
  fleet-wide tmux sweep ``coord sessions --remote`` renders — until then
788
- this half of the seam existed but nothing ever fed it.
788
+ this half of the seam existed but nothing ever fed it. #2174: the
789
+ operator-pause half is wired from
790
+ ``coord.commands.release._paused_machine_busy`` — a machine under an
791
+ explicit ``coord pause`` or an active quiet-hours window (but NOT a
792
+ #2101 release cordon: that is this module's own drain mechanism, not a
793
+ sign a host is already quiescent, and feeding it back in here would
794
+ make a cordon defer the very roll it exists to unblock) becomes a
795
+ host-pinned :class:`Busy`. Tmux liveness genuinely has no fleet-wide
796
+ read (it is a LOCAL fact, #1870, and propagation may run from any
797
+ host) — pause state does, because it is daemon-aware
798
+ (``coord.machine_pause``) the same way the board is, so both callers
799
+ can read it cheaply with no new probe.
800
+
801
+ Because a :class:`Busy` carries a host, #2067's per-host quiescence
802
+ does the obvious thing for a paused NON-daemon host: it defers only
803
+ that host, and the rest of the fleet still rolls. A paused DAEMON host
804
+ is different on purpose — the daemon-leads invariant (see the module
805
+ docstring's LANE ORDER) already defers the WHOLE run whenever the
806
+ daemon host is itself busy and behind, and a pause is just one more
807
+ way for the daemon host to be busy. So ``coord pause <daemon-host>``
808
+ halting all propagation, not just that host's own lane, is read as the
809
+ correct interpretation of "leave this box alone" applied to the one
810
+ host every other host's roll depends on — not an emergent accident.
789
811
 
790
812
  #2110: a ``running`` queue row is not, on its own, proof of anything —
791
813
  the reconciler that would have moved it to ``done`` lives inside