code-coordinator 0.5.46__tar.gz → 0.5.47__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 (776) hide show
  1. {code_coordinator-0.5.46/code_coordinator.egg-info → code_coordinator-0.5.47}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.46 → code_coordinator-0.5.47/code_coordinator.egg-info}/PKG-INFO +1 -1
  3. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/drive_queue.py +34 -1
  5. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/db.py +17 -0
  6. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/drive_queue.py +13 -0
  7. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/reports.py +6 -0
  8. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/state.py +18 -3
  9. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/DRIVE_QUEUE.md +8 -0
  10. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_drive_queue.py +92 -0
  11. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_reports.py +3 -1
  12. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_serve.py +78 -0
  13. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/drive_queue.rs +31 -1
  14. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/mod.rs +4 -2
  15. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/tests.rs +54 -0
  16. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/types.rs +7 -0
  17. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/tests/fixtures/board_sample.json +2 -0
  18. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/.claude/commands/board.md +0 -0
  19. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/.claude/commands/complete-session.md +0 -0
  20. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/.claude/commands/coordinator.md +0 -0
  21. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/.githooks/_lib.sh +0 -0
  22. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/.githooks/post-checkout +0 -0
  23. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/.githooks/post-commit +0 -0
  24. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/.githooks/post-merge +0 -0
  25. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/.github/workflows/auto-release.yml +0 -0
  26. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/.github/workflows/cargo-test.yml +0 -0
  27. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/.github/workflows/publish.yml +0 -0
  28. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/.github/workflows/release-tui.yml +0 -0
  29. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/.github/workflows/test.yml +0 -0
  30. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/.gitignore +0 -0
  31. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/CLAUDE.md +0 -0
  32. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/GOAL.md +0 -0
  33. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/LICENSE +0 -0
  34. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/MANIFEST.in +0 -0
  35. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/README.md +0 -0
  36. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/code_coordinator.egg-info/SOURCES.txt +0 -0
  37. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/code_coordinator.egg-info/dependency_links.txt +0 -0
  38. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/code_coordinator.egg-info/entry_points.txt +0 -0
  39. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/code_coordinator.egg-info/requires.txt +0 -0
  40. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/code_coordinator.egg-info/scm_file_list.json +0 -0
  41. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/code_coordinator.egg-info/top_level.txt +0 -0
  42. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/__init__.py +0 -0
  43. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/_board_mapping.py +0 -0
  44. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/acceptance.py +0 -0
  45. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/acceptance_drivers.py +0 -0
  46. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/agent.py +0 -0
  47. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/agent_app.py +0 -0
  48. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/agent_update.py +0 -0
  49. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/agents/opencode/.gitignore +0 -0
  50. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/agents/opencode/agents/work.md +0 -0
  51. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/agents/opencode/routing.jsonc +0 -0
  52. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/audit.py +0 -0
  53. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/auto_loop.py +0 -0
  54. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/board_bool_guard.py +0 -0
  55. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/board_service.py +0 -0
  56. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/board_wire.py +0 -0
  57. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/brain.py +0 -0
  58. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/branch_model.py +0 -0
  59. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/cargo_cache.py +0 -0
  60. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/ci_github.py +0 -0
  61. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/ci_store.py +0 -0
  62. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/claim.py +0 -0
  63. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/cli.py +0 -0
  64. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/client.py +0 -0
  65. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/__init__.py +0 -0
  66. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/_common.py +0 -0
  67. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/acceptance.py +0 -0
  68. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/agent_ops.py +0 -0
  69. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/audit.py +0 -0
  70. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/chat.py +0 -0
  71. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/dispatch.py +0 -0
  72. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/dispatch_workers.py +0 -0
  73. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/drive.py +0 -0
  74. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/gate_a.py +0 -0
  75. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/gates.py +0 -0
  76. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/issues.py +0 -0
  77. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/lifecycle.py +0 -0
  78. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/merge.py +0 -0
  79. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/milestone.py +0 -0
  80. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/plan_followup.py +0 -0
  81. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/plans.py +0 -0
  82. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/release.py +0 -0
  83. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/report.py +0 -0
  84. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/review.py +0 -0
  85. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/scorecard.py +0 -0
  86. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/sessions.py +0 -0
  87. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/setup.py +0 -0
  88. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/status.py +0 -0
  89. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/terminal.py +0 -0
  90. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/test_gate.py +0 -0
  91. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/commands/tui.py +0 -0
  92. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/comments.py +0 -0
  93. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/config.py +0 -0
  94. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/conflict_fix.py +0 -0
  95. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dao.py +0 -0
  96. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/__init__.py +0 -0
  97. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/fixture.py +0 -0
  98. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/index.html +0 -0
  99. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/server.py +0 -0
  100. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/terminal.py +0 -0
  101. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/.gitignore +0 -0
  102. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/components.json +0 -0
  103. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js +0 -0
  104. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  105. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js +0 -0
  106. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js +0 -0
  107. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  108. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  109. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  110. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  111. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  112. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/dist/index.html +0 -0
  113. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  114. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/dist/sw.js +0 -0
  115. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  116. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  117. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  118. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  119. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  120. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  121. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  122. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  123. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  124. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  125. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/eslint.config.js +0 -0
  126. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/index.html +0 -0
  127. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  128. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/package-lock.json +0 -0
  129. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/package.json +0 -0
  130. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  131. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/playwright.config.ts +0 -0
  132. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/postcss.config.js +0 -0
  133. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  134. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  135. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  136. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/App.tsx +0 -0
  137. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/api/client.ts +0 -0
  138. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  139. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  140. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  141. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  142. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  143. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  144. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  145. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  146. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  147. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  148. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  149. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  150. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  151. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  152. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  153. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  154. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  155. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  156. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  157. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  158. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  159. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  160. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  161. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  162. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  163. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  164. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  165. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  166. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  167. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  168. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  169. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  170. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  171. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  172. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  173. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/index.css +0 -0
  174. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  175. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  176. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/main.tsx +0 -0
  177. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  178. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  179. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  180. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  181. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  182. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  183. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  184. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  185. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  186. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  187. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  188. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  189. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  190. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  191. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  192. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  193. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  194. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  195. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  196. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  197. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  198. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  199. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  200. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/tailwind.config.js +0 -0
  201. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/tsconfig.json +0 -0
  202. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  203. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dashboard/webapp/vite.config.ts +0 -0
  204. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dead_end.py +0 -0
  205. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/README.md +0 -0
  206. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-agent.service +0 -0
  207. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-db-backup.service +0 -0
  208. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-db-backup.sh +0 -0
  209. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-db-backup.timer +0 -0
  210. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-drive-queue.service +0 -0
  211. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-drive-queue.timer +0 -0
  212. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-notify.service +0 -0
  213. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-notify.timer +0 -0
  214. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-release-propagate.service +0 -0
  215. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-release-propagate.timer +0 -0
  216. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-release-window.service +0 -0
  217. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-release-window.timer +0 -0
  218. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-serve.service +0 -0
  219. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-web-dist-build.service +0 -0
  220. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-web-dist-build.timer +0 -0
  221. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy/coord-web.service +0 -0
  222. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy_manifest.py +0 -0
  223. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deploy_units.py +0 -0
  224. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/deps.py +0 -0
  225. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/diagnose.py +0 -0
  226. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dispatch.py +0 -0
  227. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/dist_name.py +0 -0
  228. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/drive.py +0 -0
  229. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/drive_state.py +0 -0
  230. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/events.py +0 -0
  231. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/failure_class.py +0 -0
  232. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/filelock.py +0 -0
  233. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/fleet_config_health.py +0 -0
  234. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/freshness.py +0 -0
  235. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/gate_a.py +0 -0
  236. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/gate_b.py +0 -0
  237. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/gate_snapshot.py +0 -0
  238. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/gates.py +0 -0
  239. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/github_ops.py +0 -0
  240. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/goal.py +0 -0
  241. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/graph_health.py +0 -0
  242. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/__init__.py +0 -0
  243. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/aggregate.py +0 -0
  244. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/__init__.py +0 -0
  245. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/agent_install.py +0 -0
  246. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/cargo_targets.py +0 -0
  247. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/claude_binary.py +0 -0
  248. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/deploy_lane_facts.py +0 -0
  249. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/disk.py +0 -0
  250. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/fleet_board.py +0 -0
  251. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  252. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/fleet_phantom.py +0 -0
  253. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/fleet_unit_drift.py +0 -0
  254. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/graph.py +0 -0
  255. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/plan_usage.py +0 -0
  256. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/repo_state.py +0 -0
  257. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/spawned_coord.py +0 -0
  258. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/timer_active.py +0 -0
  259. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/toolchain.py +0 -0
  260. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/unit_drift.py +0 -0
  261. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/unit_enablement.py +0 -0
  262. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/checks/worktrees.py +0 -0
  263. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/cli.py +0 -0
  264. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/context.py +0 -0
  265. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/fleet_snapshot.py +0 -0
  266. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/models.py +0 -0
  267. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/pypi.py +0 -0
  268. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/registry.py +0 -0
  269. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/render.py +0 -0
  270. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/health/units.py +0 -0
  271. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/hooks.py +0 -0
  272. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/housekeeping.py +0 -0
  273. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/interactive.py +0 -0
  274. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/issue_store.py +0 -0
  275. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/liveness_auditor.py +0 -0
  276. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/machine_pause.py +0 -0
  277. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/merge_queue.py +0 -0
  278. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/milestone_chat.py +0 -0
  279. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/milestone_dispatch.py +0 -0
  280. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/milestone_gate.py +0 -0
  281. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/milestone_order.py +0 -0
  282. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/mock_author.py +0 -0
  283. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/models.py +0 -0
  284. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/network.py +0 -0
  285. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/new_issue_chat.py +0 -0
  286. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/notify.py +0 -0
  287. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/openapi.py +0 -0
  288. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/overlap_fence.py +0 -0
  289. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/parentage.py +0 -0
  290. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/parentage_github.py +0 -0
  291. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/pipeline.py +0 -0
  292. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/plan_parser.py +0 -0
  293. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/plans.py +0 -0
  294. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/platform_paths.py +0 -0
  295. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/pr_body_lint.py +0 -0
  296. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/prereqs.py +0 -0
  297. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/progress.py +0 -0
  298. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/providers/__init__.py +0 -0
  299. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/providers/base.py +0 -0
  300. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/providers/claude.py +0 -0
  301. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/providers/claude_pty.py +0 -0
  302. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/providers/opencode.py +0 -0
  303. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/reconcile.py +0 -0
  304. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/refine_chat.py +0 -0
  305. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/release_cordon.py +0 -0
  306. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/release_propagate.py +0 -0
  307. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/release_verify.py +0 -0
  308. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/release_window.py +0 -0
  309. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/revalidate.py +0 -0
  310. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/review.py +0 -0
  311. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/scorecard.py +0 -0
  312. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/serve_app.py +0 -0
  313. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/skills/update-issue/SKILL.md +0 -0
  314. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/smoke.py +0 -0
  315. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/split_work.py +0 -0
  316. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/stage_projection.py +0 -0
  317. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/test_author.py +0 -0
  318. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/test_chat.py +0 -0
  319. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/test_orchestrator.py +0 -0
  320. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/test_report.py +0 -0
  321. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/tui_release.py +0 -0
  322. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/usage.py +0 -0
  323. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/usage_limits.py +0 -0
  324. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/usage_rollup.py +0 -0
  325. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coord/worker_events.py +0 -0
  326. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/coordinator.example.yml +0 -0
  327. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-agent.service +0 -0
  328. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-db-backup.service +0 -0
  329. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-db-backup.sh +0 -0
  330. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-db-backup.timer +0 -0
  331. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-drive-queue.service +0 -0
  332. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-drive-queue.timer +0 -0
  333. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-notify.service +0 -0
  334. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-notify.timer +0 -0
  335. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-release-propagate.service +0 -0
  336. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-release-propagate.timer +0 -0
  337. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-release-window.service +0 -0
  338. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-release-window.timer +0 -0
  339. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-serve.service +0 -0
  340. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-web-dist-build.service +0 -0
  341. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-web-dist-build.sh +0 -0
  342. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-web-dist-build.timer +0 -0
  343. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-web-rollback.sh +0 -0
  344. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/coord-web.service +0 -0
  345. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/deploy/node-shim.sh +0 -0
  346. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/AGENT_OPERATIONS.md +0 -0
  347. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/ARCHITECTURE.md +0 -0
  348. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/ARCH_SECURITY_GATES.md +0 -0
  349. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/COCKPIT.md +0 -0
  350. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/CONTROL_CENTER.md +0 -0
  351. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/CROSS_PLATFORM.md +0 -0
  352. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/CUSTOMER_PORTAL.md +0 -0
  353. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/EPHEMERAL_WORKERS.md +0 -0
  354. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/FORGE_MIGRATION.md +0 -0
  355. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/GRAPHIFY_SETUP.md +0 -0
  356. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/ISSUE_GUIDANCE.md +0 -0
  357. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/MAC_MINI.md +0 -0
  358. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  359. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/OPENCODE_VERIFICATION.md +0 -0
  360. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/OPERATING_GOTCHAS.md +0 -0
  361. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/ORACLE_LOOP.md +0 -0
  362. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/PHONE_WEBAPP.md +0 -0
  363. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/PIPELINE_V2.md +0 -0
  364. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/PLATFORM_EVOLUTION.md +0 -0
  365. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/SECOND_BACKEND.md +0 -0
  366. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/STORE_SERVICE.md +0 -0
  367. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  368. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/WEB_CONTROL_CENTER.md +0 -0
  369. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/mocks/web/README.md +0 -0
  370. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/mocks/web/_tokens.css +0 -0
  371. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/mocks/web/issue-detail.html +0 -0
  372. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/mocks/web/pipeline-narrow.html +0 -0
  373. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/docs/mocks/web/pipeline-wide.html +0 -0
  374. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/graphify-out/.gitignore +0 -0
  375. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/install-agent.sh +0 -0
  376. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/pyproject.toml +0 -0
  377. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/audit_review_verdict_overrides.py +0 -0
  378. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  379. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/azure-workers/build-worker-image.sh +0 -0
  380. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/azure-workers/coordinator-machine.py +0 -0
  381. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/azure-workers/epic-down.sh +0 -0
  382. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/azure-workers/epic-up.sh +0 -0
  383. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/azure-workers/preflight.sh +0 -0
  384. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/azure-workers/provision-worker.sh +0 -0
  385. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  386. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  387. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/azure-workers/verify-github-token.sh +0 -0
  388. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/codegen.py +0 -0
  389. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/coord-test-runner.sh +0 -0
  390. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/drive-batch.sh +0 -0
  391. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/gen_board_fixture.py +0 -0
  392. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/next_release_tag.py +0 -0
  393. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/run_tests_without_gh.sh +0 -0
  394. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/smoke_437_interactive.py +0 -0
  395. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/verify_878_review_capture.py +0 -0
  396. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/verify_release_published.py +0 -0
  397. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/scripts/verify_release_wheel.py +0 -0
  398. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/setup.cfg +0 -0
  399. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/SMOKE_SET.md +0 -0
  400. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/__init__.py +0 -0
  401. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  402. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-33/contract.md +0 -0
  403. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-33/manifest.yml +0 -0
  404. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  405. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  406. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  407. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  408. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-37/conftest.py +0 -0
  409. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-37/contract.md +0 -0
  410. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-37/manifest.yml +0 -0
  411. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  412. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  413. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-38/contract.md +0 -0
  414. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-38/manifest.yml +0 -0
  415. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  416. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  417. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  418. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  419. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  420. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  421. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  422. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  423. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  424. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  425. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-51/contract.md +0 -0
  426. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  427. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  428. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-51/manifest.yml +0 -0
  429. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  430. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-51/tsconfig.json +0 -0
  431. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  432. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/conftest.py +0 -0
  433. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/board-pipeline-basic.json +0 -0
  434. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  435. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  436. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  437. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/playwright/all_pass.json +0 -0
  438. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  439. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/playwright/mixed_fail.json +0 -0
  440. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  441. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  442. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/playwright/skip.json +0 -0
  443. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/playwright/truncated.json +0 -0
  444. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  445. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  446. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  447. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  448. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  449. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  450. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  451. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  452. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_acceptance.py +0 -0
  453. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_acceptance_drivers.py +0 -0
  454. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent.py +0 -0
  455. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_api_error.py +0 -0
  456. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_app.py +0 -0
  457. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_branch_base.py +0 -0
  458. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_branch_capture.py +0 -0
  459. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_config_free_1712.py +0 -0
  460. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_deploy_units_endpoint.py +0 -0
  461. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_dirty_worktree.py +0 -0
  462. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_graph_self_heal.py +0 -0
  463. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_health_h3.py +0 -0
  464. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_push_failure.py +0 -0
  465. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_reap.py +0 -0
  466. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_repos_and_pull.py +0 -0
  467. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_restart_services_endpoint.py +0 -0
  468. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_startup_diagnostics.py +0 -0
  469. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_update.py +0 -0
  470. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_update_bluegreen.py +0 -0
  471. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_usage_limit.py +0 -0
  472. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_agent_zero_commit.py +0 -0
  473. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_approve_reject_plan.py +0 -0
  474. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_approve_usage_gate.py +0 -0
  475. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_assignment_already_recorded_daemon.py +0 -0
  476. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_audit_log.py +0 -0
  477. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_audit_outcome.py +0 -0
  478. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_audit_query.py +0 -0
  479. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_auto_loop.py +0 -0
  480. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_auto_release_publish_2035.py +0 -0
  481. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_base_checkout_restore.py +0 -0
  482. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_board_cap_762.py +0 -0
  483. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_board_fixture.py +0 -0
  484. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_board_read_path.py +0 -0
  485. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_board_service.py +0 -0
  486. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_board_state.py +0 -0
  487. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_board_wire.py +0 -0
  488. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_brain.py +0 -0
  489. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_branch_model.py +0 -0
  490. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_build_worker_image_env_update.py +0 -0
  491. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cargo_cache.py +0 -0
  492. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_ci_acceptance_gate_1950.py +0 -0
  493. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_ci_store.py +0 -0
  494. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_claim.py +0 -0
  495. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_acceptance.py +0 -0
  496. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_assign.py +0 -0
  497. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  498. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_assign_interactive_remote.py +0 -0
  499. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_assign_provider.py +0 -0
  500. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_audit.py +0 -0
  501. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_chat_continue.py +0 -0
  502. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_diagnose_config_provenance.py +0 -0
  503. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_diagnose_graph.py +0 -0
  504. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_doctor.py +0 -0
  505. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_doctor_config_free_1801.py +0 -0
  506. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  507. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_drive.py +0 -0
  508. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_escalate.py +0 -0
  509. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_fix_headless_review.py +0 -0
  510. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_gate_a.py +0 -0
  511. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_install_drift.py +0 -0
  512. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_install_skills.py +0 -0
  513. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_issue_create_label.py +0 -0
  514. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_issue_reopen.py +0 -0
  515. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_merge.py +0 -0
  516. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_milestone_assign.py +0 -0
  517. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_milestone_capture.py +0 -0
  518. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_milestone_chat_add_child.py +0 -0
  519. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_milestone_dispatch.py +0 -0
  520. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_milestone_gate_b.py +0 -0
  521. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_milestone_gate_c.py +0 -0
  522. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_milestone_order.py +0 -0
  523. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  524. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_milestone_ship.py +0 -0
  525. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_network.py +0 -0
  526. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_new_issue_chat.py +0 -0
  527. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_plans.py +0 -0
  528. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_pull_artifact.py +0 -0
  529. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_queue.py +0 -0
  530. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_reattach_sessions.py +0 -0
  531. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_refine_board.py +0 -0
  532. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_release_preflight.py +0 -0
  533. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_release_propagate.py +0 -0
  534. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_release_window.py +0 -0
  535. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_scorecard.py +0 -0
  536. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_set_review_findings.py +0 -0
  537. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_status_advisory_terminal.py +0 -0
  538. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_status_merge_queue.py +0 -0
  539. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_status_provider.py +0 -0
  540. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_status_review_finalizing.py +0 -0
  541. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_status_test_failed_tag.py +0 -0
  542. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_status_usage_limit.py +0 -0
  543. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_sync_comments_873.py +0 -0
  544. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_test_plan.py +0 -0
  545. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_track.py +0 -0
  546. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_tui_update.py +0 -0
  547. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cli_wait.py +0 -0
  548. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_client_base_install.py +0 -0
  549. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_comments.py +0 -0
  550. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_completion_summary.py +0 -0
  551. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_config.py +0 -0
  552. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_config_acceptance.py +0 -0
  553. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_config_audit.py +0 -0
  554. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_config_pricing.py +0 -0
  555. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_config_usage_gate.py +0 -0
  556. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_conflict_fix.py +0 -0
  557. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_conflict_fix_semantic.py +0 -0
  558. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_coord_test.py +0 -0
  559. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_coord_test_runner_routing.py +0 -0
  560. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_coord_test_runner_toolchain.py +0 -0
  561. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_coord_web_sse_restart_live.py +0 -0
  562. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_coordinator_machine.py +0 -0
  563. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_cross_platform_imports.py +0 -0
  564. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_dashboard.py +0 -0
  565. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_dashboard_fixture.py +0 -0
  566. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_dashboard_terminal.py +0 -0
  567. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_dashboard_terminal_live.py +0 -0
  568. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_db.py +0 -0
  569. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_dead_end.py +0 -0
  570. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_deploy_coord_db_backup.py +0 -0
  571. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_deploy_coord_web_dist.py +0 -0
  572. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_deploy_coord_web_rollback.py +0 -0
  573. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_deploy_drive_queue_unit.py +0 -0
  574. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_deploy_manifest.py +0 -0
  575. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_deploy_units_lane.py +0 -0
  576. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_deploy_web_unit.py +0 -0
  577. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_deps.py +0 -0
  578. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_diagnose.py +0 -0
  579. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_dispatch.py +0 -0
  580. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_dispatch_target_validation.py +0 -0
  581. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_dist_name.py +0 -0
  582. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_done_housekeeping.py +0 -0
  583. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_drive.py +0 -0
  584. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_drive_queue.py +0 -0
  585. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_drive_state.py +0 -0
  586. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_drive_tmux.py +0 -0
  587. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_epic_up_capability_detection.py +0 -0
  588. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  589. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_epic_up_image_provenance.py +0 -0
  590. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_errors.py +0 -0
  591. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_events.py +0 -0
  592. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_failure_class.py +0 -0
  593. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_filelock.py +0 -0
  594. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  595. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_fix_of_force_override.py +0 -0
  596. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_fleet_config_health.py +0 -0
  597. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_fleet_health_probes.py +0 -0
  598. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_fleet_health_snapshot.py +0 -0
  599. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_freshness.py +0 -0
  600. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_gate_a.py +0 -0
  601. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_gate_b.py +0 -0
  602. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_gate_snapshot_staleness.py +0 -0
  603. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_gates.py +0 -0
  604. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_generated_types_fixture.py +0 -0
  605. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_github_ops.py +0 -0
  606. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_goal.py +0 -0
  607. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_graph_health.py +0 -0
  608. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_handoff.py +0 -0
  609. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_health_checks.py +0 -0
  610. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_health_cli.py +0 -0
  611. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_health_cli_graph.py +0 -0
  612. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_health_config.py +0 -0
  613. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_health_context.py +0 -0
  614. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_health_deploy_lane_facts.py +0 -0
  615. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_health_incident_regression.py +0 -0
  616. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_health_pypi.py +0 -0
  617. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_health_registry.py +0 -0
  618. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_health_timer_active.py +0 -0
  619. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_health_toolchain.py +0 -0
  620. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_health_unit_drift.py +0 -0
  621. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_health_unit_enablement.py +0 -0
  622. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_hooks.py +0 -0
  623. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_human_attended_437.py +0 -0
  624. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_init.py +0 -0
  625. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_integration.py +0 -0
  626. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_interactive_briefing_echo.py +0 -0
  627. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_interactive_prefill_state.py +0 -0
  628. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_interactive_session_relaunch.py +0 -0
  629. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_interactive_test_verdict_backstop.py +0 -0
  630. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_interactive_worktree.py +0 -0
  631. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_issue_store_seam.py +0 -0
  632. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_liveness_auditor.py +0 -0
  633. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_liveness_notify.py +0 -0
  634. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_machine_pause.py +0 -0
  635. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_merge_queue.py +0 -0
  636. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_merge_verify.py +0 -0
  637. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_milestone_chat.py +0 -0
  638. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_milestone_dispatch.py +0 -0
  639. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_milestone_gate.py +0 -0
  640. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_milestone_order.py +0 -0
  641. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_milestone_seam.py +0 -0
  642. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_mock_author.py +0 -0
  643. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_model_tiering.py +0 -0
  644. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_models.py +0 -0
  645. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_models_config_labels.py +0 -0
  646. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_needs_attention.py +0 -0
  647. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_network.py +0 -0
  648. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_new_issue_chat.py +0 -0
  649. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_next_release_tag.py +0 -0
  650. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_no_direct_gh_calls.py +0 -0
  651. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_node_shim.py +0 -0
  652. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_notify.py +0 -0
  653. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_notify_drain.py +0 -0
  654. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_openapi.py +0 -0
  655. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_operational_defaults.py +0 -0
  656. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_overlap_fence.py +0 -0
  657. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_packaged_deploy_units.py +0 -0
  658. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_parentage.py +0 -0
  659. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_paste_landed.py +0 -0
  660. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_pipeline.py +0 -0
  661. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_plan_followup_approve_plan_command.py +0 -0
  662. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_plan_followup_pr_command.py +0 -0
  663. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_plan_followup_review_command.py +0 -0
  664. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_plan_only.py +0 -0
  665. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_plan_parser.py +0 -0
  666. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_platform_paths.py +0 -0
  667. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_pr_body_lint.py +0 -0
  668. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_prereqs.py +0 -0
  669. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_production_db_guard.py +0 -0
  670. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_progress.py +0 -0
  671. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_provider_seam.py +0 -0
  672. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_providers.py +0 -0
  673. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_providers_config_labels.py +0 -0
  674. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_providers_pty.py +0 -0
  675. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_quiet_hours.py +0 -0
  676. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_reap_merged_sessions.py +0 -0
  677. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_reap_stale_interactive_tick.py +0 -0
  678. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_reconcile_branch.py +0 -0
  679. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_reconcile_completions.py +0 -0
  680. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_reconcile_merges.py +0 -0
  681. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_reconcile_usage_limit_done.py +0 -0
  682. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_refine_chat.py +0 -0
  683. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_release_cordon_2101.py +0 -0
  684. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_release_propagate.py +0 -0
  685. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_release_unified_1242.py +0 -0
  686. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_release_verify.py +0 -0
  687. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_release_window.py +0 -0
  688. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_remote_auto_prune.py +0 -0
  689. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_remote_interactive_reaper.py +0 -0
  690. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_report_result_push.py +0 -0
  691. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_retry.py +0 -0
  692. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_retry_advisory_1606.py +0 -0
  693. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_retry_type_1636.py +0 -0
  694. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_revalidate.py +0 -0
  695. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_review.py +0 -0
  696. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_review_end_review_without_verdict.py +0 -0
  697. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_review_parse_failure_diagnostic.py +0 -0
  698. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_review_reaffirm.py +0 -0
  699. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_review_state.py +0 -0
  700. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_review_verdict_backstop.py +0 -0
  701. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_review_verdict_override_audit.py +0 -0
  702. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_review_verdict_relay.py +0 -0
  703. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_review_zero_commits.py +0 -0
  704. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_scoped_review_wiring.py +0 -0
  705. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_scorecard.py +0 -0
  706. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_serve_app_board_trim.py +0 -0
  707. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_session.py +0 -0
  708. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_slice_issue_attribution.py +0 -0
  709. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_smoke.py +0 -0
  710. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_smoke_live_checkout_restore.py +0 -0
  711. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_smoke_workflow.py +0 -0
  712. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_split.py +0 -0
  713. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_split_work.py +0 -0
  714. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_stage_projection.py +0 -0
  715. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_stalled_pipeline.py +0 -0
  716. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_state.py +0 -0
  717. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_state_review_findings_daemon.py +0 -0
  718. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_status_fleet_footer.py +0 -0
  719. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_stop_1567.py +0 -0
  720. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_stuck.py +0 -0
  721. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_terminal_command.py +0 -0
  722. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_test_author.py +0 -0
  723. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_test_chat.py +0 -0
  724. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_test_orchestrator.py +0 -0
  725. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_test_report.py +0 -0
  726. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_test_verdict_parsing.py +0 -0
  727. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_test_verdict_transcript_floor.py +0 -0
  728. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_thin_client_board_audit.py +0 -0
  729. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_thin_client_config_load_1080.py +0 -0
  730. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_thin_client_daemon_routing_906.py +0 -0
  731. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_tmux_host.py +0 -0
  732. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_tmux_session.py +0 -0
  733. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_transcript_floor.py +0 -0
  734. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_usage.py +0 -0
  735. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_usage_limits.py +0 -0
  736. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_usage_rollup.py +0 -0
  737. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_version_single_source.py +0 -0
  738. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_watch.py +0 -0
  739. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_worker_events.py +0 -0
  740. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_worker_image_pin_sync.py +0 -0
  741. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_worker_safety.py +0 -0
  742. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_worktree.py +0 -0
  743. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  744. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/Cargo.lock +0 -0
  745. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/Cargo.toml +0 -0
  746. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/cargo-config-local-quadraui.toml.example +0 -0
  747. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/audit.rs +0 -0
  748. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/chat.rs +0 -0
  749. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/data.rs +0 -0
  750. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/dialogs.rs +0 -0
  751. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/drive.rs +0 -0
  752. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/escalation.rs +0 -0
  753. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/events.rs +0 -0
  754. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/fixtures.rs +0 -0
  755. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/fleet_health.rs +0 -0
  756. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/fleet_sessions.rs +0 -0
  757. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/fleet_terminals.rs +0 -0
  758. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/format.rs +0 -0
  759. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/milestone_dag.rs +0 -0
  760. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/msv.rs +0 -0
  761. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/pipeline.rs +0 -0
  762. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/plans.rs +0 -0
  763. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/render.rs +0 -0
  764. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/reports.rs +0 -0
  765. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/sessions.rs +0 -0
  766. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/settings_ui.rs +0 -0
  767. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/sidebar.rs +0 -0
  768. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/terminal.rs +0 -0
  769. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/app/workspace.rs +0 -0
  770. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/bin/gtk.rs +0 -0
  771. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/commands.rs +0 -0
  772. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/lib.rs +0 -0
  773. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/main.rs +0 -0
  774. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/src/settings.rs +0 -0
  775. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/tests/acceptance.rs +0 -0
  776. {code_coordinator-0.5.46 → code_coordinator-0.5.47}/tui/tests/cli.rs +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.46
