code-coordinator 0.5.139__tar.gz → 0.5.141__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 (866) hide show
  1. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/code_coordinator.egg-info/SOURCES.txt +3 -0
  4. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/code_coordinator.egg-info/scm_file_list.json +3 -0
  5. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/agent.py +42 -0
  7. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/agent_app.py +70 -0
  8. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/drive_queue.py +12 -5
  9. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/release.py +161 -26
  10. code_coordinator-0.5.141/coord/reconcile_tick.py +65 -0
  11. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/AGENT_OPERATIONS.md +42 -0
  12. code_coordinator-0.5.141/tests/test_agent_drive_queue_reconcile_2373.py +157 -0
  13. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_drive_queue.py +35 -0
  14. code_coordinator-0.5.141/tests/test_reconcile_tick.py +82 -0
  15. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_release_cordon_2101.py +160 -0
  16. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/.claude/commands/board.md +0 -0
  17. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/.claude/commands/complete-session.md +0 -0
  18. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/.claude/commands/coordinator.md +0 -0
  19. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/.githooks/_lib.sh +0 -0
  20. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/.githooks/post-checkout +0 -0
  21. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/.githooks/post-commit +0 -0
  22. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/.githooks/post-merge +0 -0
  23. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  24. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/.github/coord-ci-acceptance.yml +0 -0
  25. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/.github/workflows/auto-release.yml +0 -0
  26. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/.github/workflows/cargo-test.yml +0 -0
  27. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/.github/workflows/publish.yml +0 -0
  28. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/.github/workflows/release-tui.yml +0 -0
  29. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/.github/workflows/test.yml +0 -0
  30. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/.gitignore +0 -0
  31. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/CLAUDE.md +0 -0
  32. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/GOAL.md +0 -0
  33. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/LICENSE +0 -0
  34. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/MANIFEST.in +0 -0
  35. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/README.md +0 -0
  36. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/code_coordinator.egg-info/dependency_links.txt +0 -0
  37. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/code_coordinator.egg-info/entry_points.txt +0 -0
  38. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/code_coordinator.egg-info/requires.txt +0 -0
  39. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/code_coordinator.egg-info/top_level.txt +0 -0
  40. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/__init__.py +0 -0
  41. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/_board_mapping.py +0 -0
  42. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/acceptance.py +0 -0
  43. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/acceptance_drivers.py +0 -0
  44. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/agent_update.py +0 -0
  45. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/agents/opencode/.gitignore +0 -0
  46. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/agents/opencode/agents/work.md +0 -0
  47. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/agents/opencode/routing.jsonc +0 -0
  48. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/audit.py +0 -0
  49. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/auto_loop.py +0 -0
  50. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/block_log.py +0 -0
  51. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/board_bool_guard.py +0 -0
  52. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/board_service.py +0 -0
  53. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/board_wire.py +0 -0
  54. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/brain.py +0 -0
  55. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/branch_model.py +0 -0
  56. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/bug_intake.py +0 -0
  57. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/cargo_cache.py +0 -0
  58. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/ci_github.py +0 -0
  59. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/ci_store.py +0 -0
  60. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/claim.py +0 -0
  61. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/cli.py +0 -0
  62. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/client.py +0 -0
  63. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/__init__.py +0 -0
  64. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/_common.py +0 -0
  65. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/acceptance.py +0 -0
  66. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/agent_ops.py +0 -0
  67. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/audit.py +0 -0
  68. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/chat.py +0 -0
  69. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/dispatch.py +0 -0
  70. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/dispatch_workers.py +0 -0
  71. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/drive.py +0 -0
  72. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/gate_a.py +0 -0
  73. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/gates.py +0 -0
  74. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/issues.py +0 -0
  75. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/lifecycle.py +0 -0
  76. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/merge.py +0 -0
  77. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/milestone.py +0 -0
  78. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/plan_followup.py +0 -0
  79. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/plans.py +0 -0
  80. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/portal.py +0 -0
  81. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/repo.py +0 -0
  82. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/report.py +0 -0
  83. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/review.py +0 -0
  84. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/scorecard.py +0 -0
  85. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/sessions.py +0 -0
  86. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/setup.py +0 -0
  87. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/status.py +0 -0
  88. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/terminal.py +0 -0
  89. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/test_gate.py +0 -0
  90. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/commands/tui.py +0 -0
  91. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/comments.py +0 -0
  92. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/config.py +0 -0
  93. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/config_reload.py +0 -0
  94. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/conflict_fix.py +0 -0
  95. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dao.py +0 -0
  96. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/__init__.py +0 -0
  97. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/fixture.py +0 -0
  98. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/index.html +0 -0
  99. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/server.py +0 -0
  100. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/terminal.py +0 -0
  101. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/.gitignore +0 -0
  102. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/components.json +0 -0
  103. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/dist/assets/Gallery-BoKs3mpY.js +0 -0
  104. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  105. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/dist/assets/Terminal-CEsP08iX.js +0 -0
  106. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/dist/assets/index-CDHPlB6k.js +0 -0
  107. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  108. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  109. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  110. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  111. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  112. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/dist/index.html +0 -0
  113. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  114. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/dist/sw.js +0 -0
  115. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  116. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  117. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  118. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  119. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  120. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  121. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  122. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  123. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  124. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  125. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/eslint.config.js +0 -0
  126. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/index.html +0 -0
  127. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  128. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/package-lock.json +0 -0
  129. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/package.json +0 -0
  130. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  131. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/playwright.config.ts +0 -0
  132. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/postcss.config.js +0 -0
  133. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  134. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  135. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  136. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/App.tsx +0 -0
  137. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/api/client.ts +0 -0
  138. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  139. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  140. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  141. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  142. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  143. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  144. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  145. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  146. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  147. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  148. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  149. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  150. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  151. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  152. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  153. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  154. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  155. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  156. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  157. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  158. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  159. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  160. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  161. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  162. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  163. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  164. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  165. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  166. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  167. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  168. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  169. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  170. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  171. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  172. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  173. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/index.css +0 -0
  174. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  175. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  176. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/main.tsx +0 -0
  177. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  178. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  179. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  180. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  181. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  182. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  183. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  184. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  185. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  186. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  187. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  188. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  189. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  190. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  191. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  192. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  193. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  194. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  195. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  196. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  197. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  198. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  199. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  200. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/tailwind.config.js +0 -0
  201. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/tsconfig.json +0 -0
  202. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  203. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dashboard/webapp/vite.config.ts +0 -0
  204. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/db.py +0 -0
  205. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dead_end.py +0 -0
  206. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/README.md +0 -0
  207. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-agent.service +0 -0
  208. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-db-backup.service +0 -0
  209. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-db-backup.sh +0 -0
  210. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-db-backup.timer +0 -0
  211. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-drive-queue.service +0 -0
  212. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-drive-queue.timer +0 -0
  213. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-notify.service +0 -0
  214. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-notify.timer +0 -0
  215. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-release-propagate.service +0 -0
  216. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-release-propagate.timer +0 -0
  217. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-release-window.service +0 -0
  218. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-release-window.timer +0 -0
  219. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-serve.service +0 -0
  220. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-web-dist-build.service +0 -0
  221. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-web-dist-build.timer +0 -0
  222. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy/coord-web.service +0 -0
  223. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy_manifest.py +0 -0
  224. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deploy_units.py +0 -0
  225. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/deps.py +0 -0
  226. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/diagnose.py +0 -0
  227. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dispatch.py +0 -0
  228. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/dist_name.py +0 -0
  229. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/drive.py +0 -0
  230. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/drive_queue.py +0 -0
  231. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/drive_state.py +0 -0
  232. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/events.py +0 -0
  233. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/failure_class.py +0 -0
  234. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/filelock.py +0 -0
  235. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/fleet_config_health.py +0 -0
  236. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/freshness.py +0 -0
  237. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/gate_a.py +0 -0
  238. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/gate_b.py +0 -0
  239. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/gate_snapshot.py +0 -0
  240. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/gates.py +0 -0
  241. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/github_ops.py +0 -0
  242. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/goal.py +0 -0
  243. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/graph_health.py +0 -0
  244. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/__init__.py +0 -0
  245. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/aggregate.py +0 -0
  246. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/__init__.py +0 -0
  247. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/agent_install.py +0 -0
  248. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/cargo_targets.py +0 -0
  249. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/claude_binary.py +0 -0
  250. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/deploy_lane_facts.py +0 -0
  251. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/disk.py +0 -0
  252. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/fleet_board.py +0 -0
  253. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  254. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/fleet_phantom.py +0 -0
  255. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/fleet_unit_drift.py +0 -0
  256. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/graph.py +0 -0
  257. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/graphify_cli.py +0 -0
  258. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/index_lock.py +0 -0
  259. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/plan_usage.py +0 -0
  260. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/repo_state.py +0 -0
  261. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/spawned_coord.py +0 -0
  262. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/timer_active.py +0 -0
  263. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/toolchain.py +0 -0
  264. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/unit_drift.py +0 -0
  265. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/unit_enablement.py +0 -0
  266. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/checks/worktrees.py +0 -0
  267. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/cli.py +0 -0
  268. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/context.py +0 -0
  269. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/fleet_snapshot.py +0 -0
  270. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/models.py +0 -0
  271. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/pypi.py +0 -0
  272. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/registry.py +0 -0
  273. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/render.py +0 -0
  274. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/health/units.py +0 -0
  275. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/hooks.py +0 -0
  276. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/housekeeping.py +0 -0
  277. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/interactive.py +0 -0
  278. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/issue_store.py +0 -0
  279. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/liveness_auditor.py +0 -0
  280. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/machine_pause.py +0 -0
  281. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/merge_queue.py +0 -0
  282. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/milestone_chat.py +0 -0
  283. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/milestone_dispatch.py +0 -0
  284. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/milestone_gate.py +0 -0
  285. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/milestone_order.py +0 -0
  286. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/mock_author.py +0 -0
  287. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/models.py +0 -0
  288. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/network.py +0 -0
  289. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/new_issue_chat.py +0 -0
  290. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/notifier/__init__.py +0 -0
  291. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/notifier/baseline.py +0 -0
  292. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/notifier/cli.py +0 -0
  293. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/notifier/collect.py +0 -0
  294. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/notifier/digest.py +0 -0
  295. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/notifier/models.py +0 -0
  296. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/notifier/predicate.py +0 -0
  297. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/notifier/service.py +0 -0
  298. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/notifier/store.py +0 -0
  299. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/notifier/transport.py +0 -0
  300. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/notify.py +0 -0
  301. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/openapi.py +0 -0
  302. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/overlap_fence.py +0 -0
  303. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/overlap_predict.py +0 -0
  304. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/parentage.py +0 -0
  305. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/parentage_github.py +0 -0
  306. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/pipeline.py +0 -0
  307. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/plan_parser.py +0 -0
  308. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/plans.py +0 -0
  309. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/platform_paths.py +0 -0
  310. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/portal_bridge.py +0 -0
  311. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/portal_store.py +0 -0
  312. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/portal_sync.py +0 -0
  313. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/pr_body_lint.py +0 -0
  314. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/prereqs.py +0 -0
  315. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/progress.py +0 -0
  316. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/providers/__init__.py +0 -0
  317. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/providers/base.py +0 -0
  318. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/providers/claude.py +0 -0
  319. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/providers/claude_pty.py +0 -0
  320. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/providers/opencode.py +0 -0
  321. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/queue_diagnose.py +0 -0
  322. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/reconcile.py +0 -0
  323. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/refine_chat.py +0 -0
  324. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/release_cordon.py +0 -0
  325. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/release_propagate.py +0 -0
  326. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/release_verify.py +0 -0
  327. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/release_window.py +0 -0
  328. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/repo_edit.py +0 -0
  329. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/repo_onboard.py +0 -0
  330. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/reports.py +0 -0
  331. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/revalidate.py +0 -0
  332. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/review.py +0 -0
  333. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/scorecard.py +0 -0
  334. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/serve_app.py +0 -0
  335. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/skills/portal-followup/SKILL.md +0 -0
  336. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/skills/update-issue/SKILL.md +0 -0
  337. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/smoke.py +0 -0
  338. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/spend_ceiling.py +0 -0
  339. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/split_work.py +0 -0
  340. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/stage_projection.py +0 -0
  341. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/state.py +0 -0
  342. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/test_author.py +0 -0
  343. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/test_chat.py +0 -0
  344. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/test_orchestrator.py +0 -0
  345. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/test_report.py +0 -0
  346. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/tui_release.py +0 -0
  347. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/usage.py +0 -0
  348. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/usage_limits.py +0 -0
  349. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/usage_rollup.py +0 -0
  350. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coord/worker_events.py +0 -0
  351. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/coordinator.example.yml +0 -0
  352. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-agent.service +0 -0
  353. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-db-backup.service +0 -0
  354. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-db-backup.sh +0 -0
  355. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-db-backup.timer +0 -0
  356. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-drive-queue.service +0 -0
  357. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-drive-queue.timer +0 -0
  358. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-notify.service +0 -0
  359. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-notify.timer +0 -0
  360. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-release-propagate.service +0 -0
  361. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-release-propagate.timer +0 -0
  362. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-release-window.service +0 -0
  363. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-release-window.timer +0 -0
  364. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-serve.service +0 -0
  365. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-web-dist-build.service +0 -0
  366. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-web-dist-build.sh +0 -0
  367. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-web-dist-build.timer +0 -0
  368. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-web-rollback.sh +0 -0
  369. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/coord-web.service +0 -0
  370. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/deploy/node-shim.sh +0 -0
  371. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/ARCHITECTURE.md +0 -0
  372. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/ARCH_SECURITY_GATES.md +0 -0
  373. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/COCKPIT.md +0 -0
  374. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/CONTROL_CENTER.md +0 -0
  375. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/COST_DISCIPLINE.md +0 -0
  376. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/CROSS_PLATFORM.md +0 -0
  377. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/CUSTOMER_PORTAL.md +0 -0
  378. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/DRIVE_QUEUE.md +0 -0
  379. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/EPHEMERAL_WORKERS.md +0 -0
  380. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/FORGE_MIGRATION.md +0 -0
  381. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/GRAPHIFY_SETUP.md +0 -0
  382. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/ISSUE_GUIDANCE.md +0 -0
  383. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/MAC_MINI.md +0 -0
  384. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  385. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/NOTIFIER.md +0 -0
  386. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/OPENCODE_VERIFICATION.md +0 -0
  387. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/OPERATING_GOTCHAS.md +0 -0
  388. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/ORACLE_LOOP.md +0 -0
  389. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/PHONE_WEBAPP.md +0 -0
  390. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/PIPELINE_V2.md +0 -0
  391. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/PLATFORM_EVOLUTION.md +0 -0
  392. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/SECOND_BACKEND.md +0 -0
  393. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/STORE_SERVICE.md +0 -0
  394. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  395. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/WEB_CONTROL_CENTER.md +0 -0
  396. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/WSL_WINDOWS_WORKER.md +0 -0
  397. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/mocks/web/README.md +0 -0
  398. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/mocks/web/_tokens.css +0 -0
  399. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/mocks/web/issue-detail.html +0 -0
  400. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/mocks/web/pipeline-narrow.html +0 -0
  401. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/docs/mocks/web/pipeline-wide.html +0 -0
  402. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/graphify-out/.gitignore +0 -0
  403. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/install-agent.sh +0 -0
  404. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/pyproject.toml +0 -0
  405. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/audit_review_verdict_overrides.py +0 -0
  406. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  407. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/azure-workers/build-worker-image.sh +0 -0
  408. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/azure-workers/coordinator-machine.py +0 -0
  409. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/azure-workers/epic-down.sh +0 -0
  410. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/azure-workers/epic-up.sh +0 -0
  411. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/azure-workers/preflight.sh +0 -0
  412. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/azure-workers/provision-worker.sh +0 -0
  413. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  414. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  415. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/azure-workers/verify-github-token.sh +0 -0
  416. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/codegen.py +0 -0
  417. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/coord-test-runner.sh +0 -0
  418. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/drive-batch.sh +0 -0
  419. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/gen_board_fixture.py +0 -0
  420. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/next_release_tag.py +0 -0
  421. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/run_tests_in_populated_home.sh +0 -0
  422. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/run_tests_without_gh.sh +0 -0
  423. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/smoke_437_interactive.py +0 -0
  424. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/verify_878_review_capture.py +0 -0
  425. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/verify_release_published.py +0 -0
  426. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/scripts/verify_release_wheel.py +0 -0
  427. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/setup.cfg +0 -0
  428. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/SMOKE_SET.md +0 -0
  429. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/__init__.py +0 -0
  430. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  431. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-33/contract.md +0 -0
  432. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-33/manifest.yml +0 -0
  433. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  434. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  435. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  436. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  437. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-37/conftest.py +0 -0
  438. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-37/contract.md +0 -0
  439. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-37/manifest.yml +0 -0
  440. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  441. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  442. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-38/contract.md +0 -0
  443. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-38/manifest.yml +0 -0
  444. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  445. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  446. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  447. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  448. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  449. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  450. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  451. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  452. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  453. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  454. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-51/contract.md +0 -0
  455. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  456. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  457. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-51/manifest.yml +0 -0
  458. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  459. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-51/tsconfig.json +0 -0
  460. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  461. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
  462. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-65/contract.md +0 -0
  463. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-65/manifest.yml +0 -0
  464. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  465. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  466. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  467. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  468. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  469. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  470. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  471. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  472. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  473. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/conftest.py +0 -0
  474. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/board-pipeline-basic.json +0 -0
  475. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  476. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  477. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  478. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  479. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/playwright/all_pass.json +0 -0
  480. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  481. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/playwright/mixed_fail.json +0 -0
  482. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  483. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  484. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/playwright/skip.json +0 -0
  485. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/playwright/truncated.json +0 -0
  486. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  487. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  488. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  489. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  490. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  491. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  492. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  493. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  494. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_acceptance.py +0 -0
  495. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_acceptance_drivers.py +0 -0
  496. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent.py +0 -0
  497. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_api_error.py +0 -0
  498. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_app.py +0 -0
  499. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_branch_base.py +0 -0
  500. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_branch_capture.py +0 -0
  501. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_config_free_1712.py +0 -0
  502. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_deploy_units_endpoint.py +0 -0
  503. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_dirty_worktree.py +0 -0
  504. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_graph_self_heal.py +0 -0
  505. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_health_h3.py +0 -0
  506. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_idle_restart.py +0 -0
  507. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_push_failure.py +0 -0
  508. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_reap.py +0 -0
  509. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_repos_and_pull.py +0 -0
  510. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_restart_services_endpoint.py +0 -0
  511. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_startup_diagnostics.py +0 -0
  512. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_update.py +0 -0
  513. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_update_bluegreen.py +0 -0
  514. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_usage_limit.py +0 -0
  515. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_agent_zero_commit.py +0 -0
  516. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_ambient_home_isolation.py +0 -0
  517. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_approve_reject_plan.py +0 -0
  518. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_approve_usage_gate.py +0 -0
  519. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_assignment_already_recorded_daemon.py +0 -0
  520. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_audit_log.py +0 -0
  521. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_audit_outcome.py +0 -0
  522. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_audit_query.py +0 -0
  523. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_auto_loop.py +0 -0
  524. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_auto_release_publish_2035.py +0 -0
  525. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_base_checkout_restore.py +0 -0
  526. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_block_log.py +0 -0
  527. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_board_cap_762.py +0 -0
  528. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_board_fixture.py +0 -0
  529. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_board_read_path.py +0 -0
  530. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_board_service.py +0 -0
  531. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_board_state.py +0 -0
  532. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_board_wire.py +0 -0
  533. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_brain.py +0 -0
  534. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_branch_model.py +0 -0
  535. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_bug_intake.py +0 -0
  536. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_build_worker_image_env_update.py +0 -0
  537. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cargo_cache.py +0 -0
  538. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_ci_acceptance_gate_1950.py +0 -0
  539. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_ci_parity_2091.py +0 -0
  540. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_ci_store.py +0 -0
  541. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_claim.py +0 -0
  542. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_acceptance.py +0 -0
  543. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_assign.py +0 -0
  544. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  545. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_assign_interactive_remote.py +0 -0
  546. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_assign_provider.py +0 -0
  547. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  548. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_audit.py +0 -0
  549. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_chat_continue.py +0 -0
  550. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_decide.py +0 -0
  551. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_diagnose_config_provenance.py +0 -0
  552. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_diagnose_graph.py +0 -0
  553. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_doctor.py +0 -0
  554. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_doctor_config_free_1801.py +0 -0
  555. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  556. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_drive.py +0 -0
  557. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_escalate.py +0 -0
  558. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_fix_headless_review.py +0 -0
  559. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_gate_a.py +0 -0
  560. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_install_drift.py +0 -0
  561. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_install_skills.py +0 -0
  562. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_issue_create_label.py +0 -0
  563. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_issue_reopen.py +0 -0
  564. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_merge.py +0 -0
  565. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_milestone_assign.py +0 -0
  566. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_milestone_capture.py +0 -0
  567. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_milestone_chat_add_child.py +0 -0
  568. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_milestone_dispatch.py +0 -0
  569. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_milestone_gate_b.py +0 -0
  570. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_milestone_gate_c.py +0 -0
  571. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_milestone_order.py +0 -0
  572. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  573. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_milestone_ship.py +0 -0
  574. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_network.py +0 -0
  575. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_new_issue_chat.py +0 -0
  576. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_plans.py +0 -0
  577. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_portal.py +0 -0
  578. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_pull_artifact.py +0 -0
  579. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_queue.py +0 -0
  580. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_reattach_sessions.py +0 -0
  581. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_refine_board.py +0 -0
  582. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_release_preflight.py +0 -0
  583. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_release_propagate.py +0 -0
  584. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_release_window.py +0 -0
  585. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_repo_2220.py +0 -0
  586. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_scorecard.py +0 -0
  587. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_set_review_findings.py +0 -0
  588. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_status_advisory_terminal.py +0 -0
  589. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_status_merge_queue.py +0 -0
  590. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_status_provider.py +0 -0
  591. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_status_review_finalizing.py +0 -0
  592. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_status_test_failed_tag.py +0 -0
  593. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_status_usage_limit.py +0 -0
  594. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_sync_comments_873.py +0 -0
  595. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_test_plan.py +0 -0
  596. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_track.py +0 -0
  597. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_tui_update.py +0 -0
  598. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cli_wait.py +0 -0
  599. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_client_base_install.py +0 -0
  600. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_comments.py +0 -0
  601. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_completion_summary.py +0 -0
  602. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_config.py +0 -0
  603. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_config_acceptance.py +0 -0
  604. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_config_audit.py +0 -0
  605. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_config_pricing.py +0 -0
  606. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  607. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_config_usage_gate.py +0 -0
  608. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_conflict_fix.py +0 -0
  609. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_conflict_fix_semantic.py +0 -0
  610. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_coord_test.py +0 -0
  611. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_coord_test_runner_baseline.py +0 -0
  612. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_coord_test_runner_populated_home.py +0 -0
  613. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_coord_test_runner_routing.py +0 -0
  614. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_coord_test_runner_toolchain.py +0 -0
  615. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_coord_web_sse_restart_live.py +0 -0
  616. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_coordinator_machine.py +0 -0
  617. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_cross_platform_imports.py +0 -0
  618. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_dashboard.py +0 -0
  619. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_dashboard_fixture.py +0 -0
  620. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_dashboard_terminal.py +0 -0
  621. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_dashboard_terminal_live.py +0 -0
  622. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_db.py +0 -0
  623. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_dead_end.py +0 -0
  624. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_deploy_coord_db_backup.py +0 -0
  625. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_deploy_coord_web_dist.py +0 -0
  626. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_deploy_coord_web_rollback.py +0 -0
  627. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_deploy_drive_queue_unit.py +0 -0
  628. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_deploy_manifest.py +0 -0
  629. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_deploy_units_lane.py +0 -0
  630. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_deploy_web_unit.py +0 -0
  631. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_deps.py +0 -0
  632. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_diagnose.py +0 -0
  633. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_dispatch.py +0 -0
  634. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_dispatch_target_validation.py +0 -0
  635. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_dist_name.py +0 -0
  636. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_done_housekeeping.py +0 -0
  637. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_drive.py +0 -0
  638. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_drive_queue.py +0 -0
  639. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_drive_state.py +0 -0
  640. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_drive_tmux.py +0 -0
  641. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_epic_up_capability_detection.py +0 -0
  642. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  643. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_epic_up_image_provenance.py +0 -0
  644. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_errors.py +0 -0
  645. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_events.py +0 -0
  646. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_failure_class.py +0 -0
  647. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_filelock.py +0 -0
  648. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  649. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_fix_of_force_override.py +0 -0
  650. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_fleet_config_health.py +0 -0
  651. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_fleet_health_probes.py +0 -0
  652. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_fleet_health_snapshot.py +0 -0
  653. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_freshness.py +0 -0
  654. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_gate_a.py +0 -0
  655. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_gate_b.py +0 -0
  656. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_gate_snapshot_staleness.py +0 -0
  657. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_gates.py +0 -0
  658. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  659. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_generated_types_fixture.py +0 -0
  660. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_github_ops.py +0 -0
  661. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_goal.py +0 -0
  662. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_graph_health.py +0 -0
  663. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_graph_selfheal_absent_2237.py +0 -0
  664. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_handoff.py +0 -0
  665. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_health_checks.py +0 -0
  666. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_health_cli.py +0 -0
  667. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_health_cli_graph.py +0 -0
  668. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_health_config.py +0 -0
  669. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_health_context.py +0 -0
  670. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_health_deploy_lane_facts.py +0 -0
  671. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_health_incident_regression.py +0 -0
  672. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_health_pypi.py +0 -0
  673. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_health_registry.py +0 -0
  674. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_health_timer_active.py +0 -0
  675. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_health_toolchain.py +0 -0
  676. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_health_unit_drift.py +0 -0
  677. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_health_unit_enablement.py +0 -0
  678. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_hooks.py +0 -0
  679. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_human_attended_437.py +0 -0
  680. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_init.py +0 -0
  681. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_integration.py +0 -0
  682. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_interactive_briefing_echo.py +0 -0
  683. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_interactive_prefill_state.py +0 -0
  684. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_interactive_session_relaunch.py +0 -0
  685. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_interactive_test_verdict_backstop.py +0 -0
  686. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_interactive_token_attribution.py +0 -0
  687. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_interactive_worktree.py +0 -0
  688. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_issue_store_seam.py +0 -0
  689. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_liveness_auditor.py +0 -0
  690. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_liveness_notify.py +0 -0
  691. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_machine_pause.py +0 -0
  692. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_merge_queue.py +0 -0
  693. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_merge_verify.py +0 -0
  694. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_milestone_chat.py +0 -0
  695. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_milestone_dispatch.py +0 -0
  696. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_milestone_gate.py +0 -0
  697. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_milestone_order.py +0 -0
  698. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_milestone_seam.py +0 -0
  699. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_mock_author.py +0 -0
  700. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_model_tiering.py +0 -0
  701. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_models.py +0 -0
  702. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_models_config_labels.py +0 -0
  703. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_needs_attention.py +0 -0
  704. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_network.py +0 -0
  705. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_new_issue_chat.py +0 -0
  706. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_next_release_tag.py +0 -0
  707. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_no_direct_gh_calls.py +0 -0
  708. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_node_shim.py +0 -0
  709. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_notifier_baseline.py +0 -0
  710. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_notifier_cli.py +0 -0
  711. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_notifier_collect.py +0 -0
  712. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_notifier_config.py +0 -0
  713. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_notifier_drive_seam.py +0 -0
  714. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_notifier_isolation.py +0 -0
  715. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_notifier_predicate.py +0 -0
  716. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_notifier_quiet_hours.py +0 -0
  717. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_notifier_service.py +0 -0
  718. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_notify.py +0 -0
  719. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_notify_drain.py +0 -0
  720. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_openapi.py +0 -0
  721. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_operational_defaults.py +0 -0
  722. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_overlap_fence.py +0 -0
  723. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_overlap_predict.py +0 -0
  724. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_packaged_deploy_units.py +0 -0
  725. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_parentage.py +0 -0
  726. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_paste_landed.py +0 -0
  727. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_pipeline.py +0 -0
  728. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_plan_followup_approve_plan_command.py +0 -0
  729. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_plan_followup_pr_command.py +0 -0
  730. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_plan_followup_review_command.py +0 -0
  731. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_plan_only.py +0 -0
  732. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_plan_parser.py +0 -0
  733. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_platform_paths.py +0 -0
  734. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_portal_bridge.py +0 -0
  735. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_portal_config.py +0 -0
  736. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_portal_sync.py +0 -0
  737. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_pr_body_lint.py +0 -0
  738. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_prereqs.py +0 -0
  739. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_production_db_guard.py +0 -0
  740. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_progress.py +0 -0
  741. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_provider_seam.py +0 -0
  742. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_providers.py +0 -0
  743. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_providers_config_labels.py +0 -0
  744. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_providers_pty.py +0 -0
  745. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_quiet_hours.py +0 -0
  746. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_quiet_hours_store_2146.py +0 -0
  747. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_reap_merged_sessions.py +0 -0
  748. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_reap_stale_interactive_tick.py +0 -0
  749. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_reconcile.py +0 -0
  750. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_reconcile_branch.py +0 -0
  751. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_reconcile_completions.py +0 -0
  752. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_reconcile_merges.py +0 -0
  753. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_reconcile_no_agent_record.py +0 -0
  754. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_reconcile_usage_limit_done.py +0 -0
  755. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_refine_chat.py +0 -0
  756. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  757. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_release_cordon_deadlock_2240.py +0 -0
  758. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_release_propagate.py +0 -0
  759. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_release_unified_1242.py +0 -0
  760. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_release_verify.py +0 -0
  761. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_release_window.py +0 -0
  762. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_remote_auto_prune.py +0 -0
  763. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_remote_interactive_reaper.py +0 -0
  764. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_repo_edit_2220.py +0 -0
  765. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_repo_graph_fleet_2237.py +0 -0
  766. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_repo_onboard_2220.py +0 -0
  767. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_report_result_push.py +0 -0
  768. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_reports.py +0 -0
  769. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_retry.py +0 -0
  770. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_retry_advisory_1606.py +0 -0
  771. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_retry_type_1636.py +0 -0
  772. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_revalidate.py +0 -0
  773. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_review.py +0 -0
  774. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_review_end_review_without_verdict.py +0 -0
  775. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_review_parse_failure_diagnostic.py +0 -0
  776. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_review_reaffirm.py +0 -0
  777. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_review_state.py +0 -0
  778. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_review_verdict_backstop.py +0 -0
  779. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_review_verdict_override_audit.py +0 -0
  780. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_review_verdict_relay.py +0 -0
  781. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_review_zero_commits.py +0 -0
  782. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_scoped_review_wiring.py +0 -0
  783. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_scorecard.py +0 -0
  784. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_serve.py +0 -0
  785. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_serve_app_board_trim.py +0 -0
  786. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_session.py +0 -0
  787. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_slice_issue_attribution.py +0 -0
  788. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_smoke.py +0 -0
  789. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_smoke_live_checkout_restore.py +0 -0
  790. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_smoke_workflow.py +0 -0
  791. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_spend_ceiling.py +0 -0
  792. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_spend_ceiling_coordinator.py +0 -0
  793. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_split.py +0 -0
  794. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_split_work.py +0 -0
  795. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_stage_projection.py +0 -0
  796. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_stalled_pipeline.py +0 -0
  797. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_state.py +0 -0
  798. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_state_review_findings_daemon.py +0 -0
  799. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_status_fleet_footer.py +0 -0
  800. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_stop_1567.py +0 -0
  801. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_stuck.py +0 -0
  802. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_terminal_command.py +0 -0
  803. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_test_author.py +0 -0
  804. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_test_chat.py +0 -0
  805. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_test_orchestrator.py +0 -0
  806. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_test_report.py +0 -0
  807. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_test_verdict_parsing.py +0 -0
  808. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_test_verdict_transcript_floor.py +0 -0
  809. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_thin_client_board_audit.py +0 -0
  810. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_thin_client_config_load_1080.py +0 -0
  811. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_thin_client_daemon_routing_906.py +0 -0
  812. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_tmux_host.py +0 -0
  813. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_tmux_session.py +0 -0
  814. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_transcript_floor.py +0 -0
  815. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_usage.py +0 -0
  816. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_usage_limits.py +0 -0
  817. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_usage_rollup.py +0 -0
  818. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_venv_live_install_2121.py +0 -0
  819. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_version_single_source.py +0 -0
  820. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_watch.py +0 -0
  821. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  822. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_worker_events.py +0 -0
  823. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_worker_image_pin_sync.py +0 -0
  824. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_worker_safety.py +0 -0
  825. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_worker_test_scoping.py +0 -0
  826. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_worktree.py +0 -0
  827. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  828. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/Cargo.lock +0 -0
  829. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/Cargo.toml +0 -0
  830. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/cargo-config-local-quadraui.toml.example +0 -0
  831. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/audit.rs +0 -0
  832. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/chat.rs +0 -0
  833. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/data.rs +0 -0
  834. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/dialogs.rs +0 -0
  835. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/doc_tabs.rs +0 -0
  836. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/drive.rs +0 -0
  837. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/drive_queue.rs +0 -0
  838. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/escalation.rs +0 -0
  839. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/events.rs +0 -0
  840. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/fixtures.rs +0 -0
  841. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/fleet_health.rs +0 -0
  842. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/fleet_sessions.rs +0 -0
  843. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/fleet_terminals.rs +0 -0
  844. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/format.rs +0 -0
  845. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/milestone_dag.rs +0 -0
  846. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/mod.rs +0 -0
  847. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/msv.rs +0 -0
  848. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/pipeline.rs +0 -0
  849. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/plans.rs +0 -0
  850. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/render.rs +0 -0
  851. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/reports.rs +0 -0
  852. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/sessions.rs +0 -0
  853. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/settings_ui.rs +0 -0
  854. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/sidebar.rs +0 -0
  855. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/terminal.rs +0 -0
  856. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/tests.rs +0 -0
  857. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/types.rs +0 -0
  858. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/app/workspace.rs +0 -0
  859. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/bin/gtk.rs +0 -0
  860. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/commands.rs +0 -0
  861. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/lib.rs +0 -0
  862. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/main.rs +0 -0
  863. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/src/settings.rs +0 -0
  864. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/tests/acceptance.rs +0 -0
  865. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/tui/tests/cli.rs +0 -0
  866. {code_coordinator-0.5.139 → code_coordinator-0.5.141}/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.139
