code-coordinator 0.5.111__tar.gz → 0.5.113__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 (845) hide show
  1. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/code_coordinator.egg-info/SOURCES.txt +1 -0
  4. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/code_coordinator.egg-info/scm_file_list.json +1 -0
  5. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/code_coordinator.egg-info/scm_version.json +2 -2
  6. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/_board_mapping.py +3 -0
  7. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/agent.py +104 -1
  8. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/api/generated.ts +1 -0
  9. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/db.py +13 -0
  10. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/models.py +21 -0
  11. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/notify.py +18 -0
  12. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/reconcile.py +47 -0
  13. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/serve_app.py +5 -0
  14. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/state.py +50 -0
  15. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/worker_events.py +100 -8
  16. code_coordinator-0.5.113/tests/fixtures/opencode_run_length_sample.jsonl +5 -0
  17. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_agent.py +74 -0
  18. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_agent_zero_commit.py +200 -0
  19. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cargo_cache.py +18 -0
  20. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_serve.py +18 -0
  21. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_state.py +105 -0
  22. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_worker_events.py +209 -0
  23. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/tests/fixtures/board_sample.json +3 -0
  24. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/.claude/commands/board.md +0 -0
  25. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/.claude/commands/complete-session.md +0 -0
  26. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/.claude/commands/coordinator.md +0 -0
  27. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/.githooks/_lib.sh +0 -0
  28. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/.githooks/post-checkout +0 -0
  29. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/.githooks/post-commit +0 -0
  30. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/.githooks/post-merge +0 -0
  31. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  32. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/.github/coord-ci-acceptance.yml +0 -0
  33. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/.github/workflows/auto-release.yml +0 -0
  34. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/.github/workflows/cargo-test.yml +0 -0
  35. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/.github/workflows/publish.yml +0 -0
  36. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/.github/workflows/release-tui.yml +0 -0
  37. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/.github/workflows/test.yml +0 -0
  38. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/.gitignore +0 -0
  39. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/CLAUDE.md +0 -0
  40. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/GOAL.md +0 -0
  41. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/LICENSE +0 -0
  42. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/MANIFEST.in +0 -0
  43. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/README.md +0 -0
  44. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/code_coordinator.egg-info/dependency_links.txt +0 -0
  45. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/code_coordinator.egg-info/entry_points.txt +0 -0
  46. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/code_coordinator.egg-info/requires.txt +0 -0
  47. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/code_coordinator.egg-info/top_level.txt +0 -0
  48. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/__init__.py +0 -0
  49. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/acceptance.py +0 -0
  50. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/acceptance_drivers.py +0 -0
  51. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/agent_app.py +0 -0
  52. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/agent_update.py +0 -0
  53. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/agents/opencode/.gitignore +0 -0
  54. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/agents/opencode/agents/work.md +0 -0
  55. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/agents/opencode/routing.jsonc +0 -0
  56. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/audit.py +0 -0
  57. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/auto_loop.py +0 -0
  58. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/block_log.py +0 -0
  59. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/board_bool_guard.py +0 -0
  60. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/board_service.py +0 -0
  61. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/board_wire.py +0 -0
  62. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/brain.py +0 -0
  63. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/branch_model.py +0 -0
  64. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/bug_intake.py +0 -0
  65. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/cargo_cache.py +0 -0
  66. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/ci_github.py +0 -0
  67. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/ci_store.py +0 -0
  68. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/claim.py +0 -0
  69. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/cli.py +0 -0
  70. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/client.py +0 -0
  71. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/commands/__init__.py +0 -0
  72. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/commands/_common.py +0 -0
  73. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/commands/acceptance.py +0 -0
  74. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/commands/agent_ops.py +0 -0
  75. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/commands/audit.py +0 -0
  76. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/commands/chat.py +0 -0
  77. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/commands/dispatch.py +0 -0
  78. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/commands/dispatch_workers.py +0 -0
  79. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/commands/drive.py +0 -0
  80. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/commands/drive_queue.py +0 -0
  81. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/commands/gate_a.py +0 -0
  82. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/commands/gates.py +0 -0
  83. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/commands/issues.py +0 -0
  84. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/commands/lifecycle.py +0 -0
  85. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/commands/merge.py +0 -0
  86. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/commands/milestone.py +0 -0
  87. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/commands/plan_followup.py +0 -0
  88. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/commands/plans.py +0 -0
  89. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/commands/portal.py +0 -0
  90. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/commands/release.py +0 -0
  91. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/commands/repo.py +0 -0
  92. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/commands/report.py +0 -0
  93. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/commands/review.py +0 -0
  94. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/commands/scorecard.py +0 -0
  95. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/commands/sessions.py +0 -0
  96. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/commands/setup.py +0 -0
  97. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/commands/status.py +0 -0
  98. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/commands/terminal.py +0 -0
  99. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/commands/test_gate.py +0 -0
  100. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/commands/tui.py +0 -0
  101. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/comments.py +0 -0
  102. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/config.py +0 -0
  103. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/config_reload.py +0 -0
  104. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/conflict_fix.py +0 -0
  105. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dao.py +0 -0
  106. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/__init__.py +0 -0
  107. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/fixture.py +0 -0
  108. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/index.html +0 -0
  109. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/server.py +0 -0
  110. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/terminal.py +0 -0
  111. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/.gitignore +0 -0
  112. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/components.json +0 -0
  113. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/dist/assets/Gallery-BoKs3mpY.js +0 -0
  114. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  115. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/dist/assets/Terminal-CEsP08iX.js +0 -0
  116. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/dist/assets/index-CDHPlB6k.js +0 -0
  117. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  118. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  119. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  120. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  121. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  122. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/dist/index.html +0 -0
  123. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  124. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/dist/sw.js +0 -0
  125. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  126. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  127. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  128. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  129. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  130. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  131. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  132. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  133. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  134. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  135. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/eslint.config.js +0 -0
  136. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/index.html +0 -0
  137. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  138. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/package-lock.json +0 -0
  139. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/package.json +0 -0
  140. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  141. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/playwright.config.ts +0 -0
  142. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/postcss.config.js +0 -0
  143. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  144. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  145. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  146. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/App.tsx +0 -0
  147. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/api/client.ts +0 -0
  148. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  149. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  150. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  151. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  152. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  153. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  154. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  155. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  156. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  157. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  158. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  159. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  160. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  161. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  162. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  163. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  164. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  165. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  166. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  167. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  168. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  169. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  170. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  171. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  172. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  173. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  174. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  175. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  176. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  177. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  178. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  179. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  180. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  181. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  182. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/index.css +0 -0
  183. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  184. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  185. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/main.tsx +0 -0
  186. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  187. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  188. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  189. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  190. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  191. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  192. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  193. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  194. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  195. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  196. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  197. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  198. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  199. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  200. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  201. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  202. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  203. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  204. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  205. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  206. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  207. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  208. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  209. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/tailwind.config.js +0 -0
  210. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/tsconfig.json +0 -0
  211. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  212. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dashboard/webapp/vite.config.ts +0 -0
  213. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dead_end.py +0 -0
  214. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/deploy/README.md +0 -0
  215. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/deploy/coord-agent.service +0 -0
  216. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/deploy/coord-db-backup.service +0 -0
  217. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/deploy/coord-db-backup.sh +0 -0
  218. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/deploy/coord-db-backup.timer +0 -0
  219. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/deploy/coord-drive-queue.service +0 -0
  220. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/deploy/coord-drive-queue.timer +0 -0
  221. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/deploy/coord-notify.service +0 -0
  222. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/deploy/coord-notify.timer +0 -0
  223. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/deploy/coord-release-propagate.service +0 -0
  224. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/deploy/coord-release-propagate.timer +0 -0
  225. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/deploy/coord-release-window.service +0 -0
  226. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/deploy/coord-release-window.timer +0 -0
  227. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/deploy/coord-serve.service +0 -0
  228. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/deploy/coord-web-dist-build.service +0 -0
  229. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/deploy/coord-web-dist-build.timer +0 -0
  230. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/deploy/coord-web.service +0 -0
  231. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/deploy_manifest.py +0 -0
  232. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/deploy_units.py +0 -0
  233. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/deps.py +0 -0
  234. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/diagnose.py +0 -0
  235. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dispatch.py +0 -0
  236. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/dist_name.py +0 -0
  237. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/drive.py +0 -0
  238. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/drive_queue.py +0 -0
  239. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/drive_state.py +0 -0
  240. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/events.py +0 -0
  241. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/failure_class.py +0 -0
  242. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/filelock.py +0 -0
  243. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/fleet_config_health.py +0 -0
  244. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/freshness.py +0 -0
  245. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/gate_a.py +0 -0
  246. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/gate_b.py +0 -0
  247. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/gate_snapshot.py +0 -0
  248. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/gates.py +0 -0
  249. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/github_ops.py +0 -0
  250. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/goal.py +0 -0
  251. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/graph_health.py +0 -0
  252. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/health/__init__.py +0 -0
  253. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/health/aggregate.py +0 -0
  254. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/health/checks/__init__.py +0 -0
  255. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/health/checks/agent_install.py +0 -0
  256. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/health/checks/cargo_targets.py +0 -0
  257. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/health/checks/claude_binary.py +0 -0
  258. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/health/checks/deploy_lane_facts.py +0 -0
  259. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/health/checks/disk.py +0 -0
  260. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/health/checks/fleet_board.py +0 -0
  261. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  262. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/health/checks/fleet_phantom.py +0 -0
  263. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/health/checks/fleet_unit_drift.py +0 -0
  264. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/health/checks/graph.py +0 -0
  265. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/health/checks/graphify_cli.py +0 -0
  266. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/health/checks/index_lock.py +0 -0
  267. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/health/checks/plan_usage.py +0 -0
  268. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/health/checks/repo_state.py +0 -0
  269. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/health/checks/spawned_coord.py +0 -0
  270. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/health/checks/timer_active.py +0 -0
  271. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/health/checks/toolchain.py +0 -0
  272. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/health/checks/unit_drift.py +0 -0
  273. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/health/checks/unit_enablement.py +0 -0
  274. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/health/checks/worktrees.py +0 -0
  275. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/health/cli.py +0 -0
  276. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/health/context.py +0 -0
  277. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/health/fleet_snapshot.py +0 -0
  278. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/health/models.py +0 -0
  279. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/health/pypi.py +0 -0
  280. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/health/registry.py +0 -0
  281. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/health/render.py +0 -0
  282. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/health/units.py +0 -0
  283. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/hooks.py +0 -0
  284. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/housekeeping.py +0 -0
  285. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/interactive.py +0 -0
  286. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/issue_store.py +0 -0
  287. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/liveness_auditor.py +0 -0
  288. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/machine_pause.py +0 -0
  289. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/merge_queue.py +0 -0
  290. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/milestone_chat.py +0 -0
  291. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/milestone_dispatch.py +0 -0
  292. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/milestone_gate.py +0 -0
  293. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/milestone_order.py +0 -0
  294. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/mock_author.py +0 -0
  295. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/network.py +0 -0
  296. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/new_issue_chat.py +0 -0
  297. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/notifier/__init__.py +0 -0
  298. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/notifier/baseline.py +0 -0
  299. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/notifier/cli.py +0 -0
  300. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/notifier/collect.py +0 -0
  301. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/notifier/digest.py +0 -0
  302. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/notifier/models.py +0 -0
  303. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/notifier/predicate.py +0 -0
  304. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/notifier/service.py +0 -0
  305. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/notifier/store.py +0 -0
  306. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/notifier/transport.py +0 -0
  307. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/openapi.py +0 -0
  308. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/overlap_fence.py +0 -0
  309. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/overlap_predict.py +0 -0
  310. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/parentage.py +0 -0
  311. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/parentage_github.py +0 -0
  312. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/pipeline.py +0 -0
  313. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/plan_parser.py +0 -0
  314. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/plans.py +0 -0
  315. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/platform_paths.py +0 -0
  316. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/portal_bridge.py +0 -0
  317. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/portal_store.py +0 -0
  318. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/portal_sync.py +0 -0
  319. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/pr_body_lint.py +0 -0
  320. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/prereqs.py +0 -0
  321. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/progress.py +0 -0
  322. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/providers/__init__.py +0 -0
  323. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/providers/base.py +0 -0
  324. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/providers/claude.py +0 -0
  325. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/providers/claude_pty.py +0 -0
  326. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/providers/opencode.py +0 -0
  327. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/queue_diagnose.py +0 -0
  328. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/refine_chat.py +0 -0
  329. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/release_cordon.py +0 -0
  330. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/release_propagate.py +0 -0
  331. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/release_verify.py +0 -0
  332. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/release_window.py +0 -0
  333. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/repo_edit.py +0 -0
  334. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/repo_onboard.py +0 -0
  335. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/reports.py +0 -0
  336. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/revalidate.py +0 -0
  337. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/review.py +0 -0
  338. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/scorecard.py +0 -0
  339. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/skills/update-issue/SKILL.md +0 -0
  340. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/smoke.py +0 -0
  341. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/spend_ceiling.py +0 -0
  342. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/split_work.py +0 -0
  343. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/stage_projection.py +0 -0
  344. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/test_author.py +0 -0
  345. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/test_chat.py +0 -0
  346. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/test_orchestrator.py +0 -0
  347. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/test_report.py +0 -0
  348. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/tui_release.py +0 -0
  349. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/usage.py +0 -0
  350. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/usage_limits.py +0 -0
  351. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coord/usage_rollup.py +0 -0
  352. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/coordinator.example.yml +0 -0
  353. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/deploy/coord-agent.service +0 -0
  354. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/deploy/coord-db-backup.service +0 -0
  355. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/deploy/coord-db-backup.sh +0 -0
  356. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/deploy/coord-db-backup.timer +0 -0
  357. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/deploy/coord-drive-queue.service +0 -0
  358. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/deploy/coord-drive-queue.timer +0 -0
  359. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/deploy/coord-notify.service +0 -0
  360. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/deploy/coord-notify.timer +0 -0
  361. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/deploy/coord-release-propagate.service +0 -0
  362. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/deploy/coord-release-propagate.timer +0 -0
  363. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/deploy/coord-release-window.service +0 -0
  364. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/deploy/coord-release-window.timer +0 -0
  365. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/deploy/coord-serve.service +0 -0
  366. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/deploy/coord-web-dist-build.service +0 -0
  367. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/deploy/coord-web-dist-build.sh +0 -0
  368. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/deploy/coord-web-dist-build.timer +0 -0
  369. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/deploy/coord-web-rollback.sh +0 -0
  370. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/deploy/coord-web.service +0 -0
  371. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/deploy/node-shim.sh +0 -0
  372. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/docs/AGENT_OPERATIONS.md +0 -0
  373. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/docs/ARCHITECTURE.md +0 -0
  374. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/docs/ARCH_SECURITY_GATES.md +0 -0
  375. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/docs/COCKPIT.md +0 -0
  376. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/docs/CONTROL_CENTER.md +0 -0
  377. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/docs/COST_DISCIPLINE.md +0 -0
  378. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/docs/CROSS_PLATFORM.md +0 -0
  379. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/docs/CUSTOMER_PORTAL.md +0 -0
  380. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/docs/DRIVE_QUEUE.md +0 -0
  381. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/docs/EPHEMERAL_WORKERS.md +0 -0
  382. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/docs/FORGE_MIGRATION.md +0 -0
  383. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/docs/GRAPHIFY_SETUP.md +0 -0
  384. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/docs/ISSUE_GUIDANCE.md +0 -0
  385. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/docs/MAC_MINI.md +0 -0
  386. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  387. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/docs/NOTIFIER.md +0 -0
  388. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/docs/OPENCODE_VERIFICATION.md +0 -0
  389. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/docs/OPERATING_GOTCHAS.md +0 -0
  390. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/docs/ORACLE_LOOP.md +0 -0
  391. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/docs/PHONE_WEBAPP.md +0 -0
  392. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/docs/PIPELINE_V2.md +0 -0
  393. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/docs/PLATFORM_EVOLUTION.md +0 -0
  394. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/docs/SECOND_BACKEND.md +0 -0
  395. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/docs/STORE_SERVICE.md +0 -0
  396. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  397. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/docs/WEB_CONTROL_CENTER.md +0 -0
  398. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/docs/mocks/web/README.md +0 -0
  399. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/docs/mocks/web/_tokens.css +0 -0
  400. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/docs/mocks/web/issue-detail.html +0 -0
  401. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/docs/mocks/web/pipeline-narrow.html +0 -0
  402. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/docs/mocks/web/pipeline-wide.html +0 -0
  403. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/graphify-out/.gitignore +0 -0
  404. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/install-agent.sh +0 -0
  405. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/pyproject.toml +0 -0
  406. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/scripts/audit_review_verdict_overrides.py +0 -0
  407. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  408. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/scripts/azure-workers/build-worker-image.sh +0 -0
  409. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/scripts/azure-workers/coordinator-machine.py +0 -0
  410. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/scripts/azure-workers/epic-down.sh +0 -0
  411. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/scripts/azure-workers/epic-up.sh +0 -0
  412. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/scripts/azure-workers/preflight.sh +0 -0
  413. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/scripts/azure-workers/provision-worker.sh +0 -0
  414. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  415. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  416. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/scripts/azure-workers/verify-github-token.sh +0 -0
  417. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/scripts/codegen.py +0 -0
  418. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/scripts/coord-test-runner.sh +0 -0
  419. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/scripts/drive-batch.sh +0 -0
  420. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/scripts/gen_board_fixture.py +0 -0
  421. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/scripts/next_release_tag.py +0 -0
  422. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/scripts/run_tests_in_populated_home.sh +0 -0
  423. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/scripts/run_tests_without_gh.sh +0 -0
  424. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/scripts/smoke_437_interactive.py +0 -0
  425. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/scripts/verify_878_review_capture.py +0 -0
  426. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/scripts/verify_release_published.py +0 -0
  427. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/scripts/verify_release_wheel.py +0 -0
  428. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/setup.cfg +0 -0
  429. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/SMOKE_SET.md +0 -0
  430. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/__init__.py +0 -0
  431. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  432. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/acceptance/ms-33/contract.md +0 -0
  433. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/acceptance/ms-33/manifest.yml +0 -0
  434. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  435. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  436. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  437. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  438. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/acceptance/ms-37/conftest.py +0 -0
  439. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/acceptance/ms-37/contract.md +0 -0
  440. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/acceptance/ms-37/manifest.yml +0 -0
  441. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  442. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  443. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/acceptance/ms-38/contract.md +0 -0
  444. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/acceptance/ms-38/manifest.yml +0 -0
  445. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  446. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  447. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  448. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  449. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  450. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  451. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  452. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  453. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  454. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  455. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/acceptance/ms-51/contract.md +0 -0
  456. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  457. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  458. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/acceptance/ms-51/manifest.yml +0 -0
  459. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  460. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/acceptance/ms-51/tsconfig.json +0 -0
  461. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  462. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/conftest.py +0 -0
  463. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/fixtures/board-pipeline-basic.json +0 -0
  464. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  465. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  466. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  467. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/fixtures/playwright/all_pass.json +0 -0
  468. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  469. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/fixtures/playwright/mixed_fail.json +0 -0
  470. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  471. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  472. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/fixtures/playwright/skip.json +0 -0
  473. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/fixtures/playwright/truncated.json +0 -0
  474. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  475. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  476. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  477. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  478. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  479. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  480. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  481. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  482. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_acceptance.py +0 -0
  483. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_acceptance_drivers.py +0 -0
  484. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_agent_api_error.py +0 -0
  485. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_agent_app.py +0 -0
  486. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_agent_branch_base.py +0 -0
  487. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_agent_branch_capture.py +0 -0
  488. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_agent_config_free_1712.py +0 -0
  489. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_agent_deploy_units_endpoint.py +0 -0
  490. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_agent_dirty_worktree.py +0 -0
  491. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_agent_graph_self_heal.py +0 -0
  492. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_agent_health_h3.py +0 -0
  493. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_agent_idle_restart.py +0 -0
  494. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_agent_push_failure.py +0 -0
  495. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_agent_reap.py +0 -0
  496. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_agent_repos_and_pull.py +0 -0
  497. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_agent_restart_services_endpoint.py +0 -0
  498. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_agent_startup_diagnostics.py +0 -0
  499. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_agent_update.py +0 -0
  500. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_agent_update_bluegreen.py +0 -0
  501. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_agent_usage_limit.py +0 -0
  502. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_ambient_home_isolation.py +0 -0
  503. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_approve_reject_plan.py +0 -0
  504. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_approve_usage_gate.py +0 -0
  505. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_assignment_already_recorded_daemon.py +0 -0
  506. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_audit_log.py +0 -0
  507. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_audit_outcome.py +0 -0
  508. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_audit_query.py +0 -0
  509. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_auto_loop.py +0 -0
  510. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_auto_release_publish_2035.py +0 -0
  511. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_base_checkout_restore.py +0 -0
  512. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_block_log.py +0 -0
  513. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_board_cap_762.py +0 -0
  514. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_board_fixture.py +0 -0
  515. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_board_read_path.py +0 -0
  516. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_board_service.py +0 -0
  517. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_board_state.py +0 -0
  518. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_board_wire.py +0 -0
  519. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_brain.py +0 -0
  520. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_branch_model.py +0 -0
  521. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_bug_intake.py +0 -0
  522. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_build_worker_image_env_update.py +0 -0
  523. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_ci_acceptance_gate_1950.py +0 -0
  524. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_ci_parity_2091.py +0 -0
  525. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_ci_store.py +0 -0
  526. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_claim.py +0 -0
  527. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_acceptance.py +0 -0
  528. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_assign.py +0 -0
  529. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  530. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_assign_interactive_remote.py +0 -0
  531. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_assign_provider.py +0 -0
  532. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  533. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_audit.py +0 -0
  534. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_chat_continue.py +0 -0
  535. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_diagnose_config_provenance.py +0 -0
  536. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_diagnose_graph.py +0 -0
  537. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_doctor.py +0 -0
  538. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_doctor_config_free_1801.py +0 -0
  539. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  540. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_drive.py +0 -0
  541. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_drive_queue.py +0 -0
  542. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_escalate.py +0 -0
  543. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_fix_headless_review.py +0 -0
  544. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_gate_a.py +0 -0
  545. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_install_drift.py +0 -0
  546. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_install_skills.py +0 -0
  547. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_issue_create_label.py +0 -0
  548. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_issue_reopen.py +0 -0
  549. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_merge.py +0 -0
  550. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_milestone_assign.py +0 -0
  551. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_milestone_capture.py +0 -0
  552. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_milestone_chat_add_child.py +0 -0
  553. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_milestone_dispatch.py +0 -0
  554. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_milestone_gate_b.py +0 -0
  555. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_milestone_gate_c.py +0 -0
  556. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_milestone_order.py +0 -0
  557. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  558. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_milestone_ship.py +0 -0
  559. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_network.py +0 -0
  560. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_new_issue_chat.py +0 -0
  561. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_plans.py +0 -0
  562. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_portal.py +0 -0
  563. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_pull_artifact.py +0 -0
  564. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_queue.py +0 -0
  565. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_reattach_sessions.py +0 -0
  566. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_refine_board.py +0 -0
  567. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_release_preflight.py +0 -0
  568. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_release_propagate.py +0 -0
  569. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_release_window.py +0 -0
  570. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_repo_2220.py +0 -0
  571. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_scorecard.py +0 -0
  572. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_set_review_findings.py +0 -0
  573. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_status_advisory_terminal.py +0 -0
  574. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_status_merge_queue.py +0 -0
  575. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_status_provider.py +0 -0
  576. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_status_review_finalizing.py +0 -0
  577. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_status_test_failed_tag.py +0 -0
  578. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_status_usage_limit.py +0 -0
  579. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_sync_comments_873.py +0 -0
  580. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_test_plan.py +0 -0
  581. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_track.py +0 -0
  582. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_tui_update.py +0 -0
  583. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cli_wait.py +0 -0
  584. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_client_base_install.py +0 -0
  585. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_comments.py +0 -0
  586. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_completion_summary.py +0 -0
  587. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_config.py +0 -0
  588. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_config_acceptance.py +0 -0
  589. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_config_audit.py +0 -0
  590. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_config_pricing.py +0 -0
  591. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  592. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_config_usage_gate.py +0 -0
  593. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_conflict_fix.py +0 -0
  594. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_conflict_fix_semantic.py +0 -0
  595. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_coord_test.py +0 -0
  596. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_coord_test_runner_baseline.py +0 -0
  597. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_coord_test_runner_routing.py +0 -0
  598. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_coord_test_runner_toolchain.py +0 -0
  599. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_coord_web_sse_restart_live.py +0 -0
  600. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_coordinator_machine.py +0 -0
  601. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_cross_platform_imports.py +0 -0
  602. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_dashboard.py +0 -0
  603. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_dashboard_fixture.py +0 -0
  604. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_dashboard_terminal.py +0 -0
  605. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_dashboard_terminal_live.py +0 -0
  606. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_db.py +0 -0
  607. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_dead_end.py +0 -0
  608. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_deploy_coord_db_backup.py +0 -0
  609. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_deploy_coord_web_dist.py +0 -0
  610. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_deploy_coord_web_rollback.py +0 -0
  611. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_deploy_drive_queue_unit.py +0 -0
  612. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_deploy_manifest.py +0 -0
  613. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_deploy_units_lane.py +0 -0
  614. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_deploy_web_unit.py +0 -0
  615. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_deps.py +0 -0
  616. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_diagnose.py +0 -0
  617. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_dispatch.py +0 -0
  618. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_dispatch_target_validation.py +0 -0
  619. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_dist_name.py +0 -0
  620. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_done_housekeeping.py +0 -0
  621. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_drive.py +0 -0
  622. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_drive_queue.py +0 -0
  623. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_drive_state.py +0 -0
  624. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_drive_tmux.py +0 -0
  625. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_epic_up_capability_detection.py +0 -0
  626. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  627. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_epic_up_image_provenance.py +0 -0
  628. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_errors.py +0 -0
  629. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_events.py +0 -0
  630. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_failure_class.py +0 -0
  631. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_filelock.py +0 -0
  632. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  633. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_fix_of_force_override.py +0 -0
  634. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_fleet_config_health.py +0 -0
  635. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_fleet_health_probes.py +0 -0
  636. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_fleet_health_snapshot.py +0 -0
  637. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_freshness.py +0 -0
  638. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_gate_a.py +0 -0
  639. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_gate_b.py +0 -0
  640. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_gate_snapshot_staleness.py +0 -0
  641. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_gates.py +0 -0
  642. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  643. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_generated_types_fixture.py +0 -0
  644. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_github_ops.py +0 -0
  645. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_goal.py +0 -0
  646. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_graph_health.py +0 -0
  647. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_graph_selfheal_absent_2237.py +0 -0
  648. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_handoff.py +0 -0
  649. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_health_checks.py +0 -0
  650. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_health_cli.py +0 -0
  651. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_health_cli_graph.py +0 -0
  652. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_health_config.py +0 -0
  653. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_health_context.py +0 -0
  654. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_health_deploy_lane_facts.py +0 -0
  655. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_health_incident_regression.py +0 -0
  656. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_health_pypi.py +0 -0
  657. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_health_registry.py +0 -0
  658. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_health_timer_active.py +0 -0
  659. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_health_toolchain.py +0 -0
  660. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_health_unit_drift.py +0 -0
  661. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_health_unit_enablement.py +0 -0
  662. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_hooks.py +0 -0
  663. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_human_attended_437.py +0 -0
  664. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_init.py +0 -0
  665. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_integration.py +0 -0
  666. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_interactive_briefing_echo.py +0 -0
  667. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_interactive_prefill_state.py +0 -0
  668. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_interactive_session_relaunch.py +0 -0
  669. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_interactive_test_verdict_backstop.py +0 -0
  670. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_interactive_token_attribution.py +0 -0
  671. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_interactive_worktree.py +0 -0
  672. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_issue_store_seam.py +0 -0
  673. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_liveness_auditor.py +0 -0
  674. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_liveness_notify.py +0 -0
  675. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_machine_pause.py +0 -0
  676. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_merge_queue.py +0 -0
  677. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_merge_verify.py +0 -0
  678. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_milestone_chat.py +0 -0
  679. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_milestone_dispatch.py +0 -0
  680. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_milestone_gate.py +0 -0
  681. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_milestone_order.py +0 -0
  682. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_milestone_seam.py +0 -0
  683. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_mock_author.py +0 -0
  684. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_model_tiering.py +0 -0
  685. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_models.py +0 -0
  686. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_models_config_labels.py +0 -0
  687. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_needs_attention.py +0 -0
  688. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_network.py +0 -0
  689. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_new_issue_chat.py +0 -0
  690. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_next_release_tag.py +0 -0
  691. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_no_direct_gh_calls.py +0 -0
  692. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_node_shim.py +0 -0
  693. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_notifier_baseline.py +0 -0
  694. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_notifier_cli.py +0 -0
  695. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_notifier_collect.py +0 -0
  696. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_notifier_config.py +0 -0
  697. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_notifier_drive_seam.py +0 -0
  698. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_notifier_isolation.py +0 -0
  699. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_notifier_predicate.py +0 -0
  700. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_notifier_quiet_hours.py +0 -0
  701. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_notifier_service.py +0 -0
  702. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_notify.py +0 -0
  703. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_notify_drain.py +0 -0
  704. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_openapi.py +0 -0
  705. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_operational_defaults.py +0 -0
  706. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_overlap_fence.py +0 -0
  707. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_overlap_predict.py +0 -0
  708. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_packaged_deploy_units.py +0 -0
  709. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_parentage.py +0 -0
  710. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_paste_landed.py +0 -0
  711. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_pipeline.py +0 -0
  712. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_plan_followup_approve_plan_command.py +0 -0
  713. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_plan_followup_pr_command.py +0 -0
  714. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_plan_followup_review_command.py +0 -0
  715. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_plan_only.py +0 -0
  716. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_plan_parser.py +0 -0
  717. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_platform_paths.py +0 -0
  718. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_portal_bridge.py +0 -0
  719. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_portal_config.py +0 -0
  720. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_portal_sync.py +0 -0
  721. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_pr_body_lint.py +0 -0
  722. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_prereqs.py +0 -0
  723. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_production_db_guard.py +0 -0
  724. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_progress.py +0 -0
  725. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_provider_seam.py +0 -0
  726. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_providers.py +0 -0
  727. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_providers_config_labels.py +0 -0
  728. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_providers_pty.py +0 -0
  729. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_quiet_hours.py +0 -0
  730. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_quiet_hours_store_2146.py +0 -0
  731. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_reap_merged_sessions.py +0 -0
  732. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_reap_stale_interactive_tick.py +0 -0
  733. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_reconcile_branch.py +0 -0
  734. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_reconcile_completions.py +0 -0
  735. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_reconcile_merges.py +0 -0
  736. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_reconcile_no_agent_record.py +0 -0
  737. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_reconcile_usage_limit_done.py +0 -0
  738. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_refine_chat.py +0 -0
  739. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_release_cordon_2101.py +0 -0
  740. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  741. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_release_cordon_deadlock_2240.py +0 -0
  742. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_release_propagate.py +0 -0
  743. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_release_unified_1242.py +0 -0
  744. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_release_verify.py +0 -0
  745. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_release_window.py +0 -0
  746. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_remote_auto_prune.py +0 -0
  747. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_remote_interactive_reaper.py +0 -0
  748. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_repo_edit_2220.py +0 -0
  749. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_repo_graph_fleet_2237.py +0 -0
  750. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_repo_onboard_2220.py +0 -0
  751. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_report_result_push.py +0 -0
  752. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_reports.py +0 -0
  753. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_retry.py +0 -0
  754. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_retry_advisory_1606.py +0 -0
  755. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_retry_type_1636.py +0 -0
  756. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_revalidate.py +0 -0
  757. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_review.py +0 -0
  758. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_review_end_review_without_verdict.py +0 -0
  759. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_review_parse_failure_diagnostic.py +0 -0
  760. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_review_reaffirm.py +0 -0
  761. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_review_state.py +0 -0
  762. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_review_verdict_backstop.py +0 -0
  763. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_review_verdict_override_audit.py +0 -0
  764. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_review_verdict_relay.py +0 -0
  765. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_review_zero_commits.py +0 -0
  766. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_scoped_review_wiring.py +0 -0
  767. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_scorecard.py +0 -0
  768. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_serve_app_board_trim.py +0 -0
  769. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_session.py +0 -0
  770. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_slice_issue_attribution.py +0 -0
  771. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_smoke.py +0 -0
  772. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_smoke_live_checkout_restore.py +0 -0
  773. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_smoke_workflow.py +0 -0
  774. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_spend_ceiling.py +0 -0
  775. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_spend_ceiling_coordinator.py +0 -0
  776. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_split.py +0 -0
  777. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_split_work.py +0 -0
  778. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_stage_projection.py +0 -0
  779. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_stalled_pipeline.py +0 -0
  780. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_state_review_findings_daemon.py +0 -0
  781. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_status_fleet_footer.py +0 -0
  782. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_stop_1567.py +0 -0
  783. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_stuck.py +0 -0
  784. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_terminal_command.py +0 -0
  785. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_test_author.py +0 -0
  786. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_test_chat.py +0 -0
  787. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_test_orchestrator.py +0 -0
  788. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_test_report.py +0 -0
  789. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_test_verdict_parsing.py +0 -0
  790. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_test_verdict_transcript_floor.py +0 -0
  791. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_thin_client_board_audit.py +0 -0
  792. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_thin_client_config_load_1080.py +0 -0
  793. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_thin_client_daemon_routing_906.py +0 -0
  794. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_tmux_host.py +0 -0
  795. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_tmux_session.py +0 -0
  796. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_transcript_floor.py +0 -0
  797. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_usage.py +0 -0
  798. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_usage_limits.py +0 -0
  799. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_usage_rollup.py +0 -0
  800. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_venv_live_install_2121.py +0 -0
  801. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_version_single_source.py +0 -0
  802. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_watch.py +0 -0
  803. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  804. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_worker_image_pin_sync.py +0 -0
  805. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_worker_safety.py +0 -0
  806. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_worker_test_scoping.py +0 -0
  807. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_worktree.py +0 -0
  808. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  809. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/Cargo.lock +0 -0
  810. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/Cargo.toml +0 -0
  811. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/cargo-config-local-quadraui.toml.example +0 -0
  812. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/app/audit.rs +0 -0
  813. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/app/chat.rs +0 -0
  814. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/app/data.rs +0 -0
  815. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/app/dialogs.rs +0 -0
  816. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/app/drive.rs +0 -0
  817. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/app/drive_queue.rs +0 -0
  818. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/app/escalation.rs +0 -0
  819. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/app/events.rs +0 -0
  820. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/app/fixtures.rs +0 -0
  821. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/app/fleet_health.rs +0 -0
  822. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/app/fleet_sessions.rs +0 -0
  823. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/app/fleet_terminals.rs +0 -0
  824. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/app/format.rs +0 -0
  825. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/app/milestone_dag.rs +0 -0
  826. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/app/mod.rs +0 -0
  827. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/app/msv.rs +0 -0
  828. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/app/pipeline.rs +0 -0
  829. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/app/plans.rs +0 -0
  830. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/app/render.rs +0 -0
  831. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/app/reports.rs +0 -0
  832. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/app/sessions.rs +0 -0
  833. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/app/settings_ui.rs +0 -0
  834. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/app/sidebar.rs +0 -0
  835. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/app/terminal.rs +0 -0
  836. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/app/tests.rs +0 -0
  837. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/app/types.rs +0 -0
  838. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/app/workspace.rs +0 -0
  839. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/bin/gtk.rs +0 -0
  840. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/commands.rs +0 -0
  841. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/lib.rs +0 -0
  842. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/main.rs +0 -0
  843. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/src/settings.rs +0 -0
  844. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/tests/acceptance.rs +0 -0
  845. {code_coordinator-0.5.111 → code_coordinator-0.5.113}/tui/tests/cli.rs +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.111
