code-coordinator 0.5.60__tar.gz → 0.5.62__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 (816) hide show
  1. {code_coordinator-0.5.60/code_coordinator.egg-info → code_coordinator-0.5.62}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.60 → code_coordinator-0.5.62/code_coordinator.egg-info}/PKG-INFO +1 -1
  3. code_coordinator-0.5.62/code_coordinator.egg-info/scm_version.json +8 -0
  4. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/agent.py +89 -11
  5. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/commands/release.py +137 -26
  6. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dispatch.py +8 -0
  7. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/drive.py +27 -0
  8. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/models.py +16 -0
  9. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/notify.py +18 -1
  10. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/release_window.py +14 -1
  11. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_agent_zero_commit.py +166 -0
  12. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_release_window.py +264 -3
  13. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_dispatch.py +35 -0
  14. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_drive.py +71 -0
  15. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_notify.py +60 -0
  16. code_coordinator-0.5.60/code_coordinator.egg-info/scm_version.json +0 -8
  17. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/.claude/commands/board.md +0 -0
  18. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/.claude/commands/complete-session.md +0 -0
  19. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/.claude/commands/coordinator.md +0 -0
  20. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/.githooks/_lib.sh +0 -0
  21. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/.githooks/post-checkout +0 -0
  22. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/.githooks/post-commit +0 -0
  23. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/.githooks/post-merge +0 -0
  24. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  25. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/.github/workflows/auto-release.yml +0 -0
  26. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/.github/workflows/cargo-test.yml +0 -0
  27. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/.github/workflows/publish.yml +0 -0
  28. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/.github/workflows/release-tui.yml +0 -0
  29. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/.github/workflows/test.yml +0 -0
  30. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/.gitignore +0 -0
  31. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/CLAUDE.md +0 -0
  32. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/GOAL.md +0 -0
  33. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/LICENSE +0 -0
  34. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/MANIFEST.in +0 -0
  35. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/README.md +0 -0
  36. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/code_coordinator.egg-info/SOURCES.txt +0 -0
  37. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/code_coordinator.egg-info/dependency_links.txt +0 -0
  38. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/code_coordinator.egg-info/entry_points.txt +0 -0
  39. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/code_coordinator.egg-info/requires.txt +0 -0
  40. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/code_coordinator.egg-info/scm_file_list.json +0 -0
  41. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/code_coordinator.egg-info/top_level.txt +0 -0
  42. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/__init__.py +0 -0
  43. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/_board_mapping.py +0 -0
  44. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/acceptance.py +0 -0
  45. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/acceptance_drivers.py +0 -0
  46. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/agent_app.py +0 -0
  47. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/agent_update.py +0 -0
  48. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/agents/opencode/.gitignore +0 -0
  49. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/agents/opencode/agents/work.md +0 -0
  50. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/agents/opencode/routing.jsonc +0 -0
  51. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/audit.py +0 -0
  52. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/auto_loop.py +0 -0
  53. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/board_bool_guard.py +0 -0
  54. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/board_service.py +0 -0
  55. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/board_wire.py +0 -0
  56. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/brain.py +0 -0
  57. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/branch_model.py +0 -0
  58. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/bug_intake.py +0 -0
  59. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/cargo_cache.py +0 -0
  60. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/ci_github.py +0 -0
  61. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/ci_store.py +0 -0
  62. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/claim.py +0 -0
  63. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/cli.py +0 -0
  64. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/client.py +0 -0
  65. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/commands/__init__.py +0 -0
  66. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/commands/_common.py +0 -0
  67. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/commands/acceptance.py +0 -0
  68. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/commands/agent_ops.py +0 -0
  69. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/commands/audit.py +0 -0
  70. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/commands/chat.py +0 -0
  71. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/commands/dispatch.py +0 -0
  72. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/commands/dispatch_workers.py +0 -0
  73. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/commands/drive.py +0 -0
  74. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/commands/drive_queue.py +0 -0
  75. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/commands/gate_a.py +0 -0
  76. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/commands/gates.py +0 -0
  77. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/commands/issues.py +0 -0
  78. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/commands/lifecycle.py +0 -0
  79. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/commands/merge.py +0 -0
  80. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/commands/milestone.py +0 -0
  81. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/commands/plan_followup.py +0 -0
  82. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/commands/plans.py +0 -0
  83. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/commands/portal.py +0 -0
  84. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/commands/report.py +0 -0
  85. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/commands/review.py +0 -0
  86. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/commands/scorecard.py +0 -0
  87. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/commands/sessions.py +0 -0
  88. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/commands/setup.py +0 -0
  89. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/commands/status.py +0 -0
  90. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/commands/terminal.py +0 -0
  91. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/commands/test_gate.py +0 -0
  92. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/commands/tui.py +0 -0
  93. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/comments.py +0 -0
  94. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/config.py +0 -0
  95. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/conflict_fix.py +0 -0
  96. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dao.py +0 -0
  97. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/__init__.py +0 -0
  98. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/fixture.py +0 -0
  99. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/index.html +0 -0
  100. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/server.py +0 -0
  101. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/terminal.py +0 -0
  102. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/.gitignore +0 -0
  103. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/components.json +0 -0
  104. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js +0 -0
  105. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  106. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js +0 -0
  107. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js +0 -0
  108. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  109. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  110. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  111. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  112. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  113. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/dist/index.html +0 -0
  114. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  115. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/dist/sw.js +0 -0
  116. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  117. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  118. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  119. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  120. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  121. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  122. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  123. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  124. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  125. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  126. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/eslint.config.js +0 -0
  127. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/index.html +0 -0
  128. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  129. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/package-lock.json +0 -0
  130. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/package.json +0 -0
  131. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  132. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/playwright.config.ts +0 -0
  133. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/postcss.config.js +0 -0
  134. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  135. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  136. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  137. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/App.tsx +0 -0
  138. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/api/client.ts +0 -0
  139. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  140. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  141. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  142. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  143. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  144. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  145. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  146. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  147. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  148. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  149. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  150. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  151. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  152. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  153. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  154. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  155. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  156. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  157. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  158. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  159. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  160. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  161. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  162. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  163. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  164. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  165. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  166. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  167. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  168. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  169. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  170. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  171. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  172. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  173. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  174. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/index.css +0 -0
  175. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  176. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  177. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/main.tsx +0 -0
  178. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  179. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  180. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  181. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  182. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  183. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  184. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  185. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  186. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  187. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  188. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  189. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  190. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  191. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  192. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  193. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  194. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  195. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  196. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  197. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  198. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  199. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  200. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  201. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/tailwind.config.js +0 -0
  202. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/tsconfig.json +0 -0
  203. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  204. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dashboard/webapp/vite.config.ts +0 -0
  205. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/db.py +0 -0
  206. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dead_end.py +0 -0
  207. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/deploy/README.md +0 -0
  208. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/deploy/coord-agent.service +0 -0
  209. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/deploy/coord-db-backup.service +0 -0
  210. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/deploy/coord-db-backup.sh +0 -0
  211. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/deploy/coord-db-backup.timer +0 -0
  212. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/deploy/coord-drive-queue.service +0 -0
  213. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/deploy/coord-drive-queue.timer +0 -0
  214. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/deploy/coord-notify.service +0 -0
  215. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/deploy/coord-notify.timer +0 -0
  216. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/deploy/coord-release-propagate.service +0 -0
  217. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/deploy/coord-release-propagate.timer +0 -0
  218. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/deploy/coord-release-window.service +0 -0
  219. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/deploy/coord-release-window.timer +0 -0
  220. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/deploy/coord-serve.service +0 -0
  221. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/deploy/coord-web-dist-build.service +0 -0
  222. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/deploy/coord-web-dist-build.timer +0 -0
  223. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/deploy/coord-web.service +0 -0
  224. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/deploy_manifest.py +0 -0
  225. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/deploy_units.py +0 -0
  226. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/deps.py +0 -0
  227. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/diagnose.py +0 -0
  228. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/dist_name.py +0 -0
  229. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/drive_queue.py +0 -0
  230. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/drive_state.py +0 -0
  231. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/events.py +0 -0
  232. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/failure_class.py +0 -0
  233. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/filelock.py +0 -0
  234. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/fleet_config_health.py +0 -0
  235. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/freshness.py +0 -0
  236. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/gate_a.py +0 -0
  237. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/gate_b.py +0 -0
  238. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/gate_snapshot.py +0 -0
  239. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/gates.py +0 -0
  240. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/github_ops.py +0 -0
  241. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/goal.py +0 -0
  242. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/graph_health.py +0 -0
  243. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/health/__init__.py +0 -0
  244. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/health/aggregate.py +0 -0
  245. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/health/checks/__init__.py +0 -0
  246. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/health/checks/agent_install.py +0 -0
  247. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/health/checks/cargo_targets.py +0 -0
  248. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/health/checks/claude_binary.py +0 -0
  249. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/health/checks/deploy_lane_facts.py +0 -0
  250. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/health/checks/disk.py +0 -0
  251. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/health/checks/fleet_board.py +0 -0
  252. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  253. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/health/checks/fleet_phantom.py +0 -0
  254. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/health/checks/fleet_unit_drift.py +0 -0
  255. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/health/checks/graph.py +0 -0
  256. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/health/checks/plan_usage.py +0 -0
  257. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/health/checks/repo_state.py +0 -0
  258. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/health/checks/spawned_coord.py +0 -0
  259. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/health/checks/timer_active.py +0 -0
  260. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/health/checks/toolchain.py +0 -0
  261. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/health/checks/unit_drift.py +0 -0
  262. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/health/checks/unit_enablement.py +0 -0
  263. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/health/checks/worktrees.py +0 -0
  264. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/health/cli.py +0 -0
  265. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/health/context.py +0 -0
  266. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/health/fleet_snapshot.py +0 -0
  267. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/health/models.py +0 -0
  268. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/health/pypi.py +0 -0
  269. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/health/registry.py +0 -0
  270. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/health/render.py +0 -0
  271. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/health/units.py +0 -0
  272. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/hooks.py +0 -0
  273. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/housekeeping.py +0 -0
  274. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/interactive.py +0 -0
  275. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/issue_store.py +0 -0
  276. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/liveness_auditor.py +0 -0
  277. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/machine_pause.py +0 -0
  278. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/merge_queue.py +0 -0
  279. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/milestone_chat.py +0 -0
  280. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/milestone_dispatch.py +0 -0
  281. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/milestone_gate.py +0 -0
  282. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/milestone_order.py +0 -0
  283. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/mock_author.py +0 -0
  284. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/network.py +0 -0
  285. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/new_issue_chat.py +0 -0
  286. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/notifier/__init__.py +0 -0
  287. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/notifier/baseline.py +0 -0
  288. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/notifier/cli.py +0 -0
  289. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/notifier/collect.py +0 -0
  290. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/notifier/digest.py +0 -0
  291. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/notifier/models.py +0 -0
  292. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/notifier/predicate.py +0 -0
  293. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/notifier/service.py +0 -0
  294. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/notifier/store.py +0 -0
  295. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/notifier/transport.py +0 -0
  296. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/openapi.py +0 -0
  297. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/overlap_fence.py +0 -0
  298. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/parentage.py +0 -0
  299. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/parentage_github.py +0 -0
  300. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/pipeline.py +0 -0
  301. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/plan_parser.py +0 -0
  302. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/plans.py +0 -0
  303. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/platform_paths.py +0 -0
  304. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/portal_bridge.py +0 -0
  305. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/pr_body_lint.py +0 -0
  306. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/prereqs.py +0 -0
  307. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/progress.py +0 -0
  308. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/providers/__init__.py +0 -0
  309. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/providers/base.py +0 -0
  310. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/providers/claude.py +0 -0
  311. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/providers/claude_pty.py +0 -0
  312. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/providers/opencode.py +0 -0
  313. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/reconcile.py +0 -0
  314. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/refine_chat.py +0 -0
  315. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/release_cordon.py +0 -0
  316. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/release_propagate.py +0 -0
  317. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/release_verify.py +0 -0
  318. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/reports.py +0 -0
  319. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/revalidate.py +0 -0
  320. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/review.py +0 -0
  321. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/scorecard.py +0 -0
  322. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/serve_app.py +0 -0
  323. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/skills/update-issue/SKILL.md +0 -0
  324. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/smoke.py +0 -0
  325. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/spend_ceiling.py +0 -0
  326. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/split_work.py +0 -0
  327. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/stage_projection.py +0 -0
  328. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/state.py +0 -0
  329. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/test_author.py +0 -0
  330. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/test_chat.py +0 -0
  331. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/test_orchestrator.py +0 -0
  332. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/test_report.py +0 -0
  333. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/tui_release.py +0 -0
  334. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/usage.py +0 -0
  335. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/usage_limits.py +0 -0
  336. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/usage_rollup.py +0 -0
  337. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coord/worker_events.py +0 -0
  338. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/coordinator.example.yml +0 -0
  339. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/deploy/coord-agent.service +0 -0
  340. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/deploy/coord-db-backup.service +0 -0
  341. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/deploy/coord-db-backup.sh +0 -0
  342. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/deploy/coord-db-backup.timer +0 -0
  343. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/deploy/coord-drive-queue.service +0 -0
  344. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/deploy/coord-drive-queue.timer +0 -0
  345. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/deploy/coord-notify.service +0 -0
  346. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/deploy/coord-notify.timer +0 -0
  347. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/deploy/coord-release-propagate.service +0 -0
  348. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/deploy/coord-release-propagate.timer +0 -0
  349. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/deploy/coord-release-window.service +0 -0
  350. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/deploy/coord-release-window.timer +0 -0
  351. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/deploy/coord-serve.service +0 -0
  352. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/deploy/coord-web-dist-build.service +0 -0
  353. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/deploy/coord-web-dist-build.sh +0 -0
  354. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/deploy/coord-web-dist-build.timer +0 -0
  355. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/deploy/coord-web-rollback.sh +0 -0
  356. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/deploy/coord-web.service +0 -0
  357. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/deploy/node-shim.sh +0 -0
  358. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/docs/AGENT_OPERATIONS.md +0 -0
  359. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/docs/ARCHITECTURE.md +0 -0
  360. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/docs/ARCH_SECURITY_GATES.md +0 -0
  361. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/docs/COCKPIT.md +0 -0
  362. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/docs/CONTROL_CENTER.md +0 -0
  363. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/docs/CROSS_PLATFORM.md +0 -0
  364. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/docs/CUSTOMER_PORTAL.md +0 -0
  365. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/docs/DRIVE_QUEUE.md +0 -0
  366. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/docs/EPHEMERAL_WORKERS.md +0 -0
  367. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/docs/FORGE_MIGRATION.md +0 -0
  368. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/docs/GRAPHIFY_SETUP.md +0 -0
  369. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/docs/ISSUE_GUIDANCE.md +0 -0
  370. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/docs/MAC_MINI.md +0 -0
  371. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  372. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/docs/NOTIFIER.md +0 -0
  373. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/docs/OPENCODE_VERIFICATION.md +0 -0
  374. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/docs/OPERATING_GOTCHAS.md +0 -0
  375. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/docs/ORACLE_LOOP.md +0 -0
  376. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/docs/PHONE_WEBAPP.md +0 -0
  377. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/docs/PIPELINE_V2.md +0 -0
  378. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/docs/PLATFORM_EVOLUTION.md +0 -0
  379. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/docs/SECOND_BACKEND.md +0 -0
  380. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/docs/STORE_SERVICE.md +0 -0
  381. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  382. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/docs/WEB_CONTROL_CENTER.md +0 -0
  383. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/docs/mocks/web/README.md +0 -0
  384. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/docs/mocks/web/_tokens.css +0 -0
  385. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/docs/mocks/web/issue-detail.html +0 -0
  386. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/docs/mocks/web/pipeline-narrow.html +0 -0
  387. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/docs/mocks/web/pipeline-wide.html +0 -0
  388. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/graphify-out/.gitignore +0 -0
  389. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/install-agent.sh +0 -0
  390. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/pyproject.toml +0 -0
  391. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/scripts/audit_review_verdict_overrides.py +0 -0
  392. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  393. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/scripts/azure-workers/build-worker-image.sh +0 -0
  394. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/scripts/azure-workers/coordinator-machine.py +0 -0
  395. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/scripts/azure-workers/epic-down.sh +0 -0
  396. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/scripts/azure-workers/epic-up.sh +0 -0
  397. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/scripts/azure-workers/preflight.sh +0 -0
  398. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/scripts/azure-workers/provision-worker.sh +0 -0
  399. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  400. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  401. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/scripts/azure-workers/verify-github-token.sh +0 -0
  402. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/scripts/codegen.py +0 -0
  403. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/scripts/coord-test-runner.sh +0 -0
  404. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/scripts/drive-batch.sh +0 -0
  405. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/scripts/gen_board_fixture.py +0 -0
  406. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/scripts/next_release_tag.py +0 -0
  407. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/scripts/run_tests_in_populated_home.sh +0 -0
  408. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/scripts/run_tests_without_gh.sh +0 -0
  409. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/scripts/smoke_437_interactive.py +0 -0
  410. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/scripts/verify_878_review_capture.py +0 -0
  411. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/scripts/verify_release_published.py +0 -0
  412. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/scripts/verify_release_wheel.py +0 -0
  413. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/setup.cfg +0 -0
  414. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/SMOKE_SET.md +0 -0
  415. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/__init__.py +0 -0
  416. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  417. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/acceptance/ms-33/contract.md +0 -0
  418. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/acceptance/ms-33/manifest.yml +0 -0
  419. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  420. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  421. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  422. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  423. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/acceptance/ms-37/conftest.py +0 -0
  424. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/acceptance/ms-37/contract.md +0 -0
  425. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/acceptance/ms-37/manifest.yml +0 -0
  426. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  427. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  428. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/acceptance/ms-38/contract.md +0 -0
  429. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/acceptance/ms-38/manifest.yml +0 -0
  430. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  431. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  432. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  433. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  434. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  435. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  436. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  437. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  438. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  439. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  440. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/acceptance/ms-51/contract.md +0 -0
  441. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  442. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  443. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/acceptance/ms-51/manifest.yml +0 -0
  444. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  445. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/acceptance/ms-51/tsconfig.json +0 -0
  446. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  447. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/conftest.py +0 -0
  448. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/fixtures/board-pipeline-basic.json +0 -0
  449. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  450. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  451. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  452. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/fixtures/playwright/all_pass.json +0 -0
  453. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  454. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/fixtures/playwright/mixed_fail.json +0 -0
  455. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  456. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  457. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/fixtures/playwright/skip.json +0 -0
  458. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/fixtures/playwright/truncated.json +0 -0
  459. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  460. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  461. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  462. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  463. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  464. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  465. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  466. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  467. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_acceptance.py +0 -0
  468. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_acceptance_drivers.py +0 -0
  469. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_agent.py +0 -0
  470. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_agent_api_error.py +0 -0
  471. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_agent_app.py +0 -0
  472. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_agent_branch_base.py +0 -0
  473. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_agent_branch_capture.py +0 -0
  474. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_agent_config_free_1712.py +0 -0
  475. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_agent_deploy_units_endpoint.py +0 -0
  476. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_agent_dirty_worktree.py +0 -0
  477. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_agent_graph_self_heal.py +0 -0
  478. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_agent_health_h3.py +0 -0
  479. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_agent_idle_restart.py +0 -0
  480. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_agent_push_failure.py +0 -0
  481. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_agent_reap.py +0 -0
  482. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_agent_repos_and_pull.py +0 -0
  483. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_agent_restart_services_endpoint.py +0 -0
  484. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_agent_startup_diagnostics.py +0 -0
  485. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_agent_update.py +0 -0
  486. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_agent_update_bluegreen.py +0 -0
  487. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_agent_usage_limit.py +0 -0
  488. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_ambient_home_isolation.py +0 -0
  489. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_approve_reject_plan.py +0 -0
  490. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_approve_usage_gate.py +0 -0
  491. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_assignment_already_recorded_daemon.py +0 -0
  492. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_audit_log.py +0 -0
  493. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_audit_outcome.py +0 -0
  494. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_audit_query.py +0 -0
  495. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_auto_loop.py +0 -0
  496. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_auto_release_publish_2035.py +0 -0
  497. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_base_checkout_restore.py +0 -0
  498. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_board_cap_762.py +0 -0
  499. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_board_fixture.py +0 -0
  500. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_board_read_path.py +0 -0
  501. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_board_service.py +0 -0
  502. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_board_state.py +0 -0
  503. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_board_wire.py +0 -0
  504. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_brain.py +0 -0
  505. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_branch_model.py +0 -0
  506. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_bug_intake.py +0 -0
  507. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_build_worker_image_env_update.py +0 -0
  508. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cargo_cache.py +0 -0
  509. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_ci_acceptance_gate_1950.py +0 -0
  510. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_ci_store.py +0 -0
  511. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_claim.py +0 -0
  512. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_acceptance.py +0 -0
  513. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_assign.py +0 -0
  514. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  515. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_assign_interactive_remote.py +0 -0
  516. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_assign_provider.py +0 -0
  517. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_audit.py +0 -0
  518. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_chat_continue.py +0 -0
  519. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_diagnose_config_provenance.py +0 -0
  520. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_diagnose_graph.py +0 -0
  521. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_doctor.py +0 -0
  522. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_doctor_config_free_1801.py +0 -0
  523. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  524. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_drive.py +0 -0
  525. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_drive_queue.py +0 -0
  526. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_escalate.py +0 -0
  527. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_fix_headless_review.py +0 -0
  528. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_gate_a.py +0 -0
  529. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_install_drift.py +0 -0
  530. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_install_skills.py +0 -0
  531. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_issue_create_label.py +0 -0
  532. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_issue_reopen.py +0 -0
  533. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_merge.py +0 -0
  534. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_milestone_assign.py +0 -0
  535. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_milestone_capture.py +0 -0
  536. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_milestone_chat_add_child.py +0 -0
  537. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_milestone_dispatch.py +0 -0
  538. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_milestone_gate_b.py +0 -0
  539. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_milestone_gate_c.py +0 -0
  540. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_milestone_order.py +0 -0
  541. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  542. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_milestone_ship.py +0 -0
  543. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_network.py +0 -0
  544. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_new_issue_chat.py +0 -0
  545. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_plans.py +0 -0
  546. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_portal.py +0 -0
  547. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_pull_artifact.py +0 -0
  548. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_queue.py +0 -0
  549. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_reattach_sessions.py +0 -0
  550. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_refine_board.py +0 -0
  551. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_release_preflight.py +0 -0
  552. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_release_propagate.py +0 -0
  553. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_scorecard.py +0 -0
  554. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_set_review_findings.py +0 -0
  555. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_status_advisory_terminal.py +0 -0
  556. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_status_merge_queue.py +0 -0
  557. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_status_provider.py +0 -0
  558. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_status_review_finalizing.py +0 -0
  559. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_status_test_failed_tag.py +0 -0
  560. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_status_usage_limit.py +0 -0
  561. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_sync_comments_873.py +0 -0
  562. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_test_plan.py +0 -0
  563. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_track.py +0 -0
  564. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_tui_update.py +0 -0
  565. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cli_wait.py +0 -0
  566. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_client_base_install.py +0 -0
  567. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_comments.py +0 -0
  568. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_completion_summary.py +0 -0
  569. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_config.py +0 -0
  570. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_config_acceptance.py +0 -0
  571. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_config_audit.py +0 -0
  572. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_config_pricing.py +0 -0
  573. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_config_usage_gate.py +0 -0
  574. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_conflict_fix.py +0 -0
  575. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_conflict_fix_semantic.py +0 -0
  576. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_coord_test.py +0 -0
  577. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_coord_test_runner_baseline.py +0 -0
  578. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_coord_test_runner_routing.py +0 -0
  579. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_coord_test_runner_toolchain.py +0 -0
  580. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_coord_web_sse_restart_live.py +0 -0
  581. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_coordinator_machine.py +0 -0
  582. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_cross_platform_imports.py +0 -0
  583. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_dashboard.py +0 -0
  584. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_dashboard_fixture.py +0 -0
  585. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_dashboard_terminal.py +0 -0
  586. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_dashboard_terminal_live.py +0 -0
  587. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_db.py +0 -0
  588. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_dead_end.py +0 -0
  589. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_deploy_coord_db_backup.py +0 -0
  590. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_deploy_coord_web_dist.py +0 -0
  591. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_deploy_coord_web_rollback.py +0 -0
  592. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_deploy_drive_queue_unit.py +0 -0
  593. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_deploy_manifest.py +0 -0
  594. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_deploy_units_lane.py +0 -0
  595. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_deploy_web_unit.py +0 -0
  596. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_deps.py +0 -0
  597. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_diagnose.py +0 -0
  598. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_dispatch_target_validation.py +0 -0
  599. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_dist_name.py +0 -0
  600. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_done_housekeeping.py +0 -0
  601. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_drive_queue.py +0 -0
  602. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_drive_state.py +0 -0
  603. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_drive_tmux.py +0 -0
  604. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_epic_up_capability_detection.py +0 -0
  605. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  606. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_epic_up_image_provenance.py +0 -0
  607. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_errors.py +0 -0
  608. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_events.py +0 -0
  609. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_failure_class.py +0 -0
  610. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_filelock.py +0 -0
  611. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  612. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_fix_of_force_override.py +0 -0
  613. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_fleet_config_health.py +0 -0
  614. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_fleet_health_probes.py +0 -0
  615. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_fleet_health_snapshot.py +0 -0
  616. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_freshness.py +0 -0
  617. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_gate_a.py +0 -0
  618. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_gate_b.py +0 -0
  619. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_gate_snapshot_staleness.py +0 -0
  620. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_gates.py +0 -0
  621. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_generated_types_fixture.py +0 -0
  622. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_github_ops.py +0 -0
  623. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_goal.py +0 -0
  624. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_graph_health.py +0 -0
  625. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_handoff.py +0 -0
  626. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_health_checks.py +0 -0
  627. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_health_cli.py +0 -0
  628. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_health_cli_graph.py +0 -0
  629. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_health_config.py +0 -0
  630. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_health_context.py +0 -0
  631. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_health_deploy_lane_facts.py +0 -0
  632. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_health_incident_regression.py +0 -0
  633. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_health_pypi.py +0 -0
  634. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_health_registry.py +0 -0
  635. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_health_timer_active.py +0 -0
  636. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_health_toolchain.py +0 -0
  637. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_health_unit_drift.py +0 -0
  638. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_health_unit_enablement.py +0 -0
  639. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_hooks.py +0 -0
  640. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_human_attended_437.py +0 -0
  641. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_init.py +0 -0
  642. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_integration.py +0 -0
  643. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_interactive_briefing_echo.py +0 -0
  644. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_interactive_prefill_state.py +0 -0
  645. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_interactive_session_relaunch.py +0 -0
  646. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_interactive_test_verdict_backstop.py +0 -0
  647. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_interactive_token_attribution.py +0 -0
  648. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_interactive_worktree.py +0 -0
  649. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_issue_store_seam.py +0 -0
  650. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_liveness_auditor.py +0 -0
  651. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_liveness_notify.py +0 -0
  652. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_machine_pause.py +0 -0
  653. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_merge_queue.py +0 -0
  654. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_merge_verify.py +0 -0
  655. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_milestone_chat.py +0 -0
  656. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_milestone_dispatch.py +0 -0
  657. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_milestone_gate.py +0 -0
  658. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_milestone_order.py +0 -0
  659. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_milestone_seam.py +0 -0
  660. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_mock_author.py +0 -0
  661. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_model_tiering.py +0 -0
  662. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_models.py +0 -0
  663. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_models_config_labels.py +0 -0
  664. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_needs_attention.py +0 -0
  665. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_network.py +0 -0
  666. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_new_issue_chat.py +0 -0
  667. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_next_release_tag.py +0 -0
  668. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_no_direct_gh_calls.py +0 -0
  669. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_node_shim.py +0 -0
  670. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_notifier_baseline.py +0 -0
  671. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_notifier_cli.py +0 -0
  672. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_notifier_collect.py +0 -0
  673. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_notifier_config.py +0 -0
  674. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_notifier_drive_seam.py +0 -0
  675. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_notifier_isolation.py +0 -0
  676. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_notifier_predicate.py +0 -0
  677. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_notifier_quiet_hours.py +0 -0
  678. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_notifier_service.py +0 -0
  679. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_notify_drain.py +0 -0
  680. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_openapi.py +0 -0
  681. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_operational_defaults.py +0 -0
  682. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_overlap_fence.py +0 -0
  683. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_packaged_deploy_units.py +0 -0
  684. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_parentage.py +0 -0
  685. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_paste_landed.py +0 -0
  686. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_pipeline.py +0 -0
  687. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_plan_followup_approve_plan_command.py +0 -0
  688. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_plan_followup_pr_command.py +0 -0
  689. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_plan_followup_review_command.py +0 -0
  690. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_plan_only.py +0 -0
  691. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_plan_parser.py +0 -0
  692. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_platform_paths.py +0 -0
  693. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_portal_bridge.py +0 -0
  694. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_portal_config.py +0 -0
  695. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_pr_body_lint.py +0 -0
  696. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_prereqs.py +0 -0
  697. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_production_db_guard.py +0 -0
  698. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_progress.py +0 -0
  699. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_provider_seam.py +0 -0
  700. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_providers.py +0 -0
  701. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_providers_config_labels.py +0 -0
  702. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_providers_pty.py +0 -0
  703. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_quiet_hours.py +0 -0
  704. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_quiet_hours_store_2146.py +0 -0
  705. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_reap_merged_sessions.py +0 -0
  706. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_reap_stale_interactive_tick.py +0 -0
  707. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_reconcile_branch.py +0 -0
  708. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_reconcile_completions.py +0 -0
  709. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_reconcile_merges.py +0 -0
  710. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_reconcile_usage_limit_done.py +0 -0
  711. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_refine_chat.py +0 -0
  712. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_release_cordon_2101.py +0 -0
  713. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_release_propagate.py +0 -0
  714. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_release_unified_1242.py +0 -0
  715. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_release_verify.py +0 -0
  716. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_release_window.py +0 -0
  717. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_remote_auto_prune.py +0 -0
  718. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_remote_interactive_reaper.py +0 -0
  719. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_report_result_push.py +0 -0
  720. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_reports.py +0 -0
  721. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_retry.py +0 -0
  722. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_retry_advisory_1606.py +0 -0
  723. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_retry_type_1636.py +0 -0
  724. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_revalidate.py +0 -0
  725. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_review.py +0 -0
  726. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_review_end_review_without_verdict.py +0 -0
  727. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_review_parse_failure_diagnostic.py +0 -0
  728. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_review_reaffirm.py +0 -0
  729. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_review_state.py +0 -0
  730. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_review_verdict_backstop.py +0 -0
  731. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_review_verdict_override_audit.py +0 -0
  732. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_review_verdict_relay.py +0 -0
  733. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_review_zero_commits.py +0 -0
  734. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_scoped_review_wiring.py +0 -0
  735. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_scorecard.py +0 -0
  736. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_serve.py +0 -0
  737. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_serve_app_board_trim.py +0 -0
  738. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_session.py +0 -0
  739. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_slice_issue_attribution.py +0 -0
  740. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_smoke.py +0 -0
  741. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_smoke_live_checkout_restore.py +0 -0
  742. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_smoke_workflow.py +0 -0
  743. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_spend_ceiling.py +0 -0
  744. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_spend_ceiling_coordinator.py +0 -0
  745. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_split.py +0 -0
  746. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_split_work.py +0 -0
  747. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_stage_projection.py +0 -0
  748. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_stalled_pipeline.py +0 -0
  749. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_state.py +0 -0
  750. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_state_review_findings_daemon.py +0 -0
  751. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_status_fleet_footer.py +0 -0
  752. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_stop_1567.py +0 -0
  753. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_stuck.py +0 -0
  754. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_terminal_command.py +0 -0
  755. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_test_author.py +0 -0
  756. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_test_chat.py +0 -0
  757. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_test_orchestrator.py +0 -0
  758. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_test_report.py +0 -0
  759. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_test_verdict_parsing.py +0 -0
  760. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_test_verdict_transcript_floor.py +0 -0
  761. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_thin_client_board_audit.py +0 -0
  762. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_thin_client_config_load_1080.py +0 -0
  763. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_thin_client_daemon_routing_906.py +0 -0
  764. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_tmux_host.py +0 -0
  765. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_tmux_session.py +0 -0
  766. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_transcript_floor.py +0 -0
  767. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_usage.py +0 -0
  768. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_usage_limits.py +0 -0
  769. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_usage_rollup.py +0 -0
  770. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_venv_live_install_2121.py +0 -0
  771. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_version_single_source.py +0 -0
  772. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_watch.py +0 -0
  773. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_worker_events.py +0 -0
  774. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_worker_image_pin_sync.py +0 -0
  775. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_worker_safety.py +0 -0
  776. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_worker_test_scoping.py +0 -0
  777. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_worktree.py +0 -0
  778. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  779. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/Cargo.lock +0 -0
  780. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/Cargo.toml +0 -0
  781. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/cargo-config-local-quadraui.toml.example +0 -0
  782. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/app/audit.rs +0 -0
  783. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/app/chat.rs +0 -0
  784. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/app/data.rs +0 -0
  785. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/app/dialogs.rs +0 -0
  786. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/app/drive.rs +0 -0
  787. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/app/drive_queue.rs +0 -0
  788. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/app/escalation.rs +0 -0
  789. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/app/events.rs +0 -0
  790. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/app/fixtures.rs +0 -0
  791. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/app/fleet_health.rs +0 -0
  792. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/app/fleet_sessions.rs +0 -0
  793. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/app/fleet_terminals.rs +0 -0
  794. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/app/format.rs +0 -0
  795. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/app/milestone_dag.rs +0 -0
  796. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/app/mod.rs +0 -0
  797. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/app/msv.rs +0 -0
  798. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/app/pipeline.rs +0 -0
  799. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/app/plans.rs +0 -0
  800. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/app/render.rs +0 -0
  801. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/app/reports.rs +0 -0
  802. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/app/sessions.rs +0 -0
  803. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/app/settings_ui.rs +0 -0
  804. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/app/sidebar.rs +0 -0
  805. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/app/terminal.rs +0 -0
  806. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/app/tests.rs +0 -0
  807. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/app/types.rs +0 -0
  808. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/app/workspace.rs +0 -0
  809. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/bin/gtk.rs +0 -0
  810. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/commands.rs +0 -0
  811. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/lib.rs +0 -0
  812. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/main.rs +0 -0
  813. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/src/settings.rs +0 -0
  814. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/tests/acceptance.rs +0 -0
  815. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/tui/tests/cli.rs +0 -0
  816. {code_coordinator-0.5.60 → code_coordinator-0.5.62}/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.60