3
+ Version: 0.5.141
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.139
3
+ Version: 0.5.141
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
@@ -112,6 +112,7 @@ coord/prereqs.py
112
112
  coord/progress.py
113
113
  coord/queue_diagnose.py
114
114
  coord/reconcile.py
115
+ coord/reconcile_tick.py
115
116
  coord/refine_chat.py
116
117
  coord/release_cordon.py
117
118
  coord/release_propagate.py
@@ -431,6 +432,7 @@ tests/test_agent_branch_capture.py
431
432
  tests/test_agent_config_free_1712.py
432
433
  tests/test_agent_deploy_units_endpoint.py
433
434
  tests/test_agent_dirty_worktree.py
435
+ tests/test_agent_drive_queue_reconcile_2373.py
434
436
  tests/test_agent_graph_self_heal.py
435
437
  tests/test_agent_health_h3.py
436
438
  tests/test_agent_idle_restart.py
@@ -682,6 +684,7 @@ tests/test_reconcile_branch.py
682
684
  tests/test_reconcile_completions.py
683
685
  tests/test_reconcile_merges.py
684
686
  tests/test_reconcile_no_agent_record.py
687
+ tests/test_reconcile_tick.py
685
688
  tests/test_reconcile_usage_limit_done.py
686
689
  tests/test_refine_chat.py
