code-coordinator 0.5.96__tar.gz → 0.5.98__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 (841) hide show
  1. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/code_coordinator.egg-info/SOURCES.txt +1 -0
  4. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/code_coordinator.egg-info/scm_file_list.json +1 -0
  5. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dead_end.py +36 -7
  7. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/notify.py +52 -17
  8. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/reconcile.py +289 -8
  9. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/smoke.py +163 -3
  10. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/stage_projection.py +10 -0
  11. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_dead_end.py +38 -0
  12. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_notify.py +289 -0
  13. code_coordinator-0.5.98/tests/test_reconcile_no_agent_record.py +538 -0
  14. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_smoke.py +234 -0
  15. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/.claude/commands/board.md +0 -0
  16. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/.claude/commands/complete-session.md +0 -0
  17. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/.claude/commands/coordinator.md +0 -0
  18. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/.githooks/_lib.sh +0 -0
  19. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/.githooks/post-checkout +0 -0
  20. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/.githooks/post-commit +0 -0
  21. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/.githooks/post-merge +0 -0
  22. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  23. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/.github/coord-ci-acceptance.yml +0 -0
  24. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/.github/workflows/auto-release.yml +0 -0
  25. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/.github/workflows/cargo-test.yml +0 -0
  26. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/.github/workflows/publish.yml +0 -0
  27. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/.github/workflows/release-tui.yml +0 -0
  28. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/.github/workflows/test.yml +0 -0
  29. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/.gitignore +0 -0
  30. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/CLAUDE.md +0 -0
  31. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/GOAL.md +0 -0
  32. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/LICENSE +0 -0
  33. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/MANIFEST.in +0 -0
  34. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/README.md +0 -0
  35. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/code_coordinator.egg-info/dependency_links.txt +0 -0
  36. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/code_coordinator.egg-info/entry_points.txt +0 -0
  37. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/code_coordinator.egg-info/requires.txt +0 -0
  38. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/code_coordinator.egg-info/top_level.txt +0 -0
  39. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/__init__.py +0 -0
  40. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/_board_mapping.py +0 -0
  41. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/acceptance.py +0 -0
  42. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/acceptance_drivers.py +0 -0
  43. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/agent.py +0 -0
  44. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/agent_app.py +0 -0
  45. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/agent_update.py +0 -0
  46. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/agents/opencode/.gitignore +0 -0
  47. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/agents/opencode/agents/work.md +0 -0
  48. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/agents/opencode/routing.jsonc +0 -0
  49. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/audit.py +0 -0
  50. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/auto_loop.py +0 -0
  51. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/block_log.py +0 -0
  52. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/board_bool_guard.py +0 -0
  53. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/board_service.py +0 -0
  54. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/board_wire.py +0 -0
  55. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/brain.py +0 -0
  56. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/branch_model.py +0 -0
  57. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/bug_intake.py +0 -0
  58. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/cargo_cache.py +0 -0
  59. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/ci_github.py +0 -0
  60. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/ci_store.py +0 -0
  61. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/claim.py +0 -0
  62. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/cli.py +0 -0
  63. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/client.py +0 -0
  64. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/__init__.py +0 -0
  65. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/_common.py +0 -0
  66. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/acceptance.py +0 -0
  67. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/agent_ops.py +0 -0
  68. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/audit.py +0 -0
  69. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/chat.py +0 -0
  70. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/dispatch.py +0 -0
  71. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/dispatch_workers.py +0 -0
  72. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/drive.py +0 -0
  73. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/drive_queue.py +0 -0
  74. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/gate_a.py +0 -0
  75. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/gates.py +0 -0
  76. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/issues.py +0 -0
  77. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/lifecycle.py +0 -0
  78. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/merge.py +0 -0
  79. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/milestone.py +0 -0
  80. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/plan_followup.py +0 -0
  81. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/plans.py +0 -0
  82. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/portal.py +0 -0
  83. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/release.py +0 -0
  84. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/repo.py +0 -0
  85. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/report.py +0 -0
  86. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/review.py +0 -0
  87. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/scorecard.py +0 -0
  88. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/sessions.py +0 -0
  89. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/setup.py +0 -0
  90. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/status.py +0 -0
  91. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/terminal.py +0 -0
  92. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/test_gate.py +0 -0
  93. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/commands/tui.py +0 -0
  94. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/comments.py +0 -0
  95. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/config.py +0 -0
  96. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/conflict_fix.py +0 -0
  97. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dao.py +0 -0
  98. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/__init__.py +0 -0
  99. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/fixture.py +0 -0
  100. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/index.html +0 -0
  101. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/server.py +0 -0
  102. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/terminal.py +0 -0
  103. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/.gitignore +0 -0
  104. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/components.json +0 -0
  105. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/dist/assets/Gallery-Cq84itDE.js +0 -0
  106. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  107. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/dist/assets/Terminal-DOXLcMue.js +0 -0
  108. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/dist/assets/index-DHn-RIJ8.js +0 -0
  109. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  110. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  111. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  112. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  113. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  114. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/dist/index.html +0 -0
  115. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  116. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/dist/sw.js +0 -0
  117. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  118. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  119. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  120. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  121. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  122. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  123. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  124. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  125. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  126. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  127. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/eslint.config.js +0 -0
  128. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/index.html +0 -0
  129. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  130. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/package-lock.json +0 -0
  131. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/package.json +0 -0
  132. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  133. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/playwright.config.ts +0 -0
  134. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/postcss.config.js +0 -0
  135. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  136. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  137. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  138. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/App.tsx +0 -0
  139. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/api/client.ts +0 -0
  140. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  141. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  142. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  143. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  144. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  145. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  146. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  147. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  148. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  149. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  150. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  151. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  152. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  153. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  154. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  155. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  156. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  157. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  158. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  159. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  160. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  161. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  162. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  163. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  164. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  165. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  166. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  167. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  168. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  169. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  170. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  171. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  172. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  173. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  174. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  175. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/index.css +0 -0
  176. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  177. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  178. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/main.tsx +0 -0
  179. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  180. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  181. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  182. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  183. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  184. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  185. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  186. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  187. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  188. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  189. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  190. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  191. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  192. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  193. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  194. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  195. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  196. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  197. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  198. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  199. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  200. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  201. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  202. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/tailwind.config.js +0 -0
  203. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/tsconfig.json +0 -0
  204. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  205. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dashboard/webapp/vite.config.ts +0 -0
  206. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/db.py +0 -0
  207. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/README.md +0 -0
  208. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-agent.service +0 -0
  209. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-db-backup.service +0 -0
  210. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-db-backup.sh +0 -0
  211. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-db-backup.timer +0 -0
  212. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-drive-queue.service +0 -0
  213. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-drive-queue.timer +0 -0
  214. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-notify.service +0 -0
  215. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-notify.timer +0 -0
  216. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-release-propagate.service +0 -0
  217. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-release-propagate.timer +0 -0
  218. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-release-window.service +0 -0
  219. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-release-window.timer +0 -0
  220. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-serve.service +0 -0
  221. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-web-dist-build.service +0 -0
  222. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-web-dist-build.timer +0 -0
  223. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy/coord-web.service +0 -0
  224. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy_manifest.py +0 -0
  225. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deploy_units.py +0 -0
  226. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/deps.py +0 -0
  227. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/diagnose.py +0 -0
  228. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dispatch.py +0 -0
  229. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/dist_name.py +0 -0
  230. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/drive.py +0 -0
  231. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/drive_queue.py +0 -0
  232. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/drive_state.py +0 -0
  233. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/events.py +0 -0
  234. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/failure_class.py +0 -0
  235. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/filelock.py +0 -0
  236. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/fleet_config_health.py +0 -0
  237. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/freshness.py +0 -0
  238. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/gate_a.py +0 -0
  239. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/gate_b.py +0 -0
  240. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/gate_snapshot.py +0 -0
  241. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/gates.py +0 -0
  242. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/github_ops.py +0 -0
  243. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/goal.py +0 -0
  244. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/graph_health.py +0 -0
  245. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/__init__.py +0 -0
  246. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/aggregate.py +0 -0
  247. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/__init__.py +0 -0
  248. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/agent_install.py +0 -0
  249. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/cargo_targets.py +0 -0
  250. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/claude_binary.py +0 -0
  251. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/deploy_lane_facts.py +0 -0
  252. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/disk.py +0 -0
  253. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/fleet_board.py +0 -0
  254. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  255. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/fleet_phantom.py +0 -0
  256. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/fleet_unit_drift.py +0 -0
  257. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/graph.py +0 -0
  258. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/graphify_cli.py +0 -0
  259. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/index_lock.py +0 -0
  260. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/plan_usage.py +0 -0
  261. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/repo_state.py +0 -0
  262. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/spawned_coord.py +0 -0
  263. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/timer_active.py +0 -0
  264. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/toolchain.py +0 -0
  265. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/unit_drift.py +0 -0
  266. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/unit_enablement.py +0 -0
  267. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/checks/worktrees.py +0 -0
  268. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/cli.py +0 -0
  269. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/context.py +0 -0
  270. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/fleet_snapshot.py +0 -0
  271. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/models.py +0 -0
  272. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/pypi.py +0 -0
  273. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/registry.py +0 -0
  274. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/render.py +0 -0
  275. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/health/units.py +0 -0
  276. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/hooks.py +0 -0
  277. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/housekeeping.py +0 -0
  278. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/interactive.py +0 -0
  279. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/issue_store.py +0 -0
  280. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/liveness_auditor.py +0 -0
  281. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/machine_pause.py +0 -0
  282. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/merge_queue.py +0 -0
  283. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/milestone_chat.py +0 -0
  284. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/milestone_dispatch.py +0 -0
  285. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/milestone_gate.py +0 -0
  286. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/milestone_order.py +0 -0
  287. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/mock_author.py +0 -0
  288. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/models.py +0 -0
  289. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/network.py +0 -0
  290. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/new_issue_chat.py +0 -0
  291. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/notifier/__init__.py +0 -0
  292. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/notifier/baseline.py +0 -0
  293. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/notifier/cli.py +0 -0
  294. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/notifier/collect.py +0 -0
  295. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/notifier/digest.py +0 -0
  296. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/notifier/models.py +0 -0
  297. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/notifier/predicate.py +0 -0
  298. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/notifier/service.py +0 -0
  299. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/notifier/store.py +0 -0
  300. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/notifier/transport.py +0 -0
  301. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/openapi.py +0 -0
  302. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/overlap_fence.py +0 -0
  303. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/overlap_predict.py +0 -0
  304. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/parentage.py +0 -0
  305. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/parentage_github.py +0 -0
  306. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/pipeline.py +0 -0
  307. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/plan_parser.py +0 -0
  308. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/plans.py +0 -0
  309. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/platform_paths.py +0 -0
  310. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/portal_bridge.py +0 -0
  311. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/portal_store.py +0 -0
  312. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/portal_sync.py +0 -0
  313. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/pr_body_lint.py +0 -0
  314. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/prereqs.py +0 -0
  315. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/progress.py +0 -0
  316. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/providers/__init__.py +0 -0
  317. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/providers/base.py +0 -0
  318. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/providers/claude.py +0 -0
  319. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/providers/claude_pty.py +0 -0
  320. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/providers/opencode.py +0 -0
  321. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/refine_chat.py +0 -0
  322. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/release_cordon.py +0 -0
  323. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/release_propagate.py +0 -0
  324. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/release_verify.py +0 -0
  325. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/release_window.py +0 -0
  326. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/repo_edit.py +0 -0
  327. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/repo_onboard.py +0 -0
  328. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/reports.py +0 -0
  329. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/revalidate.py +0 -0
  330. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/review.py +0 -0
  331. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/scorecard.py +0 -0
  332. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/serve_app.py +0 -0
  333. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/skills/update-issue/SKILL.md +0 -0
  334. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/spend_ceiling.py +0 -0
  335. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/split_work.py +0 -0
  336. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/state.py +0 -0
  337. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/test_author.py +0 -0
  338. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/test_chat.py +0 -0
  339. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/test_orchestrator.py +0 -0
  340. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/test_report.py +0 -0
  341. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/tui_release.py +0 -0
  342. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/usage.py +0 -0
  343. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/usage_limits.py +0 -0
  344. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/usage_rollup.py +0 -0
  345. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coord/worker_events.py +0 -0
  346. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/coordinator.example.yml +0 -0
  347. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-agent.service +0 -0
  348. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-db-backup.service +0 -0
  349. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-db-backup.sh +0 -0
  350. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-db-backup.timer +0 -0
  351. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-drive-queue.service +0 -0
  352. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-drive-queue.timer +0 -0
  353. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-notify.service +0 -0
  354. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-notify.timer +0 -0
  355. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-release-propagate.service +0 -0
  356. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-release-propagate.timer +0 -0
  357. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-release-window.service +0 -0
  358. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-release-window.timer +0 -0
  359. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-serve.service +0 -0
  360. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-web-dist-build.service +0 -0
  361. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-web-dist-build.sh +0 -0
  362. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-web-dist-build.timer +0 -0
  363. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-web-rollback.sh +0 -0
  364. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/coord-web.service +0 -0
  365. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/deploy/node-shim.sh +0 -0
  366. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/AGENT_OPERATIONS.md +0 -0
  367. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/ARCHITECTURE.md +0 -0
  368. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/ARCH_SECURITY_GATES.md +0 -0
  369. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/COCKPIT.md +0 -0
  370. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/CONTROL_CENTER.md +0 -0
  371. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/COST_DISCIPLINE.md +0 -0
  372. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/CROSS_PLATFORM.md +0 -0
  373. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/CUSTOMER_PORTAL.md +0 -0
  374. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/DRIVE_QUEUE.md +0 -0
  375. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/EPHEMERAL_WORKERS.md +0 -0
  376. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/FORGE_MIGRATION.md +0 -0
  377. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/GRAPHIFY_SETUP.md +0 -0
  378. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/ISSUE_GUIDANCE.md +0 -0
  379. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/MAC_MINI.md +0 -0
  380. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  381. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/NOTIFIER.md +0 -0
  382. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/OPENCODE_VERIFICATION.md +0 -0
  383. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/OPERATING_GOTCHAS.md +0 -0
  384. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/ORACLE_LOOP.md +0 -0
  385. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/PHONE_WEBAPP.md +0 -0
  386. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/PIPELINE_V2.md +0 -0
  387. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/PLATFORM_EVOLUTION.md +0 -0
  388. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/SECOND_BACKEND.md +0 -0
  389. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/STORE_SERVICE.md +0 -0
  390. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  391. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/WEB_CONTROL_CENTER.md +0 -0
  392. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/mocks/web/README.md +0 -0
  393. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/mocks/web/_tokens.css +0 -0
  394. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/mocks/web/issue-detail.html +0 -0
  395. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/mocks/web/pipeline-narrow.html +0 -0
  396. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/docs/mocks/web/pipeline-wide.html +0 -0
  397. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/graphify-out/.gitignore +0 -0
  398. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/install-agent.sh +0 -0
  399. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/pyproject.toml +0 -0
  400. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/audit_review_verdict_overrides.py +0 -0
  401. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  402. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/azure-workers/build-worker-image.sh +0 -0
  403. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/azure-workers/coordinator-machine.py +0 -0
  404. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/azure-workers/epic-down.sh +0 -0
  405. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/azure-workers/epic-up.sh +0 -0
  406. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/azure-workers/preflight.sh +0 -0
  407. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/azure-workers/provision-worker.sh +0 -0
  408. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  409. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  410. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/azure-workers/verify-github-token.sh +0 -0
  411. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/codegen.py +0 -0
  412. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/coord-test-runner.sh +0 -0
  413. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/drive-batch.sh +0 -0
  414. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/gen_board_fixture.py +0 -0
  415. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/next_release_tag.py +0 -0
  416. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/run_tests_in_populated_home.sh +0 -0
  417. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/run_tests_without_gh.sh +0 -0
  418. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/smoke_437_interactive.py +0 -0
  419. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/verify_878_review_capture.py +0 -0
  420. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/verify_release_published.py +0 -0
  421. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/scripts/verify_release_wheel.py +0 -0
  422. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/setup.cfg +0 -0
  423. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/SMOKE_SET.md +0 -0
  424. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/__init__.py +0 -0
  425. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  426. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-33/contract.md +0 -0
  427. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-33/manifest.yml +0 -0
  428. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  429. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  430. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  431. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  432. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-37/conftest.py +0 -0
  433. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-37/contract.md +0 -0
  434. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-37/manifest.yml +0 -0
  435. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  436. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  437. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-38/contract.md +0 -0
  438. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-38/manifest.yml +0 -0
  439. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  440. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  441. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  442. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  443. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  444. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  445. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  446. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  447. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  448. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  449. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-51/contract.md +0 -0
  450. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  451. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  452. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-51/manifest.yml +0 -0
  453. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  454. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-51/tsconfig.json +0 -0
  455. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  456. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/conftest.py +0 -0
  457. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/board-pipeline-basic.json +0 -0
  458. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  459. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  460. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  461. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/playwright/all_pass.json +0 -0
  462. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  463. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/playwright/mixed_fail.json +0 -0
  464. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  465. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  466. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/playwright/skip.json +0 -0
  467. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/playwright/truncated.json +0 -0
  468. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  469. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  470. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  471. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  472. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  473. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  474. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  475. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  476. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_acceptance.py +0 -0
  477. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_acceptance_drivers.py +0 -0
  478. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent.py +0 -0
  479. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_api_error.py +0 -0
  480. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_app.py +0 -0
  481. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_branch_base.py +0 -0
  482. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_branch_capture.py +0 -0
  483. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_config_free_1712.py +0 -0
  484. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_deploy_units_endpoint.py +0 -0
  485. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_dirty_worktree.py +0 -0
  486. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_graph_self_heal.py +0 -0
  487. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_health_h3.py +0 -0
  488. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_idle_restart.py +0 -0
  489. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_push_failure.py +0 -0
  490. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_reap.py +0 -0
  491. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_repos_and_pull.py +0 -0
  492. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_restart_services_endpoint.py +0 -0
  493. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_startup_diagnostics.py +0 -0
  494. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_update.py +0 -0
  495. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_update_bluegreen.py +0 -0
  496. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_usage_limit.py +0 -0
  497. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_agent_zero_commit.py +0 -0
  498. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_ambient_home_isolation.py +0 -0
  499. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_approve_reject_plan.py +0 -0
  500. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_approve_usage_gate.py +0 -0
  501. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_assignment_already_recorded_daemon.py +0 -0
  502. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_audit_log.py +0 -0
  503. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_audit_outcome.py +0 -0
  504. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_audit_query.py +0 -0
  505. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_auto_loop.py +0 -0
  506. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_auto_release_publish_2035.py +0 -0
  507. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_base_checkout_restore.py +0 -0
  508. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_block_log.py +0 -0
  509. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_board_cap_762.py +0 -0
  510. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_board_fixture.py +0 -0
  511. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_board_read_path.py +0 -0
  512. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_board_service.py +0 -0
  513. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_board_state.py +0 -0
  514. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_board_wire.py +0 -0
  515. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_brain.py +0 -0
  516. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_branch_model.py +0 -0
  517. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_bug_intake.py +0 -0
  518. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_build_worker_image_env_update.py +0 -0
  519. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cargo_cache.py +0 -0
  520. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_ci_acceptance_gate_1950.py +0 -0
  521. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_ci_parity_2091.py +0 -0
  522. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_ci_store.py +0 -0
  523. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_claim.py +0 -0
  524. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_acceptance.py +0 -0
  525. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_assign.py +0 -0
  526. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  527. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_assign_interactive_remote.py +0 -0
  528. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_assign_provider.py +0 -0
  529. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  530. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_audit.py +0 -0
  531. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_chat_continue.py +0 -0
  532. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_diagnose_config_provenance.py +0 -0
  533. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_diagnose_graph.py +0 -0
  534. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_doctor.py +0 -0
  535. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_doctor_config_free_1801.py +0 -0
  536. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  537. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_drive.py +0 -0
  538. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_drive_queue.py +0 -0
  539. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_escalate.py +0 -0
  540. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_fix_headless_review.py +0 -0
  541. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_gate_a.py +0 -0
  542. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_install_drift.py +0 -0
  543. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_install_skills.py +0 -0
  544. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_issue_create_label.py +0 -0
  545. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_issue_reopen.py +0 -0
  546. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_merge.py +0 -0
  547. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_milestone_assign.py +0 -0
  548. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_milestone_capture.py +0 -0
  549. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_milestone_chat_add_child.py +0 -0
  550. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_milestone_dispatch.py +0 -0
  551. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_milestone_gate_b.py +0 -0
  552. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_milestone_gate_c.py +0 -0
  553. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_milestone_order.py +0 -0
  554. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  555. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_milestone_ship.py +0 -0
  556. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_network.py +0 -0
  557. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_new_issue_chat.py +0 -0
  558. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_plans.py +0 -0
  559. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_portal.py +0 -0
  560. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_pull_artifact.py +0 -0
  561. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_queue.py +0 -0
  562. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_reattach_sessions.py +0 -0
  563. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_refine_board.py +0 -0
  564. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_release_preflight.py +0 -0
  565. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_release_propagate.py +0 -0
  566. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_release_window.py +0 -0
  567. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_repo_2220.py +0 -0
  568. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_scorecard.py +0 -0
  569. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_set_review_findings.py +0 -0
  570. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_status_advisory_terminal.py +0 -0
  571. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_status_merge_queue.py +0 -0
  572. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_status_provider.py +0 -0
  573. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_status_review_finalizing.py +0 -0
  574. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_status_test_failed_tag.py +0 -0
  575. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_status_usage_limit.py +0 -0
  576. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_sync_comments_873.py +0 -0
  577. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_test_plan.py +0 -0
  578. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_track.py +0 -0
  579. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_tui_update.py +0 -0
  580. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cli_wait.py +0 -0
  581. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_client_base_install.py +0 -0
  582. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_comments.py +0 -0
  583. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_completion_summary.py +0 -0
  584. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_config.py +0 -0
  585. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_config_acceptance.py +0 -0
  586. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_config_audit.py +0 -0
  587. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_config_pricing.py +0 -0
  588. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  589. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_config_usage_gate.py +0 -0
  590. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_conflict_fix.py +0 -0
  591. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_conflict_fix_semantic.py +0 -0
  592. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_coord_test.py +0 -0
  593. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_coord_test_runner_baseline.py +0 -0
  594. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_coord_test_runner_routing.py +0 -0
  595. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_coord_test_runner_toolchain.py +0 -0
  596. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_coord_web_sse_restart_live.py +0 -0
  597. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_coordinator_machine.py +0 -0
  598. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_cross_platform_imports.py +0 -0
  599. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_dashboard.py +0 -0
  600. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_dashboard_fixture.py +0 -0
  601. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_dashboard_terminal.py +0 -0
  602. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_dashboard_terminal_live.py +0 -0
  603. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_db.py +0 -0
  604. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_deploy_coord_db_backup.py +0 -0
  605. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_deploy_coord_web_dist.py +0 -0
  606. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_deploy_coord_web_rollback.py +0 -0
  607. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_deploy_drive_queue_unit.py +0 -0
  608. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_deploy_manifest.py +0 -0
  609. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_deploy_units_lane.py +0 -0
  610. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_deploy_web_unit.py +0 -0
  611. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_deps.py +0 -0
  612. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_diagnose.py +0 -0
  613. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_dispatch.py +0 -0
  614. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_dispatch_target_validation.py +0 -0
  615. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_dist_name.py +0 -0
  616. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_done_housekeeping.py +0 -0
  617. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_drive.py +0 -0
  618. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_drive_queue.py +0 -0
  619. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_drive_state.py +0 -0
  620. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_drive_tmux.py +0 -0
  621. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_epic_up_capability_detection.py +0 -0
  622. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  623. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_epic_up_image_provenance.py +0 -0
  624. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_errors.py +0 -0
  625. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_events.py +0 -0
  626. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_failure_class.py +0 -0
  627. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_filelock.py +0 -0
  628. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  629. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_fix_of_force_override.py +0 -0
  630. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_fleet_config_health.py +0 -0
  631. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_fleet_health_probes.py +0 -0
  632. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_fleet_health_snapshot.py +0 -0
  633. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_freshness.py +0 -0
  634. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_gate_a.py +0 -0
  635. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_gate_b.py +0 -0
  636. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_gate_snapshot_staleness.py +0 -0
  637. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_gates.py +0 -0
  638. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  639. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_generated_types_fixture.py +0 -0
  640. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_github_ops.py +0 -0
  641. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_goal.py +0 -0
  642. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_graph_health.py +0 -0
  643. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_graph_selfheal_absent_2237.py +0 -0
  644. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_handoff.py +0 -0
  645. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_health_checks.py +0 -0
  646. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_health_cli.py +0 -0
  647. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_health_cli_graph.py +0 -0
  648. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_health_config.py +0 -0
  649. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_health_context.py +0 -0
  650. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_health_deploy_lane_facts.py +0 -0
  651. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_health_incident_regression.py +0 -0
  652. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_health_pypi.py +0 -0
  653. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_health_registry.py +0 -0
  654. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_health_timer_active.py +0 -0
  655. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_health_toolchain.py +0 -0
  656. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_health_unit_drift.py +0 -0
  657. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_health_unit_enablement.py +0 -0
  658. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_hooks.py +0 -0
  659. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_human_attended_437.py +0 -0
  660. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_init.py +0 -0
  661. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_integration.py +0 -0
  662. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_interactive_briefing_echo.py +0 -0
  663. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_interactive_prefill_state.py +0 -0
  664. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_interactive_session_relaunch.py +0 -0
  665. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_interactive_test_verdict_backstop.py +0 -0
  666. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_interactive_token_attribution.py +0 -0
  667. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_interactive_worktree.py +0 -0
  668. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_issue_store_seam.py +0 -0
  669. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_liveness_auditor.py +0 -0
  670. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_liveness_notify.py +0 -0
  671. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_machine_pause.py +0 -0
  672. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_merge_queue.py +0 -0
  673. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_merge_verify.py +0 -0
  674. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_milestone_chat.py +0 -0
  675. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_milestone_dispatch.py +0 -0
  676. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_milestone_gate.py +0 -0
  677. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_milestone_order.py +0 -0
  678. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_milestone_seam.py +0 -0
  679. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_mock_author.py +0 -0
  680. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_model_tiering.py +0 -0
  681. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_models.py +0 -0
  682. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_models_config_labels.py +0 -0
  683. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_needs_attention.py +0 -0
  684. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_network.py +0 -0
  685. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_new_issue_chat.py +0 -0
  686. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_next_release_tag.py +0 -0
  687. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_no_direct_gh_calls.py +0 -0
  688. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_node_shim.py +0 -0
  689. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_notifier_baseline.py +0 -0
  690. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_notifier_cli.py +0 -0
  691. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_notifier_collect.py +0 -0
  692. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_notifier_config.py +0 -0
  693. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_notifier_drive_seam.py +0 -0
  694. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_notifier_isolation.py +0 -0
  695. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_notifier_predicate.py +0 -0
  696. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_notifier_quiet_hours.py +0 -0
  697. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_notifier_service.py +0 -0
  698. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_notify_drain.py +0 -0
  699. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_openapi.py +0 -0
  700. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_operational_defaults.py +0 -0
  701. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_overlap_fence.py +0 -0
  702. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_overlap_predict.py +0 -0
  703. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_packaged_deploy_units.py +0 -0
  704. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_parentage.py +0 -0
  705. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_paste_landed.py +0 -0
  706. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_pipeline.py +0 -0
  707. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_plan_followup_approve_plan_command.py +0 -0
  708. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_plan_followup_pr_command.py +0 -0
  709. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_plan_followup_review_command.py +0 -0
  710. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_plan_only.py +0 -0
  711. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_plan_parser.py +0 -0
  712. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_platform_paths.py +0 -0
  713. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_portal_bridge.py +0 -0
  714. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_portal_config.py +0 -0
  715. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_portal_sync.py +0 -0
  716. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_pr_body_lint.py +0 -0
  717. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_prereqs.py +0 -0
  718. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_production_db_guard.py +0 -0
  719. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_progress.py +0 -0
  720. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_provider_seam.py +0 -0
  721. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_providers.py +0 -0
  722. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_providers_config_labels.py +0 -0
  723. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_providers_pty.py +0 -0
  724. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_quiet_hours.py +0 -0
  725. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_quiet_hours_store_2146.py +0 -0
  726. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_reap_merged_sessions.py +0 -0
  727. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_reap_stale_interactive_tick.py +0 -0
  728. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_reconcile_branch.py +0 -0
  729. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_reconcile_completions.py +0 -0
  730. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_reconcile_merges.py +0 -0
  731. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_reconcile_usage_limit_done.py +0 -0
  732. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_refine_chat.py +0 -0
  733. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_release_cordon_2101.py +0 -0
  734. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  735. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_release_cordon_deadlock_2240.py +0 -0
  736. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_release_propagate.py +0 -0
  737. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_release_unified_1242.py +0 -0
  738. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_release_verify.py +0 -0
  739. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_release_window.py +0 -0
  740. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_remote_auto_prune.py +0 -0
  741. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_remote_interactive_reaper.py +0 -0
  742. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_repo_edit_2220.py +0 -0
  743. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_repo_graph_fleet_2237.py +0 -0
  744. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_repo_onboard_2220.py +0 -0
  745. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_report_result_push.py +0 -0
  746. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_reports.py +0 -0
  747. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_retry.py +0 -0
  748. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_retry_advisory_1606.py +0 -0
  749. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_retry_type_1636.py +0 -0
  750. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_revalidate.py +0 -0
  751. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_review.py +0 -0
  752. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_review_end_review_without_verdict.py +0 -0
  753. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_review_parse_failure_diagnostic.py +0 -0
  754. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_review_reaffirm.py +0 -0
  755. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_review_state.py +0 -0
  756. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_review_verdict_backstop.py +0 -0
  757. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_review_verdict_override_audit.py +0 -0
  758. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_review_verdict_relay.py +0 -0
  759. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_review_zero_commits.py +0 -0
  760. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_scoped_review_wiring.py +0 -0
  761. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_scorecard.py +0 -0
  762. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_serve.py +0 -0
  763. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_serve_app_board_trim.py +0 -0
  764. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_session.py +0 -0
  765. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_slice_issue_attribution.py +0 -0
  766. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_smoke_live_checkout_restore.py +0 -0
  767. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_smoke_workflow.py +0 -0
  768. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_spend_ceiling.py +0 -0
  769. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_spend_ceiling_coordinator.py +0 -0
  770. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_split.py +0 -0
  771. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_split_work.py +0 -0
  772. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_stage_projection.py +0 -0
  773. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_stalled_pipeline.py +0 -0
  774. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_state.py +0 -0
  775. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_state_review_findings_daemon.py +0 -0
  776. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_status_fleet_footer.py +0 -0
  777. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_stop_1567.py +0 -0
  778. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_stuck.py +0 -0
  779. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_terminal_command.py +0 -0
  780. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_test_author.py +0 -0
  781. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_test_chat.py +0 -0
  782. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_test_orchestrator.py +0 -0
  783. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_test_report.py +0 -0
  784. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_test_verdict_parsing.py +0 -0
  785. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_test_verdict_transcript_floor.py +0 -0
  786. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_thin_client_board_audit.py +0 -0
  787. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_thin_client_config_load_1080.py +0 -0
  788. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_thin_client_daemon_routing_906.py +0 -0
  789. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_tmux_host.py +0 -0
  790. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_tmux_session.py +0 -0
  791. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_transcript_floor.py +0 -0
  792. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_usage.py +0 -0
  793. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_usage_limits.py +0 -0
  794. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_usage_rollup.py +0 -0
  795. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_venv_live_install_2121.py +0 -0
  796. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_version_single_source.py +0 -0
  797. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_watch.py +0 -0
  798. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_worker_events.py +0 -0
  799. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_worker_image_pin_sync.py +0 -0
  800. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_worker_safety.py +0 -0
  801. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_worker_test_scoping.py +0 -0
  802. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_worktree.py +0 -0
  803. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  804. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/Cargo.lock +0 -0
  805. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/Cargo.toml +0 -0
  806. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/cargo-config-local-quadraui.toml.example +0 -0
  807. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/audit.rs +0 -0
  808. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/chat.rs +0 -0
  809. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/data.rs +0 -0
  810. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/dialogs.rs +0 -0
  811. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/drive.rs +0 -0
  812. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/drive_queue.rs +0 -0
  813. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/escalation.rs +0 -0
  814. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/events.rs +0 -0
  815. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/fixtures.rs +0 -0
  816. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/fleet_health.rs +0 -0
  817. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/fleet_sessions.rs +0 -0
  818. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/fleet_terminals.rs +0 -0
  819. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/format.rs +0 -0
  820. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/milestone_dag.rs +0 -0
  821. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/mod.rs +0 -0
  822. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/msv.rs +0 -0
  823. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/pipeline.rs +0 -0
  824. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/plans.rs +0 -0
  825. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/render.rs +0 -0
  826. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/reports.rs +0 -0
  827. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/sessions.rs +0 -0
  828. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/settings_ui.rs +0 -0
  829. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/sidebar.rs +0 -0
  830. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/terminal.rs +0 -0
  831. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/tests.rs +0 -0
  832. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/types.rs +0 -0
  833. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/app/workspace.rs +0 -0
  834. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/bin/gtk.rs +0 -0
  835. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/commands.rs +0 -0
  836. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/lib.rs +0 -0
  837. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/main.rs +0 -0
  838. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/src/settings.rs +0 -0
  839. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/tests/acceptance.rs +0 -0
  840. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/tests/cli.rs +0 -0
  841. {code_coordinator-0.5.96 → code_coordinator-0.5.98}/tui/tests/fixtures/board_sample.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.96