3
+ Version: 0.5.62
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.60
3
+ Version: 0.5.62
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
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "0.5.62",
3
+ "distance": 0,
4
+ "node": "g84d64a795986ab501062308d9e29da81f86cfb79",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-08-14"
8
+ }
@@ -26,6 +26,7 @@ from pathlib import Path
26
26
  from typing import TYPE_CHECKING, Any, Callable, Iterable
27
27
 
28
28
  from coord import cargo_cache
29
+ from coord.models import DELIVERABLE_ANALYSIS_LABEL
29
30
  from coord.platform_paths import default_coord_dir
30
31
 
31
32
  if TYPE_CHECKING:
@@ -604,6 +605,19 @@ class AssignmentSpec:
604
605
  # `AssignmentSpec(**body)` in agent_app.py 400s on those) unless the
605
606
  # operator has actually configured one.
606
607
  cost_ceiling_usd: float | None = None
608
+ # #2188: the issue's GitHub label names, mirroring `Proposal.issue_labels`
609
+ # (#1430) — carried on the wire so a reap running on a config-free agent
610
+ # (docs/EPHEMERAL_WORKERS.md; no local DB or GitHub token to ask) can
611
+ # still see `coord.models.DELIVERABLE_ANALYSIS_LABEL` without an extra
612
+ # round-trip. Only `coord/dispatch.py`'s `dispatch()` populates this (from
613
+ # `proposal.issue_labels`, itself only set for `type="work"` dispatches —
614
+ # see #1430's `model_for_labels`/`provider_for_labels` gating), and only
615
+ # when non-empty — an agent predating this field 400s on an unrecognized
616
+ # kwarg (`AssignmentSpec(**body)` in agent_app.py), same discipline as
617
+ # every other optional wire field above. Empty by default: a spec with no
618
+ # labels (or dispatched by a caller that never populated
619
+ # `Proposal.issue_labels`) behaves exactly as before this field existed.
620
+ issue_labels: list[str] = field(default_factory=list)
607
621
 