687
690
  tests/test_release_cordon_2101.py
@@ -293,6 +293,7 @@
293
293
  "coord/providers/opencode.py",
294
294
  "coord/queue_diagnose.py",
295
295
  "coord/reconcile.py",
296
+ "coord/reconcile_tick.py",
296
297
  "coord/refine_chat.py",
297
298
  "coord/release_cordon.py",
298
299
  "coord/release_propagate.py",
@@ -474,6 +475,7 @@
474
475
  "tests/test_agent_config_free_1712.py",
475
476
  "tests/test_agent_deploy_units_endpoint.py",
476
477
  "tests/test_agent_dirty_worktree.py",
478
+ "tests/test_agent_drive_queue_reconcile_2373.py",
477
479
  "tests/test_agent_graph_self_heal.py",
478
480
  "tests/test_agent_health_h3.py",
479
481
  "tests/test_agent_idle_restart.py",
@@ -725,6 +727,7 @@
725
727
  "tests/test_reconcile_completions.py",
726
728
  "tests/test_reconcile_merges.py",
727
729
  "tests/test_reconcile_no_agent_record.py",
730
+ "tests/test_reconcile_tick.py",
728
731
  "tests/test_reconcile_usage_limit_done.py",
729
732
  "tests/test_refine_chat.py",