3
+ Version: 0.5.113
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.111
3
+ Version: 0.5.113
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
@@ -786,6 +786,7 @@ tests/acceptance/ms-example/mocks/home-active.html
786
786
  tests/fixtures/board-pipeline-basic.json
787
787
  tests/fixtures/board-pipeline-terminal-gates.json
788
788
  tests/fixtures/opencode_run_failure_sample.jsonl
789
+ tests/fixtures/opencode_run_length_sample.jsonl
789
790
  tests/fixtures/opencode_run_sample.jsonl
790
791
  tests/fixtures/playwright/all_pass.json
791
792
  tests/fixtures/playwright/global_setup_crash.json
@@ -433,6 +433,7 @@
433
433
  "tests/fixtures/board-pipeline-basic.json",
434
434
  "tests/fixtures/board-pipeline-terminal-gates.json",
435
435
  "tests/fixtures/opencode_run_failure_sample.jsonl",
436
+ "tests/fixtures/opencode_run_length_sample.jsonl",
436
437
  "tests/fixtures/opencode_run_sample.jsonl",
437
438
  "tests/fixtures/playwright/all_pass.json",
438
439
  "tests/fixtures/playwright/global_setup_crash.json",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.111",
2
+ "tag": "0.5.113",
3
3
  "distance": 0,
