code-coordinator 0.5.46__tar.gz → 0.5.48__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 (805) hide show
  1. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/CLAUDE.md +2 -1
  2. {code_coordinator-0.5.46/code_coordinator.egg-info → code_coordinator-0.5.48}/PKG-INFO +1 -1
  3. {code_coordinator-0.5.46 → code_coordinator-0.5.48/code_coordinator.egg-info}/PKG-INFO +1 -1
  4. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/code_coordinator.egg-info/SOURCES.txt +26 -0
  5. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/code_coordinator.egg-info/scm_file_list.json +26 -0
  6. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/code_coordinator.egg-info/scm_version.json +2 -2
  7. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/agent.py +163 -1
  8. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/agent_app.py +395 -47
  9. code_coordinator-0.5.48/coord/agent_update.py +864 -0
  10. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/cli.py +4 -0
  11. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/agent_ops.py +51 -10
  12. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/dispatch.py +51 -2
  13. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/drive.py +50 -0
  14. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/drive_queue.py +34 -1
  15. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/merge.py +18 -1
  16. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/release.py +39 -7
  17. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/status.py +8 -2
  18. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/config.py +340 -4
  19. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/db.py +17 -0
  20. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/coord-release-window.timer +2 -2
  21. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/coord-web-dist-build.service +2 -2
  22. code_coordinator-0.5.48/coord/deploy/coord-web-dist-build.timer +61 -0
  23. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dispatch.py +37 -0
  24. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/drive.py +142 -7
  25. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/drive_queue.py +219 -12
  26. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/deploy_lane_facts.py +145 -0
  27. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/interactive.py +123 -2
  28. code_coordinator-0.5.48/coord/notifier/__init__.py +32 -0
  29. code_coordinator-0.5.48/coord/notifier/baseline.py +329 -0
  30. code_coordinator-0.5.48/coord/notifier/cli.py +255 -0
  31. code_coordinator-0.5.48/coord/notifier/collect.py +341 -0
  32. code_coordinator-0.5.48/coord/notifier/digest.py +171 -0
  33. code_coordinator-0.5.48/coord/notifier/models.py +185 -0
  34. code_coordinator-0.5.48/coord/notifier/predicate.py +453 -0
  35. code_coordinator-0.5.48/coord/notifier/service.py +252 -0
  36. code_coordinator-0.5.48/coord/notifier/store.py +312 -0
  37. code_coordinator-0.5.48/coord/notifier/transport.py +196 -0
  38. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/notify.py +14 -0
  39. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/reconcile.py +88 -0
  40. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/release_cordon.py +22 -0
  41. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/release_propagate.py +66 -16
  42. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/release_verify.py +42 -0
  43. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/release_window.py +25 -6
  44. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/reports.py +6 -0
  45. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/serve_app.py +49 -1
  46. code_coordinator-0.5.48/coord/spend_ceiling.py +291 -0
  47. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/state.py +18 -3
  48. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/usage.py +42 -0
  49. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coordinator.example.yml +130 -0
  50. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-release-window.timer +2 -2
  51. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-web-dist-build.service +2 -2
  52. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-web-dist-build.sh +82 -15
  53. code_coordinator-0.5.48/deploy/coord-web-dist-build.timer +61 -0
  54. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-web-rollback.sh +5 -5
  55. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/DRIVE_QUEUE.md +45 -0
  56. code_coordinator-0.5.48/docs/NOTIFIER.md +233 -0
  57. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/conftest.py +49 -0
  58. code_coordinator-0.5.48/tests/test_agent_idle_restart.py +453 -0
  59. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_update.py +175 -11
  60. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_drive_queue.py +262 -0
  61. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_merge.py +101 -3
  62. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_release_propagate.py +137 -0
  63. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_deploy_coord_web_dist.py +103 -4
  64. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_drive.py +380 -2
  65. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_drive_queue.py +370 -2
  66. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_drive_tmux.py +3 -1
  67. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_health_deploy_lane_facts.py +127 -0
  68. code_coordinator-0.5.48/tests/test_interactive_token_attribution.py +463 -0
  69. code_coordinator-0.5.48/tests/test_notifier_baseline.py +201 -0
  70. code_coordinator-0.5.48/tests/test_notifier_cli.py +198 -0
  71. code_coordinator-0.5.48/tests/test_notifier_collect.py +243 -0
  72. code_coordinator-0.5.48/tests/test_notifier_config.py +150 -0
  73. code_coordinator-0.5.48/tests/test_notifier_drive_seam.py +130 -0
  74. code_coordinator-0.5.48/tests/test_notifier_isolation.py +250 -0
  75. code_coordinator-0.5.48/tests/test_notifier_predicate.py +381 -0
  76. code_coordinator-0.5.48/tests/test_notifier_quiet_hours.py +161 -0
  77. code_coordinator-0.5.48/tests/test_notifier_service.py +365 -0
  78. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_release_propagate.py +67 -13
  79. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_release_verify.py +89 -0
  80. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_reports.py +3 -1
  81. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_serve.py +113 -1
  82. code_coordinator-0.5.48/tests/test_spend_ceiling.py +537 -0
  83. code_coordinator-0.5.48/tests/test_spend_ceiling_coordinator.py +315 -0
  84. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_usage.py +145 -0
  85. code_coordinator-0.5.48/tests/test_venv_live_install_2121.py +551 -0
  86. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/drive_queue.rs +31 -1
  87. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/mod.rs +4 -2
  88. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/tests.rs +54 -0
  89. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/types.rs +7 -0
  90. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/tests/fixtures/board_sample.json +2 -0
  91. code_coordinator-0.5.46/coord/agent_update.py +0 -417
  92. code_coordinator-0.5.46/coord/deploy/coord-web-dist-build.timer +0 -36
  93. code_coordinator-0.5.46/deploy/coord-web-dist-build.timer +0 -36
  94. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/.claude/commands/board.md +0 -0
  95. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/.claude/commands/complete-session.md +0 -0
  96. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/.claude/commands/coordinator.md +0 -0
  97. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/.githooks/_lib.sh +0 -0
  98. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/.githooks/post-checkout +0 -0
  99. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/.githooks/post-commit +0 -0
  100. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/.githooks/post-merge +0 -0
  101. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/.github/workflows/auto-release.yml +0 -0
  102. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/.github/workflows/cargo-test.yml +0 -0
  103. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/.github/workflows/publish.yml +0 -0
  104. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/.github/workflows/release-tui.yml +0 -0
  105. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/.github/workflows/test.yml +0 -0
  106. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/.gitignore +0 -0
  107. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/GOAL.md +0 -0
  108. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/LICENSE +0 -0
  109. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/MANIFEST.in +0 -0
  110. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/README.md +0 -0
  111. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/code_coordinator.egg-info/dependency_links.txt +0 -0
  112. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/code_coordinator.egg-info/entry_points.txt +0 -0
  113. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/code_coordinator.egg-info/requires.txt +0 -0
  114. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/code_coordinator.egg-info/top_level.txt +0 -0
  115. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/__init__.py +0 -0
  116. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/_board_mapping.py +0 -0
  117. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/acceptance.py +0 -0
  118. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/acceptance_drivers.py +0 -0
  119. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/agents/opencode/.gitignore +0 -0
  120. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/agents/opencode/agents/work.md +0 -0
  121. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/agents/opencode/routing.jsonc +0 -0
  122. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/audit.py +0 -0
  123. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/auto_loop.py +0 -0
  124. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/board_bool_guard.py +0 -0
  125. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/board_service.py +0 -0
  126. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/board_wire.py +0 -0
  127. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/brain.py +0 -0
  128. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/branch_model.py +0 -0
  129. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/cargo_cache.py +0 -0
  130. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/ci_github.py +0 -0
  131. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/ci_store.py +0 -0
  132. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/claim.py +0 -0
  133. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/client.py +0 -0
  134. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/__init__.py +0 -0
  135. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/_common.py +0 -0
  136. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/acceptance.py +0 -0
  137. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/audit.py +0 -0
  138. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/chat.py +0 -0
  139. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/dispatch_workers.py +0 -0
  140. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/gate_a.py +0 -0
  141. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/gates.py +0 -0
  142. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/issues.py +0 -0
  143. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/lifecycle.py +0 -0
  144. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/milestone.py +0 -0
  145. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/plan_followup.py +0 -0
  146. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/plans.py +0 -0
  147. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/report.py +0 -0
  148. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/review.py +0 -0
  149. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/scorecard.py +0 -0
  150. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/sessions.py +0 -0
  151. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/setup.py +0 -0
  152. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/terminal.py +0 -0
  153. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/test_gate.py +0 -0
  154. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/commands/tui.py +0 -0
  155. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/comments.py +0 -0
  156. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/conflict_fix.py +0 -0
  157. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dao.py +0 -0
  158. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/__init__.py +0 -0
  159. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/fixture.py +0 -0
  160. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/index.html +0 -0
  161. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/server.py +0 -0
  162. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/terminal.py +0 -0
  163. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/.gitignore +0 -0
  164. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/components.json +0 -0
  165. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js +0 -0
  166. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  167. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js +0 -0
  168. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js +0 -0
  169. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  170. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  171. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  172. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  173. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  174. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/dist/index.html +0 -0
  175. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  176. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/dist/sw.js +0 -0
  177. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  178. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  179. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  180. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  181. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  182. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  183. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  184. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  185. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  186. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  187. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/eslint.config.js +0 -0
  188. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/index.html +0 -0
  189. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  190. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/package-lock.json +0 -0
  191. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/package.json +0 -0
  192. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  193. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/playwright.config.ts +0 -0
  194. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/postcss.config.js +0 -0
  195. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  196. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  197. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  198. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/App.tsx +0 -0
  199. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/api/client.ts +0 -0
  200. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  201. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  202. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  203. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  204. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  205. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  206. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  207. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  208. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  209. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  210. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  211. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  212. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  213. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  214. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  215. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  216. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  217. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  218. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  219. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  220. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  221. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  222. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  223. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  224. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  225. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  226. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  227. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  228. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  229. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  230. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  231. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  232. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  233. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  234. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  235. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/index.css +0 -0
  236. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  237. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  238. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/main.tsx +0 -0
  239. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  240. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  241. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  242. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  243. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  244. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  245. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  246. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  247. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  248. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  249. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  250. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  251. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  252. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  253. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  254. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  255. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  256. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  257. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  258. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  259. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  260. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  261. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  262. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/tailwind.config.js +0 -0
  263. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/tsconfig.json +0 -0
  264. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  265. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dashboard/webapp/vite.config.ts +0 -0
  266. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dead_end.py +0 -0
  267. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/README.md +0 -0
  268. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/coord-agent.service +0 -0
  269. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/coord-db-backup.service +0 -0
  270. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/coord-db-backup.sh +0 -0
  271. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/coord-db-backup.timer +0 -0
  272. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/coord-drive-queue.service +0 -0
  273. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/coord-drive-queue.timer +0 -0
  274. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/coord-notify.service +0 -0
  275. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/coord-notify.timer +0 -0
  276. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/coord-release-propagate.service +0 -0
  277. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/coord-release-propagate.timer +0 -0
  278. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/coord-release-window.service +0 -0
  279. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/coord-serve.service +0 -0
  280. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy/coord-web.service +0 -0
  281. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy_manifest.py +0 -0
  282. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deploy_units.py +0 -0
  283. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/deps.py +0 -0
  284. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/diagnose.py +0 -0
  285. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/dist_name.py +0 -0
  286. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/drive_state.py +0 -0
  287. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/events.py +0 -0
  288. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/failure_class.py +0 -0
  289. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/filelock.py +0 -0
  290. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/fleet_config_health.py +0 -0
  291. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/freshness.py +0 -0
  292. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/gate_a.py +0 -0
  293. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/gate_b.py +0 -0
  294. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/gate_snapshot.py +0 -0
  295. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/gates.py +0 -0
  296. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/github_ops.py +0 -0
  297. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/goal.py +0 -0
  298. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/graph_health.py +0 -0
  299. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/__init__.py +0 -0
  300. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/aggregate.py +0 -0
  301. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/__init__.py +0 -0
  302. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/agent_install.py +0 -0
  303. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/cargo_targets.py +0 -0
  304. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/claude_binary.py +0 -0
  305. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/disk.py +0 -0
  306. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/fleet_board.py +0 -0
  307. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  308. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/fleet_phantom.py +0 -0
  309. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/fleet_unit_drift.py +0 -0
  310. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/graph.py +0 -0
  311. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/plan_usage.py +0 -0
  312. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/repo_state.py +0 -0
  313. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/spawned_coord.py +0 -0
  314. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/timer_active.py +0 -0
  315. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/toolchain.py +0 -0
  316. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/unit_drift.py +0 -0
  317. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/unit_enablement.py +0 -0
  318. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/checks/worktrees.py +0 -0
  319. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/cli.py +0 -0
  320. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/context.py +0 -0
  321. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/fleet_snapshot.py +0 -0
  322. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/models.py +0 -0
  323. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/pypi.py +0 -0
  324. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/registry.py +0 -0
  325. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/render.py +0 -0
  326. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/health/units.py +0 -0
  327. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/hooks.py +0 -0
  328. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/housekeeping.py +0 -0
  329. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/issue_store.py +0 -0
  330. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/liveness_auditor.py +0 -0
  331. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/machine_pause.py +0 -0
  332. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/merge_queue.py +0 -0
  333. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/milestone_chat.py +0 -0
  334. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/milestone_dispatch.py +0 -0
  335. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/milestone_gate.py +0 -0
  336. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/milestone_order.py +0 -0
  337. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/mock_author.py +0 -0
  338. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/models.py +0 -0
  339. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/network.py +0 -0
  340. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/new_issue_chat.py +0 -0
  341. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/openapi.py +0 -0
  342. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/overlap_fence.py +0 -0
  343. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/parentage.py +0 -0
  344. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/parentage_github.py +0 -0
  345. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/pipeline.py +0 -0
  346. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/plan_parser.py +0 -0
  347. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/plans.py +0 -0
  348. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/platform_paths.py +0 -0
  349. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/pr_body_lint.py +0 -0
  350. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/prereqs.py +0 -0
  351. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/progress.py +0 -0
  352. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/providers/__init__.py +0 -0
  353. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/providers/base.py +0 -0
  354. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/providers/claude.py +0 -0
  355. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/providers/claude_pty.py +0 -0
  356. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/providers/opencode.py +0 -0
  357. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/refine_chat.py +0 -0
  358. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/revalidate.py +0 -0
  359. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/review.py +0 -0
  360. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/scorecard.py +0 -0
  361. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/skills/update-issue/SKILL.md +0 -0
  362. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/smoke.py +0 -0
  363. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/split_work.py +0 -0
  364. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/stage_projection.py +0 -0
  365. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/test_author.py +0 -0
  366. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/test_chat.py +0 -0
  367. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/test_orchestrator.py +0 -0
  368. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/test_report.py +0 -0
  369. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/tui_release.py +0 -0
  370. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/usage_limits.py +0 -0
  371. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/usage_rollup.py +0 -0
  372. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/coord/worker_events.py +0 -0
  373. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-agent.service +0 -0
  374. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-db-backup.service +0 -0
  375. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-db-backup.sh +0 -0
  376. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-db-backup.timer +0 -0
  377. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-drive-queue.service +0 -0
  378. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-drive-queue.timer +0 -0
  379. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-notify.service +0 -0
  380. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-notify.timer +0 -0
  381. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-release-propagate.service +0 -0
  382. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-release-propagate.timer +0 -0
  383. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-release-window.service +0 -0
  384. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-serve.service +0 -0
  385. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/coord-web.service +0 -0
  386. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/deploy/node-shim.sh +0 -0
  387. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/AGENT_OPERATIONS.md +0 -0
  388. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/ARCHITECTURE.md +0 -0
  389. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/ARCH_SECURITY_GATES.md +0 -0
  390. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/COCKPIT.md +0 -0
  391. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/CONTROL_CENTER.md +0 -0
  392. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/CROSS_PLATFORM.md +0 -0
  393. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/CUSTOMER_PORTAL.md +0 -0
  394. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/EPHEMERAL_WORKERS.md +0 -0
  395. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/FORGE_MIGRATION.md +0 -0
  396. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/GRAPHIFY_SETUP.md +0 -0
  397. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/ISSUE_GUIDANCE.md +0 -0
  398. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/MAC_MINI.md +0 -0
  399. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  400. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/OPENCODE_VERIFICATION.md +0 -0
  401. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/OPERATING_GOTCHAS.md +0 -0
  402. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/ORACLE_LOOP.md +0 -0
  403. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/PHONE_WEBAPP.md +0 -0
  404. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/PIPELINE_V2.md +0 -0
  405. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/PLATFORM_EVOLUTION.md +0 -0
  406. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/SECOND_BACKEND.md +0 -0
  407. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/STORE_SERVICE.md +0 -0
  408. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  409. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/WEB_CONTROL_CENTER.md +0 -0
  410. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/mocks/web/README.md +0 -0
  411. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/mocks/web/_tokens.css +0 -0
  412. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/mocks/web/issue-detail.html +0 -0
  413. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/mocks/web/pipeline-narrow.html +0 -0
  414. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/docs/mocks/web/pipeline-wide.html +0 -0
  415. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/graphify-out/.gitignore +0 -0
  416. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/install-agent.sh +0 -0
  417. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/pyproject.toml +0 -0
  418. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/audit_review_verdict_overrides.py +0 -0
  419. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  420. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/azure-workers/build-worker-image.sh +0 -0
  421. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/azure-workers/coordinator-machine.py +0 -0
  422. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/azure-workers/epic-down.sh +0 -0
  423. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/azure-workers/epic-up.sh +0 -0
  424. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/azure-workers/preflight.sh +0 -0
  425. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/azure-workers/provision-worker.sh +0 -0
  426. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  427. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  428. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/azure-workers/verify-github-token.sh +0 -0
  429. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/codegen.py +0 -0
  430. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/coord-test-runner.sh +0 -0
  431. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/drive-batch.sh +0 -0
  432. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/gen_board_fixture.py +0 -0
  433. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/next_release_tag.py +0 -0
  434. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/run_tests_without_gh.sh +0 -0
  435. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/smoke_437_interactive.py +0 -0
  436. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/verify_878_review_capture.py +0 -0
  437. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/verify_release_published.py +0 -0
  438. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/scripts/verify_release_wheel.py +0 -0
  439. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/setup.cfg +0 -0
  440. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/SMOKE_SET.md +0 -0
  441. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/__init__.py +0 -0
  442. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  443. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-33/contract.md +0 -0
  444. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-33/manifest.yml +0 -0
  445. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  446. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  447. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  448. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  449. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-37/conftest.py +0 -0
  450. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-37/contract.md +0 -0
  451. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-37/manifest.yml +0 -0
  452. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  453. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  454. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-38/contract.md +0 -0
  455. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-38/manifest.yml +0 -0
  456. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  457. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  458. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  459. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  460. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  461. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  462. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  463. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  464. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  465. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  466. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-51/contract.md +0 -0
  467. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  468. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  469. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-51/manifest.yml +0 -0
  470. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  471. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-51/tsconfig.json +0 -0
  472. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  473. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/board-pipeline-basic.json +0 -0
  474. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  475. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  476. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  477. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/playwright/all_pass.json +0 -0
  478. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  479. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/playwright/mixed_fail.json +0 -0
  480. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  481. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  482. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/playwright/skip.json +0 -0
  483. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/playwright/truncated.json +0 -0
  484. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  485. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  486. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  487. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  488. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  489. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  490. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  491. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  492. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_acceptance.py +0 -0
  493. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_acceptance_drivers.py +0 -0
  494. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent.py +0 -0
  495. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_api_error.py +0 -0
  496. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_app.py +0 -0
  497. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_branch_base.py +0 -0
  498. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_branch_capture.py +0 -0
  499. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_config_free_1712.py +0 -0
  500. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_deploy_units_endpoint.py +0 -0
  501. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_dirty_worktree.py +0 -0
  502. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_graph_self_heal.py +0 -0
  503. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_health_h3.py +0 -0
  504. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_push_failure.py +0 -0
  505. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_reap.py +0 -0
  506. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_repos_and_pull.py +0 -0
  507. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_restart_services_endpoint.py +0 -0
  508. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_startup_diagnostics.py +0 -0
  509. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_update_bluegreen.py +0 -0
  510. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_usage_limit.py +0 -0
  511. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_agent_zero_commit.py +0 -0
  512. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_approve_reject_plan.py +0 -0
  513. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_approve_usage_gate.py +0 -0
  514. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_assignment_already_recorded_daemon.py +0 -0
  515. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_audit_log.py +0 -0
  516. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_audit_outcome.py +0 -0
  517. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_audit_query.py +0 -0
  518. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_auto_loop.py +0 -0
  519. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_auto_release_publish_2035.py +0 -0
  520. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_base_checkout_restore.py +0 -0
  521. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_board_cap_762.py +0 -0
  522. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_board_fixture.py +0 -0
  523. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_board_read_path.py +0 -0
  524. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_board_service.py +0 -0
  525. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_board_state.py +0 -0
  526. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_board_wire.py +0 -0
  527. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_brain.py +0 -0
  528. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_branch_model.py +0 -0
  529. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_build_worker_image_env_update.py +0 -0
  530. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cargo_cache.py +0 -0
  531. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_ci_acceptance_gate_1950.py +0 -0
  532. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_ci_store.py +0 -0
  533. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_claim.py +0 -0
  534. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_acceptance.py +0 -0
  535. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_assign.py +0 -0
  536. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  537. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_assign_interactive_remote.py +0 -0
  538. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_assign_provider.py +0 -0
  539. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_audit.py +0 -0
  540. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_chat_continue.py +0 -0
  541. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_diagnose_config_provenance.py +0 -0
  542. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_diagnose_graph.py +0 -0
  543. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_doctor.py +0 -0
  544. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_doctor_config_free_1801.py +0 -0
  545. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  546. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_drive.py +0 -0
  547. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_escalate.py +0 -0
  548. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_fix_headless_review.py +0 -0
  549. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_gate_a.py +0 -0
  550. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_install_drift.py +0 -0
  551. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_install_skills.py +0 -0
  552. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_issue_create_label.py +0 -0
  553. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_issue_reopen.py +0 -0
  554. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_milestone_assign.py +0 -0
  555. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_milestone_capture.py +0 -0
  556. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_milestone_chat_add_child.py +0 -0
  557. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_milestone_dispatch.py +0 -0
  558. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_milestone_gate_b.py +0 -0
  559. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_milestone_gate_c.py +0 -0
  560. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_milestone_order.py +0 -0
  561. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  562. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_milestone_ship.py +0 -0
  563. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_network.py +0 -0
  564. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_new_issue_chat.py +0 -0
  565. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_plans.py +0 -0
  566. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_pull_artifact.py +0 -0
  567. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_queue.py +0 -0
  568. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_reattach_sessions.py +0 -0
  569. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_refine_board.py +0 -0
  570. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_release_preflight.py +0 -0
  571. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_release_window.py +0 -0
  572. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_scorecard.py +0 -0
  573. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_set_review_findings.py +0 -0
  574. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_status_advisory_terminal.py +0 -0
  575. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_status_merge_queue.py +0 -0
  576. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_status_provider.py +0 -0
  577. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_status_review_finalizing.py +0 -0
  578. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_status_test_failed_tag.py +0 -0
  579. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_status_usage_limit.py +0 -0
  580. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_sync_comments_873.py +0 -0
  581. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_test_plan.py +0 -0
  582. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_track.py +0 -0
  583. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_tui_update.py +0 -0
  584. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cli_wait.py +0 -0
  585. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_client_base_install.py +0 -0
  586. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_comments.py +0 -0
  587. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_completion_summary.py +0 -0
  588. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_config.py +0 -0
  589. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_config_acceptance.py +0 -0
  590. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_config_audit.py +0 -0
  591. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_config_pricing.py +0 -0
  592. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_config_usage_gate.py +0 -0
  593. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_conflict_fix.py +0 -0
  594. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_conflict_fix_semantic.py +0 -0
  595. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_coord_test.py +0 -0
  596. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_coord_test_runner_routing.py +0 -0
  597. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_coord_test_runner_toolchain.py +0 -0
  598. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_coord_web_sse_restart_live.py +0 -0
  599. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_coordinator_machine.py +0 -0
  600. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_cross_platform_imports.py +0 -0
  601. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_dashboard.py +0 -0
  602. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_dashboard_fixture.py +0 -0
  603. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_dashboard_terminal.py +0 -0
  604. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_dashboard_terminal_live.py +0 -0
  605. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_db.py +0 -0
  606. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_dead_end.py +0 -0
  607. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_deploy_coord_db_backup.py +0 -0
  608. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_deploy_coord_web_rollback.py +0 -0
  609. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_deploy_drive_queue_unit.py +0 -0
  610. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_deploy_manifest.py +0 -0
  611. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_deploy_units_lane.py +0 -0
  612. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_deploy_web_unit.py +0 -0
  613. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_deps.py +0 -0
  614. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_diagnose.py +0 -0
  615. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_dispatch.py +0 -0
  616. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_dispatch_target_validation.py +0 -0
  617. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_dist_name.py +0 -0
  618. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_done_housekeeping.py +0 -0
  619. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_drive_state.py +0 -0
  620. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_epic_up_capability_detection.py +0 -0
  621. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  622. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_epic_up_image_provenance.py +0 -0
  623. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_errors.py +0 -0
  624. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_events.py +0 -0
  625. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_failure_class.py +0 -0
  626. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_filelock.py +0 -0
  627. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  628. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_fix_of_force_override.py +0 -0
  629. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_fleet_config_health.py +0 -0
  630. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_fleet_health_probes.py +0 -0
  631. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_fleet_health_snapshot.py +0 -0
  632. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_freshness.py +0 -0
  633. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_gate_a.py +0 -0
  634. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_gate_b.py +0 -0
  635. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_gate_snapshot_staleness.py +0 -0
  636. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_gates.py +0 -0
  637. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_generated_types_fixture.py +0 -0
  638. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_github_ops.py +0 -0
  639. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_goal.py +0 -0
  640. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_graph_health.py +0 -0
  641. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_handoff.py +0 -0
  642. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_health_checks.py +0 -0
  643. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_health_cli.py +0 -0
  644. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_health_cli_graph.py +0 -0
  645. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_health_config.py +0 -0
  646. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_health_context.py +0 -0
  647. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_health_incident_regression.py +0 -0
  648. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_health_pypi.py +0 -0
  649. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_health_registry.py +0 -0
  650. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_health_timer_active.py +0 -0
  651. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_health_toolchain.py +0 -0
  652. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_health_unit_drift.py +0 -0
  653. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_health_unit_enablement.py +0 -0
  654. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_hooks.py +0 -0
  655. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_human_attended_437.py +0 -0
  656. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_init.py +0 -0
  657. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_integration.py +0 -0
  658. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_interactive_briefing_echo.py +0 -0
  659. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_interactive_prefill_state.py +0 -0
  660. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_interactive_session_relaunch.py +0 -0
  661. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_interactive_test_verdict_backstop.py +0 -0
  662. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_interactive_worktree.py +0 -0
  663. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_issue_store_seam.py +0 -0
  664. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_liveness_auditor.py +0 -0
  665. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_liveness_notify.py +0 -0
  666. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_machine_pause.py +0 -0
  667. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_merge_queue.py +0 -0
  668. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_merge_verify.py +0 -0
  669. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_milestone_chat.py +0 -0
  670. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_milestone_dispatch.py +0 -0
  671. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_milestone_gate.py +0 -0
  672. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_milestone_order.py +0 -0
  673. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_milestone_seam.py +0 -0
  674. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_mock_author.py +0 -0
  675. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_model_tiering.py +0 -0
  676. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_models.py +0 -0
  677. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_models_config_labels.py +0 -0
  678. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_needs_attention.py +0 -0
  679. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_network.py +0 -0
  680. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_new_issue_chat.py +0 -0
  681. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_next_release_tag.py +0 -0
  682. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_no_direct_gh_calls.py +0 -0
  683. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_node_shim.py +0 -0
  684. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_notify.py +0 -0
  685. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_notify_drain.py +0 -0
  686. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_openapi.py +0 -0
  687. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_operational_defaults.py +0 -0
  688. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_overlap_fence.py +0 -0
  689. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_packaged_deploy_units.py +0 -0
  690. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_parentage.py +0 -0
  691. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_paste_landed.py +0 -0
  692. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_pipeline.py +0 -0
  693. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_plan_followup_approve_plan_command.py +0 -0
  694. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_plan_followup_pr_command.py +0 -0
  695. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_plan_followup_review_command.py +0 -0
  696. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_plan_only.py +0 -0
  697. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_plan_parser.py +0 -0
  698. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_platform_paths.py +0 -0
  699. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_pr_body_lint.py +0 -0
  700. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_prereqs.py +0 -0
  701. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_production_db_guard.py +0 -0
  702. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_progress.py +0 -0
  703. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_provider_seam.py +0 -0
  704. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_providers.py +0 -0
  705. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_providers_config_labels.py +0 -0
  706. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_providers_pty.py +0 -0
  707. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_quiet_hours.py +0 -0
  708. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_reap_merged_sessions.py +0 -0
  709. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_reap_stale_interactive_tick.py +0 -0
  710. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_reconcile_branch.py +0 -0
  711. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_reconcile_completions.py +0 -0
  712. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_reconcile_merges.py +0 -0
  713. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_reconcile_usage_limit_done.py +0 -0
  714. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_refine_chat.py +0 -0
  715. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_release_cordon_2101.py +0 -0
  716. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_release_unified_1242.py +0 -0
  717. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_release_window.py +0 -0
  718. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_remote_auto_prune.py +0 -0
  719. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_remote_interactive_reaper.py +0 -0
  720. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_report_result_push.py +0 -0
  721. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_retry.py +0 -0
  722. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_retry_advisory_1606.py +0 -0
  723. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_retry_type_1636.py +0 -0
  724. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_revalidate.py +0 -0
  725. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_review.py +0 -0
  726. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_review_end_review_without_verdict.py +0 -0
  727. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_review_parse_failure_diagnostic.py +0 -0
  728. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_review_reaffirm.py +0 -0
  729. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_review_state.py +0 -0
  730. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_review_verdict_backstop.py +0 -0
  731. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_review_verdict_override_audit.py +0 -0
  732. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_review_verdict_relay.py +0 -0
  733. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_review_zero_commits.py +0 -0
  734. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_scoped_review_wiring.py +0 -0
  735. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_scorecard.py +0 -0
  736. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_serve_app_board_trim.py +0 -0
  737. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_session.py +0 -0
  738. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_slice_issue_attribution.py +0 -0
  739. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_smoke.py +0 -0
  740. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_smoke_live_checkout_restore.py +0 -0
  741. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_smoke_workflow.py +0 -0
  742. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_split.py +0 -0
  743. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_split_work.py +0 -0
  744. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_stage_projection.py +0 -0
  745. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_stalled_pipeline.py +0 -0
  746. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_state.py +0 -0
  747. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_state_review_findings_daemon.py +0 -0
  748. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_status_fleet_footer.py +0 -0
  749. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_stop_1567.py +0 -0
  750. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_stuck.py +0 -0
  751. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_terminal_command.py +0 -0
  752. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_test_author.py +0 -0
  753. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_test_chat.py +0 -0
  754. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_test_orchestrator.py +0 -0
  755. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_test_report.py +0 -0
  756. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_test_verdict_parsing.py +0 -0
  757. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_test_verdict_transcript_floor.py +0 -0
  758. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_thin_client_board_audit.py +0 -0
  759. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_thin_client_config_load_1080.py +0 -0
  760. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_thin_client_daemon_routing_906.py +0 -0
  761. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_tmux_host.py +0 -0
  762. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_tmux_session.py +0 -0
  763. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_transcript_floor.py +0 -0
  764. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_usage_limits.py +0 -0
  765. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_usage_rollup.py +0 -0
  766. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_version_single_source.py +0 -0
  767. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_watch.py +0 -0
  768. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_worker_events.py +0 -0
  769. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_worker_image_pin_sync.py +0 -0
  770. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_worker_safety.py +0 -0
  771. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_worktree.py +0 -0
  772. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  773. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/Cargo.lock +0 -0
  774. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/Cargo.toml +0 -0
  775. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/cargo-config-local-quadraui.toml.example +0 -0
  776. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/audit.rs +0 -0
  777. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/chat.rs +0 -0
  778. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/data.rs +0 -0
  779. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/dialogs.rs +0 -0
  780. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/drive.rs +0 -0
  781. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/escalation.rs +0 -0
  782. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/events.rs +0 -0
  783. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/fixtures.rs +0 -0
  784. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/fleet_health.rs +0 -0
  785. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/fleet_sessions.rs +0 -0
  786. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/fleet_terminals.rs +0 -0
  787. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/format.rs +0 -0
  788. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/milestone_dag.rs +0 -0
  789. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/msv.rs +0 -0
  790. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/pipeline.rs +0 -0
  791. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/plans.rs +0 -0
  792. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/render.rs +0 -0
  793. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/reports.rs +0 -0
  794. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/sessions.rs +0 -0
  795. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/settings_ui.rs +0 -0
  796. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/sidebar.rs +0 -0
  797. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/terminal.rs +0 -0
  798. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/app/workspace.rs +0 -0
  799. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/bin/gtk.rs +0 -0
  800. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/commands.rs +0 -0
  801. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/lib.rs +0 -0
  802. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/main.rs +0 -0
  803. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/src/settings.rs +0 -0
  804. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/tests/acceptance.rs +0 -0
  805. {code_coordinator-0.5.46 → code_coordinator-0.5.48}/tui/tests/cli.rs +0 -0