3
+ Version: 0.5.98
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.96
3
+ Version: 0.5.98
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
@@ -674,6 +674,7 @@ tests/test_reap_stale_interactive_tick.py
674
674
  tests/test_reconcile_branch.py
675
675
  tests/test_reconcile_completions.py
676
676
  tests/test_reconcile_merges.py
677
+ tests/test_reconcile_no_agent_record.py
677
678
  tests/test_reconcile_usage_limit_done.py
678
679
  tests/test_refine_chat.py
679
680
  tests/test_release_cordon_2101.py
@@ -704,6 +704,7 @@
704
704
  "tests/test_reconcile_branch.py",
705
705
  "tests/test_reconcile_completions.py",
706
706
  "tests/test_reconcile_merges.py",
707
+ "tests/test_reconcile_no_agent_record.py",
707
708
  "tests/test_reconcile_usage_limit_done.py",
708
709
  "tests/test_refine_chat.py",
709
710
  "tests/test_release_cordon_2101.py",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.96",
2
+ "tag": "0.5.98",
3
3
  "distance": 0,
4
- "node": "g312293364325c98de0888c4de55e3f5f168662dd",
4
+ "node": "g57c1800a85c41bb5fbc62251d3bb942c842a6062",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-15"
@@ -232,26 +232,55 @@ def detect_dead_end(state, *, can_waive_test_gate: bool = False) -> DeadEnd | No
232
232
  gates=_gates(state),