4
- "node": "g0bbfb660d44f1e03dcf6d5ded5b11f804d43aae9",
4
+ "node": "ga030a27e286c5012119c4cdbfb871f070e331e8a",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-16"
@@ -158,6 +158,9 @@ def row_to_assignment(row: object) -> Assignment:
158
158
  # row predating this column and for a normally-parsed verdict.
159
159
  verdict_source=d.get("verdict_source"),
160
160
  verdict_source_reason=d.get("verdict_source_reason"),
161
+ # #2316: raw terminal stop_reason; None for rows predating this
162
+ # column or a worker whose log carried no such field.
163
+ stop_reason=d.get("stop_reason"),
161
164
  )
162
165
 
163
166
 
@@ -232,6 +232,51 @@ def _looks_like_policy_refusal(text: str | None) -> bool:
232
232
  return any(marker in lowered for marker in _POLICY_REFUSAL_MARKERS)
233
233
 
234
234
 
235
+ # #2316: `WorkerSummary.stop_reason` values that mean the model was CUT OFF
236
+ # by an output-token ceiling before it could finish — as opposed to a normal
237
+ # stop (`end_turn`/`stop_sequence`, see `coord.progress`'s identical "unusual
238
+ # stop" allowlist). `"length"` is opencode's `step_finish` reason
239
+ # (`coord.providers.opencode.OpenCodeProvider.parse_log`, gated on opencode's
240
+ # `OPENCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX`); `"max_tokens"` is Anthropic's own
241
+ # `stop_reason` for the same shape. Either one on a 0-commit clean exit means
242
+ # the worker never got a turn to write anything — the space-invaders#1
243
+ # incident (13 successful tool calls, then one reasoning block burned the
244
+ # entire 32k-token budget and exited 0 with nothing on disk) is exactly this:
245
+ # `exit_code == 0` looked like "worker exited cleanly but pushed 0 commits"
246
+ # (the #448 ADVISORY reading) when it was actually a truncation nobody could
247
+ # have acted on differently. See `_reap`, which checks this BEFORE the #448
248
+ # zero-commit downgrade.
249
+ _TRUNCATION_STOP_REASONS = frozenset({"length", "max_tokens"})
250
+
251
+ # #2321: the opencode-specific knob named in the GitHub comment so an
252
+ # operator reading "cut off at its output limit" doesn't have to go
253
+ # rediscover — as the #2316 investigation had to — that the ceiling is
254
+ # adjustable per provider definition.
255
+ _OPENCODE_OUTPUT_TOKEN_MAX_ENV = "OPENCODE_EXPERIMENTAL_OUTPUT_TOKEN_MAX"
256
+
257
+
258
+ def _format_truncation_reason(stop_reason: str, provider_name: str | None) -> str:
259
+ """#2316: human-readable diagnostic for a 0-commit run truncated by an
260
+ output-token ceiling — used for both `AgentAssignment.truncation_reason`
261
+ (persisted `failure_reason`) and `AgentAssignment.error` (the GitHub
262
+ completion comment's `error=` text, see `coord.notify`'s FAILED arms).
263
+
264
+ Deliberately says "cut off" rather than "exited cleanly" — `exit_code ==
265
+ 0` is what a truncated run looks like, not evidence the worker finished.
266
+ Names :data:`_OPENCODE_OUTPUT_TOKEN_MAX_ENV` for an opencode worker
267
+ (#2321: the ceiling is raisable per provider definition) so an operator
268
+ doesn't have to rediscover that from scratch.
269
+ """
270
+ base = "the model was cut off at its output limit before writing anything"
271
+ if provider_name == "opencode":
272
+ return (
273
+ f"{base} (stop_reason={stop_reason!r}; opencode's output-token "
274
+ f"ceiling is set by {_OPENCODE_OUTPUT_TOKEN_MAX_ENV} and is "
275
+ "raisable per provider definition — #2321)"
276
+ )
277
+ return f"{base} (stop_reason={stop_reason!r})"
278
+
279
+
235
280
  # ── Reap tuning ───────────────────────────────────────────────────────────────
