code-coordinator 0.5.60__tar.gz → 0.5.61__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.61}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.60 → code_coordinator-0.5.61/code_coordinator.egg-info}/PKG-INFO +1 -1
  3. code_coordinator-0.5.61/code_coordinator.egg-info/scm_version.json +8 -0
  4. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/commands/release.py +137 -26
  5. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/release_window.py +14 -1
  6. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_release_window.py +264 -3
  7. code_coordinator-0.5.60/code_coordinator.egg-info/scm_version.json +0 -8
  8. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/.claude/commands/board.md +0 -0
  9. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/.claude/commands/complete-session.md +0 -0
  10. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/.claude/commands/coordinator.md +0 -0
  11. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/.githooks/_lib.sh +0 -0
  12. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/.githooks/post-checkout +0 -0
  13. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/.githooks/post-commit +0 -0
  14. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/.githooks/post-merge +0 -0
  15. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  16. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/.github/workflows/auto-release.yml +0 -0
  17. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/.github/workflows/cargo-test.yml +0 -0
  18. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/.github/workflows/publish.yml +0 -0
  19. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/.github/workflows/release-tui.yml +0 -0
  20. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/.github/workflows/test.yml +0 -0
  21. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/.gitignore +0 -0
  22. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/CLAUDE.md +0 -0
  23. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/GOAL.md +0 -0
  24. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/LICENSE +0 -0
  25. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/MANIFEST.in +0 -0
  26. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/README.md +0 -0
  27. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/code_coordinator.egg-info/SOURCES.txt +0 -0
  28. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/code_coordinator.egg-info/dependency_links.txt +0 -0
  29. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/code_coordinator.egg-info/entry_points.txt +0 -0
  30. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/code_coordinator.egg-info/requires.txt +0 -0
  31. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/code_coordinator.egg-info/scm_file_list.json +0 -0
  32. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/code_coordinator.egg-info/top_level.txt +0 -0
  33. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/__init__.py +0 -0
  34. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/_board_mapping.py +0 -0
  35. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/acceptance.py +0 -0
  36. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/acceptance_drivers.py +0 -0
  37. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/agent.py +0 -0
  38. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/agent_app.py +0 -0
  39. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/agent_update.py +0 -0
  40. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/agents/opencode/.gitignore +0 -0
  41. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/agents/opencode/agents/work.md +0 -0
  42. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/agents/opencode/routing.jsonc +0 -0
  43. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/audit.py +0 -0
  44. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/auto_loop.py +0 -0
  45. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/board_bool_guard.py +0 -0
  46. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/board_service.py +0 -0
  47. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/board_wire.py +0 -0
  48. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/brain.py +0 -0
  49. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/branch_model.py +0 -0
  50. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/bug_intake.py +0 -0
  51. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/cargo_cache.py +0 -0
  52. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/ci_github.py +0 -0
  53. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/ci_store.py +0 -0
  54. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/claim.py +0 -0
  55. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/cli.py +0 -0
  56. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/client.py +0 -0
  57. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/commands/__init__.py +0 -0
  58. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/commands/_common.py +0 -0
  59. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/commands/acceptance.py +0 -0
  60. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/commands/agent_ops.py +0 -0
  61. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/commands/audit.py +0 -0
  62. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/commands/chat.py +0 -0
  63. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/commands/dispatch.py +0 -0
  64. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/commands/dispatch_workers.py +0 -0
  65. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/commands/drive.py +0 -0
  66. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/commands/drive_queue.py +0 -0
  67. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/commands/gate_a.py +0 -0
  68. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/commands/gates.py +0 -0
  69. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/commands/issues.py +0 -0
  70. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/commands/lifecycle.py +0 -0
  71. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/commands/merge.py +0 -0
  72. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/commands/milestone.py +0 -0
  73. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/commands/plan_followup.py +0 -0
  74. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/commands/plans.py +0 -0
  75. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/commands/portal.py +0 -0
  76. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/commands/report.py +0 -0
  77. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/commands/review.py +0 -0
  78. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/commands/scorecard.py +0 -0
  79. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/commands/sessions.py +0 -0
  80. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/commands/setup.py +0 -0
  81. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/commands/status.py +0 -0
  82. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/commands/terminal.py +0 -0
  83. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/commands/test_gate.py +0 -0
  84. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/commands/tui.py +0 -0
  85. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/comments.py +0 -0
  86. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/config.py +0 -0
  87. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/conflict_fix.py +0 -0
  88. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dao.py +0 -0
  89. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/__init__.py +0 -0
  90. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/fixture.py +0 -0
  91. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/index.html +0 -0
  92. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/server.py +0 -0
  93. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/terminal.py +0 -0
  94. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/.gitignore +0 -0
  95. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/components.json +0 -0
  96. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js +0 -0
  97. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  98. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js +0 -0
  99. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js +0 -0
  100. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  101. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  102. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  103. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  104. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  105. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/dist/index.html +0 -0
  106. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  107. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/dist/sw.js +0 -0
  108. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  109. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  110. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  111. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  112. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  113. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  114. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  115. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  116. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  117. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  118. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/eslint.config.js +0 -0
  119. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/index.html +0 -0
  120. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  121. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/package-lock.json +0 -0
  122. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/package.json +0 -0
  123. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  124. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/playwright.config.ts +0 -0
  125. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/postcss.config.js +0 -0
  126. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  127. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  128. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  129. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/App.tsx +0 -0
  130. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/api/client.ts +0 -0
  131. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  132. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  133. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  134. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  135. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  136. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  137. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  138. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  139. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  140. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  141. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  142. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  143. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  144. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  145. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  146. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  147. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  148. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  149. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  150. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  151. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  152. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  153. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  154. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  155. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  156. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  157. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  158. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  159. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  160. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  161. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  162. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  163. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  164. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  165. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  166. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/index.css +0 -0
  167. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  168. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  169. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/main.tsx +0 -0
  170. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  171. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  172. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  173. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  174. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  175. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  176. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  177. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  178. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  179. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  180. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  181. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  182. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  183. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  184. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  185. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  186. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  187. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  188. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  189. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  190. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  191. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  192. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  193. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/tailwind.config.js +0 -0
  194. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/tsconfig.json +0 -0
  195. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  196. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dashboard/webapp/vite.config.ts +0 -0
  197. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/db.py +0 -0
  198. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dead_end.py +0 -0
  199. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/deploy/README.md +0 -0
  200. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/deploy/coord-agent.service +0 -0
  201. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/deploy/coord-db-backup.service +0 -0
  202. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/deploy/coord-db-backup.sh +0 -0
  203. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/deploy/coord-db-backup.timer +0 -0
  204. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/deploy/coord-drive-queue.service +0 -0
  205. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/deploy/coord-drive-queue.timer +0 -0
  206. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/deploy/coord-notify.service +0 -0
  207. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/deploy/coord-notify.timer +0 -0
  208. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/deploy/coord-release-propagate.service +0 -0
  209. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/deploy/coord-release-propagate.timer +0 -0
  210. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/deploy/coord-release-window.service +0 -0
  211. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/deploy/coord-release-window.timer +0 -0
  212. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/deploy/coord-serve.service +0 -0
  213. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/deploy/coord-web-dist-build.service +0 -0
  214. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/deploy/coord-web-dist-build.timer +0 -0
  215. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/deploy/coord-web.service +0 -0
  216. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/deploy_manifest.py +0 -0
  217. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/deploy_units.py +0 -0
  218. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/deps.py +0 -0
  219. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/diagnose.py +0 -0
  220. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dispatch.py +0 -0
  221. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/dist_name.py +0 -0
  222. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/drive.py +0 -0
  223. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/drive_queue.py +0 -0
  224. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/drive_state.py +0 -0
  225. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/events.py +0 -0
  226. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/failure_class.py +0 -0
  227. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/filelock.py +0 -0
  228. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/fleet_config_health.py +0 -0
  229. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/freshness.py +0 -0
  230. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/gate_a.py +0 -0
  231. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/gate_b.py +0 -0
  232. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/gate_snapshot.py +0 -0
  233. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/gates.py +0 -0
  234. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/github_ops.py +0 -0
  235. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/goal.py +0 -0
  236. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/graph_health.py +0 -0
  237. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/health/__init__.py +0 -0
  238. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/health/aggregate.py +0 -0
  239. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/health/checks/__init__.py +0 -0
  240. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/health/checks/agent_install.py +0 -0
  241. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/health/checks/cargo_targets.py +0 -0
  242. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/health/checks/claude_binary.py +0 -0
  243. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/health/checks/deploy_lane_facts.py +0 -0
  244. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/health/checks/disk.py +0 -0
  245. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/health/checks/fleet_board.py +0 -0
  246. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  247. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/health/checks/fleet_phantom.py +0 -0
  248. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/health/checks/fleet_unit_drift.py +0 -0
  249. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/health/checks/graph.py +0 -0
  250. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/health/checks/plan_usage.py +0 -0
  251. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/health/checks/repo_state.py +0 -0
  252. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/health/checks/spawned_coord.py +0 -0
  253. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/health/checks/timer_active.py +0 -0
  254. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/health/checks/toolchain.py +0 -0
  255. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/health/checks/unit_drift.py +0 -0
  256. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/health/checks/unit_enablement.py +0 -0
  257. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/health/checks/worktrees.py +0 -0
  258. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/health/cli.py +0 -0
  259. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/health/context.py +0 -0
  260. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/health/fleet_snapshot.py +0 -0
  261. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/health/models.py +0 -0
  262. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/health/pypi.py +0 -0
  263. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/health/registry.py +0 -0
  264. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/health/render.py +0 -0
  265. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/health/units.py +0 -0
  266. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/hooks.py +0 -0
  267. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/housekeeping.py +0 -0
  268. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/interactive.py +0 -0
  269. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/issue_store.py +0 -0
  270. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/liveness_auditor.py +0 -0
  271. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/machine_pause.py +0 -0
  272. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/merge_queue.py +0 -0
  273. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/milestone_chat.py +0 -0
  274. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/milestone_dispatch.py +0 -0
  275. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/milestone_gate.py +0 -0
  276. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/milestone_order.py +0 -0
  277. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/mock_author.py +0 -0
  278. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/models.py +0 -0
  279. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/network.py +0 -0
  280. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/new_issue_chat.py +0 -0
  281. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/notifier/__init__.py +0 -0
  282. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/notifier/baseline.py +0 -0
  283. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/notifier/cli.py +0 -0
  284. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/notifier/collect.py +0 -0
  285. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/notifier/digest.py +0 -0
  286. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/notifier/models.py +0 -0
  287. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/notifier/predicate.py +0 -0
  288. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/notifier/service.py +0 -0
  289. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/notifier/store.py +0 -0
  290. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/notifier/transport.py +0 -0
  291. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/notify.py +0 -0
  292. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/openapi.py +0 -0
  293. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/overlap_fence.py +0 -0
  294. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/parentage.py +0 -0
  295. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/parentage_github.py +0 -0
  296. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/pipeline.py +0 -0
  297. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/plan_parser.py +0 -0
  298. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/plans.py +0 -0
  299. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/platform_paths.py +0 -0
  300. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/portal_bridge.py +0 -0
  301. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/pr_body_lint.py +0 -0
  302. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/prereqs.py +0 -0
  303. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/progress.py +0 -0
  304. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/providers/__init__.py +0 -0
  305. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/providers/base.py +0 -0
  306. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/providers/claude.py +0 -0
  307. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/providers/claude_pty.py +0 -0
  308. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/providers/opencode.py +0 -0
  309. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/reconcile.py +0 -0
  310. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/refine_chat.py +0 -0
  311. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/release_cordon.py +0 -0
  312. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/release_propagate.py +0 -0
  313. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/release_verify.py +0 -0
  314. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/reports.py +0 -0
  315. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/revalidate.py +0 -0
  316. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/review.py +0 -0
  317. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/scorecard.py +0 -0
  318. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/serve_app.py +0 -0
  319. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/skills/update-issue/SKILL.md +0 -0
  320. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/smoke.py +0 -0
  321. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/spend_ceiling.py +0 -0
  322. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/split_work.py +0 -0
  323. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/stage_projection.py +0 -0
  324. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/state.py +0 -0
  325. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/test_author.py +0 -0
  326. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/test_chat.py +0 -0
  327. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/test_orchestrator.py +0 -0
  328. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/test_report.py +0 -0
  329. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/tui_release.py +0 -0
  330. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/usage.py +0 -0
  331. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/usage_limits.py +0 -0
  332. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/usage_rollup.py +0 -0
  333. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coord/worker_events.py +0 -0
  334. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/coordinator.example.yml +0 -0
  335. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/deploy/coord-agent.service +0 -0
  336. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/deploy/coord-db-backup.service +0 -0
  337. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/deploy/coord-db-backup.sh +0 -0
  338. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/deploy/coord-db-backup.timer +0 -0
  339. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/deploy/coord-drive-queue.service +0 -0
  340. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/deploy/coord-drive-queue.timer +0 -0
  341. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/deploy/coord-notify.service +0 -0
  342. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/deploy/coord-notify.timer +0 -0
  343. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/deploy/coord-release-propagate.service +0 -0
  344. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/deploy/coord-release-propagate.timer +0 -0
  345. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/deploy/coord-release-window.service +0 -0
  346. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/deploy/coord-release-window.timer +0 -0
  347. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/deploy/coord-serve.service +0 -0
  348. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/deploy/coord-web-dist-build.service +0 -0
  349. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/deploy/coord-web-dist-build.sh +0 -0
  350. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/deploy/coord-web-dist-build.timer +0 -0
  351. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/deploy/coord-web-rollback.sh +0 -0
  352. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/deploy/coord-web.service +0 -0
  353. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/deploy/node-shim.sh +0 -0
  354. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/docs/AGENT_OPERATIONS.md +0 -0
  355. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/docs/ARCHITECTURE.md +0 -0
  356. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/docs/ARCH_SECURITY_GATES.md +0 -0
  357. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/docs/COCKPIT.md +0 -0
  358. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/docs/CONTROL_CENTER.md +0 -0
  359. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/docs/CROSS_PLATFORM.md +0 -0
  360. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/docs/CUSTOMER_PORTAL.md +0 -0
  361. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/docs/DRIVE_QUEUE.md +0 -0
  362. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/docs/EPHEMERAL_WORKERS.md +0 -0
  363. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/docs/FORGE_MIGRATION.md +0 -0
  364. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/docs/GRAPHIFY_SETUP.md +0 -0
  365. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/docs/ISSUE_GUIDANCE.md +0 -0
  366. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/docs/MAC_MINI.md +0 -0
  367. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  368. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/docs/NOTIFIER.md +0 -0
  369. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/docs/OPENCODE_VERIFICATION.md +0 -0
  370. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/docs/OPERATING_GOTCHAS.md +0 -0
  371. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/docs/ORACLE_LOOP.md +0 -0
  372. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/docs/PHONE_WEBAPP.md +0 -0
  373. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/docs/PIPELINE_V2.md +0 -0
  374. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/docs/PLATFORM_EVOLUTION.md +0 -0
  375. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/docs/SECOND_BACKEND.md +0 -0
  376. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/docs/STORE_SERVICE.md +0 -0
  377. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  378. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/docs/WEB_CONTROL_CENTER.md +0 -0
  379. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/docs/mocks/web/README.md +0 -0
  380. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/docs/mocks/web/_tokens.css +0 -0
  381. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/docs/mocks/web/issue-detail.html +0 -0
  382. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/docs/mocks/web/pipeline-narrow.html +0 -0
  383. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/docs/mocks/web/pipeline-wide.html +0 -0
  384. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/graphify-out/.gitignore +0 -0
  385. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/install-agent.sh +0 -0
  386. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/pyproject.toml +0 -0
  387. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/scripts/audit_review_verdict_overrides.py +0 -0
  388. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  389. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/scripts/azure-workers/build-worker-image.sh +0 -0
  390. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/scripts/azure-workers/coordinator-machine.py +0 -0
  391. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/scripts/azure-workers/epic-down.sh +0 -0
  392. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/scripts/azure-workers/epic-up.sh +0 -0
  393. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/scripts/azure-workers/preflight.sh +0 -0
  394. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/scripts/azure-workers/provision-worker.sh +0 -0
  395. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  396. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  397. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/scripts/azure-workers/verify-github-token.sh +0 -0
  398. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/scripts/codegen.py +0 -0
  399. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/scripts/coord-test-runner.sh +0 -0
  400. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/scripts/drive-batch.sh +0 -0
  401. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/scripts/gen_board_fixture.py +0 -0
  402. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/scripts/next_release_tag.py +0 -0
  403. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/scripts/run_tests_in_populated_home.sh +0 -0
  404. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/scripts/run_tests_without_gh.sh +0 -0
  405. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/scripts/smoke_437_interactive.py +0 -0
  406. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/scripts/verify_878_review_capture.py +0 -0
  407. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/scripts/verify_release_published.py +0 -0
  408. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/scripts/verify_release_wheel.py +0 -0
  409. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/setup.cfg +0 -0
  410. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/SMOKE_SET.md +0 -0
  411. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/__init__.py +0 -0
  412. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  413. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/acceptance/ms-33/contract.md +0 -0
  414. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/acceptance/ms-33/manifest.yml +0 -0
  415. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  416. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  417. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  418. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  419. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/acceptance/ms-37/conftest.py +0 -0
  420. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/acceptance/ms-37/contract.md +0 -0
  421. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/acceptance/ms-37/manifest.yml +0 -0
  422. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  423. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  424. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/acceptance/ms-38/contract.md +0 -0
  425. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/acceptance/ms-38/manifest.yml +0 -0
  426. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  427. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  428. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  429. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  430. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  431. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  432. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  433. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  434. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  435. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  436. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/acceptance/ms-51/contract.md +0 -0
  437. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  438. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  439. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/acceptance/ms-51/manifest.yml +0 -0
  440. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  441. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/acceptance/ms-51/tsconfig.json +0 -0
  442. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  443. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/conftest.py +0 -0
  444. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/fixtures/board-pipeline-basic.json +0 -0
  445. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  446. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  447. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  448. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/fixtures/playwright/all_pass.json +0 -0
  449. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  450. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/fixtures/playwright/mixed_fail.json +0 -0
  451. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  452. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  453. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/fixtures/playwright/skip.json +0 -0
  454. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/fixtures/playwright/truncated.json +0 -0
  455. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  456. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  457. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  458. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  459. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  460. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  461. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  462. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  463. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_acceptance.py +0 -0
  464. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_acceptance_drivers.py +0 -0
  465. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_agent.py +0 -0
  466. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_agent_api_error.py +0 -0
  467. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_agent_app.py +0 -0
  468. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_agent_branch_base.py +0 -0
  469. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_agent_branch_capture.py +0 -0
  470. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_agent_config_free_1712.py +0 -0
  471. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_agent_deploy_units_endpoint.py +0 -0
  472. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_agent_dirty_worktree.py +0 -0
  473. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_agent_graph_self_heal.py +0 -0
  474. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_agent_health_h3.py +0 -0
  475. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_agent_idle_restart.py +0 -0
  476. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_agent_push_failure.py +0 -0
  477. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_agent_reap.py +0 -0
  478. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_agent_repos_and_pull.py +0 -0
  479. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_agent_restart_services_endpoint.py +0 -0
  480. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_agent_startup_diagnostics.py +0 -0
  481. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_agent_update.py +0 -0
  482. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_agent_update_bluegreen.py +0 -0
  483. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_agent_usage_limit.py +0 -0
  484. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_agent_zero_commit.py +0 -0
  485. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_ambient_home_isolation.py +0 -0
  486. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_approve_reject_plan.py +0 -0
  487. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_approve_usage_gate.py +0 -0
  488. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_assignment_already_recorded_daemon.py +0 -0
  489. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_audit_log.py +0 -0
  490. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_audit_outcome.py +0 -0
  491. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_audit_query.py +0 -0
  492. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_auto_loop.py +0 -0
  493. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_auto_release_publish_2035.py +0 -0
  494. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_base_checkout_restore.py +0 -0
  495. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_board_cap_762.py +0 -0
  496. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_board_fixture.py +0 -0
  497. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_board_read_path.py +0 -0
  498. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_board_service.py +0 -0
  499. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_board_state.py +0 -0
  500. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_board_wire.py +0 -0
  501. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_brain.py +0 -0
  502. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_branch_model.py +0 -0
  503. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_bug_intake.py +0 -0
  504. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_build_worker_image_env_update.py +0 -0
  505. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cargo_cache.py +0 -0
  506. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_ci_acceptance_gate_1950.py +0 -0
  507. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_ci_store.py +0 -0
  508. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_claim.py +0 -0
  509. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_acceptance.py +0 -0
  510. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_assign.py +0 -0
  511. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  512. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_assign_interactive_remote.py +0 -0
  513. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_assign_provider.py +0 -0
  514. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_audit.py +0 -0
  515. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_chat_continue.py +0 -0
  516. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_diagnose_config_provenance.py +0 -0
  517. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_diagnose_graph.py +0 -0
  518. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_doctor.py +0 -0
  519. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_doctor_config_free_1801.py +0 -0
  520. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  521. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_drive.py +0 -0
  522. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_drive_queue.py +0 -0
  523. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_escalate.py +0 -0
  524. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_fix_headless_review.py +0 -0
  525. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_gate_a.py +0 -0
  526. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_install_drift.py +0 -0
  527. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_install_skills.py +0 -0
  528. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_issue_create_label.py +0 -0
  529. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_issue_reopen.py +0 -0
  530. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_merge.py +0 -0
  531. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_milestone_assign.py +0 -0
  532. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_milestone_capture.py +0 -0
  533. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_milestone_chat_add_child.py +0 -0
  534. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_milestone_dispatch.py +0 -0
  535. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_milestone_gate_b.py +0 -0
  536. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_milestone_gate_c.py +0 -0
  537. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_milestone_order.py +0 -0
  538. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  539. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_milestone_ship.py +0 -0
  540. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_network.py +0 -0
  541. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_new_issue_chat.py +0 -0
  542. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_plans.py +0 -0
  543. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_portal.py +0 -0
  544. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_pull_artifact.py +0 -0
  545. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_queue.py +0 -0
  546. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_reattach_sessions.py +0 -0
  547. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_refine_board.py +0 -0
  548. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_release_preflight.py +0 -0
  549. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_release_propagate.py +0 -0
  550. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_scorecard.py +0 -0
  551. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_set_review_findings.py +0 -0
  552. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_status_advisory_terminal.py +0 -0
  553. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_status_merge_queue.py +0 -0
  554. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_status_provider.py +0 -0
  555. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_status_review_finalizing.py +0 -0
  556. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_status_test_failed_tag.py +0 -0
  557. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_status_usage_limit.py +0 -0
  558. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_sync_comments_873.py +0 -0
  559. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_test_plan.py +0 -0
  560. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_track.py +0 -0
  561. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_tui_update.py +0 -0
  562. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cli_wait.py +0 -0
  563. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_client_base_install.py +0 -0
  564. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_comments.py +0 -0
  565. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_completion_summary.py +0 -0
  566. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_config.py +0 -0
  567. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_config_acceptance.py +0 -0
  568. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_config_audit.py +0 -0
  569. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_config_pricing.py +0 -0
  570. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_config_usage_gate.py +0 -0
  571. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_conflict_fix.py +0 -0
  572. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_conflict_fix_semantic.py +0 -0
  573. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_coord_test.py +0 -0
  574. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_coord_test_runner_baseline.py +0 -0
  575. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_coord_test_runner_routing.py +0 -0
  576. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_coord_test_runner_toolchain.py +0 -0
  577. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_coord_web_sse_restart_live.py +0 -0
  578. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_coordinator_machine.py +0 -0
  579. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_cross_platform_imports.py +0 -0
  580. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_dashboard.py +0 -0
  581. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_dashboard_fixture.py +0 -0
  582. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_dashboard_terminal.py +0 -0
  583. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_dashboard_terminal_live.py +0 -0
  584. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_db.py +0 -0
  585. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_dead_end.py +0 -0
  586. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_deploy_coord_db_backup.py +0 -0
  587. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_deploy_coord_web_dist.py +0 -0
  588. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_deploy_coord_web_rollback.py +0 -0
  589. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_deploy_drive_queue_unit.py +0 -0
  590. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_deploy_manifest.py +0 -0
  591. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_deploy_units_lane.py +0 -0
  592. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_deploy_web_unit.py +0 -0
  593. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_deps.py +0 -0
  594. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_diagnose.py +0 -0
  595. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_dispatch.py +0 -0
  596. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_dispatch_target_validation.py +0 -0
  597. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_dist_name.py +0 -0
  598. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_done_housekeeping.py +0 -0
  599. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_drive.py +0 -0
  600. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_drive_queue.py +0 -0
  601. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_drive_state.py +0 -0
  602. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_drive_tmux.py +0 -0
  603. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_epic_up_capability_detection.py +0 -0
  604. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  605. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_epic_up_image_provenance.py +0 -0
  606. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_errors.py +0 -0
  607. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_events.py +0 -0
  608. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_failure_class.py +0 -0
  609. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_filelock.py +0 -0
  610. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  611. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_fix_of_force_override.py +0 -0
  612. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_fleet_config_health.py +0 -0
  613. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_fleet_health_probes.py +0 -0
  614. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_fleet_health_snapshot.py +0 -0
  615. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_freshness.py +0 -0
  616. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_gate_a.py +0 -0
  617. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_gate_b.py +0 -0
  618. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_gate_snapshot_staleness.py +0 -0
  619. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_gates.py +0 -0
  620. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_generated_types_fixture.py +0 -0
  621. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_github_ops.py +0 -0
  622. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_goal.py +0 -0
  623. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_graph_health.py +0 -0
  624. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_handoff.py +0 -0
  625. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_health_checks.py +0 -0
  626. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_health_cli.py +0 -0
  627. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_health_cli_graph.py +0 -0
  628. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_health_config.py +0 -0
  629. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_health_context.py +0 -0
  630. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_health_deploy_lane_facts.py +0 -0
  631. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_health_incident_regression.py +0 -0
  632. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_health_pypi.py +0 -0
  633. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_health_registry.py +0 -0
  634. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_health_timer_active.py +0 -0
  635. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_health_toolchain.py +0 -0
  636. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_health_unit_drift.py +0 -0
  637. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_health_unit_enablement.py +0 -0
  638. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_hooks.py +0 -0
  639. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_human_attended_437.py +0 -0
  640. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_init.py +0 -0
  641. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_integration.py +0 -0
  642. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_interactive_briefing_echo.py +0 -0
  643. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_interactive_prefill_state.py +0 -0
  644. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_interactive_session_relaunch.py +0 -0
  645. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_interactive_test_verdict_backstop.py +0 -0
  646. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_interactive_token_attribution.py +0 -0
  647. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_interactive_worktree.py +0 -0
  648. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_issue_store_seam.py +0 -0
  649. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_liveness_auditor.py +0 -0
  650. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_liveness_notify.py +0 -0
  651. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_machine_pause.py +0 -0
  652. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_merge_queue.py +0 -0
  653. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_merge_verify.py +0 -0
  654. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_milestone_chat.py +0 -0
  655. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_milestone_dispatch.py +0 -0
  656. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_milestone_gate.py +0 -0
  657. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_milestone_order.py +0 -0
  658. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_milestone_seam.py +0 -0
  659. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_mock_author.py +0 -0
  660. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_model_tiering.py +0 -0
  661. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_models.py +0 -0
  662. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_models_config_labels.py +0 -0
  663. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_needs_attention.py +0 -0
  664. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_network.py +0 -0
  665. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_new_issue_chat.py +0 -0
  666. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_next_release_tag.py +0 -0
  667. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_no_direct_gh_calls.py +0 -0
  668. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_node_shim.py +0 -0
  669. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_notifier_baseline.py +0 -0
  670. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_notifier_cli.py +0 -0
  671. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_notifier_collect.py +0 -0
  672. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_notifier_config.py +0 -0
  673. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_notifier_drive_seam.py +0 -0
  674. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_notifier_isolation.py +0 -0
  675. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_notifier_predicate.py +0 -0
  676. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_notifier_quiet_hours.py +0 -0
  677. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_notifier_service.py +0 -0
  678. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_notify.py +0 -0
  679. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_notify_drain.py +0 -0
  680. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_openapi.py +0 -0
  681. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_operational_defaults.py +0 -0
  682. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_overlap_fence.py +0 -0
  683. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_packaged_deploy_units.py +0 -0
  684. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_parentage.py +0 -0
  685. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_paste_landed.py +0 -0
  686. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_pipeline.py +0 -0
  687. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_plan_followup_approve_plan_command.py +0 -0
  688. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_plan_followup_pr_command.py +0 -0
  689. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_plan_followup_review_command.py +0 -0
  690. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_plan_only.py +0 -0
  691. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_plan_parser.py +0 -0
  692. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_platform_paths.py +0 -0
  693. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_portal_bridge.py +0 -0
  694. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_portal_config.py +0 -0
  695. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_pr_body_lint.py +0 -0
  696. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_prereqs.py +0 -0
  697. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_production_db_guard.py +0 -0
  698. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_progress.py +0 -0
  699. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_provider_seam.py +0 -0
  700. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_providers.py +0 -0
  701. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_providers_config_labels.py +0 -0
  702. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_providers_pty.py +0 -0
  703. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_quiet_hours.py +0 -0
  704. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_quiet_hours_store_2146.py +0 -0
  705. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_reap_merged_sessions.py +0 -0
  706. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_reap_stale_interactive_tick.py +0 -0
  707. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_reconcile_branch.py +0 -0
  708. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_reconcile_completions.py +0 -0
  709. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_reconcile_merges.py +0 -0
  710. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_reconcile_usage_limit_done.py +0 -0
  711. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_refine_chat.py +0 -0
  712. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_release_cordon_2101.py +0 -0
  713. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_release_propagate.py +0 -0
  714. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_release_unified_1242.py +0 -0
  715. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_release_verify.py +0 -0
  716. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_release_window.py +0 -0
  717. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_remote_auto_prune.py +0 -0
  718. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_remote_interactive_reaper.py +0 -0
  719. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_report_result_push.py +0 -0
  720. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_reports.py +0 -0
  721. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_retry.py +0 -0
  722. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_retry_advisory_1606.py +0 -0
  723. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_retry_type_1636.py +0 -0
  724. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_revalidate.py +0 -0
  725. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_review.py +0 -0
  726. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_review_end_review_without_verdict.py +0 -0
  727. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_review_parse_failure_diagnostic.py +0 -0
  728. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_review_reaffirm.py +0 -0
  729. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_review_state.py +0 -0
  730. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_review_verdict_backstop.py +0 -0
  731. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_review_verdict_override_audit.py +0 -0
  732. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_review_verdict_relay.py +0 -0
  733. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_review_zero_commits.py +0 -0
  734. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_scoped_review_wiring.py +0 -0
  735. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_scorecard.py +0 -0
  736. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_serve.py +0 -0
  737. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_serve_app_board_trim.py +0 -0
  738. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_session.py +0 -0
  739. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_slice_issue_attribution.py +0 -0
  740. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_smoke.py +0 -0
  741. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_smoke_live_checkout_restore.py +0 -0
  742. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_smoke_workflow.py +0 -0
  743. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_spend_ceiling.py +0 -0
  744. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_spend_ceiling_coordinator.py +0 -0
  745. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_split.py +0 -0
  746. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_split_work.py +0 -0
  747. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_stage_projection.py +0 -0
  748. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_stalled_pipeline.py +0 -0
  749. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_state.py +0 -0
  750. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_state_review_findings_daemon.py +0 -0
  751. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_status_fleet_footer.py +0 -0
  752. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_stop_1567.py +0 -0
  753. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_stuck.py +0 -0
  754. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_terminal_command.py +0 -0
  755. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_test_author.py +0 -0
  756. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_test_chat.py +0 -0
  757. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_test_orchestrator.py +0 -0
  758. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_test_report.py +0 -0
  759. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_test_verdict_parsing.py +0 -0
  760. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_test_verdict_transcript_floor.py +0 -0
  761. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_thin_client_board_audit.py +0 -0
  762. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_thin_client_config_load_1080.py +0 -0
  763. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_thin_client_daemon_routing_906.py +0 -0
  764. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_tmux_host.py +0 -0
  765. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_tmux_session.py +0 -0
  766. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_transcript_floor.py +0 -0
  767. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_usage.py +0 -0
  768. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_usage_limits.py +0 -0
  769. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_usage_rollup.py +0 -0
  770. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_venv_live_install_2121.py +0 -0
  771. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_version_single_source.py +0 -0
  772. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_watch.py +0 -0
  773. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_worker_events.py +0 -0
  774. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_worker_image_pin_sync.py +0 -0
  775. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_worker_safety.py +0 -0
  776. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_worker_test_scoping.py +0 -0
  777. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_worktree.py +0 -0
  778. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  779. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/Cargo.lock +0 -0
  780. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/Cargo.toml +0 -0
  781. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/cargo-config-local-quadraui.toml.example +0 -0
  782. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/app/audit.rs +0 -0
  783. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/app/chat.rs +0 -0
  784. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/app/data.rs +0 -0
  785. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/app/dialogs.rs +0 -0
  786. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/app/drive.rs +0 -0
  787. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/app/drive_queue.rs +0 -0
  788. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/app/escalation.rs +0 -0
  789. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/app/events.rs +0 -0
  790. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/app/fixtures.rs +0 -0
  791. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/app/fleet_health.rs +0 -0
  792. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/app/fleet_sessions.rs +0 -0
  793. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/app/fleet_terminals.rs +0 -0
  794. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/app/format.rs +0 -0
  795. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/app/milestone_dag.rs +0 -0
  796. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/app/mod.rs +0 -0
  797. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/app/msv.rs +0 -0
  798. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/app/pipeline.rs +0 -0
  799. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/app/plans.rs +0 -0
  800. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/app/render.rs +0 -0
  801. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/app/reports.rs +0 -0
  802. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/app/sessions.rs +0 -0
  803. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/app/settings_ui.rs +0 -0
  804. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/app/sidebar.rs +0 -0
  805. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/app/terminal.rs +0 -0
  806. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/app/tests.rs +0 -0
  807. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/app/types.rs +0 -0
  808. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/app/workspace.rs +0 -0
  809. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/bin/gtk.rs +0 -0
  810. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/commands.rs +0 -0
  811. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/lib.rs +0 -0
  812. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/main.rs +0 -0
  813. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/src/settings.rs +0 -0
  814. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/tests/acceptance.rs +0 -0
  815. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/tui/tests/cli.rs +0 -0
  816. {code_coordinator-0.5.60 → code_coordinator-0.5.61}/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.61
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.61
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.61",
3
+ "distance": 0,
4
+ "node": "g74884c7dae4507e48a87e147dbfae31765822fd5",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-08-14"
8
+ }
@@ -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)
@@ -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(
@@ -120,12 +120,13 @@ def _stub_drain(monkeypatch, *, drained: bool, elapsed: float = 5.0, detail: str
120
120
  return calls
121
121
 
122
122
 
123
- def _stub_propagate(monkeypatch, *, status: str, exit_code: int, output: str = "ok"):
123
+ def _stub_propagate(monkeypatch, *, status: str, exit_code: int, output: str = "ok",
124
+ started_at: float | None = None):
124
125
  calls = []
125
126
 
126
127
  def _fake(**kwargs):
127
128
  calls.append(kwargs)
128
- return status, exit_code, output
129
+ return status, exit_code, output, started_at
129
130
 
130
131
  monkeypatch.setattr(release_cmd, "_run_propagate", _fake)
131
132
  return calls
@@ -399,7 +400,7 @@ def test_a_propagate_subprocess_that_cannot_even_run_is_reported_not_a_success(
399
400
 
400
401
  monkeypatch.setattr(release_cmd, "_run_propagate",
401
402
  lambda **k: ("error: TimeoutError: propagate subprocess timed out",
402
- 1, "TimeoutError: propagate subprocess timed out"))
403
+ 1, "TimeoutError: propagate subprocess timed out", None))
403
404
  result = CliRunner().invoke(
404
405
  main,
405
406
  ["release", "nightly-window", "--config", str(valid_config_path),
@@ -594,3 +595,263 @@ def test_drain_treats_an_unreadable_board_as_fleet_wide_busy():
594
595
  )
595
596
  assert outcome.drained is False
596
597
  assert "board unreadable" in outcome.detail
598
+
599
+
600
+ # ── #2187: a VERIFIED, exit-0 propagate must never be reported as
601
+ # `propagate-failed` — the whole bug this issue is about ─────────────────
602
+ #
603
+ # The tests above all stub `_run_propagate` wholesale via `_stub_propagate`,
604
+ # which bypasses the exact code that was broken: parsing what a REAL
605
+ # `coord release propagate --json` subprocess prints. These exercise
606
+ # `_parse_trailing_json`, `_latest_propagate_record_since` and
607
+ # `_run_propagate` itself directly, then drive the full CLI command with a
608
+ # faked subprocess boundary (not `_run_propagate` itself) so the fix is
609
+ # proven end to end, the same way the real bug reached production.
610
+
611
+
612
+ def test_parse_trailing_json_reads_a_pretty_printed_indent2_payload():
613
+ """The exact shape `coord release propagate --json` prints
614
+ (`json.dumps(..., indent=2, sort_keys=True)`) — this is the shape the
615
+ old single-line heuristic never matched (#2187's root cause)."""
616
+ import json as _json
617
+
618
+ payload = {"status": "verified", "target_version": "0.5.50"}
619
+ stdout = (
620
+ "note: some warning on stdout\n"
621
+ + _json.dumps(payload, indent=2, sort_keys=True)
622
+ + "\n"
623
+ )
624
+ parsed = release_cmd._parse_trailing_json(stdout)
625
+ assert parsed == payload
626
+
627
+
628
+ def test_parse_trailing_json_still_reads_a_compact_single_line_payload():
629
+ import json as _json
630
+
631
+ stdout = "some preamble\n" + _json.dumps({"status": "deferred"}, sort_keys=True)
632
+ assert release_cmd._parse_trailing_json(stdout) == {"status": "deferred"}
633
+
634
+
635
+ def test_parse_trailing_json_on_no_json_at_all_is_none():
636
+ assert release_cmd._parse_trailing_json("just some plain log output\nnothing here") is None
637
+
638
+
639
+ def test_parse_trailing_json_on_empty_stdout_is_none():
640
+ assert release_cmd._parse_trailing_json("") is None
641
+
642
+
643
+ def test_latest_propagate_record_since_finds_the_run_just_launched(tmp_path, monkeypatch):
644
+ from coord import release_propagate as rp
645
+
646
+ rp.append_record(tmp_path, rp.PropagationRecord(started_at=100.0, status=rp.STATUS_FAILED))
647
+ rp.append_record(tmp_path, rp.PropagationRecord(started_at=200.0, status=rp.STATUS_VERIFIED))
648
+ record = release_cmd._latest_propagate_record_since(tmp_path, 150.0)
649
+ assert record["started_at"] == 200.0
650
+ assert record["status"] == rp.STATUS_VERIFIED
651
+
652
+
653
+ def test_latest_propagate_record_since_ignores_older_runs(tmp_path):
654
+ from coord import release_propagate as rp
655
+
656
+ rp.append_record(tmp_path, rp.PropagationRecord(started_at=100.0, status=rp.STATUS_VERIFIED))
657
+ assert release_cmd._latest_propagate_record_since(tmp_path, 150.0) is None
658
+
659
+
660
+ def test_latest_propagate_record_since_on_no_journal_is_none(tmp_path):
661
+ assert release_cmd._latest_propagate_record_since(tmp_path, 0.0) is None
662
+
663
+
664
+ def test_run_propagate_prefers_the_journal_over_stdout(tmp_path):
665
+ """Ground truth (#2187 proposal 1): even if stdout were unparseable, a
666
+ matching journal entry is what decides the status — and it stamps
667
+ `propagate_started_at`, the join key (#2187 proposal 2)."""
668
+ from coord import release_propagate as rp
669
+
670
+ def _fake_runner(argv, **kwargs):
671
+ import subprocess as _subprocess
672
+
673
+ rp.append_record(
674
+ tmp_path,
675
+ rp.PropagationRecord(started_at=500.0, status=rp.STATUS_VERIFIED,
676
+ target_version="0.5.50", finished_at=505.0),
677
+ )
678
+ return _subprocess.CompletedProcess(argv, 0, stdout="not json at all", stderr="")
679
+
680
+ status, exit_code, output, started_at = release_cmd._run_propagate(
681
+ daemon_host="dellserver", target_version="0.5.50",
682
+ config_path=tmp_path / "coordinator.yml", state_dir=tmp_path,
683
+ runner=_fake_runner, now_fn=lambda: 499.0,
684
+ )
685
+ assert status == rp.STATUS_VERIFIED
686
+ assert exit_code == 0
687
+ assert started_at == 500.0
688
+
689
+
690
+ def test_run_propagate_falls_back_to_pretty_printed_stdout_when_no_journal_entry(tmp_path):
691
+ """#2187's exact root-cause repro: no journal record can be found (the
692
+ write races or fails), but stdout carries the SAME pretty-printed
693
+ (`indent=2`) `--json` payload the real command emits. The old
694
+ single-line heuristic returned the `f"exit {code}"` placeholder here for
695
+ every successful, exit-0 roll — this must now read `verified` instead."""
696
+ import json as _json
697
+ import subprocess as _subprocess
698
+
699
+ def _fake_runner(argv, **kwargs):
700
+ payload = {"status": "verified", "target_version": "0.5.50"}
701
+ stdout = _json.dumps(payload, indent=2, sort_keys=True)
702
+ return _subprocess.CompletedProcess(argv, 0, stdout=stdout, stderr="")
703
+
704
+ status, exit_code, output, started_at = release_cmd._run_propagate(
705
+ daemon_host="dellserver", target_version="0.5.50",
706
+ config_path=tmp_path / "coordinator.yml", state_dir=tmp_path,
707
+ runner=_fake_runner, now_fn=lambda: 0.0,
708
+ )
709
+ assert status == "verified"
710
+ assert exit_code == 0
711
+ assert started_at is None # nothing to join to — no journal entry found
712
+
713
+
714
+ def test_run_propagate_with_no_journal_and_no_parseable_stdout_names_the_gap(tmp_path):
715
+ """Neither ground truth is available: falls back to the honest
716
+ `f"exit {code}"` placeholder — the CALLER (below) is responsible for
717
+ turning that into a message that names what's missing, not one that
718
+ misreports it as a real, examined status."""
719
+ import subprocess as _subprocess
720
+
721
+ def _fake_runner(argv, **kwargs):
722
+ return _subprocess.CompletedProcess(argv, 0, stdout="garbage, no json", stderr="")
723
+
724
+ status, exit_code, output, started_at = release_cmd._run_propagate(
725
+ daemon_host="dellserver", target_version="0.5.50",
726
+ config_path=tmp_path / "coordinator.yml", state_dir=tmp_path,
727
+ runner=_fake_runner, now_fn=lambda: 0.0,
728
+ )
729
+ assert status == "exit 0"
730
+ assert exit_code == 0
731
+ assert started_at is None
732
+
733
+
734
+ def _fake_propagate_subprocess(monkeypatch, state_dir, *, status: str, exit_code: int,
735
+ target_version: str = "0.5.50", write_journal: bool = True):
736
+ """Stands in for a REAL `python -m coord.cli release propagate --json`
737
+ subprocess: appends the same journal record `_finish` would (#2187's
738
+ ground truth) and returns the SAME pretty-printed (`indent=2`) --json
739
+ stdout shape the real command emits, so the whole `_run_propagate`
740
+ boundary — not just its already-stubbed replacement — is exercised."""
741
+ import json as _json
742
+ import subprocess as _subprocess
743
+ import time as _time
744
+
745
+ from coord import release_propagate as rp
746
+
747
+ calls = []
748
+
749
+ def _fake_run(argv, **kwargs):
750
+ calls.append(argv)
751
+ if write_journal:
752
+ # A REAL `started_at` — not a fixed constant — because
753
+ # `_run_propagate` compares this against `time.time()` captured
754
+ # right before launch (`_latest_propagate_record_since`'s
755
+ # `since`); a hardcoded past timestamp would look like an OLDER,
756
+ # unrelated run and be filtered out exactly like a real stale
757
+ # entry would be.
758
+ rp.append_record(
759
+ state_dir,
760
+ rp.PropagationRecord(
761
+ started_at=_time.time(), target_version=target_version,
762
+ status=status, finished_at=_time.time(),
763
+ ),
764
+ )
765
+ payload = {"status": status, "target_version": target_version}
766
+ stdout = _json.dumps(payload, indent=2, sort_keys=True)
767
+ return _subprocess.CompletedProcess(argv, exit_code, stdout=stdout, stderr="")
768
+
769
+ monkeypatch.setattr(_subprocess, "run", _fake_run)
770
+ return calls
771
+
772
+
773
+ def test_window_end_to_end_a_verified_roll_is_never_reported_as_failed(
774
+ valid_config_path, state_dir, no_network, escalations, monkeypatch
775
+ ):
776
+ """#2187 acceptance arm 1: a propagate that exits 0 and records
777
+ `verified` produces a clean window-history entry and a clean exit —
778
+ through the REAL `_run_propagate`, not a stub of it."""
779
+ _stub_verify(monkeypatch, daemon_version="0.5.49")
780
+ _stub_systemctl(monkeypatch)
781
+ _stub_drain(monkeypatch, drained=True)
782
+ _fake_propagate_subprocess(monkeypatch, state_dir, status=rp.STATUS_VERIFIED,
783
+ exit_code=0, target_version="0.5.50")
784
+
785
+ result = CliRunner().invoke(
786
+ main,
787
+ ["release", "nightly-window", "--config", str(valid_config_path),
788
+ "--target", "0.5.50", "--daemon-host", "server"],
789
+ )
790
+ assert result.exit_code == 0, result.output
791
+ record = _records(state_dir)[0]
792
+ assert record["status"] == rw.STATUS_ROLLED
793
+ assert record["status"] in rw.OK_STATUSES
794
+ assert record["propagate_status"] == rp.STATUS_VERIFIED
795
+ # The join key (#2187 proposal 2): stamped from the propagation
796
+ # journal's OWN `started_at`, proving `window-history` can now be
797
+ # correlated to `history` for this exact run.
798
+ assert record["propagate_started_at"] is not None
799
+ assert record["propagate_started_at"] > 0
800
+ assert not record["error"]
801
+ assert not escalations
802
+
803
+
804
+ def test_window_end_to_end_a_genuine_failure_is_still_reported_failed(
805
+ valid_config_path, state_dir, no_network, escalations, monkeypatch
806
+ ):
807
+ """#2187 acceptance arm 2: a propagate that genuinely fails still
808
+ produces `propagate-failed` and a non-zero exit — the fix must not turn
809
+ every outcome green."""
810
+ _stub_verify(monkeypatch, daemon_version="0.5.49")
811
+ _stub_systemctl(monkeypatch)
812
+ _stub_drain(monkeypatch, drained=True)
813
+ _fake_propagate_subprocess(monkeypatch, state_dir, status=rp.STATUS_FAILED,
814
+ exit_code=1, target_version="0.5.50")
815
+
816
+ result = CliRunner().invoke(
817
+ main,
818
+ ["release", "nightly-window", "--config", str(valid_config_path),
819
+ "--target", "0.5.50", "--daemon-host", "server"],
820
+ )
821
+ assert result.exit_code == 1, result.output
822
+ record = _records(state_dir)[0]
823
+ assert record["status"] == rw.STATUS_PROPAGATE_FAILED
824
+ assert record["status"] not in rw.OK_STATUSES
825
+ assert record["propagate_status"] == rp.STATUS_FAILED
826
+ assert len(escalations) == 1
827
+
828
+
829
+ def test_window_end_to_end_an_unconfirmable_exit_0_names_the_missing_evidence(
830
+ valid_config_path, state_dir, no_network, escalations, monkeypatch
831
+ ):
832
+ """No journal entry AND no parseable stdout, despite exit 0 (#2187
833
+ proposal 3): the error must name the specific missing artifacts, never
834
+ read as `status=exit 0, exit=0` with nothing further explained."""
835
+ import subprocess as _subprocess
836
+
837
+ _stub_verify(monkeypatch, daemon_version="0.5.49")
838
+ _stub_systemctl(monkeypatch)
839
+ _stub_drain(monkeypatch, drained=True)
840
+
841
+ def _fake_run(argv, **kwargs):
842
+ return _subprocess.CompletedProcess(argv, 0, stdout="", stderr="")
843
+
844
+ monkeypatch.setattr(_subprocess, "run", _fake_run)
845
+
846
+ result = CliRunner().invoke(
847
+ main,
848
+ ["release", "nightly-window", "--config", str(valid_config_path),
849
+ "--target", "0.5.50", "--daemon-host", "server"],
850
+ )
851
+ assert result.exit_code != 0, result.output
852
+ record = _records(state_dir)[0]
853
+ assert record["status"] == rw.STATUS_PROPAGATE_FAILED
854
+ assert "status=exit 0, exit=0" not in (record["error"] or "")
855
+ assert "no matching entry" in (record["error"] or "")
856
+ assert "no parseable" in (record["error"] or "")
857
+ assert len(escalations) == 1
@@ -1,8 +0,0 @@
1
- {
2
- "tag": "0.5.60",
3
- "distance": 0,
4
- "node": "ge01001eaf8201fb10e8bd9b1a0f6c018d93b3fb8",
5
- "dirty": false,
6
- "branch": "HEAD",
7
- "node_date": "2026-08-13"
8
- }