233
233
  )
234
234
 
235
- # ── shape 2: the Test stage is BLOCKED (#1672) ─────────────────────────
235
+ # ── shape 2: the Test stage is BLOCKED (#1672/#2272) ───────────────────
236
236
  # `dispatch_smoke` stamps `test_state="blocked"` when no capability-
237
237
  # matched machine could run the suite, and then REFUSES to re-probe on
238
238
  # every tick — deliberately, that spin is what #1672 closed. So the
239
239
  # driver polling for a verdict is polling for something the dispatcher
240
240
  # has already decided not to produce. vimcode#635's shape, in the one
241
241
  # variant the board makes provable.
242
+ #
243
+ # #2272 parks the SAME value for a second, unrelated cause: N Test-stage
244
+ # legs in a row finished without printing a `SMOKE:` marker and the retry
245
+ # budget ran out. Both are "no verdict is coming", which is why they
246
+ # share a state — but the recovery is completely different (fix the fleet
247
+ # vs. find out why the worker went mute, usually the 600s Bash ceiling),
248
+ # so they must not share a REASON. Telling the operator "no capability-
249
+ # matched machine" about a row whose machines were fine all along is the
250
+ # symptom-not-cause failure #2235 exists to measure, and it is one
251
+ # `mute_smoke_legs` call away from being avoided.
242
252
  if state.work_test_state == TEST_STATE_BLOCKED:
243
- return DeadEnd(
244
- kind="test_stage_blocked",
245
- stage="test",
246
- reason=(
247
- f"the Test stage for {state.work_aid} is BLOCKED: "
248
- f"{state.work_test_reason or 'no reason recorded'} "
253
+ from coord.smoke import mute_smoke_legs # noqa: PLC0415
254
+
255
+ mute_legs = mute_smoke_legs(state.work_test_reason)
256
+ if mute_legs:
257
+ cause = (
258
+ f"{mute_legs} Test-stage leg(s) in a row finished without "
259
+ "printing a `SMOKE:` verdict marker, exhausting the retry "
260
+ "budget, so coord.notify parked the row rather than "
261
+ "re-dispatching a cause that had already repeated identically "
262
+ "every lap (#2272). Nothing is known to be wrong with the "
263
+ "BRANCH — the commonest cause is the smoke command exceeding "
264
+ "the worker's 600s Bash ceiling, which backgrounds the run "
265
+ "and leaves the session with no exit status to report. Check "
266
+ "the last Test-stage transcript for a backgrounded command "
267
+ "before you blame the diff."
268
+ )
269
+ else:
270
+ cause = (
249
271
  "coord.smoke.dispatch_smoke found no capability-matched "
250
272
  "machine and recorded 'blocked' rather than re-probing a "
251
273
  "broken fleet on every tick (#1672). It will not try again "
252
274
  "on its own, so waiting for a verdict here waits forever "
253
275
  "(#2019). Fix the fleet (or the capability rules), then "
254
276
  "clear the marker."
277
+ )
278
+ return DeadEnd(
279
+ kind="test_stage_blocked",
280
+ stage="test",
281
+ reason=(
282
+ f"the Test stage for {state.work_aid} is BLOCKED: "
283
+ f"{state.work_test_reason or 'no reason recorded'} — {cause}"
255
284
  ),
256
285
  recovery=(
257
286
  f"coord diagnose {state.repo} {state.issue} --stage test --reset"
@@ -52,6 +52,16 @@ from coord.dispatch import (
52
52
  post_refused_policy,
53
53
  )
54
54
  from coord.progress import parse_progress
55
+
56
+ # #2272: the mute-Test-stage retry budget. Canonically in `coord.smoke`
57
+ # because `dispatch_smoke` is the writer that has to carry the tally across
58
+ # its own `running` stamp — a second definition here is exactly how the
59
+ # counter and the thing that clobbers it drift apart again. Safe as a
60
+ # module-level import: `coord.smoke` reaches config/dispatch/models/revalidate
61
+ # and none of them import this module.
62
+ from coord.smoke import MUTE_SMOKE_LEG_BUDGET, TEST_STATE_BLOCKED
63
+ from coord.smoke import NO_SMOKE_VERDICT_MARKER as _NO_SMOKE_VERDICT_MARKER
64
+ from coord.smoke import mute_smoke_legs, mute_smoke_tally
55
65
  from coord.state import (
56
66
  load_dispatched,
57
67
  load_done_reviews_needing_post,
@@ -1776,7 +1786,12 @@ def _smoke_worker_verdict(
1776
1786
  #: ``test_reason`` when a headless smoke produced no parseable verdict. Read
1777
1787
  #: back on the NEXT such reap to decide between "park for one automatic
1778
1788
  #: re-dispatch" and "block, an operator has to look" — see below.
1779
- NO_SMOKE_VERDICT_MARKER = "no-verdict (#2244)"
1789
+ #:
1790
+ #: #2272: canonically defined in :mod:`coord.smoke` (imported at the top of
1791
+ #: this module), next to `dispatch_smoke` — the function that has to carry the
1792
+ #: tally across its own ``running`` stamp for this counter to survive at all.
1793
+ #: Re-bound here because this is the name the reap path has always used.
1794
+ NO_SMOKE_VERDICT_MARKER = _NO_SMOKE_VERDICT_MARKER
1780
1795
 
1781
1796
 
1782
1797
  def _record_smoke_verdict(
@@ -1885,50 +1900,70 @@ def _record_smoke_verdict(
1885
1900
  return
1886
1901
 
1887
1902
  # No verdict line, clean session exit. NOT a pass.
1903
+ #
1904
+ # #2272: count the legs, don't just test for the marker's presence. The
1905
+ # tally lives at the FRONT of `test_reason` so a bounded `/board` preview
1906
+ # still carries it, and `dispatch_smoke` re-states it across the `running`
1907
+ # stamp that used to erase it. Together those two make this a real budget
1908
+ # rather than the never-firing one #2244 intended.
1888
1909
  previous_reason = load_assignment_test_reason(parent_id) or ""
1889
- already_mute_once = NO_SMOKE_VERDICT_MARKER in previous_reason
1910
+ legs = mute_smoke_legs(previous_reason) + 1
1890
1911
  reason = (
1891
- f"{NO_SMOKE_VERDICT_MARKER}: the Test-stage worker "
1912
+ f"{mute_smoke_tally(legs)}: the Test-stage worker "
1892
1913
  f"{transition.assignment_id} ended without printing a verdict marker "
1893
1914
  "line, and a `claude -p` exit code says only that the session ended — "
1894
1915
  "it is not a suite result."
1895
1916
  )
1896
- if already_mute_once:
1917
+ if legs >= MUTE_SMOKE_LEG_BUDGET:
1897
1918
  # The same park value `dispatch_smoke` uses for an unroutable stage
1898
1919
  # (#1672): every gate that wants "passed"/"skipped" keeps the merge
1899
1920
  # shut, `dispatch_pending_smoke` stops re-dispatching, and no fix
1900
1921
  # round is burned on a branch nothing has found fault with.
1901
- from coord.smoke import TEST_STATE_BLOCKED # noqa: PLC0415
1902
-
1922
+ #
1923
+ # #2272: the terminal reason NAMES the cause and the count. "N smoke
1924
+ # legs produced no verdict" is a statement an operator can act on; the
1925
+ # five-lap incident presented as "the branch is slow" precisely
1926
+ # because nothing on the row ever said how many legs had gone mute.
1903
1927
  record_test_verdict(
1904
1928
  assignment_id=parent_id,
1905
1929
  test_state=TEST_STATE_BLOCKED,
1906
1930
  test_reason=(
1907
- f"{reason} Second consecutive mute Test stageparked instead "
1908
- "of re-dispatched. Recover with `coord diagnose <repo> <issue> "
1909
- "--stage test --reset`, or record the verdict by hand with "
1910
- f"`coord test --passed|--fail {parent_id}`."
1931
+ f"{reason} {legs} smoke legs produced no verdict the "
1932
+ f"Test-stage retry budget ({MUTE_SMOKE_LEG_BUDGET}) is "
1933
+ "exhausted, so the row is parked instead of re-dispatched "
1934
+ "(#2272). A mute leg is not a failing branch: check whether "
1935
+ "the smoke command is exceeding the worker's 600s Bash "
1936
+ "ceiling before you blame the diff. Recover with `coord "
1937
+ "diagnose <repo> <issue> --stage test --reset`, or record the "
1938
+ f"verdict by hand with `coord test --passed|--fail "
1939
+ f"{parent_id}`."
1911
1940
  ),
1912
1941
  )
1913
1942
  log.warning(
1914
- "smoke %s: no SMOKE: verdict in the transcript for the SECOND "
1915
- "time on parent %s parking test_state='blocked' (#2244).",
1916
- transition.assignment_id, parent_id,
1943
+ "smoke %s: no SMOKE: verdict in the transcript that is %d mute "
1944
+ "Test-stage leg(s) on parent %s and the retry budget (%d) is "
1945
+ "exhausted, so parking test_state=%r instead of re-dispatching "
1946
+ "(#2272). Check the worker's 600s Bash ceiling first.",
1947
+ transition.assignment_id, legs, parent_id, MUTE_SMOKE_LEG_BUDGET,
1948
+ TEST_STATE_BLOCKED,
1917
1949
  )
1918
1950
  return
1919
1951
 
1952
+ remaining = MUTE_SMOKE_LEG_BUDGET - legs
1920
1953
  record_test_verdict(
1921
1954
  assignment_id=parent_id,
1922
1955
  test_state=None,
1923
1956
  test_reason=(
1924
- f"{reason} Cleared for one automatic Test-stage re-dispatch; a "
1925
- "second mute run parks the row instead."
1957
+ f"{reason} Cleared for a Test-stage re-dispatch; {remaining} of "
1958
+ f"{MUTE_SMOKE_LEG_BUDGET} legs left in the budget before the row "
1959
+ "parks instead (#2272)."
1926
1960
  ),
1927
1961
  )
1928
1962
  log.warning(
1929
1963
  "smoke %s: no SMOKE: verdict in the transcript — recording NO verdict "
1930
- "for parent %s (cleared for re-dispatch), never 'passed' (#2244).",
1931
- transition.assignment_id, parent_id,
1964
+ "for parent %s (mute leg %d of %d, cleared for re-dispatch), never "
1965
+ "'passed' (#2244).",
1966
+ transition.assignment_id, parent_id, legs, MUTE_SMOKE_LEG_BUDGET,
1932
1967
  )
1933
1968
 
1934
1969
 
@@ -10,7 +10,7 @@ import httpx
10
10
 
11
11
  from typing import TYPE_CHECKING
12
12
 
13
- from coord.config import Config
13
+ from coord.config import INTERACTIVE_SESSION_TYPES, Config
14
14
  from coord.dispatch import AGENT_PORT
15
15
  from coord.models import WORK_LIKE_TYPES, Assignment, Board, Machine
16
16
 
@@ -49,6 +49,120 @@ _AGENT_TERMINAL_STATUS = {
49
49
  }
50
50
 
51
51
 
52
+ # ── #2275: the agent has no record of this assignment ──────────────────────
53
+ #
54
+ # Pinned reason string, written verbatim to `assignments.failure_reason` when
55
+ # the no-record arm below reconciles a row. Asserted on by
56
+ # `tests/test_reconcile_no_agent_record.py` and (deliberately) the only thing
57
+ # a human or a downstream reader has to grep for to understand why a row went
58
+ # terminal without a worker verdict.
59
+ NO_AGENT_RECORD_REASON = (
60
+ "agent has no record of this assignment (present in neither its /status "
61
+ "`active` nor `completed` list) — the worker process is gone: the agent "
62
+ "restarted with its state lost, the machine rebooted, or the completion "
63
+ "rolled off the capped history before anything observed it (#2275)"
64
+ )
65
+
66
+ # Minimum age (seconds since `dispatched_at`) before the no-record arm will
67
+ # reconcile a row.
68
+ #
69
+ # The positive disproof — "in neither list" — is what makes this arm safe;
70
+ # this window is the belt to its braces, and exists for exactly one shape:
71
+ # `AgentServer.assign()` builds the worktree BEFORE taking `self._lock` to
72
+ # insert into `self._assignments` (see the identical race window called out in
73
+ # `clean_worktrees`). Any dispatch path that learns an assignment id and
74
+ # writes a `running` board row without waiting for that insert would otherwise
75
+ # hand this arm a row the agent genuinely will know about a moment later. Two
76
+ # minutes is orders of magnitude longer than that window and orders of
77
+ # magnitude shorter than the 11 hours #2208 burned, so it costs nothing real.
78
+ #
79
+ # It is NOT a restart grace window — see `reconcile_completed_assignments`'
80
+ # docstring for why an agent restart does not produce a mass reap.
81
+ _NO_RECORD_GRACE_SECONDS = 120.0
82
+
83
+
84
+ def is_attended_session(a: object) -> bool:
85
+ """True when *a* is a human-attended session, not an agent subprocess (#2275).
86
+
87
+ The exclusion that keeps the no-record arm in
88
+ :func:`reconcile_completed_assignments` from reaping live work. An
89
+ attended session is launched into tmux/a PTY by ``coord assign
90
+ --interactive`` — it is not an agent subprocess, so it appears in NEITHER
91
+ the agent's ``active`` list NOR its ``completed`` list, for its whole
92
+ life. Without this check the no-record arm would reap every attended
93
+ session the moment it started, which is the #1658 failure mode (reaping
94
+ live headless workers) pointed at a human's own terminal.
95
+
96
+ Two independent discriminators, either of which is sufficient — this is a
97
+ reaping path, so it is deliberately over-inclusive:
98
+
99
+ * ``provider_name == "claude-pty"`` — stamped by every ``--interactive``
100
+ dispatch (the same discriminator :func:`is_interactive_merge_session`
101
+ and :meth:`coord.config.PipelineConfig.attention_threshold_for` use).
102
+ This is the load-bearing one: an interactive ``--fix-of``/
103
+ ``--review-of``/``--smoke-of`` session shares its ``type`` with a
104
+ headless counterpart, so only ``provider_name`` tells them apart.
105
+ * ``type in`` :data:`coord.config.INTERACTIVE_SESSION_TYPES` — the
106
+ chat/troubleshoot/audit/refinement family, which has no headless
107
+ counterpart at all and never goes near an agent.
108
+
109
+ Dead attended sessions are reaped by their own path
110
+ (:func:`coord.interactive.reap_stale_interactive_sessions`, called from
111
+ :func:`reconcile`), which probes the actual tmux server rather than
112
+ inferring death from an agent's silence. That is the correct instrument
113
+ for them; this one must stay out of the way.
114
+ """
115
+ if getattr(a, "provider_name", None) == "claude-pty":
116
+ return True
117
+ return getattr(a, "type", None) in INTERACTIVE_SESSION_TYPES
118
+
119
+
120
+ def agent_has_no_record(status: dict, assignment_id: str) -> bool:
121
+ """True when *status* positively shows the agent knows nothing of *assignment_id*.
122
+
123
+ #2275's whole point: ``/status`` carries ``active`` (everything the agent
124
+ has a live subprocess for) and ``completed`` (its capped terminal
125
+ history). An id in NEITHER is a **positive statement** about the agent's
126
+ state — "no record" — not an inference from silence, which is what the
127
+ old ``entry is None → continue`` conflated with "still running".
128
+
129
+ Fail-open on a payload that doesn't carry both keys. A response missing
130
+ ``active`` cannot support the disproof (we would be inferring from
131
+ absence again, exactly the bug), so it is treated as "cannot tell" and
132
+ the caller leaves the row alone. This also means an older agent build,
133
+ or any future ``/status`` variant, degrades to today's behaviour rather
134
+ than to a reap.
135
+ """
136
+ if not isinstance(status, dict):
137
+ return False
138
+ active = status.get("active")
139
+ completed = status.get("completed")
140
+ if not isinstance(active, list) or not isinstance(completed, list):
141
+ return False
142
+ for entries in (active, completed):
143
+ for e in entries:
144
+ if isinstance(e, dict) and e.get("id") == assignment_id:
145
+ return False
146
+ return True
147
+
148
+
149
+ def _no_record_grace_elapsed(a: Assignment, *, now: float | None = None) -> bool:
150
+ """True when *a* is old enough for the no-record arm (:data:`_NO_RECORD_GRACE_SECONDS`).
151
+
152
+ A row with no ``dispatched_at`` at all is eligible: the grace window
153
+ guards a dispatch-time race, and a row that never recorded a dispatch
154
+ time is not in one.
155
+ """
156
+ dispatched_at = getattr(a, "dispatched_at", None)
157
+ if not dispatched_at:
158
+ return True
159
+ try:
160
+ dispatched = float(dispatched_at)
161
+ except (TypeError, ValueError):
162
+ return True
163
+ return (time.time() if now is None else now) - dispatched >= _NO_RECORD_GRACE_SECONDS
164
+
165
+
52
166
  def effective_agent_status(entry: dict) -> str:
53
167
  """The agent-reported status for *entry*, with #1534's ``done`` refusal.
54
168
 
@@ -143,7 +257,49 @@ def reconcile_completed_assignments(
143
257
 
144
258
  Interactive sessions are tmux launches, not agent subprocesses, so they
145
259
  never appear in the agent's ``completed`` list — a live attended session
146
- can't be reaped by this path.
260
+ can't be reaped by this path. #2275 made that a CHECKED property rather
261
+ than an emergent one: see :func:`is_attended_session`.
262
+
263
+ **#2275 — the second reconcile arm: "the agent has no record of it".**
264
+ Until #2275 this function only ever acted on a row it found in the agent's
265
+ ``completed`` history. Anything else hit a bare ``continue`` whose comment
266
+ read *"still active on the agent (or rolled off history) → leave it"* —
267
+ two cases with opposite correct handling, conflated, both left. That is
268
+ not a race: ``_COMPLETED_HISTORY_CAP`` is 25, so a leg that dies needs only
269
+ 25 further completions on its machine before its id is gone from
270
+ ``/status``, after which nothing on the daemon's 30s clock would ever look
271
+ at that row again. It cost claude-coordinator#2208 8 hours and both drive
272
+ attempts on an already-green branch; a human running ``coord status``
273
+ cleared it, and the branch was merge-READY 14 minutes later.
274
+
275
+ The fix is a positive disproof: ``/status`` carries both ``active`` and
276
+ ``completed``, and an id in NEITHER is a statement about the agent's state,
277
+ not an inference from its silence. Those — and only those — are
278
+ reconciled, to ``failed`` (never ``done``) with :data:`NO_AGENT_RECORD_
279
+ REASON`. See :func:`agent_has_no_record` and
280
+ :func:`_reconcile_no_agent_record`.
281
+
282
+ Three guards, because **this arm reaps** and #1658 is what getting that
283
+ wrong looks like in production:
284
+
285
+ 1. :func:`is_attended_session` — attended sessions appear in neither list
286
+ for their whole life. Reaping them is the regression that costs real
287
+ work; :func:`coord.interactive.reap_stale_interactive_sessions` owns
288
+ them, and it probes tmux rather than guessing.
289
+ 2. An unreachable agent still short-circuits at ``if not status`` above,
290
+ unweakened. **No record and no answer are different things.**
291
+ 3. :data:`_NO_RECORD_GRACE_SECONDS` since ``dispatched_at``.
292
+
293
+ On **agent restart** (the ``coord agent update`` roll) this is deliberately
294
+ NOT a mass reap, and not because of the grace window: ``AgentServer.
295
+ _load_state`` restores the persisted assignments and rewrites every
296
+ ``pending``/``running`` one to ``failed`` with *"agent restarted;
297
+ subprocess lost"* before the first ``/status`` is served. Those rows are
298
+ therefore IN ``completed``, and the ordinary path above handles them with a
299
+ real reason. Genuinely-empty ``active`` + ``completed`` means the agent
300
+ lost its state file too (fresh install, corrupt state moved aside by
301
+ #1421's handler) — and there the workers really are gone, so reconciling
302
+ every row on that machine is the correct answer rather than an accident.
147
303
 
148
304
  Returns one dict per reconciled assignment (empty when nothing changed).
149
305
  """
@@ -182,7 +338,22 @@ def reconcile_completed_assignments(
182
338
  None,
183
339
  )
184
340
  if entry is None:
185
- continue # still active on the agent (or rolled off history) → leave it
341
+ # #2275: NOT in `completed` has two causes with OPPOSITE correct
342
+ # handling — "still running on the agent" (leave it) and "the
343
+ # agent has no record of it at all" (reconcile it). This used to
344
+ # be a bare `continue` that named both cases in a comment and
345
+ # then left both, so a row in the second case was re-skipped every
346
+ # 30s forever while `status` read `running` (#2208: 8 hours and
347
+ # both drive attempts burned on an already-green branch).
348
+ # `agent_has_no_record` tells them apart from the `active` list —
349
+ # a positive disproof, not an inference from silence.
350
+ if (
351
+ agent_has_no_record(status, aid)
352
+ and not is_attended_session(a)
353
+ and _no_record_grace_elapsed(a)
354
+ ):
355
+ _reconcile_no_agent_record(a, aid, update_state_fn, reconciled)
356
+ continue
186
357
  # #1534: `effective_agent_status` refuses an agent-reported `done`
187
358
  # that also carries a usage-limit-kill reason — the daemon's passive
188
359
  # tick is the FIRST place most completions are observed, so without
@@ -325,8 +496,83 @@ def reconcile_completed_assignments(
325
496
  return reconciled
326
497
 
327
498
 
499
+ def _reconcile_no_agent_record(
500
+ a: Assignment,
501
+ aid: str,
502
+ update_state_fn,
503
+ reconciled: list[dict],
504
+ ) -> None:
505
+ """#2275: flip a ``running`` row the agent has no record of to ``failed``.
506
+
507
+ Called from :func:`reconcile_completed_assignments` only, and only once
508
+ all three guards there have passed (positive disproof, not attended, past
509
+ the grace window).
510
+
511
+ **``failed``, never ``done``.** This leg never reported a verdict, so the
512
+ one thing that must not happen is a silent flip to ``done`` — that
513
+ manufactures a pass and every downstream gate (review dispatch, the
514
+ acceptance gate, the merge queue) then behaves as if a slice exists that
515
+ nobody ever produced. A stall is bad; a manufactured pass is worse.
516
+ ``failure_reason`` is the pinned :data:`NO_AGENT_RECORD_REASON`, so
517
+ ``coord status``/the TUI/``coord drive`` all name the cause rather than
518
+ showing a failure with no explanation.
519
+
520
+ ``exit_code`` is deliberately left ``None``: there is no reap, so there is
521
+ no exit code, and writing a fake one would be the same class of lie as
522
+ writing ``done``.
523
+
524
+ Kept passive, per this module's #1616 contract — it writes state through
525
+ the same ``update_state_fn`` seam and dispatches nothing. The ONE thing
526
+ it does beyond the write is the #1605 Test-stage propagation, which is not
527
+ a new side effect: it is the same call the ordinary ``terminal ==
528
+ "failed"`` path already makes, and skipping it would leave the parent
529
+ work row's ``test_state="running"`` forever — i.e. it would fix half of
530
+ #2208 and leave the other half stranded.
531
+ """
532
+ update_state_fn(
533
+ assignment_id=aid,
534
+ terminal_status="failed",
535
+ branch=a.branch,
536
+ review_state=None,
537
+ failure_reason=NO_AGENT_RECORD_REASON,
538
+ exit_code=None,
539
+ )
540
+
541
+ if a.type == "smoke":
542
+ # #2275: environmental by construction, so state it rather than
543
+ # letting `classify_failure` guess. `NO_AGENT_RECORD_REASON` is
544
+ # coordinator-authored prose with no wire token in it, so the
545
+ # classifier would (correctly, by its own "default to work" rule)
546
+ # call it a WORK failure and record `test_state="failed"` — which
547
+ # spends a bounded `coord fix` round chasing a code defect that never
548
+ # existed, on a branch that in #2208's case was already green. A
549
+ # vanished worker is the machine's fault, not the work's; clearing
550
+ # the verdict lets `dispatch_pending_smoke` re-run the Test stage on
551
+ # its next tick, which is exactly what a human did in 14 minutes.
552
+ propagate_smoke_terminal_failure(
553
+ parent_assignment_id=a.review_of_assignment_id,
554
+ failure_reason=NO_AGENT_RECORD_REASON,
555
+ environmental=True,
556
+ )
557
+
558
+ reconciled.append(
559
+ {
560
+ "assignment_id": aid,
561
+ "issue_number": a.issue_number,
562
+ "repo": a.repo_name,
563
+ "type": a.type,
564
+ "to_status": "failed",
565
+ "plan_captured": False,
566
+ "reason": NO_AGENT_RECORD_REASON,
567
+ }
568
+ )
569
+
570
+
328
571
  def propagate_smoke_terminal_failure(
329
- *, parent_assignment_id: str | None, failure_reason: str | None,
572
+ *,
573
+ parent_assignment_id: str | None,
574
+ failure_reason: str | None,
575
+ environmental: bool | None = None,
330
576
  ) -> None:
331
577
  """#1605: resolve a work row's ``test_state`` when its Test-stage
332
578
  (``type="smoke"``) child dies without ever reporting pass/fail.
@@ -358,6 +604,17 @@ def propagate_smoke_terminal_failure(
358
604
  completion already does (`coord/notify.py`'s completion handler), so
359
605
  the existing bounded `coord fix` loop picks it up from there.
360
606
 
607
+ *environmental* (#2275) overrides that classification when the CALLER
608
+ already knows the answer. Default ``None`` means "classify from
609
+ *failure_reason*", i.e. every pre-#2275 caller is unchanged. Pass
610
+ ``True`` only when the reason is coordinator-authored prose describing a
611
+ lost worker rather than a worker's own terminal output — the classifier's
612
+ vocabulary is deliberately restricted to named API/network wire tokens
613
+ (see :mod:`coord.failure_class`) and correctly defaults everything else to
614
+ WORK, so a call site that *knows* the machine ate the worker has to say
615
+ so rather than smuggle a token into its prose. The only such caller today
616
+ is :func:`_reconcile_no_agent_record`.
617
+
361
618
  A no-op when *parent_assignment_id* is falsy (a smoke row somehow
362
619
  missing its ``review_of_assignment_id`` — should not happen in practice,
363
620
  but this must never raise on it).
@@ -365,16 +622,40 @@ def propagate_smoke_terminal_failure(
365
622
  if not parent_assignment_id:
366
623
  return
367
624
  from coord.failure_class import classify_failure # noqa: PLC0415
368
- from coord.state import record_test_verdict # noqa: PLC0415
625
+ from coord.smoke import mute_smoke_legs, mute_smoke_tally # noqa: PLC0415
626
+ from coord.state import ( # noqa: PLC0415
627
+ load_assignment_test_reason,
628
+ record_test_verdict,
629
+ )
369
630
 
370
631
  classification = classify_failure(failure_reason=failure_reason)
371
- if classification.is_environmental:
632
+ if environmental is None:
633
+ is_environmental = classification.is_environmental
634
+ cause = classification.reason
635
+ else:
636
+ is_environmental = bool(environmental)
637
+ cause = failure_reason or classification.reason
638
+ if is_environmental:
639
+ # #2272: this clear must CARRY the mute-leg tally, for exactly the
640
+ # reason `dispatch_smoke`'s `running` stamp must. `test_reason` is the
641
+ # only field that survives between Test-stage legs, so any writer that
642
+ # replaces it wholesale silently hands the row a fresh retry budget —
643
+ # and a row that alternates "mute leg" / "worker died environmentally"
644
+ # would then never reach the bound from either side. The tally is not
645
+ # incremented here (an environmental death is a different, genuinely
646
+ # self-healing cause and #1605's unbounded re-dispatch of it is
647
+ # deliberate) — it is only preserved, so mute legs keep counting
648
+ # across it.
649
+ carried = mute_smoke_legs(
650
+ load_assignment_test_reason(parent_assignment_id)
651
+ )
652
+ prefix = f"{mute_smoke_tally(carried)} — " if carried else ""
372
653
  record_test_verdict(
373
654
  assignment_id=parent_assignment_id,
374
655
  test_state=None,
375
656
  test_reason=(
376
- "Test stage worker died environmentally "
377
- f"({classification.reason}) — cleared for automatic "
657
+ f"{prefix}Test stage worker died environmentally "
658
+ f"({cause}) — cleared for automatic "
378
659
  "re-dispatch, not recorded as a work failure (#1605)"
379
660
  ),
380
661
  )