3
+ Version: 0.5.47
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.46
3
+ Version: 0.5.47
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.46",
2
+ "tag": "0.5.47",
3
3
  "distance": 0,
4
- "node": "g6b550e02d314120327e243cc96c1f09580e49af1",
4
+ "node": "g50ca8ee3f6cbe5afae47b1a43d23fc5faa997f84",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-12"
@@ -264,6 +264,7 @@ def drive_queue_list(repo: str | None, output_json: bool, config_path: Path) ->
264
264
  if not rows:
265
265
  click.echo("(drive queue is empty)")
266
266
  return
267
+ now = time.time()
267
268
  for entry in entries_from_rows(rows):
268
269
  bits = [f"{entry.position:>2} {entry.key:<28} {entry.state}"]
269
270
  if entry.machine:
@@ -278,11 +279,43 @@ def drive_queue_list(repo: str | None, output_json: bool, config_path: Path) ->
278
279
  bits.append(f"hold={entry.hold_state or 'armed'}")
279
280
  click.echo(" ".join(bits))
280
281
  if entry.last_reason:
281
- click.echo(f" last: {entry.last_reason}")
282
+ click.echo(f" last{_reason_age_suffix(entry, now)}: {entry.last_reason}")
282
283
  for line in _hold_lines(entry):