236
281
  # claude-cli sometimes does not exit after emitting its final
237
282
  # `{"type":"result"}` message — a child process (MCP server, tool subprocess)
@@ -2999,6 +3044,20 @@ class AgentAssignment:
2999
3044
  # one of `analysis_deliverable`/`zero_commit_reason`/this field is ever
3000
3045
  # set for a given assignment).
3001
3046
  policy_refusal_reason: str | None = None
3047
+ # #2316: set when `_reap` classifies a clean (exit_code==0), 0-commit
3048
+ # exit as a TRUNCATION — the worker's last `result`/`step_finish` event
3049
+ # carries a `stop_reason` in `_TRUNCATION_STOP_REASONS` (opencode's
3050
+ # `"length"`, claude's `"max_tokens"`) — rather than the #448 ADVISORY
3051
+ # default. Formatted with `_format_truncation_reason`. Only ever set
3052
+ # alongside `status == FAILED` (never ADVISORY: a truncated run is not a
3053
+ # "worker looked and found nothing to do", it is a cut-off nobody chose),
3054
+ # and `None` on every other outcome — including a genuine clean-exit-no-
3055
+ # commits run (no truncation marker matched) and a truncated run that DID
3056
+ # push commits (`_ahead != 0` never reaches this check at all). Mutually
3057
+ # exclusive with `zero_commit_reason`/`analysis_deliverable`/
3058
+ # `policy_refusal_reason`: all four are decided in the SAME `_ahead == 0`
3059
+ # branch of `_reap`, and this one is checked first — see that method.
3060
+ truncation_reason: str | None = None
3002
3061
 