730
733
  "tests/test_release_cordon_2101.py",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.139",
2
+ "tag": "0.5.141",
3
3
  "distance": 0,
4
- "node": "g30ba3872d2157cfdc9832bc57cca0722f858a55a",
4
+ "node": "gef1e71db0f0c6bc0d0346e3020abaeabac680993",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-18"
@@ -6102,6 +6102,48 @@ class AgentServer:
6102
6102
  self._local_health_cache = None
6103
6103
  return {**result.to_dict(), "repo": repo_name}
6104
6104
 
6105
+ def reconcile_drive_queue(self, *, timeout: float = 120.0) -> dict:
6106
+ """``coord drive-queue tick --reconcile-only`` — run on THIS machine
6107
+ (#2373 — ``coord release propagate``'s drain-deadline escalation
6108
+ fans this out to a host it has cordoned but that will not drain, via
6109
+ `_reconcile_launch_host` in `coord/commands/release.py`).
6110
+
6111
+ Only the machine that launched a `running` drive-queue entry can
6112
+ resolve it (the #1870 cross-host guard in
6113
+ `coord.drive_queue._reconcile_running` is keyed on a LOCAL tmux
6114
+ read); this method is that resolution, reachable over this agent's
6115
+ HTTP API instead of a human's SSH session. Full incident writeup
6116
+ (claude-coordinator#2360) and rationale: `_reconcile_launch_host`'s
6117
+ docstring and docs/AGENT_OPERATIONS.md's #2373 section.
6118
+
6119
+ Delegates to :func:`coord.reconcile_tick.run_reconcile_tick` — the
6120
+ same shared implementation `coord release propagate`'s own
6121
+ `_run_reconcile_tick` (`coord/commands/release.py`) calls, so there
6122
+ is exactly one implementation of "what a reconcile-only tick does",
6123
+ not two that can drift apart.
6124
+
6125
+ Returns ``{"ok": bool, "detail": str}``. ``ok=False`` with a
6126
+ ``no local coordinator.yml`` detail when this agent has no on-disk
6127
+ config to pass as ``--config`` — thin-client/config-free mode
6128
+ (docs/EPHEMERAL_WORKERS.md) has nothing for a queue tick to resolve
6129
+ against here. Never raises: the caller (`/drive-queue-reconcile`) is
6130
+ a best-effort self-heal step inside a larger escalation, not a gate
6131
+ that may take propagation down with it.
6132
+ """
6133
+ from coord.reconcile_tick import run_reconcile_tick # noqa: PLC0415
6134
+
6135
+ config_path = getattr(self._health_config, "path", None)
6136
+ if not config_path:
6137
+ return {
6138
+ "ok": False,
6139
+ "detail": (
6140
+ "no local coordinator.yml on this agent — cannot resolve "
6141
+ "a --config path for the tick"
6142
+ ),
6143
+ }
6144
+ ok, detail = run_reconcile_tick(config_path, timeout=timeout, detail_limit=2000)
6145
+ return {"ok": ok, "detail": detail}
6146
+
6105
6147
  def list_repos(self) -> dict[str, dict]:
6106
6148
  """Return local HEAD / branch / dirty flag for each configured repo.
6107
6149
 
@@ -1020,6 +1020,42 @@ def _openapi_spec() -> dict:
1020
1020
  },
1021
1021
  }
1022
1022
  },
1023
+ "/drive-queue-reconcile": {
1024
+ "post": {
1025
+ "summary": (
1026
+ "Run `coord drive-queue tick --reconcile-only` on this "
1027
+ "machine (#2373)"
1028
+ ),
1029
+ "description": (
1030
+ "The per-machine self-heal `coord release propagate`'s "
1031
+ "drain-deadline escalation calls before it escalates "
1032
+ "loudly: only the host that actually launched a "
1033
+ "`running` drive-queue entry can resolve the #1870 "
1034
+ "cross-host liveness guard for it. Fleet-queue-wide, "
1035
+ "not scoped to a repo."
1036
+ ),
1037
+ "requestBody": {
1038
+ "required": False,
1039
+ "content": {
1040
+ "application/json": {
1041
+ "schema": {
1042
+ "type": "object",
1043
+ "properties": {
1044
+ "timeout": {
1045
+ "type": "number",
1046
+ "description": (
1047
+ "seconds for the tick subprocess; "
1048
+ "defaults to 120."
1049
+ ),
1050
+ },
1051
+ },
1052
+ }
1053
+ }
1054
+ },
1055
+ },
1056
+ "responses": {"200": {"description": "OK (including a failed tick)"}},
1057
+ }
1058
+ },
1023
1059
  "/artifact/{repo}/{branch}": {
1024
1060
  "get": {
1025
1061
  "summary": "Manifest of stashed build artifacts for a (repo, branch) pair",
@@ -1948,6 +1984,36 @@ def build_app(
1948
1984
  result = await asyncio.to_thread(server.fix_graph, repo, timeout=timeout)
1949
1985
  return JSONResponse(result)
1950
1986
 
1987
+ async def drive_queue_reconcile(request: Request) -> JSONResponse:
1988
+ """Run ``coord drive-queue tick --reconcile-only`` on THIS machine
1989
+ (#2373). ``coord release propagate``'s drain-deadline escalation
1990
+ POSTs here — before it escalates loudly — on whichever host it has
1991
+ cordoned but that will not drain, so the one machine that can
1992
+ actually resolve the #1870 cross-host liveness ambiguity for an
1993
+ entry it launched gets asked to, automatically, instead of a human
1994
+ needing to SSH in and run this by hand (the live 2026-08-18 incident
1995
+ this closes).
1996
+
1997
+ Body: optional ``{"timeout": 120}``. No required fields, unlike
1998
+ ``/graph-fix`` — a reconcile-only tick is fleet-queue-wide, not
1999
+ scoped to one repo.
2000
+
2001
+ Runs off the event loop: the subprocess holds the drive-queue file
2002
+ lock for the length of one tick, which must never stall this
2003
+ agent's ``/health`` for the rest of the fleet.
2004
+ """
2005
+ body: dict = {}
2006
+ try:
2007
+ body = await request.json()
2008
+ except Exception:
2009
+ pass
2010
+ try:
2011
+ timeout = float(body.get("timeout", 120.0))
2012
+ except (TypeError, ValueError):
2013
+ timeout = 120.0
2014
+ result = await asyncio.to_thread(server.reconcile_drive_queue, timeout=timeout)
2015
+ return JSONResponse(result)
2016
+
1951
2017
  routes = [
1952
2018
  Route("/health", health, methods=["GET"]),
1953
2019
  Route("/status", status, methods=["GET"]),
@@ -1973,6 +2039,10 @@ def build_app(
1973
2039
  # missing graph and set core.hooksPath, on the machines that
1974
2040
  # actually run workers rather than only on the operator's laptop.
1975
2041
  Route("/graph-fix", graph_fix, methods=["POST"]),
2042
+ # #2373: `coord release propagate`'s drain-deadline escalation's
2043
+ # per-machine self-heal — resolve a `running` drive-queue entry this
2044
+ # host launched before the escalation fires loudly.
2045
+ Route("/drive-queue-reconcile", drive_queue_reconcile, methods=["POST"]),
1976
2046
  # #305: artifact stash manifest (GET /artifact/<repo>/<branch>)
1977
2047
  Route("/artifact/{repo}/{branch}", artifact_manifest, methods=["GET"]),
1978
2048
  # #207: CPU + memory snapshot for TUI sparklines
@@ -2761,11 +2761,18 @@ def drive_queue_tick(
2761
2761
  gates=" | ".join(plan.alert.details),
2762
2762
  command=plan.alert.command,
2763
2763
  )
2764
- elif any(h.outcome == "released" for h in plan.holds):
2765
- # A probe just auto-released the gate. Drop the "QUEUE HELD"
2766
- # record in the same tick, or `status` keeps shouting HELD while
2767
- # the queue is demonstrably running again the contradiction that
2768
- # teaches an operator to stop reading alerts.
2764
+ else:
2765
+ # #2381: ANY resolved alert-raising condition a released hold,
2766
+ # a lapsed/cleared cordon, a fixed editable-drift checkout must
2767
+ # drop the stale escalation record in the SAME tick it resolves,
2768
+ # or `status` (and the TUI/`decisions` report reading the same
2769
+ # record) keeps shouting the old reason while the queue is
2770
+ # demonstrably running again. This used to be gated on `any(h.
2771
+ # outcome == "released" for h in plan.holds)` — the deploy-gate
2772
+ # case only — so a cleared CORDON (no `plan.holds` entry at all)
2773
+ # never cleared its own stale alert. `_clear_queue_alert()` is a
2774
+ # no-op when there is nothing to dismiss, so calling it on every
2775
+ # alert-free tick is safe and cheap.
2769
2776
  _clear_queue_alert()
2770
2777
 
2771
2778
  target = plan.launch
@@ -503,6 +503,77 @@ def _post(url: str, payload: dict, *, timeout: float) -> tuple[int | None, dict,
503
503
  return resp.status_code, (body if isinstance(body, dict) else {}), ""
504
504
 
505
505
 
506
+ #: #2373: default timeout for the remote-reconcile POST below. Generous, but
507
+ #: still small next to `DEFAULT_DRAIN_DEADLINE_SECONDS` (90 minutes), so a
508
+ #: wedged/unreachable agent never turns "ask before escalating" into a
509
+ #: second, longer wait before the loud message an operator is actually
510
+ #: watching for. The POST body forwards a *shorter* remote-subprocess
511
+ #: timeout (see `_RECONCILE_TIMEOUT_MARGIN_SECONDS` below) so the remote
512
+ #: agent's own tick (`AgentServer.reconcile_drive_queue`, otherwise 120s by
513
+ #: default) can never outlive this wait — without that, a tick legitimately
514
+ #: taking longer than this timeout would surface here as a misleading
515
+ #: "unreachable" even though it was still running and would have resolved
516
+ #: correctly on its own.
517
+ DEFAULT_RECONCILE_TIMEOUT_SECONDS = 30.0
518
+
519
+ #: Margin subtracted from *timeout* before it is forwarded as the remote
520
+ #: subprocess's own timeout (see `_reconcile_launch_host`) — leaves the
521
+ #: agent's HTTP handler room to marshal and return its response before
522
+ #: this side's own `httpx` deadline fires.
523
+ _RECONCILE_TIMEOUT_MARGIN_SECONDS = 5.0
524
+
525
+
526
+ def _reconcile_launch_host(
527
+ machine_host: str,
528
+ *,
529
+ agent_port: int,
530
+ timeout: float = DEFAULT_RECONCILE_TIMEOUT_SECONDS,
531
+ post=None,
532
+ ) -> tuple[bool | None, str]:
533
+ """Ask *machine_host*'s own agent to run a local reconcile-only tick
534
+ (#2373), over the same ``POST /<verb>`` HTTP pattern ``/graph-fix``
535
+ already uses for a per-machine self-heal fanned out from elsewhere.
536
+
537
+ Why this has to be a REMOTE call rather than something run locally by
538
+ whichever host happens to be executing `coord release propagate`: the
539
+ #1870 cross-host guard (`coord.drive_queue._reconcile_running`) is keyed
540
+ on a LOCAL tmux read, so only the machine that actually launched a
541
+ `running` drive-queue entry can ever resolve whether it is still alive.
542
+ A non-daemon launch host has no periodic tick of its own — confirmed
543
+ live 2026-08-18 (claude-coordinator#2360): elitebook ran only
544
+ `coord-agent.service`, dellserver's `coord-drive-queue.timer` correctly
545
+ refused to declare a foreign-host entry dead every time it ticked, and
546
+ the ambiguity sat wedging the fleet's release drain for ~17h until a
547
+ human happened to SSH in and run this exact command by hand. Routing it
548
+ through the agent HTTP API that already runs on every machine capable of
549
+ launching a drive closes that gap without a new timer unit anywhere.
550
+
551
+ Returns ``(ok, detail)``. ``ok`` is ``None`` when the call could not even
552
+ be attempted (never treated as a *failure* by the caller — see
553
+ :func:`_escalate_drain`), ``False`` on an unreachable agent or a non-200
554
+ response, ``True`` when the agent ran the tick (its own exit code, not
555
+ "and it resolved the entry" — a genuinely still-busy host is expected to
556
+ report ``ok=True`` with nothing to reconcile).
557
+
558
+ The POST body forwards a remote subprocess timeout derived from
559
+ *timeout* itself (minus `_RECONCILE_TIMEOUT_MARGIN_SECONDS`) rather than
560
+ leaving the remote agent to fall back to its own 120s default
561
+ (`AgentServer.reconcile_drive_queue`) — otherwise a tick that legitimately
562
+ takes longer than this call's own HTTP wait reports here as
563
+ `ok=False, detail="unreachable: ..."` even though it is still running and
564
+ will resolve correctly on its own, just not attributed to this call.
565
+ """
566
+ poster = post or _post
567
+ url = f"http://{machine_host}:{agent_port}/drive-queue-reconcile"
568
+ remote_timeout = max(1.0, timeout - _RECONCILE_TIMEOUT_MARGIN_SECONDS)
569
+ status, body, err = poster(url, {"timeout": remote_timeout}, timeout=timeout)
570
+ if err:
571
+ return False, f"unreachable: {err}"
572
+ if status != 200:
573
+ return False, f"HTTP {status}: {body.get('detail') or body}"
574
+ return bool(body.get("ok")), str(body.get("detail") or "")
575
+
576
+
506
577
  def _lane_versions_by_host(report) -> dict[str, list[str | None]]:
507
578
  out: dict[str, list[str | None]] = {}
508
579
  for lane in report.lanes:
@@ -791,6 +862,11 @@ def release_propagate( # noqa: PLR0912, PLR0915 — a pipeline; the decisions a
791
862
  max_deferrals=cordon_max_deferrals,
792
863
  release_cooldown=cordon_cooldown,
793
864
  daemon_host=daemon_name,
865
+ # #2373: lets a blown drain deadline ask the escalated host's own
866
+ # agent to resolve the #1870 cross-host liveness ambiguity locally
867
+ # before the loud message goes out — see `_reconcile_launch_host`.
868
+ machines=getattr(config, "machines", ()) or (),
869
+ agent_port=AGENT_PORT,
794
870
  )
795
871
 
796
872
  if fully_busy and not force:
@@ -1162,6 +1238,9 @@ def _apply_cordons( # noqa: PLR0912 — one linear apply-the-plan pass
1162
1238
  max_deferrals: int | None = None,
1163
1239
  release_cooldown: float | None = None,
1164
1240
  daemon_host: str | None = None,
1241
+ machines=None,
1242
+ agent_port: int | None = None,
1243
+ reconcile_timeout: float | None = None,
1165
1244
  ) -> dict:
1166
1245
  """Plan and apply this run's cordons. Returns the journal fragment.
1167
1246
 
@@ -1185,6 +1264,13 @@ def _apply_cordons( # noqa: PLR0912 — one linear apply-the-plan pass
1185
1264
  pre-#2240 behaviour) rather than to a spurious release: dropping the
1186
1265
  fleet's cordon because a file could not be read is the wrong direction to
1187
1266
  fail in.
1267
+
1268
+ #2373: *machines*/*agent_port* let each :class:`~coord.release_cordon.
1269
+ DrainEscalation` ask the escalated host's OWN agent to run a local
1270
+ reconcile-only tick before the loud message goes out — see
1271
+ :func:`_reconcile_launch_host`. ``machines=None`` (a caller with no fleet
1272
+ topology, e.g. a unit test exercising `plan_cordons` output directly)
1273
+ skips the remote call entirely and escalates exactly as before #2373.
1188
1274
  """
1189
1275
  import time # noqa: PLC0415
1190
1276
 
@@ -1304,9 +1390,39 @@ def _apply_cordons( # noqa: PLR0912 — one linear apply-the-plan pass
1304
1390
  outcome.errors.append(f"release cordon {name}: {exc}")
1305
1391
  click.echo(f" ✗ release cordon {name}: {exc}", err=True)
1306
1392
 
1393
+ machines_by_name = {m.name: m for m in (machines or ())}
1394
+ # #2373: each escalation below makes one synchronous `_reconcile_launch_host`
1395
+ # HTTP call, serially, each blocking up to ~`DEFAULT_RECONCILE_TIMEOUT_SECONDS`.
1396
+ # With multiple simultaneously-overdue hosts this adds up to N * timeout of
1397
+ # latency inside one `release propagate` invocation. Fine today — escalations
1398
+ # are rare and few at once — but if that ever stops being true, parallelize
1399
+ # this loop (e.g. a thread pool over `plan.escalations`) rather than letting
1400
+ # a single propagate call silently grow with fleet size.
1307
1401
  for escalation in plan.escalations:
1308
- _escalate_drain(escalation)
1309
- outcome.escalated.append(escalation.to_dict())
1402
+ # #2373: before the loud message, give the escalated host's OWN
1403
+ # agent one chance to resolve the ambiguity that is actually holding
1404
+ # it — see `_reconcile_launch_host`'s docstring. `machine` missing
1405
+ # from the fleet map, or no `agent_port` supplied (a caller with no
1406
+ # HTTP topology), skips the call rather than guessing an address.
1407
+ reconcile_ok: bool | None = None
1408
+ reconcile_detail = ""
1409
+ target = machines_by_name.get(escalation.machine)
1410
+ if target is not None and agent_port:
1411
+ reconcile_ok, reconcile_detail = _reconcile_launch_host(
1412
+ target.host,
1413
+ agent_port=agent_port,
1414
+ timeout=(
1415
+ DEFAULT_RECONCILE_TIMEOUT_SECONDS
1416
+ if reconcile_timeout is None
1417
+ else reconcile_timeout
1418
+ ),
1419
+ )
1420
+ _escalate_drain(escalation, reconcile_ok=reconcile_ok, reconcile_detail=reconcile_detail)
1421
+ outcome.escalated.append({
1422
+ **escalation.to_dict(),
1423
+ "reconcile_ok": reconcile_ok,
1424
+ "reconcile_detail": reconcile_detail,
1425
+ })
1310
1426
 
1311
1427
  return outcome.to_dict()
1312
1428
 
@@ -1321,7 +1437,9 @@ DRAIN_ALERT_ISSUE = 0
1321
1437
  DRAIN_ALERT_STAGE = "release-cordon"
1322
1438
 
1323
1439
 
1324
- def _escalate_drain(escalation) -> None:
1440
+ def _escalate_drain(
1441
+ escalation, *, reconcile_ok: bool | None = None, reconcile_detail: str = ""
1442
+ ) -> None:
1325
1443
  """Surface a host that will not drain — loudly, in three places.
1326
1444
 
1327
1445
  stderr (the timer's journal), the escalation table (the TUI and
@@ -1329,21 +1447,43 @@ def _escalate_drain(escalation) -> None:
1329
1447
  criterion 4 is explicitly about the surfaced MESSAGE rather than an
1330
1448
  internal state change, because a silent forever-wait is the failure this
1331
1449
  whole mechanism replaces.
1450
+
1451
+ #2373: *reconcile_ok*/*reconcile_detail* are the outcome of the remote
1452
+ reconcile-only tick `_apply_cordons` asked the escalated host's own
1453
+ agent to run just before calling this — ``None`` when that call was
1454
+ never attempted (no fleet topology / agent port available), so the
1455
+ message stays byte-identical to before #2373 in that case. When it WAS
1456
+ attempted, the outcome is folded into the same message rather than a
1457
+ second alert, so an operator reading one escalation sees both "this is
1458
+ overdue" and "here is what the self-heal attempt already found" without
1459
+ correlating two records.
1332
1460
  """
1333
- click.echo(f" ! {escalation.message}", err=True)
1461
+ reconcile_note = ""
1462
+ if reconcile_ok is not None:
1463
+ verb = "ok" if reconcile_ok else "failed"
1464
+ detail = f" ({reconcile_detail})" if reconcile_detail else ""
1465
+ reconcile_note = (
1466
+ f" — asked {escalation.machine}'s own agent to run a local "
1467
+ f"reconcile-only tick first (#2373): {verb}{detail}"
1468
+ )
1469
+ message = f"{escalation.message}{reconcile_note}"
1470
+ click.echo(f" ! {message}", err=True)
1334
1471
  try:
1335
1472
  from coord.state import record_drive_escalation # noqa: PLC0415
1336
1473
 
1474
+ gate_readings = (
1475
+ f"machine={escalation.machine} | "
1476
+ f"waited={escalation.waited_seconds:.0f}s | "
1477
+ f"deadline={escalation.deadline_seconds:.0f}s"
1478
+ )
1479
+ if reconcile_ok is not None:
1480
+ gate_readings += f" | remote_reconcile={'ok' if reconcile_ok else 'failed'}"
1337
1481
  record_drive_escalation(
1338
1482
  DRAIN_ALERT_REPO,
1339
1483
  DRAIN_ALERT_ISSUE,
1340
1484
  stage=DRAIN_ALERT_STAGE,
1341
- reason=escalation.message,
1342
- gate_readings=(
1343
- f"machine={escalation.machine} | "
1344
- f"waited={escalation.waited_seconds:.0f}s | "
1345
- f"deadline={escalation.deadline_seconds:.0f}s"
1346
- ),
1485
+ reason=message,
1486
+ gate_readings=gate_readings,
1347
1487
  proposed_command=escalation.command,
1348
1488
  )
1349
1489
  except Exception as exc: # noqa: BLE001 — the stderr line above is the
@@ -2181,24 +2321,19 @@ def _run_reconcile_tick(config_path: Path, *, runner=None) -> tuple[bool, str]:
2181
2321
  *after* the timer stopped would stay stuck ``running`` for the rest of
2182
2322
  the drain no matter how generous the deadline is — the exact deadlock
2183
2323
  #2110 fixed reconciliation to no longer require the timer for.
2324
+
2325
+ Thin wrapper around :func:`coord.reconcile_tick.run_reconcile_tick`, the
2326
+ #2373-extracted shared implementation also used by
2327
+ `AgentServer.reconcile_drive_queue` (`coord/agent.py`) — see that
2328
+ module's docstring for why there must be exactly one implementation of
2329
+ "what a reconcile-only tick does". A failure here is not fatal on its
2330
+ own: the quiescence check right after this call is the real signal a
2331
+ stuck reconcile eventually clears on a later poll, not this one call's
2332
+ job to guarantee.
2184
2333
  """
2185
- import subprocess # noqa: PLC0415
2334
+ from coord.reconcile_tick import run_reconcile_tick # noqa: PLC0415
2186
2335
 
2187
- run = runner or subprocess.run
2188
- try:
2189
- proc = run(
2190
- [sys.executable, "-m", "coord.cli", "drive-queue", "tick",
2191
- "--reconcile-only", "--config", str(config_path)],
2192
- capture_output=True, text=True, timeout=120,
2193
- )
2194
- except Exception as exc: # noqa: BLE001 — best effort; the quiescence
2195
- # check right after this call is the real signal a stuck reconcile
2196
- # eventually clears on a later poll, not this one call's job to
2197
- # guarantee.
2198
- return False, f"{type(exc).__name__}: {exc}"
2199
- ok = getattr(proc, "returncode", 1) == 0
2200
- detail = (getattr(proc, "stderr", "") or getattr(proc, "stdout", "") or "").strip()
2201
- return ok, detail[:200]
2336
+ return run_reconcile_tick(config_path, timeout=120, detail_limit=200, runner=runner)
2202
2337
 
2203
2338
 
2204
2339
  def _drain(
@@ -0,0 +1,65 @@
1
+ """Shared primitive: run ``coord drive-queue tick --reconcile-only`` as a
2
+ subprocess and report ``(ok, detail)``.
3
+
4
+ Two independent surfaces need to run this exact command — the real CLI path,
5
+ with its own file lock (`coord.filelock.drive_queue_lock_path`) against a
6
+ concurrently-running timer tick on the same host, and its own ``--config``
7
+ resolution:
8
+
9
+ * ``coord release propagate``'s drain loop (`coord/commands/release.py`,
10
+ `_run_reconcile_tick`, #2110) — polls this on every iteration so a drive
11
+ that finishes *after* `coord-drive-queue.timer` has been stopped for the
12
+ drain still gets reconciled from ``running`` to ``done``.
13
+ * `AgentServer.reconcile_drive_queue` (`coord/agent.py`, #2373) — reachable
14
+ over the agent's HTTP API so `coord release propagate`'s drain-deadline
15
+ escalation can ask a non-daemon ``launch_host`` to resolve its own
16
+ cross-host liveness ambiguity (`coord.drive_queue._reconcile_running`'s
17
+ #1870 guard) before escalating loudly. See ``docs/AGENT_OPERATIONS.md``'s
18
+ #2373 section for the full incident writeup.
19
+
20
+ Per this repo's rule (CLAUDE.md, epic #2096): if two surfaces answer the
21
+ same question, they must call the same function. This is that function —
22
+ not two hand-maintained copies that quietly drift apart (as #2373's review
23
+ found: a hardcoded 120s timeout vs. a caller-supplied one, and a 200-char
24
+ detail truncation vs. a 2000-char one).
25
+ """
26
+
27
+ from __future__ import annotations
28
+
29
+ import subprocess
30
+ import sys
31
+ from pathlib import Path
32
+
33
+
34
+ def run_reconcile_tick(
35
+ config_path: Path | str,
36
+ *,
37
+ timeout: float = 120.0,
38
+ detail_limit: int = 2000,
39
+ runner=None,
40
+ ) -> tuple[bool, str]:
41
+ """Run ``coord drive-queue tick --reconcile-only --config <config_path>``.
42
+
43
+ Never raises: a timeout or any other subprocess failure comes back as
44
+ ``(False, "<ExceptionType>: <message>")`` rather than propagating — both
45
+ callers treat this as a best-effort step inside a larger loop/escalation,
46
+ not a gate that may take the caller down with it.
47
+
48
+ *runner* is the `subprocess.run`-shaped seam tests substitute; *timeout*
49
+ and *detail_limit* let each caller keep its own existing behavior
50
+ (`_run_reconcile_tick`'s 120s/200-char vs. `reconcile_drive_queue`'s
51
+ caller-supplied timeout/2000-char) without re-implementing the command
52
+ itself twice.
53
+ """
54
+ run = runner or subprocess.run
55
+ try:
56
+ proc = run(
57
+ [sys.executable, "-m", "coord.cli", "drive-queue", "tick",
58
+ "--reconcile-only", "--config", str(config_path)],
59
+ capture_output=True, text=True, timeout=timeout,
60
+ )
61
+ except Exception as exc: # noqa: BLE001 — best effort, see docstring
62
+ return False, f"{type(exc).__name__}: {exc}"
63
+ ok = getattr(proc, "returncode", 1) == 0
64
+ detail = (getattr(proc, "stderr", "") or getattr(proc, "stdout", "") or "").strip()
65
+ return ok, detail[:detail_limit]
@@ -1028,6 +1028,48 @@ the gate's dependents stop themselves (the whole queue too, if the entry was
1028
1028
  declared `--scope=fleet` — #2186), propagation sees a *fired* gate as the
1029
1029
  opposite of busy, rolls, and releases the hold.
1030
1030
 
1031
+ **#2373 (fixed 2026-08-18): a launch-host-only liveness ambiguity had no
1032
+ machine assigned to resolve it.** `_reconcile_running`'s #1870 cross-host
1033
+ guard (`coord/drive_queue.py`) is correct and load-bearing: a tick's tmux
1034
+ read is always LOCAL, so a `running` entry launched on a *different* host
1035
+ than the one ticking must read as `unknown`, never dead — declaring it dead
1036
+ from the wrong machine is exactly the false-positive #1870 exists to
1037
+ prevent. But only `coord-drive-queue.timer` on the daemon host ticks the
1038
+ queue at all; a machine that only runs `coord-agent.service` (precision,
1039
+ elitebook) never runs its own tick, so an entry launched there sits
1040
+ `running`/`unknown` forever if it actually died — there is no periodic
1041
+ process anywhere whose job is to resolve it. Confirmed live 2026-08-18
1042
+ (claude-coordinator#2360): an entry launched on elitebook sat `running` for
1043
+ ~17h; every dellserver tick correctly refused to declare it dead; elitebook's
1044
+ release-cordon (which #2101/#2136 renews on every tick that finds the host
1045
+ "still busy") kept renewing past its drain deadline and re-escalated with
1046
+ nothing ever resolving the ambiguity. Running `coord drive-queue tick
1047
+ --reconcile-only` locally on elitebook resolved it in one call — the entry
1048
+ moved to `parked` (waiting on a CI re-check, #1891), not actually dead.
1049
+
1050
+ The fix closes the loop inside the drain-deadline escalation itself, so it
1051
+ needs no new timer unit anywhere: before `_apply_cordons` surfaces a
1052
+ `DrainEscalation` (the loud `DRAIN OVERDUE: ...` message), it first `POST`s
1053
+ to the escalated host's own agent — `POST /drive-queue-reconcile`
1054
+ (`coord/agent_app.py`, handled by `AgentServer.reconcile_drive_queue` in
1055
+ `coord/agent.py`) — which shells out to `coord drive-queue tick
1056
+ --reconcile-only` *on that machine*, so the #1870 guard's own local-tmux-read
1057
+ requirement is satisfied by construction: the host asked is the host whose
1058
+ evidence actually counts. The outcome (`ok`/`detail`) is folded into the SAME
1059
+ escalation message and escalation-table record rather than a second alert —
1060
+ "DRAIN OVERDUE: elitebook has been cordoned for 91m ... — asked elitebook's
1061
+ own agent to run a local reconcile-only tick first (#2373): ok (moved to
1062
+ parked)". An unreachable agent does not suppress the escalation; the loud
1063
+ message still goes out, with the failed self-heal attempt named rather than
1064
+ hidden. Every machine capable of launching a drive already runs
1065
+ `coord-agent.service`, so no fleet ever needs a new unit installed for this
1066
+ to work; a machine with no local `coordinator.yml` (thin-client/config-free
1067
+ mode) refuses the call cleanly (`no local coordinator.yml on this agent`)
1068
+ since it has nothing to pass as `--config`. See
1069
+ `tests/test_release_cordon_2101.py`'s `#2373` section for the seeded
1070
+ end-to-end shape (a `running` entry pinned to a non-daemon host, cordoned
1071
+ past the drain deadline, resolved without an operator SSH session).
1072
+
1031
1073
  ## `coord.db` backups to the external SSD (interim — #1822 owns the real thing)
1032
1074
 
1033
1075
  `~/.coord/coord.db` on the daemon host is the fleet's canonical state and had