283
284
  click.echo(line)
284
285
 
285
286
 
287
+ def _reason_age_suffix(entry: QueueEntry, now: float) -> str:
288
+ """`` (3h ago)`` / `` (42s ago)``, or ``''`` when the age is unknown.
289
+
290
+ #2133: a `last_reason` is a snapshot taken the instant the tick (or a
291
+ guard) wrote it — never re-validated — so displaying it bare lets an
292
+ hours-old, no-longer-true observation read as current state (that
293
+ misdirected a live diagnosis on #2104: `checks_failed` was still shown
294
+ ~3 hours after the named checks had gone green, while the actual
295
+ blocker — a later `request-changes` review — was nowhere in the
296
+ output). Stamping the age doesn't make the reason current, but it stops
297
+ it from being silently *mistaken* for current, which is the whole
298
+ defect. Empty for `entry.reason_at is None` — a row predating #2133's
299
+ migration, or an entry whose `last_reason` was never written through
300
+ `update_drive_queue_entry` (e.g. hand-built in a test) — rather than
301
+ guessing an age it doesn't have.
302
+ """
303
+ if entry.reason_at is None:
304
+ return ""
305
+ return f" ({_age_str(max(0.0, now - entry.reason_at))} ago)"
306
+
307
+
308
+ def _age_str(delta_seconds: float) -> str:
309
+ """``42s`` / ``3h`` / ``5d`` — coarse, single-unit, matches #2133's ask."""
310
+ if delta_seconds < 60:
311
+ return f"{int(delta_seconds)}s"
312
+ if delta_seconds < 3600:
313
+ return f"{int(delta_seconds // 60)}m"
314
+ if delta_seconds < 86400:
315
+ return f"{int(delta_seconds // 3600)}h"
316
+ return f"{int(delta_seconds // 86400)}d"
317
+
318
+
286
319
  def _hold_lines(entry: QueueEntry) -> list[str]:
287
320
  """The gate's rendering for `list` / `status`, or `[]` when there is none.
288
321
 
@@ -379,6 +379,18 @@ def _ensure_schema(conn: sqlite3.Connection) -> None:
379
379
  attempts INTEGER NOT NULL DEFAULT 0,
380
380
  deferrals INTEGER NOT NULL DEFAULT 0,
381
381
  last_reason TEXT NOT NULL DEFAULT '',
382
+ -- #2133: wall-clock time `last_reason` was last WRITTEN, stamped
383
+ -- by `coord.state._update_drive_queue_entry_local` every time a
384
+ -- `last_reason` update lands (never by a caller — it is not in
385
+ -- `_DRIVE_QUEUE_UPDATABLE`). `last_reason` is a point-in-time
386
+ -- observation, not a live probe; without this a `blocked` entry's
387
+ -- displayed text ages silently and a stale-but-plausible reason
388
+ -- reads as current state (2026-08-11's #2104 incident: a 3-hour-
389
+ -- stale `checks_failed` outlived the CI failure it named while
390
+ -- the real, later blocker — a request-changes review — went
391
+ -- unmentioned). NULL for a row written before this migration or
392
+ -- for a fresh row whose `last_reason` is still the '' default.
393
+ reason_at REAL,
382
394
  session_name TEXT,
383
395
  launched_at REAL,
384
396
  enqueued_at REAL NOT NULL,
@@ -693,6 +705,11 @@ def _migrate_add_columns(conn: sqlite3.Connection) -> None:
693
705
  # "agent".
694
706
  "ALTER TABLE assignments ADD COLUMN verdict_source TEXT",
695
707
  "ALTER TABLE assignments ADD COLUMN verdict_source_reason TEXT",
708
+ # #2133: see the CREATE TABLE comment above — capture time of
709
+ # `drive_queue.last_reason`, so a `blocked` entry's displayed reason
710
+ # carries its age instead of rendering a stale snapshot as current
711
+ # state. NULL for every row predating this migration.
712
+ "ALTER TABLE drive_queue ADD COLUMN reason_at REAL",
696
713
  ]
697
714
  for sql in migrations:
698
715
  try:
@@ -321,6 +321,14 @@ class QueueEntry:
321
321
  attempts: int = 0
322
322
  deferrals: int = 0
323
323
  last_reason: str = ""
324
+ # #2133: wall-clock capture time of `last_reason`, stamped by
325
+ # `coord.state._update_drive_queue_entry_local` every time `last_reason`
326
+ # is written. `None` for a row predating the migration or whose
327
+ # `last_reason` is still the '' default — never treated as "just now".
328
+ # A rendering that shows `last_reason` without also showing (or at least
329
+ # consulting) this is exactly the bug #2133 closes: a point-in-time
330
+ # observation displayed as if it were current state.
331
+ reason_at: float | None = None
324
332
  session_name: str = ""
325
333
  launched_at: float | None = None
326
334
  # #1870: the short hostname of the machine whose tick launched THIS
@@ -382,6 +390,11 @@ class QueueEntry:
382
390
  attempts=int(row.get("attempts") or 0),
383
391
  deferrals=int(row.get("deferrals") or 0),
384
392
  last_reason=str(row.get("last_reason") or ""),
393
+ reason_at=(
394
+ None
395
+ if row.get("reason_at") is None
396
+ else float(row.get("reason_at"))
397
+ ),
385
398
  session_name=str(row.get("session_name") or ""),
386
399
  launched_at=None if launched_at is None else float(launched_at),
387
400
  launch_host=str(row.get("launch_host") or ""),
@@ -814,6 +814,7 @@ DRIVE_QUEUE_STATUS_COLUMNS = [
814
814
  "attempts",
815
815
  "deferrals",
816
816
  "last_reason",
817
+ "reason_at",
817
818
  "enqueued_at",
818
819
  "launched_at",
819
820
  "hold_state",
@@ -831,6 +832,10 @@ DRIVE_QUEUE_STATUS_COLUMN_META = [
831
832
  ColumnMeta(id="attempts", label="Attempts", kind="int", align="right"),
832
833
  ColumnMeta(id="deferrals", label="Deferrals", kind="int", align="right"),
833
834
  ColumnMeta(id="last_reason", label="Last Reason", kind="text", weight=3.0),
835
+ # #2133: capture time of `last_reason` — a client renders it as an age
836
+ # next to the reason so a stale snapshot never reads as current state.
837
+ # `None`/absent for a row predating the migration.
838
+ ColumnMeta(id="reason_at", label="Reason At", kind="timestamp"),
834
839
  ColumnMeta(id="enqueued_at", label="Enqueued", kind="timestamp"),
835
840
  ColumnMeta(id="launched_at", label="Launched", kind="timestamp"),
836
841
  ColumnMeta(id="hold_state", label="Hold", kind="enum"),
@@ -876,6 +881,7 @@ def fold_drive_queue_status(
876
881
  "attempts": int(entry.get("attempts") or 0),
877
882
  "deferrals": int(entry.get("deferrals") or 0),
878
883
  "last_reason": entry.get("last_reason") or "",
884
+ "reason_at": entry.get("reason_at"),
879
885
  "enqueued_at": entry.get("enqueued_at"),
880
886
  "launched_at": entry.get("launched_at"),
881
887
  "hold_state": entry.get("hold_state") or "",
@@ -5096,8 +5096,9 @@ def _list_drive_escalations_local(repo_name: str | None = None) -> list[dict]:
5096
5096
 
5097
5097
  _DRIVE_QUEUE_COLUMNS = (
5098
5098
  "id, repo_name, issue_number, position, machine, after_json, state, "
5099
- "attempts, deferrals, last_reason, session_name, launched_at, enqueued_at, "
5100
- "hold_after, hold_reason, resume_when, hold_state, hold_probes, launch_host"
5099
+ "attempts, deferrals, last_reason, reason_at, session_name, launched_at, "
5100
+ "enqueued_at, hold_after, hold_reason, resume_when, hold_state, "
5101
+ "hold_probes, launch_host"
5101
5102
  )
5102
5103
 
5103
5104
  # Fields `update_drive_queue_entry` may write. Deliberately excludes the
@@ -5338,7 +5339,10 @@ def update_drive_queue_entry(repo_name: str, issue_number: int, **fields) -> boo
5338
5339
  Accepts any of ``state`` / ``attempts`` / ``deferrals`` / ``last_reason`` /
5339
5340
  ``session_name`` / ``launched_at`` / ``launch_host``; anything else raises
5340
5341
  ``ValueError`` (the queue's order is owned by ``enqueue``/``move``, not by
5341
- a tick).
5342
+ a tick). A ``last_reason`` update is stamped with its capture time
5343
+ (``reason_at``, #2133) by ``_update_drive_queue_entry_local`` — the one
5344
+ function both this local path and the daemon's ``/drive-queue`` handler
5345
+ call, so no caller can write a reason without also dating it.
5342
5346
 
5343
5347
  Routes to the daemon when ``board_service`` is set. Returns whether a row
5344
5348
  was actually updated.
@@ -5370,6 +5374,17 @@ def _update_drive_queue_entry_local(
5370
5374
  raise ValueError(f"not updatable on drive_queue: {sorted(unknown)}")
5371
5375
  if not fields:
5372
5376
  return False
5377
+ if "last_reason" in fields:
5378
+ # #2133: `last_reason` is a point-in-time observation (the tick's
5379
+ # gate reading at the moment it wrote it), not a live probe. Without
5380
+ # a capture timestamp a `blocked` entry's displayed reason ages
5381
+ # silently and a stale-but-plausible reason reads as current state
5382
+ # — see coord/db.py's CREATE TABLE comment for the incident this
5383
+ # closes. Stamped here, the single choke point every `last_reason`
5384
+ # write passes through (both the no-daemon local path and the
5385
+ # daemon's `/drive-queue` update handler call this same function),
5386
+ # so no caller can set one without the other.
5387
+ fields = {**fields, "reason_at": time.time()}
5373
5388
  conn = get_connection()
5374
5389
  assignments = ", ".join(f"{name} = ?" for name in fields)
5375
5390
  cur = conn.execute(
@@ -289,6 +289,14 @@ coord drive-queue remove REPO ISSUE && coord drive-queue add REPO ISSUE
289
289
 
290
290
  or, from the TUI overlay, select the blocked entry and press `u`.
291
291
 
292
+ `last_reason` is a **snapshot**, taken the instant it was written and never
293
+ re-validated (#2133) — the condition it names can resolve minutes or hours
294
+ later while the text stays exactly as first written. `coord drive-queue
295
+ list` shows its age next to it (`last (3h ago): checks_failed …`) precisely
296
+ so it never reads as a live diagnosis; treat the reason as history and go
297
+ check the board/CI/review state for what is *actually* blocking now,
298
+ especially once the age climbs past a few minutes.
299
+
292
300
  ### 4a. Blocked *without* spending an attempt — permanent causes
293
301
 
294
302
  Two `blocked` reasons are **not** "died `attempts` times". They block on the
@@ -260,6 +260,98 @@ def test_list_json_emits_the_raw_rows(cli):
260
260
  assert rows[0]["after_json"] == [] # a real list on the wire, never a string
261
261
 
262
262
 
263
+ # ── #2133: `last_reason` is a snapshot, never re-validated — its rendering
264
+ # must carry its own age so it can never be mistaken for a current diagnosis.
265
+ # Reproduces the shape of the #2104 incident: a `blocked` entry's reason was
266
+ # captured once and then read, ~3 hours later, as if it still described the
267
+ # present.
268
+
269
+
270
+ def _backdate_reason(coord_db, issue: int, seconds: float) -> None:
271
+ """Age a queued entry's `reason_at` by *seconds* directly in SQLite —
272
+ simulating a `last_reason` snapshot captured that long ago. Bypasses
273
+ `update_drive_queue_entry` (which always stamps "now") on purpose: this
274
+ is standing in for the wall-clock time that has genuinely elapsed since
275
+ a real tick wrote the reason, exactly as `_backdate` does for
276
+ `launched_at` above.
277
+ """
278
+ coord_db.execute(
279
+ "UPDATE drive_queue SET reason_at = ? WHERE repo_name = ? AND issue_number = ?",
280
+ (time.time() - seconds, REPO, issue),
281
+ )
282
+ coord_db.commit()
283
+
284
+
285
+ def test_list_shows_no_age_for_a_freshly_written_reason(cli):
286
+ cli("add", REPO, "1650")
287
+ state._update_drive_queue_entry_local(
288
+ REPO, 1650, state="blocked", last_reason="checks_failed: test (3.12)"
289
+ )
290
+ result = cli("list")
291
+ assert result.exit_code == 0, result.output
292
+ assert "checks_failed: test (3.12)" in result.output
293
+ assert "0s ago" in result.output, (
294
+ "a reason written this instant must still carry SOME age marker — "
295
+ "the point is that a reader never has to guess whether an age is "
296
+ "being shown at all:\n" + result.output
297
+ )
298
+
299
+
300
+ def test_list_ages_a_stale_park_reason_instead_of_showing_it_bare(cli, coord_db):
301
+ """The #2104 reproduction: a `blocked` reason captured hours ago must
302
+ read as history, not as a live diagnosis of the current blocker."""
303
+ cli("add", REPO, "1650")
304
+ state._update_drive_queue_entry_local(
305
+ REPO, 1650, state="blocked", last_reason="checks_failed: test (3.12)"
306
+ )
307
+ _backdate_reason(coord_db, 1650, 3 * 3600 + 60) # ~3h ago, clear of rounding
308
+
309
+ result = cli("list")
310
+ assert result.exit_code == 0, result.output
311
+ assert "checks_failed: test (3.12)" in result.output, (
312
+ "the reason text itself must still be legible:\n" + result.output
313
+ )
314
+ assert "(3h ago)" in result.output, (
315
+ "#2133: a stale `last_reason` rendered without its age is exactly "
316
+ "the trap that misdirected the #2104 diagnosis — the queue text "
317
+ "pointed at CI while the real, later blocker (a review verdict) "
318
+ "went unmentioned:\n" + result.output
319
+ )
320
+
321
+
322
+ def test_list_json_carries_reason_at_for_a_client_to_render_its_own_age(cli, coord_db):
323
+ cli("add", REPO, "1650")
324
+ state._update_drive_queue_entry_local(
325
+ REPO, 1650, state="blocked", last_reason="checks_failed"
326
+ )
327
+ _backdate_reason(coord_db, 1650, 90.0)
328
+
329
+ rows = json.loads(cli("list", "--json").output)
330
+ assert rows[0]["last_reason"] == "checks_failed"
331
+ assert rows[0]["reason_at"] == pytest.approx(time.time() - 90.0, abs=5.0)
332
+
333
+
334
+ def test_list_omits_age_for_a_reason_with_no_capture_time(cli, coord_db):
335
+ """A row predating #2133's migration (or written straight to the table by
336
+ hand) has `reason_at IS NULL` — the renderer must not fabricate an age
337
+ for it, just show the bare reason exactly as it always has."""
338
+ cli("add", REPO, "1650")
339
+ coord_db.execute(
340
+ "UPDATE drive_queue SET state = 'blocked', last_reason = 'legacy reason', "
341
+ "reason_at = NULL WHERE repo_name = ? AND issue_number = ?",
342
+ (REPO, 1650),
343
+ )
344
+ coord_db.commit()
345
+
346
+ result = cli("list")
347
+ assert result.exit_code == 0, result.output
348
+ assert "legacy reason" in result.output
349
+ assert "ago" not in result.output, (
350
+ "no `reason_at` means no age can be computed — inventing one would "
351
+ "be worse than showing nothing:\n" + result.output
352
+ )
353
+
354
+
263
355
  # ── remove / move ────────────────────────────────────────────────────────────
264
356
 
265
357
 
@@ -643,6 +643,7 @@ def _dq_row(
643
643
  attempts: int = 0,
644
644
  deferrals: int = 0,
645
645
  last_reason: str = "",
646
+ reason_at: float | None = None,
646
647
  session_name: str = "",
647
648
  launched_at: float | None = None,
648
649
  enqueued_at: float = 100.0,
@@ -664,6 +665,7 @@ def _dq_row(
664
665
  "attempts": attempts,
665
666
  "deferrals": deferrals,
666
667
  "last_reason": last_reason,
668
+ "reason_at": reason_at,
667
669
  "session_name": session_name,
668
670
  "launched_at": launched_at,
669
671
  "enqueued_at": enqueued_at,
@@ -695,7 +697,7 @@ class TestFoldDriveQueueStatus:
695
697
  assert [m.id for m in result.column_meta] == result.columns
696
698
  assert result.columns == [
697
699
  "position", "repo", "issue", "title", "state", "machine",
698
- "attempts", "deferrals", "last_reason", "enqueued_at",
700
+ "attempts", "deferrals", "last_reason", "reason_at", "enqueued_at",
699
701
  "launched_at", "hold_state", "after",
700
702
  ]
701
703
 
@@ -3150,6 +3150,84 @@ def test_drive_queue_local_rejects_non_updatable_field(coord_db):
3150
3150
  state._update_drive_queue_entry_local("api", 7, machine="laptop")
3151
3151
 
3152
3152
 
3153
+ def test_drive_queue_local_stamps_reason_at_when_last_reason_is_written(coord_db):
3154
+ """#2133: `last_reason` is a point-in-time observation, so every write to
3155
+ it is dated — the queue's ONE choke point for both the no-daemon local
3156
+ path and the daemon's `/drive-queue` update handler
3157
+ (`serve_app.post_drive_queue` calls this exact function), so no caller
3158
+ can set a reason without also dating it.
3159
+ """
3160
+ import time as _time
3161
+
3162
+ from coord import state
3163
+
3164
+ state._enqueue_drive_queue_local("api", 7)
3165
+ assert state._get_drive_queue_entry_local("api", 7)["reason_at"] is None
3166
+
3167
+ before = _time.time()
3168
+ assert state._update_drive_queue_entry_local(
3169
+ "api", 7, state="blocked", last_reason="checks_failed"
3170
+ )
3171
+ after = _time.time()
3172
+ entry = state._get_drive_queue_entry_local("api", 7)
3173
+ assert entry["reason_at"] is not None
3174
+ assert before <= entry["reason_at"] <= after
3175
+ first_stamp = entry["reason_at"]
3176
+
3177
+ # A write that never touches `last_reason` must not re-date it — the
3178
+ # timestamp names when the REASON was captured, not when the row last
3179
+ # changed for any reason.
3180
+ assert state._update_drive_queue_entry_local("api", 7, attempts=1)
3181
+ entry = state._get_drive_queue_entry_local("api", 7)
3182
+ assert entry["reason_at"] == first_stamp
3183
+ assert entry["last_reason"] == "checks_failed"
3184
+
3185
+ # Re-writing `last_reason` — even to the identical text — re-dates it: a
3186
+ # fresh observation of the same condition is still a fresh observation.
3187
+ _time.sleep(0.01)
3188
+ assert state._update_drive_queue_entry_local(
3189
+ "api", 7, last_reason="checks_failed"
3190
+ )
3191
+ entry = state._get_drive_queue_entry_local("api", 7)
3192
+ assert entry["reason_at"] > first_stamp
3193
+
3194
+
3195
+ def test_drive_queue_daemon_update_handler_also_stamps_reason_at(
3196
+ tmp_path: Path, valid_config_path: Path, rw_db,
3197
+ ):
3198
+ """The daemon's `/drive-queue` update action must date `last_reason` the
3199
+ same way the local (no-daemon) path does — #2133's fix has to hold for a
3200
+ thin client too, not just a standalone `coord` invocation. Mirrors
3201
+ `test_board_projection_carries_drive_queue`'s use of `rw_db` (a
3202
+ thread-safe file-backed override `TestClient`'s worker thread can
3203
+ actually see) rather than the autouse `:memory:` `coord_db`.
3204
+ """
3205
+ import time as _time
3206
+
3207
+ from coord import state
3208
+
3209
+ db_path = tmp_path / "rw.db"
3210
+ app = build_app(SqliteStore(db_path), load_config(valid_config_path))
3211
+ with TestClient(app) as cli:
3212
+ cli.post(
3213
+ "/drive-queue",
3214
+ json={"action": "enqueue", "repo_name": "api", "issue_number": 7},
3215
+ )
3216
+ resp = cli.post(
3217
+ "/drive-queue",
3218
+ json={
3219
+ "action": "update",
3220
+ "repo_name": "api",
3221
+ "issue_number": 7,
3222
+ "fields": {"state": "blocked", "last_reason": "checks_failed"},
3223
+ },
3224
+ )
3225
+ assert resp.status_code == 200, resp.text
3226
+ entry = state._get_drive_queue_entry_local("api", 7)
3227
+ assert entry["reason_at"] is not None
3228
+ assert entry["reason_at"] <= _time.time()
3229
+
3230
+
3153
3231
  def test_drive_queue_local_move_clamps_out_of_range(coord_db):
3154
3232
  from coord import state
3155
3233
 
@@ -879,7 +879,7 @@ impl CoordApp {
879
879
  .join(", "),
880
880
  ),
881
881
  queue_hold_cell(e),
882
- or_dash(e.last_reason.clone()),
882
+ or_dash(queue_reason_cell(e)),
883
883
  ],
884
884
  }
885
885
  }
@@ -1878,6 +1878,36 @@ fn queue_hold_cell(e: &BoardDriveQueueEntry) -> String {
1878
1878
  }
1879
1879
  }
1880
1880
 
1881
+ /// The `Reason` cell for one entry — `last_reason` age-stamped with
1882
+ /// `reason_at` (#2133).
1883
+ ///
1884
+ /// `last_reason` is a snapshot the tick (or a guard) wrote the instant it
1885
+ /// observed the condition, never re-validated afterwards. Rendering it bare
1886
+ /// lets an hours-old, no-longer-true observation read as a live diagnosis —
1887
+ /// the #2104 incident this closes: `checks_failed` was still shown roughly
1888
+ /// three hours after the named checks had gone green, while the actual
1889
+ /// blocker (a later `request-changes` review) was nowhere in the panel.
1890
+ /// Appending the age doesn't make the reason current, but it stops it from
1891
+ /// being silently mistaken for current. No suffix when `reason_at` is
1892
+ /// `None` — a row predating #2133's migration, or built without going
1893
+ /// through `update_drive_queue_entry` — rather than guessing an age it
1894
+ /// doesn't have.
1895
+ fn queue_reason_cell(e: &BoardDriveQueueEntry) -> String {
1896
+ if e.last_reason.is_empty() {
1897
+ return String::new();
1898
+ }
1899
+ let now = std::time::SystemTime::now()
1900
+ .duration_since(std::time::UNIX_EPOCH)
1901
+ .unwrap_or_default()
1902
+ .as_secs_f64();
1903
+ let age = format_age(e.reason_at, now);
1904
+ if age.is_empty() {
1905
+ e.last_reason.clone()
1906
+ } else {
1907
+ format!("{} ({})", e.last_reason, age)
1908
+ }
1909
+ }
1910
+
1881
1911
  /// Order two Queue rows by `col`.
1882
1912
  ///
1883
1913
  /// Numeric for the two numeric columns, case-insensitive text otherwise.
@@ -1069,10 +1069,12 @@ pub(crate) struct ContextMenuState {
1069
1069
 
1070
1070
  /// Format a Unix timestamp as a human-readable "X ago" string relative to `now`.
1071
1071
  ///
1072
- /// Used in the Merge Queue panel (#777) to show `enqueued_at` and `last_attempt`.
1072
+ /// Used in the Merge Queue panel (#777) to show `enqueued_at` and `last_attempt`,
1073
+ /// and (#2133) in the Queue panel to age-stamp a drive-queue entry's
1074
+ /// `last_reason` so a snapshot taken hours ago never renders as current state.
1073
1075
  /// Returns `""` for `None` timestamps. Precision caps at minutes for < 1h,
1074
1076
  /// hours for < 24h, days otherwise — keeps panel rows terse.
1075
- fn format_age(ts: Option<f64>, now: f64) -> String {
1077
+ pub(crate) fn format_age(ts: Option<f64>, now: f64) -> String {
1076
1078
  let ts = match ts {
1077
1079
  Some(t) if t > 0.0 => t,
1078
1080
  _ => return String::new(),
@@ -44200,6 +44200,60 @@ Milestone tracking issue.
44200
44200
  );
44201
44201
  }
44202
44202
 
44203
+ /// #2133: `last_reason` is a snapshot taken the instant it was written,
44204
+ /// never re-validated — the #2104 incident it names is a `checks_failed`
44205
+ /// reason that outlived the CI failure it described by ~3 hours while
44206
+ /// the real, later blocker went unmentioned. The Queue panel must show
44207
+ /// the reason's age so it can never read as a live diagnosis.
44208
+ #[test]
44209
+ fn tuidriver_queue_panel_age_stamps_a_stale_reason() {
44210
+ let now = std::time::SystemTime::now()
44211
+ .duration_since(std::time::UNIX_EPOCH)
44212
+ .unwrap_or_default()
44213
+ .as_secs_f64();
44214
+ // 3h + 60s ago: comfortably inside the "3h ago" bucket
44215
+ // (`format_age` truncates to whole hours) with slack on both sides
44216
+ // so a few milliseconds of test execution can never flip the digit.
44217
+ let reason_at = now - (3.0 * 3600.0 + 60.0);
44218
+ let fixture = format!(
44219
+ r#"[
44220
+ {{"repo_name": "myrepo", "issue_number": 703, "position": 0,
44221
+ "state": "blocked", "attempts": 9,
44222
+ "last_reason": "checks_failed: test (3.12)",
44223
+ "reason_at": {reason_at}}}
44224
+ ]"#
44225
+ );
44226
+ let driver = queue_driver(&fixture, 200, 30);
44227
+ let screen = driver.screen();
44228
+ assert!(
44229
+ screen.contains("checks_failed: test (3.12)"),
44230
+ "the reason text itself must still be legible:\n{screen}"
44231
+ );
44232
+ assert!(
44233
+ screen.contains("(3h ago)"),
44234
+ "#2133: a stale `last_reason` must carry its age so it is never \
44235
+ mistaken for a current diagnosis:\n{screen}"
44236
+ );
44237
+ }
44238
+
44239
+ /// A `reason_at`-less row (predates #2133's migration, or a fixture that
44240
+ /// never set it) renders the bare reason — no fabricated age, and no
44241
+ /// crash on the missing field.
44242
+ #[test]
44243
+ fn tuidriver_queue_panel_omits_age_when_reason_at_is_unknown() {
44244
+ let driver = queue_driver(queue_fixture_json(), 160, 30);
44245
+ let screen = driver.screen();
44246
+ assert!(
44247
+ screen.contains("REASON-BLOCKED"),
44248
+ "the reason still renders on its own:\n{screen}"
44249
+ );
44250
+ assert!(
44251
+ !screen.contains("REASON-BLOCKED ("),
44252
+ "#2133: no `reason_at` means no age can be computed — the cell \
44253
+ must not invent one:\n{screen}"
44254
+ );
44255
+ }
44256
+
44203
44257
  #[test]
44204
44258
  fn tuidriver_queue_panel_states_are_visually_distinguishable() {
44205
44259
  // Colour is asserted at the model layer (the screen dump is plain
@@ -863,6 +863,13 @@ pub(crate) struct BoardDriveQueueEntry {
863
863
  pub(crate) deferrals: i64,
864
864
  #[serde(default)]
865
865
  pub(crate) last_reason: String,
866
+ /// #2133: capture time of `last_reason` — `last_reason` is a
867
+ /// point-in-time observation, never re-validated, so the Queue panel
868
+ /// age-stamps it (`queue_row`) rather than rendering it bare as if it
869
+ /// were current state. `None` for a row predating the migration or one
870
+ /// whose `last_reason` is still the `""` default.
871
+ #[serde(default)]
872
+ pub(crate) reason_at: Option<f64>,
866
873
  #[allow(dead_code)] // wire parity; the Queue panel shows `state`, not the clock
867
874
  #[serde(default)]
868
875
  pub(crate) launched_at: Option<f64>,
@@ -236,6 +236,7 @@
236
236
  "launched_at": null,
237
237
  "machine": null,
238
238
  "position": 0,
239
+ "reason_at": null,
239
240
  "repo_name": "claude-coordinator",
240
241
  "resume_when": "",
241
242
  "session_name": null,
@@ -259,6 +260,7 @@
259
260
  "launched_at": null,
260
261
  "machine": "dellserver",
261
262
  "position": 1,
263
+ "reason_at": null,
262
264
  "repo_name": "claude-coordinator",
263
265
  "resume_when": "",
264
266
  "session_name": null,