3003
3062
  def to_dict(self) -> dict:
3004
3063
  d = asdict(self)
@@ -7897,6 +7956,13 @@ class AgentServer:
7897
7956
  # readings of "0 commits" can never disagree about which one applies
7898
7957
  # to this assignment.
7899
7958
  _policy_refusal_reason: str | None = None
7959
+ # #2316: checked FIRST in the `_ahead == 0` branch below, ahead of
7960
+ # `_analysis_deliverable`/`_policy_refusal_reason`/`_zero_commit_
7961
+ # reason` — a truncated run's `result_text` is whatever the model
7962
+ # managed to emit before the ceiling cut it off, not a considered
7963
+ # final message, so it must not be read as a positive "deliverable"
7964
+ # or "policy refusal" signal just because it happens to match one.
7965
+ _truncation_reason: str | None = None
7900
7966
  if (exit_code == 0 and assignment is not None
7901
7967
  and assignment.worktree_path
7902
7968
  and assignment.spec.type in _ZERO_COMMIT_TYPES):
@@ -7905,7 +7971,28 @@ class AgentServer:
7905
7971
  _base = assignment.spec.branch or "main"
7906
7972
  _ahead = self._commits_ahead(_wt_advisory, _base)
7907
7973
  if _ahead == 0:
7908
- if DELIVERABLE_ANALYSIS_LABEL in (assignment.spec.issue_labels or []):
7974
+ if (_worker_summary is not None
7975
+ and _worker_summary.stop_reason in _TRUNCATION_STOP_REASONS):
7976
+ # #2316: the model was guillotined by its own
7977
+ # output-token ceiling before it could act — exit
7978
+ # code 0 here is what a truncated run looks like, NOT
7979
+ # evidence of a clean "nothing to do" finish. Must be
7980
+ # re-driven, not parked in the advisory bucket
7981
+ # nobody re-drives (space-invaders#1).
7982
+ _truncation_reason = _format_truncation_reason(
7983
+ _worker_summary.stop_reason, assignment.spec.provider
7984
+ )
7985
+ try:
7986
+ with open(assignment.log_path, "a") as reopen:
7987
+ reopen.write(
7988
+ "# reap: truncated — 0 commits ahead of "
7989
+ f"{_base}; stop_reason="
7990
+ f"{_worker_summary.stop_reason!r}, status "
7991
+ "set to failed (#2316)\n"
7992
+ )
7993
+ except OSError:
7994
+ pass
7995
+ elif DELIVERABLE_ANALYSIS_LABEL in (assignment.spec.issue_labels or []):
7909
7996
  _analysis_deliverable = True
7910
7997
  try:
7911
7998
  with open(assignment.log_path, "a") as reopen:
@@ -8014,6 +8101,22 @@ class AgentServer:
8014
8101
  # shrug.
8015
8102
  assignment.status = FAILED
8016
8103
  assignment.push_failure_reason = _push_failure_reason
8104
+ elif _truncation_reason is not None:
8105
+ # #2316: the worker's own output-token ceiling cut it
8106
+ # off before it committed anything — checked BEFORE
8107
+ # `_policy_refusal_reason`/`_zero_commit_reason` (the
8108
+ # `_reap` computation above already guarantees the
8109
+ # four are mutually exclusive; kept parallel here for
8110
+ # readability). FAILED, not ADVISORY: exit_code==0 is
8111
+ # not evidence of a clean finish for a truncated run,
8112
+ # and nobody re-drives an advisory. `error` is set
8113
+ # too (not just `truncation_reason`) so the existing
8114
+ # generic `entry.get("error")` fallback in
8115
+ # `coord.notify`'s FAILED comment arms carries this
8116
+ # text without needing its own dedicated wiring.
8117
+ assignment.status = FAILED
8118
+ assignment.truncation_reason = _truncation_reason
8119
+ assignment.error = _truncation_reason
8017
8120
  elif _policy_refusal_reason is not None:
8018
8121
  # #2234: clean exit, no commits, and the worker's own
8019
8122
  # final message cites a standing repo-rule
@@ -173,4 +173,5 @@ export interface Assignment {
173
173
  audit_run_number: number | null
174
174
  for_issue_number: number | null
175
175
  driven_by: string | null
176
+ stop_reason: string | null
176
177
  }
@@ -896,6 +896,19 @@ def _migrate_add_columns(conn: sqlite3.Connection) -> None:
896
896
  # own default and identical in effect to `attempts <= 0` (no backoff
897
897
  # window active).
898
898
  "ALTER TABLE drive_queue ADD COLUMN retry_backoff_at REAL",
899
+ # #2316: the worker's own terminal `stop_reason` (e.g. `"end_turn"`,
900
+ # opencode's `"length"`, claude's `"max_tokens"`) — see
901
+ # `coord.agent.AgentServer._reap`'s `/status` `completed` entry
902
+ # (already sent by every agent build) and `coord.reconcile._capture_
903
+ # stop_reason_best_effort`, which persists it here for EVERY terminal
904
+ # assignment, not just failed ones. Previously this value reached the
905
+ # agent's own `/status` response and nothing else — `coord gates`,
906
+ # `coord status` and the dashboard had no column to read it from and
907
+ # a truncated (`stop_reason == "length"`/`"max_tokens"`), 0-commit
908
+ # run was recorded `advisory` with no trace of WHY. NULL for every
909
+ # row predating this migration and for a non-stream-json / PTY
910
+ # worker whose log carries no such field.
911
+ "ALTER TABLE assignments ADD COLUMN stop_reason TEXT",
899
912
  ]
900
913
  for sql in migrations:
901
914
  try:
@@ -702,6 +702,27 @@ class Assignment:
702
702
  # `coord/drive.py`'s work-stage `Action` sets on every `coord assign` it
703
703
  # shells out to.
704
704
  driven_by: str | None = None
705
+ # #2316: the worker's own terminal `stop_reason` (e.g. `"end_turn"`,
706
+ # opencode's `"length"`, claude's `"max_tokens"`) — persisted for EVERY
707
+ # terminal work-like assignment, not just failed ones, so `coord gates`/
708
+ # `coord status`/the dashboard can show it and a future gate can act on
709
+ # it. Captured from the agent's own `/status` `completed` entry (already
710
+ # sent by every agent build — `coord.agent.AgentServer.list_assignments`
711
+ # parses the worker's log and includes it there) by
712
+ # `coord.reconcile._capture_stop_reason_best_effort`. `None` for rows
713
+ # predating this column and for a non-stream-json / PTY worker whose log
714
+ # carries no such field.
715
+ #
716
+ # This is the raw diagnostic value, distinct from `failure_reason`: a
717
+ # truncated (`stop_reason` in `coord.agent._TRUNCATION_STOP_REASONS`),
718
+ # 0-commit run is separately classified FAILED by `AgentServer._reap`
719
+ # with a human-readable `failure_reason` naming the truncation — see
720
+ # `coord.agent.AgentAssignment.truncation_reason`. Before #2316 that same
721
+ # shape (space-invaders#1: the model spent its whole output budget on one
722
+ # reasoning block and hit opencode's 32k-token ceiling) landed on
723
+ # `advisory` — the same bucket as a worker that looked and correctly
724
+ # found nothing to do — so nobody re-drove it.
725
+ stop_reason: str | None = None
705
726
 
706
727
 
707
728
  def effective_issue_number(assignment: "Assignment | dict") -> int:
@@ -2638,11 +2638,20 @@ def post_transition(transition: Transition, record: dict, entry: dict) -> None:
2638
2638
  # says "spend ceiling" instead of leaving an operator to guess why a
2639
2639
  # leg died mid-task. Mutually exclusive with the other three (see
2640
2640
  # `coord.reconcile.reconcile_completed_assignments`).
2641
+ # #2316: `truncation_reason` is the same column again — the worker's
2642
+ # output-token ceiling cut it off before it committed anything. It
2643
+ # must reach `error=` below too, so the GitHub failure comment reads
2644
+ # "the model was cut off at its output limit before writing
2645
+ # anything" instead of the misleading "exited cleanly but pushed 0
2646
+ # commits" the #448 ADVISORY default would otherwise have produced.
2647
+ # Mutually exclusive with the other four (see
2648
+ # `coord.reconcile.reconcile_completed_assignments`).
2641
2649
  _failure_reason = (
2642
2650
  entry.get("usage_limit_reason")
2643
2651
  or entry.get("api_error_reason")
2644
2652
  or entry.get("push_failure_reason")
2645
2653
  or entry.get("spend_ceiling_reason")
2654
+ or entry.get("truncation_reason")
2646
2655
  )