608
622
 
609
623
  class _GitError(RuntimeError):
@@ -2700,6 +2714,11 @@ class AgentAssignment:
2700
2714
  # #448: advisory reason when the worker exited cleanly (exit_code==0) but
2701
2715
  # pushed 0 commits. None on all other status values.
2702
2716
  #
2717
+ # #2188: also None (never set) for an issue labelled `deliverable:
2718
+ # analysis` — that shape lands on `status == DONE`/`analysis_deliverable
2719
+ # = True` below instead, since 0 commits is its SUCCESS condition, not
2720
+ # something advisory.
2721
+ #
2703
2722
  # #1323 used to *also* reuse this field (for "work"-type assignments,
2704
2723
  # see _ADVISORY_TYPES) to hold a reason when a configured artifact_paths
2705
2724
  # glob matched 0 files, downgrading DONE -> ADVISORY in the process.
@@ -2787,6 +2806,26 @@ class AgentAssignment:
2787
2806
  # ceiling kill is indistinguishable from a crash and the money is spent
2788
2807
  # again on the next pass.
2789
2808
  spend_ceiling_reason: str | None = None
2809
+ # #2188: True when `_reap` classified a clean (exit_code==0), 0-commit
2810
+ # exit as a DELIVERABLE — the issue was labelled
2811
+ # `coord.models.DELIVERABLE_ANALYSIS_LABEL` (`spec.issue_labels`) — rather
2812
+ # than the #448 "worker did nothing" ADVISORY. Only ever set alongside
2813
+ # `status == DONE`; `False` on every other outcome, including a normal
2814
+ # zero-commit ADVISORY (the label wasn't present) and a labelled issue
2815
+ # whose worker actually pushed commits (that's an ordinary DONE, handled
2816
+ # by the ordinary Test/Review/Merge pipeline — this flag is specifically
2817
+ # "the deliverable IS the message, there is no diff").
2818
+ analysis_deliverable: bool = False
2819
+ # #2188: the worker's own final message — `result` off the last
2820
+ # stream-json `result` event (`coord.worker_events.WorkerSummary.
2821
+ # result_text`), captured here so the coordinator can post the actual
2822
+ # deliverable (a diagnosis/audit's prose) to the issue instead of a bare
2823
+ # "assignment complete" comment. The worker itself has no `gh` access to
2824
+ # post this — see coord.notify.post_transition's EVENT_COMPLETION arm.
2825
+ # Populated only when `analysis_deliverable` is True; `None` otherwise
2826
+ # (a normal work assignment's deliverable is the diff itself, already
2827
+ # visible on the PR — restating the transcript there would be noise).
2828
+ result_text: str | None = None
2790
2829
 