@@ -82,7 +82,7 @@ coord merge [--dry-run] [--repo NAME] [--method rebase|squash|merge] [--order ID
82
82
  coord reconcile-merges # Backfill missing branches + record out-of-band merges (#609/#611)
83
83
  coord retry|stop|resume <id> # Recovery; `coord done` ends the session
84
84
  ```
85
- Setup / diagnostics (discoverable via `--help`): `coord init`, `coord config`, `coord agent`, `coord serve`, `coord web`, `coord diagnose`, `coord sessions [--remote]`, `coord split`.
85
+ Setup / diagnostics (discoverable via `--help`): `coord init`, `coord config`, `coord agent`, `coord serve`, `coord web`, `coord diagnose`, `coord sessions [--remote]`, `coord split`, `coord notifier` ([`docs/NOTIFIER.md`](docs/NOTIFIER.md)).
86
86
 
87
87
  ## Development
88
88
 
@@ -118,6 +118,7 @@ coord assign --dry-run precision claude-coordinator 42
118
118
  - **Test precedes Review — the pipeline order is `Work → Test → Review → Merge`.** The smoke test runs *before* the PR/review (the natural order: smoke before PR), reversing the #520 "get the review over with first" workaround now that the agent-assisted Testing stage is smooth. This is enforced in two places that must stay in sync: (1) the **displayed** stage order comes from `pipeline.default_gates = ["test","review","merge"]` (`coord/config.py`; an old DB carrying the #520-era `["review","test","merge"]` is migrated in `coord/db.py`); (2) the **headless** auto-loop holds review dispatch until the work has a `passed`/`skipped` test verdict whenever `default_gates` orders test before review — `PipelineConfig.test_precedes_review()` drives `dispatch_pending_reviews` (`coord/review.py`). The explicit `coord review`/`coord pr` paths stay ungated so a human can always force a review. (The merge gate already required a test verdict — `requires_smoke` — so the human test touchpoint just moved earlier, and review cycles are no longer burned on untested code.)
119
119
  - **Interactive testing + merge agents drive the Test → Review → Merge handoff (leg 3c / A3, #350/#581/#306/#606).** From a Pipeline row's right-click menu, the TUI routes **board-driven** verdicts (never TTY-scraped, ToS §3.7) along `Work → Test → Review → Merge`: **Start testing** = `coord assign --interactive --smoke-of <work_aid>` (read-only testing agent in the live checkout; records the verdict via `coord test --passed|--fail`); a `passed`/`skipped` test → **pass→review** (launches the interactive review); an approved review → **Start merge** = `--merge-of <work_aid>` (worktrees + proactively rebases onto the default branch #306, resolves mechanical conflicts (semantic with the operator), runs tests, `git push --force-with-lease`, then `coord verify-merge` and — if clean — `coord merge` itself to complete it #606); a `failed` test **or** request-changes review → one-key **`--fix-of`** on the same branch (a test-fail takes the identical action as a request-changes; `--fix-of` accepts a review id **or** a test-failed work id, the #581 front door). The merge agent is still gated on CI/review/smoke (a gate failure is reported, not forced) and `verify-merge` (#604) runs first. Full walkthrough: [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md).
120
120
  - **Progress streaming from workers.** Workers emit `STATUS:` and `STUCK:` lines in their logs. The coordinator parses these for real-time progress reporting in `coord status` and the dashboard.
121
+ - **The notifier tells you when NOBODY IS COMING — and nothing else (#1632).** `coord/notifier/` pushes to a self-hosted ntfy on the daemon host (over Tailscale, so no event text leaves the tailnet) when the pipeline **has stopped or is stalled and will not advance without a human**: a halted drive, a gate parked `HUMAN_REQUIRED`, a worker's `STUCK:`, a stall that survived `drive`'s nudge (#1593), a leg running far past comparable work, a fleet CRIT that invalidates in-flight work. It is **not** an error channel and **not** a progress feed — a failed test, a request-changes review and a mechanical merge conflict are all things the auto-loop handles, and pushing them is what trains an operator to mute the channel; in normal operation this fires approximately never. "Far too long" is **learned, never a fixed timeout**: p90 of a `(repo, type, tier)`-stratified population built from the durations milestone #37 already records, with a cold-start state (<5 samples → a generous absolute ceiling, said out loud in the message) so it never fires off a population of one. Quiet hours (22:00–08:00, daemon-local, `notifications.quiet_hours`) are a **deferral window, not a filter** — events are held and delivered as one 08:00 digest, nothing is discarded, and **no severity pierces them**; the only exception is `coord drive --urgent`, which is a deadline rather than a severity and expires with the drive. The whole subsystem is **advisory and isolated** (#1485's lesson): `tick()` never raises, every collector source fails open, state lives in its own `~/.coord/notifier.json`, and an unreachable ntfy server cannot affect dispatch, routing, the board or any verdict. It rides #1616's daemon clock rather than shipping a second one, and reads `drive`'s stall decision rather than defining "stalled" again. Off by default. Full rationale: [`docs/NOTIFIER.md`](docs/NOTIFIER.md).
121
122
  - **Failure reassignment.** Failed assignments can be retried on a different machine via `coord retry`. With `concurrency.auto_reassign: true`, reconciliation auto-retries on a different machine.
122
123
  - **Dependency freshness checks.** Before dispatching, `coord approve` checks whether upstream repos are up-to-date on the target machine. Stale dependencies trigger warnings or auto-pull with `--auto-pull`.
123
124
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.46
3
+ Version: 0.5.48
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.46
3
+ Version: 0.5.48
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
@@ -113,6 +113,7 @@ coord/review.py
113
113
  coord/scorecard.py
114
114
  coord/serve_app.py
115
115
  coord/smoke.py
116
+ coord/spend_ceiling.py
116
117
  coord/split_work.py
117
118
  coord/stage_projection.py
118
119
  coord/state.py
@@ -310,6 +311,16 @@ coord/health/checks/toolchain.py
310
311
  coord/health/checks/unit_drift.py
311
312
  coord/health/checks/unit_enablement.py
312
313
  coord/health/checks/worktrees.py
314
+ coord/notifier/__init__.py
315
+ coord/notifier/baseline.py
316
+ coord/notifier/cli.py
317
+ coord/notifier/collect.py
318
+ coord/notifier/digest.py
319
+ coord/notifier/models.py
320
+ coord/notifier/predicate.py
321
+ coord/notifier/service.py
322
+ coord/notifier/store.py
323
+ coord/notifier/transport.py
313
324
  coord/providers/__init__.py
314
325
  coord/providers/base.py
315
326
  coord/providers/claude.py
@@ -349,6 +360,7 @@ docs/GRAPHIFY_SETUP.md
349
360
  docs/ISSUE_GUIDANCE.md
350
361
  docs/MAC_MINI.md
351
362
  docs/MERGE_AUTO_DRAIN_TRUST_BAR.md
363
+ docs/NOTIFIER.md
352
364
  docs/OPENCODE_VERIFICATION.md
353
365
  docs/OPERATING_GOTCHAS.md
354
366
  docs/ORACLE_LOOP.md
@@ -401,6 +413,7 @@ tests/test_agent_deploy_units_endpoint.py
401
413
  tests/test_agent_dirty_worktree.py
402
414
  tests/test_agent_graph_self_heal.py
403
415
  tests/test_agent_health_h3.py
416
+ tests/test_agent_idle_restart.py
404
417
  tests/test_agent_push_failure.py
405
418
  tests/test_agent_reap.py
406
419
  tests/test_agent_repos_and_pull.py
@@ -568,6 +581,7 @@ tests/test_interactive_briefing_echo.py
568
581
  tests/test_interactive_prefill_state.py
569
582
  tests/test_interactive_session_relaunch.py
570
583
  tests/test_interactive_test_verdict_backstop.py
584
+ tests/test_interactive_token_attribution.py
571
585
  tests/test_interactive_worktree.py
572
586
  tests/test_issue_store_seam.py
573
587
  tests/test_liveness_auditor.py
@@ -590,6 +604,15 @@ tests/test_new_issue_chat.py
590
604
  tests/test_next_release_tag.py
591
605
  tests/test_no_direct_gh_calls.py
592
606
  tests/test_node_shim.py
607
+ tests/test_notifier_baseline.py
608
+ tests/test_notifier_cli.py
609
+ tests/test_notifier_collect.py
610
+ tests/test_notifier_config.py
611
+ tests/test_notifier_drive_seam.py
612
+ tests/test_notifier_isolation.py
613
+ tests/test_notifier_predicate.py
614
+ tests/test_notifier_quiet_hours.py
615
+ tests/test_notifier_service.py
593
616
  tests/test_notify.py
594
617
  tests/test_notify_drain.py
595
618
  tests/test_openapi.py
@@ -652,6 +675,8 @@ tests/test_slice_issue_attribution.py
652
675
  tests/test_smoke.py
653
676
  tests/test_smoke_live_checkout_restore.py
654
677
  tests/test_smoke_workflow.py
678
+ tests/test_spend_ceiling.py
679
+ tests/test_spend_ceiling_coordinator.py
655
680
  tests/test_split.py
656
681
  tests/test_split_work.py
657
682
  tests/test_stage_projection.py
@@ -677,6 +702,7 @@ tests/test_transcript_floor.py
677
702
  tests/test_usage.py
678
703
  tests/test_usage_limits.py
679
704
  tests/test_usage_rollup.py
705
+ tests/test_venv_live_install_2121.py
680
706
  tests/test_version_single_source.py
681
707
  tests/test_watch.py
682
708
  tests/test_worker_events.py
@@ -251,6 +251,16 @@
251
251
  "coord/models.py",
252
252
  "coord/network.py",
253
253
  "coord/new_issue_chat.py",
254
+ "coord/notifier/__init__.py",
255
+ "coord/notifier/baseline.py",
256
+ "coord/notifier/cli.py",
257
+ "coord/notifier/collect.py",
258
+ "coord/notifier/digest.py",
259
+ "coord/notifier/models.py",
260
+ "coord/notifier/predicate.py",
261
+ "coord/notifier/service.py",
262
+ "coord/notifier/store.py",
263
+ "coord/notifier/transport.py",
254
264
  "coord/notify.py",
255
265
  "coord/openapi.py",
256
266
  "coord/overlap_fence.py",
@@ -281,6 +291,7 @@
281
291
  "coord/serve_app.py",
282
292
  "coord/skills/update-issue/SKILL.md",
283
293
  "coord/smoke.py",
294
+ "coord/spend_ceiling.py",
284
295
  "coord/split_work.py",
285
296
  "coord/stage_projection.py",
286
297
  "coord/state.py",
@@ -327,6 +338,7 @@
327
338
  "docs/ISSUE_GUIDANCE.md",
328
339
  "docs/MAC_MINI.md",
329
340
  "docs/MERGE_AUTO_DRAIN_TRUST_BAR.md",
341
+ "docs/NOTIFIER.md",
330
342
  "docs/OPENCODE_VERIFICATION.md",
331
343
  "docs/OPERATING_GOTCHAS.md",
332
344
  "docs/ORACLE_LOOP.md",
@@ -431,6 +443,7 @@
431
443
  "tests/test_agent_dirty_worktree.py",
432
444
  "tests/test_agent_graph_self_heal.py",
433
445
  "tests/test_agent_health_h3.py",
446
+ "tests/test_agent_idle_restart.py",
434
447
  "tests/test_agent_push_failure.py",
435
448
  "tests/test_agent_reap.py",
436
449
  "tests/test_agent_repos_and_pull.py",
@@ -598,6 +611,7 @@
598
611
  "tests/test_interactive_prefill_state.py",
599
612
  "tests/test_interactive_session_relaunch.py",
600
613
  "tests/test_interactive_test_verdict_backstop.py",
614
+ "tests/test_interactive_token_attribution.py",
601
615
  "tests/test_interactive_worktree.py",
602
616
  "tests/test_issue_store_seam.py",
603
617
  "tests/test_liveness_auditor.py",
@@ -620,6 +634,15 @@
620
634
  "tests/test_next_release_tag.py",
621
635
  "tests/test_no_direct_gh_calls.py",
622
636
  "tests/test_node_shim.py",
637
+ "tests/test_notifier_baseline.py",
638
+ "tests/test_notifier_cli.py",
639
+ "tests/test_notifier_collect.py",
640
+ "tests/test_notifier_config.py",
641
+ "tests/test_notifier_drive_seam.py",
642
+ "tests/test_notifier_isolation.py",
643
+ "tests/test_notifier_predicate.py",
644
+ "tests/test_notifier_quiet_hours.py",
645
+ "tests/test_notifier_service.py",
623
646
  "tests/test_notify.py",
624
647
  "tests/test_notify_drain.py",
625
648
  "tests/test_openapi.py",
@@ -682,6 +705,8 @@
682
705
  "tests/test_smoke.py",
683
706
  "tests/test_smoke_live_checkout_restore.py",
684
707
  "tests/test_smoke_workflow.py",
708
+ "tests/test_spend_ceiling.py",
709
+ "tests/test_spend_ceiling_coordinator.py",
685
710
  "tests/test_split.py",
686
711
  "tests/test_split_work.py",
687
712
  "tests/test_stage_projection.py",
@@ -707,6 +732,7 @@
707
732
  "tests/test_usage.py",
708
733
  "tests/test_usage_limits.py",
709
734
  "tests/test_usage_rollup.py",
735
+ "tests/test_venv_live_install_2121.py",
710
736
  "tests/test_version_single_source.py",
711
737
  "tests/test_watch.py",
712
738
  "tests/test_worker_events.py",
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.46",
2
+ "tag": "0.5.48",
3
3
  "distance": 0,
4
- "node": "g6b550e02d314120327e243cc96c1f09580e49af1",
4
+ "node": "gac33bdb3df0d6dce42857fa4ae59fa5ca29d9952",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-12"
@@ -235,6 +235,15 @@ _PTY_INJECT_RETRY_BACKOFF_S = 0.4
235
235
  _FIRST_OUTPUT_TIMEOUT = 600.0 # seconds of zero output before the watchdog kills
236
236
  NO_FIRST_OUTPUT_EXIT = 124 # exit code reported when the TTFT watchdog fires
237
237
 
238
+ # #2131: distinct exit code for a leg killed by the per-leg spend ceiling. It
239
+ # must NOT collide with NO_FIRST_OUTPUT_EXIT (or any plausible worker exit
240
+ # code) — `_reap` keys the `spend_ceiling_reason` stamp off it, and that stamp
241
+ # is the ONLY thing that makes a ceiling kill distinguishable from a crash for
242
+ # `coord retry` and the auto-reassign skip. Any non-zero value still lands the
243
+ # assignment on FAILED via the existing reap branch; the value only selects
244
+ # which diagnostic gets attached.
245
+ SPEND_CEILING_EXIT = 125
246
+
238
247
 
239
248
  def _append_log_line(log_path: str, line: str) -> None:
240
249
  """Best-effort append of a single line to the assignment log. Never raises."""
@@ -344,6 +353,8 @@ def _wait_for_proc_or_result(
344
353
  grace_after_result: float = _REAP_GRACE_AFTER_RESULT,
345
354
  max_wait: float = _REAP_MAX_WAIT,
346
355
  first_output_timeout: float = _FIRST_OUTPUT_TIMEOUT,
356
+ cost_ceiling_usd: float | None = None,
357
+ read_cost_usd: "Callable[[], float | None] | None" = None,
347
358
  killpg: Callable[[int, int], None] = _killpg_safe,
348
359
  log_has_result: Callable[[str], bool] = _log_has_result,
349
360
  log_has_output: Callable[[str], bool] = _log_has_output,
@@ -364,12 +375,44 @@ def _wait_for_proc_or_result(
364
375
  satisfied permanently — it never re-arms — so a slow-but-emitting (e.g.
365
376
  rate-limited) worker is never killed by it. See #299.
366
377
 
378
+ Per-leg spend ceiling (#2131): when ``cost_ceiling_usd`` is a positive
379
+ number and ``read_cost_usd`` is supplied, the worker's live spend is
380
+ sampled on every poll. At :data:`coord.spend_ceiling.WARN_FRACTION` of
381
+ the ceiling a one-shot ``STATUS:`` warning is written to the worker's own
382
+ log — so a watching operator gets a chance to intervene, and the kill is
383
+ legible after the fact. At or above the ceiling the process group is
384
+ killed and :data:`SPEND_CEILING_EXIT` is returned so ``_reap`` records a
385
+ ceiling kill rather than a generic failure.
386
+
387
+ Three properties of that check matter and are deliberate:
388
+
389
+ * **Fail open.** ``read_cost_usd`` returning ``None`` (unreadable log,
390
+ not stream-json, nothing priceable yet) never kills anything — killing
391
+ real work over a parse failure is worse than the overspend.
392
+ * **Never after the result event.** Once the worker has emitted its final
393
+ ``result`` the leg is logically finished and the money is already
394
+ spent; killing then would only mislabel a completed leg as a ceiling
395
+ kill. So the check is skipped once ``result_seen_at`` is set.
396
+ * **SIGKILL, not SIGTERM.** The whole point is to stop spending now; a
397
+ graceful shutdown that keeps talking to the API defeats it. Whatever
398
+ the worker committed is still on disk, and ``_reap``'s existing
399
+ safety-net push still runs afterwards.
400
+
367
401
  The keyword-only parameters exist for tests to inject short timeouts and
368
- mock kill/clock behavior.
402
+ mock kill/clock/cost behavior.
369
403
  """
370
404
  start = clock()
371
405
  result_seen_at: float | None = None
372
406
  output_seen = False
407
+ cost_warned = False
408
+ ceiling_armed = bool(
409
+ cost_ceiling_usd and cost_ceiling_usd > 0 and read_cost_usd is not None
410
+ )
411
+ if ceiling_armed:
412
+ # Hoisted out of the poll loop — this runs every `poll_interval`.
413
+ from coord.spend_ceiling import WARN_FRACTION # noqa: PLC0415
414
+
415
+ warn_at = cost_ceiling_usd * WARN_FRACTION
373
416
 
374
417
  while True:
375
418
  try:
@@ -406,6 +449,37 @@ def _wait_for_proc_or_result(
406
449
  "# reap: worker emitted result; awaiting clean exit\n",
407
450
  )
408
451
 
452
+ # #2131: per-leg spend ceiling. Only while the leg is still running
453
+ # (see the docstring for why a post-`result` kill is never useful),
454
+ # and only ever acting on a value the meter could actually read.
455
+ if ceiling_armed and result_seen_at is None:
456
+ try:
457
+ spent = read_cost_usd()
458
+ except Exception: # noqa: BLE001 — fail open, never break the reap
459
+ spent = None
460
+ if spent is not None:
461
+ if not cost_warned and spent >= warn_at:
462
+ cost_warned = True
463
+ _append_log_line(
464
+ log_path,
465
+ f"STATUS: spend ${spent:.2f} has passed "
466
+ f"{WARN_FRACTION:.0%} of the ${cost_ceiling_usd:.2f} "
467
+ "per-leg ceiling → the leg will be killed if it "
468
+ "reaches the ceiling → confidence: high (#2131)\n",
469
+ )
470
+ if spent >= cost_ceiling_usd:
471
+ _append_log_line(
472
+ log_path,
473
+ f"# reap: SIGKILL — spend ceiling breached "
474
+ f"(${spent:.2f} of ${cost_ceiling_usd:.2f}) (#2131)\n",
475
+ )
476
+ killpg(proc.pid, signal.SIGKILL)
477
+ try:
478
+ proc.wait(timeout=5)
479
+ except subprocess.TimeoutExpired:
480
+ pass
481
+ return SPEND_CEILING_EXIT
482
+
409
483
  if result_seen_at is not None and clock() - result_seen_at >= grace_after_result:
410
484
  # Worker logically done but process group still alive — force-kill.
411
485
  _append_log_line(
@@ -517,6 +591,19 @@ class AssignmentSpec:
517
591
  # :meth:`AgentServer._resolve_provider` for the full resolution chain —
518
592
  # this field existing does not, on its own, get honoured anywhere else.
519
593
  provider_def: "dict[str, Any] | None" = None
594
+ # #2131: per-leg spend ceiling in USD, resolved coordinator-side from
595
+ # `budget.ceiling_for(type)` (coord/config.py) and carried here rather
596
+ # than read from the agent's own config — a config-free agent
597
+ # (docs/EPHEMERAL_WORKERS.md) has none to read. `None` (the default, and
598
+ # what every agent sees when the coordinator has no `budget:` block)
599
+ # means NO CEILING: the reap's watchdog never samples cost and behaves
600
+ # exactly as it did pre-#2131.
601
+ #
602
+ # `coord/dispatch.py` omits the key entirely when there is no ceiling, so
603
+ # an agent predating this field never sees an unrecognized kwarg (
604
+ # `AssignmentSpec(**body)` in agent_app.py 400s on those) unless the
605
+ # operator has actually configured one.
606
+ cost_ceiling_usd: float | None = None
520
607
 
521
608
 
522
609
  class _GitError(RuntimeError):
@@ -2685,6 +2772,21 @@ class AgentAssignment:
2685
2772
  # instead of leaving it to expand at push time) surfaced only as a line
2686
2773
  # in the worker log that nothing downstream ever read.
2687
2774
  push_failure_reason: str | None = None
2775
+ # #2131: set when the reap's watchdog killed this leg because its live
2776
+ # spend crossed `spec.cost_ceiling_usd`. Formatted with
2777
+ # `coord.spend_ceiling.format_spend_ceiling_reason` (stable "spend
2778
+ # ceiling — " prefix, recognised by `is_spend_ceiling_reason`). Only ever
2779
+ # set alongside `status == FAILED` (the kill returns the non-zero
2780
+ # `SPEND_CEILING_EXIT`), and `None` on every other outcome.
2781
+ #
2782
+ # This field is the WHOLE POINT of #2131's "not a generic failure"
2783
+ # requirement: the coordinator stamps it onto the board's persisted
2784
+ # `failure_reason` (coord/reconcile.py) so `coord retry` can refuse to
2785
+ # silently re-spend, `auto_reassign` can decline to re-dispatch it, and
2786
+ # the escalation record can name what actually happened. Without it a
2787
+ # ceiling kill is indistinguishable from a crash and the money is spent
2788
+ # again on the next pass.
2789
+ spend_ceiling_reason: str | None = None
2688
2790
 
2689
2791
  def to_dict(self) -> dict:
2690
2792
  d = asdict(self)
@@ -4934,6 +5036,18 @@ class AgentServer:
4934
5036
  prog = None
4935
5037
  if prog:
4936
5038
  d["progress"] = prog
5039
+ # #1632: when this worker last SAID anything, as Unix
5040
+ # seconds. The output-silence probe is the one that catches
5041
+ # failures with no symptom except duration, and only this
5042
+ # machine can see its own log file — the coordinator cannot
5043
+ # stat a remote path. A single `stat` on a file that is
5044
+ # already open for append, wrapped so a vanished log can
5045
+ # never break `/status`.
5046
+ if a.log_path:
5047
+ try:
5048
+ d["last_output_at"] = os.path.getmtime(a.log_path)
5049
+ except OSError:
5050
+ pass
4937
5051
  # Tail-read stream-json log for live summary fields.
4938
5052
  if a.log_path and is_stream_json(a.log_path):
4939
5053
  try:
@@ -6823,6 +6937,25 @@ class AgentServer:
6823
6937
  else:
6824
6938
  _log_has_result_fn = _log_has_result
6825
6939
 
6940
+ # #2131: arm the per-leg spend ceiling when the coordinator sent one.
6941
+ # The meter is built here (not inside the wait loop) so the same
6942
+ # instance survives the whole run and can be re-read afterwards for
6943
+ # the reason string — it reads the log incrementally, so a full
6944
+ # re-parse never happens on any poll.
6945
+ _cost_ceiling: float | None = None
6946
+ _cost_meter = None
6947
+ if _reap_start is not None:
6948
+ _raw_ceiling = getattr(_reap_start.spec, "cost_ceiling_usd", None)
6949
+ if isinstance(_raw_ceiling, (int, float)) and _raw_ceiling > 0:
6950
+ try:
6951
+ from coord.spend_ceiling import LiveCostMeter # noqa: PLC0415
6952
+
6953
+ _cost_ceiling = float(_raw_ceiling)
6954
+ _cost_meter = LiveCostMeter(log_path)
6955
+ except Exception: # noqa: BLE001 — fail open, never break reap
6956
+ _cost_ceiling = None
6957
+ _cost_meter = None
6958
+
6826
6959
  # Use a polling wait that handles claude-cli's well-known habit of
6827
6960
  # not exiting after emitting its final result event (a child of the
6828
6961
  # process group keeps the session alive). See #228.
@@ -6830,9 +6963,31 @@ class AgentServer:
6830
6963
  proc, log_path,
6831
6964
  first_output_timeout=self.first_output_timeout,
6832
6965
  log_has_result=_log_has_result_fn,
6966
+ cost_ceiling_usd=_cost_ceiling,
6967
+ read_cost_usd=_cost_meter.read if _cost_meter is not None else None,
6833
6968
  )
6834
6969
  log_fh.close()
6835
6970
 
6971
+ # #2131: turn the ceiling kill into the stable, greppable diagnostic
6972
+ # every downstream consumer keys off. Uses the meter's LAST observed
6973
+ # value rather than re-reading, so the number in the reason is
6974
+ # exactly the one the kill decision was made on.
6975
+ _spend_ceiling_reason: str | None = None
6976
+ if exit_code == SPEND_CEILING_EXIT and _cost_ceiling is not None:
6977
+ try:
6978
+ from coord.spend_ceiling import ( # noqa: PLC0415
6979
+ format_spend_ceiling_reason,
6980
+ )
6981
+
6982
+ _observed = (_cost_meter.last if _cost_meter is not None else None)
6983
+ _spend_ceiling_reason = format_spend_ceiling_reason(
6984
+ _observed if _observed is not None else _cost_ceiling,
6985
+ _cost_ceiling,
6986
+ getattr(_reap_start.spec, "type", None) if _reap_start else None,
6987
+ )
6988
+ except Exception: # noqa: BLE001 — best-effort, never break reap
6989
+ _spend_ceiling_reason = None
6990
+
6836
6991
  # #1461: detect a usage-limit kill from the tail of the transcript.
6837
6992
  # Done HERE — immediately after the worker's own process has exited
6838
6993
  # and BEFORE any coordinator bookkeeping (push attempts, advisory
@@ -7103,6 +7258,13 @@ class AgentServer:
7103
7258
  # checked independently of which branch set FAILED.
7104
7259
  if _result_is_error and assignment.status == FAILED:
7105
7260
  assignment.api_error_reason = _api_error_reason
7261
+ # #2131: only ever attaches to a FAILED transition —
7262
+ # `SPEND_CEILING_EXIT` is non-zero, so the `else` above has
7263
+ # already set FAILED whenever `_spend_ceiling_reason` is set.
7264
+ # Guarded anyway so a `POST /cancel` that raced the kill (and
7265
+ # set CANCELLED before this block ran) is never relabelled.
7266
+ if _spend_ceiling_reason is not None and assignment.status == FAILED:
7267
+ assignment.spend_ceiling_reason = _spend_ceiling_reason
7106
7268
  self._processes.pop(assignment_id, None)
7107
7269
 
7108
7270
  # #315/#324: parse the log for the worker's claude session_id (from the