2647
2656
  post_failure(
2648
2657
  exit_code=transition.exit_code,
@@ -2738,11 +2747,20 @@ def post_transition(transition: Transition, record: dict, entry: dict) -> None:
2738
2747
  # says "spend ceiling" instead of leaving an operator to guess why a
2739
2748
  # leg died mid-task. Mutually exclusive with the other three (see
2740
2749
  # `coord.reconcile.reconcile_completed_assignments`).
2750
+ # #2316: `truncation_reason` is the same column again — the worker's
2751
+ # output-token ceiling cut it off before it committed anything. It
2752
+ # must reach `error=` below too, so the GitHub failure comment reads
2753
+ # "the model was cut off at its output limit before writing
2754
+ # anything" instead of the misleading "exited cleanly but pushed 0
2755
+ # commits" the #448 ADVISORY default would otherwise have produced.
2756
+ # Mutually exclusive with the other four (see
2757
+ # `coord.reconcile.reconcile_completed_assignments`).
2741
2758
  _failure_reason = (
2742
2759
  entry.get("usage_limit_reason")
2743
2760
  or entry.get("api_error_reason")
2744
2761
  or entry.get("push_failure_reason")
2745
2762
  or entry.get("spend_ceiling_reason")
2763
+ or entry.get("truncation_reason")
2746
2764
  )
2747
2765
  post_failure(
2748
2766
  exit_code=transition.exit_code,
@@ -429,11 +429,23 @@ def reconcile_completed_assignments(
429
429
  # was killed for spending, not for hitting a usage limit. Stamping it
430
430
  # here is what makes the kill distinguishable from a crash for
431
431
  # `coord retry`, the auto-reassign skip below, and the escalation.
432
+ # #2316: `truncation_reason` is the SAME column again — stamped by
433
+ # `AgentServer._reap` when a 0-commit clean exit's `stop_reason`
434
+ # shows the worker was cut off by its output-token ceiling
435
+ # (`coord.agent._TRUNCATION_STOP_REASONS`) rather than genuinely
436
+ # finding nothing to do. Never coexists with the other three: it is
437
+ # only ever set on the SAME `_ahead == 0` branch as the #448 ADVISORY
438
+ # default (see `AgentServer._reap`'s `elif` chain), which the other
439
+ # three all preempt before that branch even runs. Without this, a
440
+ # truncated run lands FAILED with no `failure_reason` recorded —
441
+ # exactly the "advisory looks the same as this" gap #2316 exists to
442
+ # close.
432
443
  _failure_reason = (
433
444
  entry.get("usage_limit_reason")
434
445
  or entry.get("api_error_reason")
435
446
  or entry.get("push_failure_reason")
436
447
  or entry.get("spend_ceiling_reason")
448
+ or entry.get("truncation_reason")
437
449
  )
438
450
  _escalate_spend_ceiling_best_effort(a, entry)
439
451
  update_state_fn(
@@ -482,6 +494,14 @@ def reconcile_completed_assignments(
482
494
  # failure is swallowed so it can't break the reconcile.
483
495
  _capture_tokens_best_effort(aid, entry)
484
496
 
497
+ # #2316: capture the raw stop_reason from the /status entry for
498
+ # EVERY terminal assignment (not just failed ones) — the enabling
499
+ # persistence step; `_failure_reason` above already carries the
500
+ # human-readable classification for a truncated run specifically.
501
+ # Best-effort — any failure is swallowed so it can't break the
502
+ # reconcile.
503
+ _capture_stop_reason_best_effort(aid, entry)
504
+
485
505
  reconciled.append(
486
506
  {
487
507
  "assignment_id": aid,
@@ -747,6 +767,29 @@ def _capture_tokens_best_effort(assignment_id: str, entry: dict) -> None:
747
767
  pass
748
768
 
749
769
 
770
+ def _capture_stop_reason_best_effort(assignment_id: str, entry: dict) -> None:
771
+ """#2316: persist the raw ``stop_reason`` from a /status completed entry.
772
+
773
+ The agent parses its own log and includes ``stop_reason`` on every
774
+ terminal ``completed`` entry (``coord.agent.AgentServer.list_assignments``
775
+ — this predates #2316, only the write path is new). Captured for EVERY
776
+ terminal assignment, not gated on status, so the column reflects the
777
+ worker's own last word (``"end_turn"``, ``"length"``, ``"max_tokens"``,
778
+ ...) regardless of how ``_failure_reason``/the board's ``status``
779
+ classified the run. Best-effort — any failure is swallowed so it can't
780
+ break the reconcile.
781
+ """
782
+ try:
783
+ stop_reason = entry.get("stop_reason")
784
+ if not stop_reason:
785
+ return
786
+ from coord.state import update_assignment_stop_reason # noqa: PLC0415
787
+
788
+ update_assignment_stop_reason(assignment_id, stop_reason)
789
+ except Exception: # noqa: BLE001 — never let this capture break the reconcile
790
+ pass
791
+
792
+
750
793
  def _build_fix_round_retry_briefing(
751
794
  failed: Assignment, board: Board, repo_cfg, max_review_iterations: int,
752
795
  ) -> str | None:
@@ -1407,6 +1450,10 @@ def _record_usage_limit_reason(assignment_id: str | None, entry: dict) -> None:
1407
1450
  # mutual exclusivity as the three above (see the identical chain in
1408
1451
  # `reconcile_completed_assignments`).
1409
1452
  or entry.get("spend_ceiling_reason")
1453
+ # #2316: a truncated (output-token-ceiling) 0-commit run. Same
1454
+ # column, same mutual exclusivity — see the identical chain in
1455
+ # `reconcile_completed_assignments`.
1456
+ or entry.get("truncation_reason")
1410
1457
  )
1411
1458
  if not reason or not assignment_id:
1412
1459
  return
@@ -2636,6 +2636,7 @@ def _openapi_spec() -> dict:
2636
2636
  "items": {"type": "string"},
2637
2637
  "nullable": True,
2638
2638
  },
2639
+ "stop_reason": {"type": "string", "nullable": True},
2639
2640
  },
2640
2641
  "required": ["assignment_id"],
2641
2642
  }
@@ -5257,6 +5258,10 @@ def build_app(store: CoordStore, config: Config, *, token: str | None = None) ->
5257
5258
  state._update_assignment_smoke_tests_local(aid, body["smoke_tests"])
5258
5259
  if "completion_summary" in body and body["completion_summary"]:
5259
5260
  state._update_assignment_completion_summary_local(aid, body["completion_summary"])
5261
+ if body.get("stop_reason"):
5262
+ # #2316: same endpoint, same reason as the fields above —
5263
+ # one round-trip covers the diagnostic capture too.
5264
+ state._update_assignment_stop_reason_local(aid, body["stop_reason"])
5260
5265
  except Exception as e: # noqa: BLE001
5261
5266
  return JSONResponse(
5262
5267
  {"error": "assignment-usage write failed", "detail": str(e)},
@@ -2811,6 +2811,56 @@ def _update_assignment_tokens_local(
2811
2811
  pass
2812
2812
 
2813
2813
 
2814
+ def update_assignment_stop_reason(assignment_id: str, stop_reason: str) -> None:
2815
+ """#2316: record the worker's terminal ``stop_reason`` — routes to the
2816
+ daemon when set.
2817
+
2818
+ Persisted for EVERY terminal work-like assignment (not just failed
2819
+ ones) so ``coord gates``/``coord status``/the dashboard have something
2820
+ to read — before this column existed, a truncated worker's ``/status``
2821
+ already carried ``stop_reason`` but the coordinator dropped it on
2822
+ receipt (see ``coord.agent.AgentServer.list_assignments``, which parses
2823
+ the log and includes it on every terminal ``completed`` entry).
2824
+
2825
+ Idempotent: the UPDATE only fires when the row's ``stop_reason`` is
2826
+ still NULL (first-writer-wins) — a terminal row's stop reason cannot
2827
+ change after the fact, so a later reconcile tick re-observing the same
2828
+ ``/status`` entry is a no-op rather than a redundant write. Silently
2829
+ no-ops on a falsy *stop_reason* or a missing assignment row, and
2830
+ swallows ``OperationalError`` so a pre-migration DB (tests, an older
2831
+ install that hasn't restarted the coordinator yet) never crashes the
2832
+ reconcile/notify path this is called from.
2833
+ """
2834
+ if not assignment_id or not stop_reason:
2835
+ return
2836
+ svc = _board_service()
2837
+ resp = _route_write(
2838
+ svc,
2839
+ "/assignment-usage",
2840
+ {"assignment_id": assignment_id, "stop_reason": stop_reason},
2841
+ )
2842
+ if resp is not None:
2843
+ return
2844
+ _update_assignment_stop_reason_local(assignment_id, stop_reason)
2845
+
2846
+
2847
+ def _update_assignment_stop_reason_local(assignment_id: str, stop_reason: str) -> None:
2848
+ """Write ``stop_reason`` directly to the local DB. Called by the daemon endpoint."""
2849
+ if not assignment_id or not stop_reason:
2850
+ return
2851
+ conn = get_connection()
2852
+ try:
2853
+ conn.execute(
2854
+ "UPDATE assignments SET stop_reason=? WHERE assignment_id=? "
2855
+ "AND stop_reason IS NULL",
2856
+ (stop_reason, assignment_id),
2857
+ )
2858
+ conn.commit()
2859
+ except sqlite3.OperationalError:
2860
+ # Column may not exist yet (pre-migration DB or test fixtures).
2861
+ pass
2862
+
2863
+
2814
2864
  def mark_assignment_interactive(assignment_id: str) -> None:
2815
2865
  """#546/#665: flag the row as interactive — routes to the daemon when set.
2816
2866
 
@@ -462,7 +462,15 @@ def _tool_name_from_event(event: WorkerEvent) -> str | None:
462
462
  """Try a few plausible field paths for the tool name."""
463
463
  raw = event.raw
464
464
  if event.type == "tool_use":
465
- return raw.get("name") or raw.get("tool") or raw.get("tool_name")
465
+ name = raw.get("name") or raw.get("tool") or raw.get("tool_name")
466
+ if name:
467
+ return name
468
+ # #2315: opencode's `tool_use` events carry the name one level down,
469
+ # at `part.tool` — {"type":"tool_use","part":{"tool":"bash",...}} —
470
+ # not at any of the top-level keys above, which is why every opencode
471
+ # tool call used to render `[tool] ?`.
472
+ tool, _ = _opencode_tool_input(raw)
473
+ return tool
466
474
  # Assistant events may embed a tool_use block in `message.content[*]`.
467
475
  if event.type == "assistant":
468
476
  message = raw.get("message") or {}
@@ -472,6 +480,29 @@ def _tool_name_from_event(event: WorkerEvent) -> str | None:
472
480
  return None
473
481
 
474
482
 
483
+ def _opencode_tool_input(raw: dict) -> tuple[str | None, dict | None]:
484
+ """Pull ``(tool_name, input_dict)`` out of an opencode ``tool_use``
485
+ event's nested ``part`` (#2315).
486
+
487
+ opencode's wire shape is ``{"type":"tool_use","part":{"tool":"bash",
488
+ "state":{"input":{"command":"..."},...}}}`` — see
489
+ :meth:`coord.providers.opencode.OpenCodeProvider.parse_log`'s docstring,
490
+ which this mirrors (the provider's own parser already reads this
491
+ correctly; this is the same lookup for the render side). Returns
492
+ ``(None, None)`` for anything else — missing/malformed ``part``, or a
493
+ ``state.input`` that isn't a dict.
494
+ """
495
+ part = raw.get("part")
496
+ if not isinstance(part, dict):
497
+ return None, None
498
+ tool = part.get("tool")
499
+ tool = tool if isinstance(tool, str) and tool else None
500
+ state = part.get("state")
501
+ input_obj = state.get("input") if isinstance(state, dict) else None
502
+ input_obj = input_obj if isinstance(input_obj, dict) else None
503
+ return tool, input_obj
504
+
505
+
475
506
  def _iter_content_blocks(message: dict) -> Iterable[dict]:
476
507
  """Yield content blocks from an Anthropic-style message payload."""
477
508
  content = message.get("content")
@@ -493,6 +524,12 @@ def _bash_command_from_event(event: WorkerEvent) -> str | None:
493
524
  for block in _iter_content_blocks(message):
494
525
  if block.get("type") == "tool_use" and block.get("name") == "Bash":
495
526
  return _command_from_input(block.get("input"))
527
+ if event.type == "tool_use":
528
+ # #2315: opencode's bash call — command lives at `part.state.input.
529
+ # command`, tool name (lowercase) at `part.tool`.
530
+ tool, input_obj = _opencode_tool_input(raw)
531
+ if tool == "bash":
532
+ return _command_from_input(input_obj)
496
533
  return None
497
534
 
498
535
 
@@ -506,13 +543,24 @@ def _command_from_input(input_obj: object) -> str | None:
506
543
 
507
544
 
508
545
  def _file_path_from_event(event: WorkerEvent) -> str | None:
509
- """Pull file_path out of an Edit/Write tool_use, if present."""
546
+ """Pull file_path out of an Edit/Write tool_use, if present.
547
+
548
+ Name matching is case-insensitive so this covers both claude's
549
+ ``Edit``/``Write``/``NotebookEdit`` and opencode's lowercase ``edit``/
550
+ ``write`` (#2315).
551
+ """
510
552
  raw = event.raw
511
553
  name = _tool_name_from_event(event)
512
- if name not in ("Edit", "Write", "NotebookEdit"):
554
+ if not name or name.lower() not in ("edit", "write", "notebookedit"):
513
555
  return None
514
556
  if event.type == "tool_use":
515
- return _file_from_input(raw.get("input"))
557
+ input_obj = raw.get("input")
558
+ if input_obj is not None:
559
+ return _file_from_input(input_obj)
560
+ # #2315: opencode carries the input nested under `part.state.input`
561
+ # rather than a top-level `input` key.
562
+ _, opencode_input = _opencode_tool_input(raw)
563
+ return _file_from_input(opencode_input)
516
564
  if event.type == "assistant":
517
565
  message = raw.get("message") or {}
518
566
  for block in _iter_content_blocks(message):
@@ -528,7 +576,8 @@ def _file_path_from_event(event: WorkerEvent) -> str | None:
528
576
  def _file_from_input(input_obj: object) -> str | None:
529
577
  if not isinstance(input_obj, dict):
530
578
  return None
531
- for key in ("file_path", "path", "notebook_path"):
579
+ # `filePath` is opencode's key (#2315); the rest are claude's.
580
+ for key in ("file_path", "path", "notebook_path", "filePath"):
532
581
  v = input_obj.get(key)
533
582
  if isinstance(v, str):
534
583
  return v
@@ -1012,10 +1061,15 @@ def render_event(event: WorkerEvent, *, turn_counter: list[int] | None = None) -
1012
1061
 
1013
1062
  if event.type == "tool_use":
1014
1063
  name = _tool_name_from_event(event) or "?"
1015
- if name == "Bash":
1064
+ # Case-insensitive: claude's tool names are `Bash`/`Edit`/`Write`/
1065
+ # `NotebookEdit`; opencode's equivalents are lowercase (#2315). The
1066
+ # original casing from *name* is kept in the rendered line either
1067
+ # way — only the branch dispatch is case-insensitive.
1068
+ name_lower = name.lower()
1069
+ if name_lower == "bash":
1016
1070
  cmd = _bash_command_from_event(event) or ""
1017
- return f"[tool] Bash: {_truncate(cmd, 100)}"
1018
- if name in ("Edit", "Write", "NotebookEdit"):
1071
+ return f"[tool] {name}: {_truncate(cmd, 100)}"
1072
+ if name_lower in ("edit", "write", "notebookedit"):
1019
1073
  fp = _file_path_from_event(event)
1020
1074
  return f"[tool] {name}: {fp or '?'}"
1021
1075
  return f"[tool] {name}"
@@ -1027,6 +1081,44 @@ def render_event(event: WorkerEvent, *, turn_counter: list[int] | None = None) -
1027
1081
  tag = " error" if is_error else ""
1028
1082
  return f"[tool_result{tag}] {tool_use_id}"
1029
1083
 
1084
+ if event.type == "step_finish":
1085
+ # opencode's per-turn completion event (#2315) — claude has no
1086
+ # equivalent. `part.reason` is `"tool-calls"` for every turn but the
1087
+ # last one (which is always followed by another `step_start`);
1088
+ # anything else — `"stop"` (normal completion), `"length"` (ran out
1089
+ # of output budget mid-turn), `"error"`, or any other value — means
1090
+ # the run ended on THIS step, because opencode never emits a
1091
+ # terminal event of its own the way claude's `result` event above
1092
+ # does (see OpenCodeProvider.parse_log's docstring). So a
1093
+ # non-"tool-calls" reason also gets an appended `[result]` line —
1094
+ # the only place `coord log` ever prints a stop reason for an
1095
+ # opencode run. Cost/tokens here are this step's own figures (there
1096
+ # is no cumulative-total field anywhere in opencode's stream, so a
1097
+ # single event can't report a running total — see the same
1098
+ # docstring), which is still the diagnostic fact that matters: e.g.
1099
+ # `reason=length out=32000 $0.145` says outright that the model
1100
+ # spent its whole output budget on one turn and got cut off.
1101
+ part = raw.get("part")
1102
+ part = part if isinstance(part, dict) else {}
1103
+ # `reason_raw` (as opposed to `reason`, the display value with the
1104
+ # `?` placeholder substituted in) drives the terminality check below
1105
+ # — a genuinely absent/malformed reason must NOT be treated as
1106
+ # terminal just because the placeholder string happens to differ
1107
+ # from `"tool-calls"`.
1108
+ reason_raw = part.get("reason")
1109
+ reason_raw = reason_raw if isinstance(reason_raw, str) and reason_raw else None
1110
+ reason = reason_raw or "?"
1111
+ tokens = part.get("tokens")
1112
+ tokens = tokens if isinstance(tokens, dict) else {}
1113
+ out_tok = tokens.get("output")
1114
+ out_str = str(out_tok) if isinstance(out_tok, int) else "?"
1115
+ cost = part.get("cost")
1116
+ cost_str = f"${float(cost):.3f}" if isinstance(cost, (int, float)) else "$?"
1117
+ line = f"[step_finish] reason={reason} out={out_str} {cost_str}"
1118
+ if reason_raw is not None and reason_raw != "tool-calls":
1119
+ line += f"\n[result] stop={reason_raw}, {cost_str}"
1120
+ return line
1121
+
1030
1122
  if event.type == "rate_limit_event":
1031
1123
  status, resets = _rate_limit_info(raw)
1032
1124
  return f"[rate_limit] status={status or '?'} resets_at={resets if resets is not None else '?'}"
@@ -0,0 +1,5 @@
1
+ {"type":"step_start","timestamp":1785788589000,"sessionID":"ses_2315len4ffeIOILOMFtWVIoOb","part":{"id":"prt_2315len001peaLrUkvfXkzF4","messageID":"msg_2315len001B2TN1bVanhA48U","sessionID":"ses_2315len4ffeIOILOMFtWVIoOb","snapshot":"40c925c779fe9cd39801d60400818aa70d6a49b0","type":"step-start"}}
2
+ {"type":"tool_use","timestamp":1785788589900,"sessionID":"ses_2315len4ffeIOILOMFtWVIoOb","part":{"type":"tool","tool":"bash","callID":"call_2315len_01","state":{"status":"completed","input":{"command":"git status"},"output":"On branch issue-2315\nnothing to commit, working tree clean\n","metadata":{},"title":"","time":{"start":1785788589850,"end":1785788589890}},"id":"prt_2315len002D1oKOLzO3u64k1","sessionID":"ses_2315len4ffeIOILOMFtWVIoOb","messageID":"msg_2315len001B2TN1bVanhA48U"}}
3
+ {"type":"step_finish","timestamp":1785788589950,"sessionID":"ses_2315len4ffeIOILOMFtWVIoOb","part":{"id":"prt_2315len003QbgfV5ZEEm7pIO","reason":"tool-calls","snapshot":"40c925c779fe9cd39801d60400818aa70d6a49b0","messageID":"msg_2315len001B2TN1bVanhA48U","sessionID":"ses_2315len4ffeIOILOMFtWVIoOb","type":"step-finish","tokens":{"total":520,"input":440,"output":80,"reasoning":0,"cache":{"write":0,"read":0}},"cost":0.002}}
4
+ {"type":"step_start","timestamp":1785788590600,"sessionID":"ses_2315len4ffeIOILOMFtWVIoOb","part":{"id":"prt_2315len004abWeGE97E8opKR","messageID":"msg_2315len004XNhYw1dBJxV99P","sessionID":"ses_2315len4ffeIOILOMFtWVIoOb","snapshot":"40c925c779fe9cd39801d60400818aa70d6a49b0","type":"step-start"}}
5
+ {"type":"step_finish","timestamp":1785788969600,"sessionID":"ses_2315len4ffeIOILOMFtWVIoOb","part":{"id":"prt_2315len005pw1TMWsekKMlNS","reason":"length","snapshot":"40c925c779fe9cd39801d60400818aa70d6a49b0","messageID":"msg_2315len004XNhYw1dBJxV99P","sessionID":"ses_2315len4ffeIOILOMFtWVIoOb","type":"step-finish","tokens":{"total":32410,"input":410,"output":32000,"reasoning":32000,"cache":{"write":0,"read":0}},"cost":0.145}}