2791
2830
  def to_dict(self) -> dict:
2792
2831
  d = asdict(self)
@@ -7209,6 +7248,16 @@ class AgentServer:
7209
7248
  # ("work",) to the full work-like set so `test-author`/`mock-author`
7210
7249
  # get the same downgrade; before that they could land on `done` with
7211
7250
  # an empty branch.
7251
+ # #2188: an issue labelled `deliverable:analysis` inverts the #448
7252
+ # reading — for it, a clean exit with 0 commits is the SUCCESS
7253
+ # condition (the deliverable is the worker's own final message, not
7254
+ # a diff), not the "worker did nothing" anomaly. Detected off
7255
+ # `assignment.spec.issue_labels` (wire field, #2188) so this works on
7256
+ # a config-free agent too — no DB or GitHub read required. Resolved
7257
+ # in the SAME `_ahead == 0` branch as the advisory check below so
7258
+ # the two can never disagree about what "0 commits" means for this
7259
+ # assignment.
7260
+ _analysis_deliverable = False
7212
7261
  _zero_commit_reason: str | None = None
7213
7262
  if (exit_code == 0 and assignment is not None
7214
7263
  and assignment.worktree_path
@@ -7218,17 +7267,30 @@ class AgentServer:
7218
7267
  _base = assignment.spec.branch or "main"
7219
7268
  _ahead = self._commits_ahead(_wt_advisory, _base)
7220
7269
  if _ahead == 0:
7221
- _zero_commit_reason = (
7222
- "worker exited cleanly but pushed 0 commits"
7223
- )
7224
- try:
7225
- with open(assignment.log_path, "a") as reopen:
7226
- reopen.write(
7227
- "# reap: advisory 0 commits ahead of "
7228
- f"{_base}; status set to advisory\n"
7229
- )
7230
- except OSError:
7231
- pass
7270
+ if DELIVERABLE_ANALYSIS_LABEL in (assignment.spec.issue_labels or []):
7271
+ _analysis_deliverable = True
7272
+ try:
7273
+ with open(assignment.log_path, "a") as reopen:
7274
+ reopen.write(
7275
+ "# reap: analysis deliverable — 0 commits "
7276
+ f"ahead of {_base}; issue labelled "
7277
+ f"{DELIVERABLE_ANALYSIS_LABEL!r}, status "
7278
+ "set to done (#2188)\n"
7279
+ )
7280
+ except OSError:
7281
+ pass
7282
+ else:
7283
+ _zero_commit_reason = (
7284
+ "worker exited cleanly but pushed 0 commits"
7285
+ )
7286
+ try:
7287
+ with open(assignment.log_path, "a") as reopen:
7288
+ reopen.write(
7289
+ "# reap: advisory — 0 commits ahead of "
7290
+ f"{_base}; status set to advisory\n"
7291
+ )
7292
+ except OSError:
7293
+ pass
7232
7294
 
7233
7295
  # This block MUST always run regardless of push outcome so that
7234
7296
  # the assignment transitions out of 'running'.
@@ -7296,6 +7358,22 @@ class AgentServer:
7296
7358
  assignment.zero_commit_reason = _zero_commit_reason
7297
7359
  else:
7298
7360
  assignment.status = DONE
7361
+ if _analysis_deliverable:
7362
+ # #2188: 0 commits on a `deliverable:analysis`
7363
+ # issue is the success shape — capture the
7364
+ # worker's own final message (already parsed
7365
+ # into `_worker_summary` above) so the
7366
+ # coordinator can post the actual deliverable to
7367
+ # the issue instead of a bare "complete" comment.
7368
+ # Best-effort: a non-stream-json log (or one with
7369
+ # no terminal `result` event) just leaves
7370
+ # `result_text` `None` — the assignment is still
7371
+ # correctly `done`, only the auto-posted prose is
7372
+ # missing, same degradation as every other
7373
+ # best-effort log parse in this function.
7374
+ assignment.analysis_deliverable = True
7375
+ if _worker_summary is not None and _worker_summary.result_text:
7376
+ assignment.result_text = _worker_summary.result_text
7299
7377
  else:
7300
7378
  assignment.status = FAILED
7301
7379
  # #1461: only ever attaches to a FAILED/ADVISORY transition —
@@ -1877,9 +1877,82 @@ def _drain(
1877
1877
  sleep_fn(max(0.0, min(poll_interval, deadline - elapsed)))
1878
1878
 
1879
1879
 
1880
+ def _parse_trailing_json(stdout: str) -> dict | None:
1881
+ """The last top-level JSON object printed to *stdout*, or ``None``.
1882
+
1883
+ #2187: this used to look only at the LAST LINE of stdout and try to
1884
+ parse THAT LINE alone as JSON. `coord release propagate --json` (like
1885
+ every ``--json`` command in this codebase) prints its record via
1886
+ ``json.dumps(..., indent=2, ...)`` — pretty-printed, for a human running
1887
+ it by hand — which means the payload spans many lines and its own last
1888
+ line is just ``}``, never a complete object on its own. The old check
1889
+ therefore never found the record for ANY propagate run, successful or
1890
+ not, and every call fell back to the ``f"exit {code}"`` placeholder in
1891
+ `_run_propagate` below — which is exactly the false "propagate-failed
1892
+ (status=exit 0, exit=0)" #2187 reports for a verified, exit-0 roll.
1893
+
1894
+ This instead finds the LAST line that is the object's own unindented
1895
+ ``{`` (json.dumps never indents the outermost brace) and parses
1896
+ everything from there to the end of stdout as one document. A single
1897
+ compact line (no ``indent=``) still works too, tried second.
1898
+ """
1899
+ import json as _json # noqa: PLC0415
1900
+
1901
+ text = stdout.strip()
1902
+ if not text:
1903
+ return None
1904
+ lines = text.splitlines()
1905
+ for idx in range(len(lines) - 1, -1, -1):
1906
+ if lines[idx].strip() != "{":
1907
+ continue
1908
+ try:
1909
+ payload = _json.loads("\n".join(lines[idx:]))
1910
+ except ValueError:
1911
+ continue
1912
+ if isinstance(payload, dict):
1913
+ return payload
1914
+ for line in reversed(lines):
1915
+ line = line.strip()
1916
+ if not line.startswith("{"):
1917
+ continue
1918
+ try:
1919
+ payload = _json.loads(line)
1920
+ except ValueError:
1921
+ continue
1922
+ if isinstance(payload, dict):
1923
+ return payload
1924
+ return None
1925
+
1926
+
1927
+ def _latest_propagate_record_since(state_dir: Path, since: float) -> dict | None:
1928
+ """The propagation journal's own record for the run started at/after
1929
+ *since*, if any — the ground truth `coord release history` itself reads.
1930
+
1931
+ #2187 proposal 1: "read `coord release history` for the run it just
1932
+ launched rather than inferring from a side-channel [stdout]." The
1933
+ journal has no request id to join on, so this uses ``started_at``: the
1934
+ subprocess `_run_propagate` shells out to is synchronous, so by the
1935
+ time it has returned, a successful run has already appended its record
1936
+ with a ``started_at`` at or after the moment this function's caller
1937
+ launched it. Picks the OLDEST such record — the first thing written
1938
+ after launch — in case some unrelated `coord release propagate` run
1939
+ elsewhere raced it onto the same shared journal.
1940
+ """
1941
+ from coord import release_propagate as rp # noqa: PLC0415
1942
+
1943
+ candidates = [
1944
+ rec for rec in rp.read_records(state_dir)
1945
+ if isinstance(rec.get("started_at"), (int, float)) and rec["started_at"] >= since
1946
+ ]
1947
+ if not candidates:
1948
+ return None
1949
+ return min(candidates, key=lambda rec: rec["started_at"])
1950
+
1951
+
1880
1952
  def _run_propagate(
1881
- *, daemon_host: str, target_version: str, config_path: Path, runner=None,
1882
- ) -> tuple[str, int, str]:
1953
+ *, daemon_host: str, target_version: str, config_path: Path, state_dir: Path,
1954
+ runner=None, now_fn=None,
1955
+ ) -> tuple[str, int, str, float | None]:
1883
1956
  """``coord release propagate --daemon-host ... --target ... --json``.
1884
1957
 
1885
1958
  A real subprocess of THIS interpreter (matches `_roll_tui`/
@@ -1890,15 +1963,26 @@ def _run_propagate(
1890
1963
  run decided was needed is the version that actually rolls, even if a new
1891
1964
  release lands on PyPI mid-drain.
1892
1965
 
1893
- Returns ``(status, exit_code, combined_output)``. ``status`` is parsed
1894
- from the last JSON line of stdout (propagate's own record); parsing
1895
- failures fall back to ``f"exit {code}"`` rather than raising — a window
1896
- run must never crash because propagate's output was unexpected.
1966
+ Returns ``(status, exit_code, combined_output, propagate_started_at)``.
1967
+ ``status`` is read from the propagation journal entry that run itself
1968
+ wrote (:func:`_latest_propagate_record_since`) the same ground truth
1969
+ `coord release history` reads not reparsed from stdout (#2187:
1970
+ reparsing stdout was the false-negative bug). ``propagate_started_at``
1971
+ is that record's own ``started_at``, stamped onto the window's own
1972
+ record so `window-history` can be joined to `history` (#2187 proposal
1973
+ 2) instead of the two stores re-deciding the same outcome separately.
1974
+ Only when no journal entry can be found — the subprocess died before
1975
+ writing one, or the journal write itself failed — does this fall back
1976
+ to `_parse_trailing_json` on stdout, and then to ``f"exit {code}"``;
1977
+ either fallback returns ``None`` for ``propagate_started_at`` since
1978
+ there is then nothing to join to.
1897
1979
  """
1898
- import json as _json # noqa: PLC0415
1899
1980
  import subprocess # noqa: PLC0415
1981
+ import time # noqa: PLC0415
1900
1982
 
1901
1983
  run = runner or subprocess.run
1984
+ clock = now_fn or time.time
1985
+ launched_at = clock()
1902
1986
  argv = [
1903
1987
  sys.executable, "-m", "coord.cli", "release", "propagate",
1904
1988
  "--daemon-host", daemon_host, "--target", target_version,
@@ -1908,23 +1992,22 @@ def _run_propagate(
1908
1992
  proc = run(argv, capture_output=True, text=True, timeout=1800)
1909
1993
  except Exception as exc: # noqa: BLE001
1910
1994
  detail = f"{type(exc).__name__}: {exc}"
1911
- return f"error: {detail}", 1, detail
1995
+ return f"error: {detail}", 1, detail, None
1912
1996
  code = getattr(proc, "returncode", 1)
1913
1997
  stdout = getattr(proc, "stdout", "") or ""
1914
1998
  stderr = getattr(proc, "stderr", "") or ""
1915
- status = f"exit {code}"
1916
- for line in reversed(stdout.strip().splitlines()):
1917
- line = line.strip()
1918
- if not line.startswith("{"):
1919
- continue
1920
- try:
1921
- payload = _json.loads(line)
1922
- except ValueError:
1923
- continue
1924
- if isinstance(payload, dict) and payload.get("status"):
1925
- status = str(payload["status"])
1926
- break
1927
- return status, code, (stdout + ("\n" + stderr if stderr else "")).strip()
1999
+ output = (stdout + ("\n" + stderr if stderr else "")).strip()
2000
+
2001
+ record = _latest_propagate_record_since(state_dir, launched_at)
2002
+ if record is not None:
2003
+ status = str(record.get("status") or f"exit {code}")
2004
+ return status, code, output, record.get("started_at")
2005
+
2006
+ payload = _parse_trailing_json(stdout)
2007
+ status = (
2008
+ str(payload["status"]) if payload and payload.get("status") else f"exit {code}"
2009
+ )
2010
+ return status, code, output, None
1928
2011
 
1929
2012
 
1930
2013
  #: Where a skipped/failed nightly window (trap 3) is recorded — same
@@ -2161,13 +2244,14 @@ def release_nightly_window( # noqa: PLR0912, PLR0915 — a pipeline; see module
2161
2244
  status = rw.STATUS_DRAIN_TIMEOUT
2162
2245
  else:
2163
2246
  # ── 5. roll — the daemon host is now provably free ─────────
2164
- prop_status, prop_exit, prop_output = _run_propagate(
2247
+ prop_status, prop_exit, prop_output, prop_started_at = _run_propagate(
2165
2248
  daemon_host=daemon_name, target_version=record.target_version,
2166
- config_path=config_path,
2249
+ config_path=config_path, state_dir=state_dir,
2167
2250
  )
2168
2251
  record.propagate_status = prop_status
2169
2252
  record.propagate_exit_code = prop_exit
2170
2253
  record.propagate_output = prop_output
2254
+ record.propagate_started_at = prop_started_at
2171
2255
  if prop_output:
2172
2256
  click.echo(prop_output)
2173
2257
 
@@ -2193,11 +2277,38 @@ def release_nightly_window( # noqa: PLR0912, PLR0915 — a pipeline; see module
2193
2277
  click.echo(f"error: {record.error}", err=True)
2194
2278
  _escalate_window(record, reason=record.error)
2195
2279
  status = rw.STATUS_PROPAGATE_DEFERRED
2280
+ elif prop_status.startswith("exit ") or prop_status.startswith("error:"):
2281
+ # #2187 proposal 3: this arm is reached only when NEITHER
2282
+ # ground truth was available — no matching entry in
2283
+ # `coord release history` (see
2284
+ # `_latest_propagate_record_since`) AND no parseable
2285
+ # `--json` payload on stdout (`_parse_trailing_json`).
2286
+ # `prop_status` here is one of those two functions'
2287
+ # placeholder fallbacks, never a real outcome — so the
2288
+ # message must say exactly what evidence is missing
2289
+ # instead of quoting the placeholder as if it were one
2290
+ # (the old text, "status=exit 0, exit=0", read as a
2291
+ # verification failure when exit 0 is what a VERIFIED
2292
+ # roll also produces).
2293
+ record.error = (
2294
+ f"coord release propagate exited {prop_exit}, but its "
2295
+ "outcome could not be confirmed: no matching entry "
2296
+ "was found in `coord release history` for this run, "
2297
+ "and its --json stdout had no parseable status "
2298
+ "either — see propagate_output"
2299
+ )
2300
+ click.echo(f"error: {record.error}", err=True)
2301
+ _escalate_window(record, reason=record.error)
2302
+ status = rw.STATUS_PROPAGATE_FAILED
2303
+ exit_code = prop_exit or 1
2196
2304
  else:
2305
+ # A real, ground-truth status from `coord release
2306
+ # history` — just not a verified roll (e.g. `failed` or
2307
+ # `rolled-back`).
2197
2308
  record.error = (
2198
- f"coord release propagate did not verify a roll "
2199
- f"(status={prop_status}, exit={prop_exit}) despite a "
2200
- f"drained daemon host"
2309
+ f"coord release propagate did not verify a roll "
2310
+ f"`coord release history` recorded status="
2311
+ f"{prop_status!r} (exit {prop_exit}) for this run"
2201
2312
  )
2202
2313
  click.echo(f"error: {record.error}", err=True)
2203
2314
  _escalate_window(record, reason=record.error)
@@ -755,6 +755,14 @@ def dispatch(
755
755
  # field reject unknown payload keys with a 400.
756
756
  if getattr(proposal, "resume_session_id", None):
757
757
  payload["resume_session_id"] = proposal.resume_session_id
758
+ # #2188: the issue's GitHub labels, so the agent's own reap can see
759
+ # `coord.models.DELIVERABLE_ANALYSIS_LABEL` without a DB/GitHub round
760
+ # trip (config-free agent — docs/EPHEMERAL_WORKERS.md). Only sent when
761
+ # non-empty, same discipline as every optional wire field above — an
762
+ # agent predating `AssignmentSpec.issue_labels` 400s on an unrecognized
763
+ # kwarg.
764
+ if proposal.issue_labels:
765
+ payload["issue_labels"] = list(proposal.issue_labels)
758
766
  # #2131: per-leg spend ceiling, resolved here (CLI/daemon lane) and
759
767
  # carried on the wire so a config-free agent is covered too. Sent ONLY
760
768
  # when the operator has actually configured one — with no `budget:` block
@@ -109,6 +109,7 @@ from coord.interactive import (
109
109
  )
110
110
  from coord.dead_end import DeadEnd, detect_dead_end
111
111
  from coord.failure_class import classify_failure, plan_usage_limit_resume
112
+ from coord.models import DELIVERABLE_ANALYSIS_LABEL
112
113
  from coord.usage_limits import PlanLimits, evaluate_usage_gate, get_plan_limits
113
114
  # Lost in the #1584-onto-#1590 rebase: _decide_review() calls this, but the
114
115
  # import lived in a hunk #1590 rewrote, so the merge came out textually clean
@@ -1397,6 +1398,32 @@ def decide(
1397
1398
  f"{state.work_machine or machine}"
1398
1399
  )
1399
1400
 
1401
+ # ---- analysis deliverable: done + 0 commits is the SUCCESS shape (#2188)
1402
+ #
1403
+ # An issue labelled `deliverable:analysis` inverts the read on a 0-commit
1404
+ # exit: the deliverable is the worker's own final message (already
1405
+ # posted to the issue by the coordinator — see coord.notify.
1406
+ # post_transition's EVENT_COMPLETION arm), not a diff. `coord.agent.
1407
+ # AgentServer._reap` only ever produces this shape on `status == "done"`
1408
+ # (never "advisory" — see `AgentAssignment.analysis_deliverable`), so
1409
+ # this only needs to guard the `done` arm above, and it runs BEFORE the
1410
+ # "no branch"/dead-end/Test/Review/Merge machinery below: none of that
1411
+ # applies when there is nothing to test, review, or merge. A labelled
1412
+ # issue whose worker DID push commits (the label describes the common
1413
+ # case, not a hard rule) falls through unchanged — `branch_has_commits`
1414
+ # is False only for the genuine 0-commit shape.
1415
+ if (
1416
+ state.work_status == "done"
1417
+ and DELIVERABLE_ANALYSIS_LABEL in state.issue_labels
1418
+ and (not state.work_branch or not verifier.branch_has_commits(state))
1419
+ ):
1420
+ return _succeed(
1421
+ f"✓ ANALYSIS DELIVERABLE — {state.work_aid} completed with 0 "
1422
+ f"commits (issue labelled `{DELIVERABLE_ANALYSIS_LABEL}`); the "
1423
+ "worker's final message is the deliverable and was posted to "
1424
+ "the issue automatically — nothing to test, review, or merge."
1425
+ )
1426
+
1400
1427
  # A 'done' row with no branch never pushed anything either.
1401
1428
  if not state.work_branch:
1402
1429
  return _die(
@@ -354,6 +354,22 @@ def test_mode_from_labels(labels) -> str | None:
354
354
  return None
355
355
 
356
356
 
357
+ # #2188: the per-issue DELIVERABLE policy label — mirrors `TEST_MODE_*_LABEL`'s
358
+ # shape (cheapest fit, no body parsing). An issue whose deliverable is a
359
+ # written artifact (a diagnosis, an audit, a spike/investigation writeup)
360
+ # rather than a diff cannot succeed in the default pipeline: a worker that
361
+ # does exactly what was asked ends with 0 commits by design, which the reap
362
+ # otherwise reads as the #448 "worker did nothing" ADVISORY and `coord drive`
363
+ # gives up on — discarding the whole deliverable (#2188's own worked example,
364
+ # #2132, lost $1.65 of correct, on-topic analysis this way). Labelling the
365
+ # issue `deliverable:analysis` inverts that reading: a clean exit with 0
366
+ # commits is `coord.agent.AgentServer._reap`'s SUCCESS condition for this
367
+ # issue, not its anomaly — see `_ZERO_COMMIT_TYPES`/`AgentAssignment.
368
+ # analysis_deliverable` in coord/agent.py and the `decide()` short-circuit in
369
+ # coord/drive.py that skips Test/Review/Merge for it.
370
+ DELIVERABLE_ANALYSIS_LABEL = "deliverable:analysis"
371
+
372
+
357
373
  @dataclass
358
374
  class Assignment:
359
375
  machine_name: str
@@ -2470,7 +2470,24 @@ def post_transition(transition: Transition, record: dict, entry: dict) -> None:
2470
2470
  failure_reason=_failure_reason,
2471
2471
  )
2472
2472
  elif transition.event == EVENT_COMPLETION:
2473
- post_completion(exit_code=transition.exit_code or 0, **common)
2473
+ # #2188: a `deliverable:analysis` issue that legitimately ended with
2474
+ # 0 commits has no diff to point at — the deliverable IS the
2475
+ # worker's own final message (`AgentAssignment.result_text`, see
2476
+ # `coord.agent.AgentServer._reap`). Post it as the completion
2477
+ # comment's summary so it reaches the issue automatically; the
2478
+ # worker itself has no `gh` access to post it. Every other
2479
+ # completion (the overwhelming majority) is unaffected — `entry.get
2480
+ # ("analysis_deliverable")` is only ever truthy for this one shape.
2481
+ _analysis_summary = (
2482
+ entry.get("result_text") or ""
2483
+ if entry.get("analysis_deliverable")
2484
+ else ""
2485
+ )
2486
+ post_completion(
2487
+ exit_code=transition.exit_code or 0,
2488
+ summary=_analysis_summary,
2489
+ **common,
2490
+ )
2474
2491
  mark_notified(
2475
2492
  transition.assignment_id,
2476
2493
  transition.event,
@@ -190,6 +190,14 @@ class WindowRecord:
190
190
  propagate_status: str | None = None
191
191
  propagate_exit_code: int | None = None
192
192
  propagate_output: str = ""
193
+ #: The propagation journal record's OWN ``started_at`` — the join key
194
+ #: (#2187 proposal 2) that lets `window-history` be correlated to
195
+ #: `coord release history` for the SAME run, instead of each store
196
+ #: independently re-deciding what happened. ``None`` when no matching
197
+ #: journal record could be found (see
198
+ #: `coord.commands.release._latest_propagate_record_since`) — there is
199
+ #: then nothing to join to.
200
+ propagate_started_at: float | None = None
193
201
  finished_at: float | None = None
194
202
  error: str | None = None
195
203
  dry_run: bool = False
@@ -327,9 +335,14 @@ def render_record(record: WindowRecord | Mapping[str, Any]) -> list[str]:
327
335
  if data.get("drain_detail"):
328
336
  lines.append(f" {data['drain_detail']}")
329
337
  if data.get("propagate_status"):
338
+ joined = (
339
+ f" [history @ {_stamp(data['propagate_started_at'])}]"
340
+ if data.get("propagate_started_at")
341
+ else ""
342
+ )
330
343
  lines.append(
331
344
  f" propagate: {data['propagate_status']} "
332
- f"(exit {data.get('propagate_exit_code')})"
345
+ f"(exit {data.get('propagate_exit_code')}){joined}"
333
346
  )
334
347
  if data.get("queue_restarted") is not None:
335
348
  lines.append(