code-coordinator 0.5.47__tar.gz → 0.5.49__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 (809) hide show
  1. code_coordinator-0.5.49/.github/ISSUE_TEMPLATE/bug_report.md +42 -0
  2. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/CLAUDE.md +2 -1
  3. {code_coordinator-0.5.47/code_coordinator.egg-info → code_coordinator-0.5.49}/PKG-INFO +1 -1
  4. {code_coordinator-0.5.47 → code_coordinator-0.5.49/code_coordinator.egg-info}/PKG-INFO +1 -1
  5. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/code_coordinator.egg-info/SOURCES.txt +29 -0
  6. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/code_coordinator.egg-info/scm_file_list.json +29 -0
  7. code_coordinator-0.5.49/code_coordinator.egg-info/scm_version.json +8 -0
  8. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/acceptance.py +34 -0
  9. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/agent.py +163 -1
  10. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/agent_app.py +395 -47
  11. code_coordinator-0.5.49/coord/agent_update.py +864 -0
  12. code_coordinator-0.5.49/coord/bug_intake.py +117 -0
  13. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/cli.py +4 -0
  14. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/agent_ops.py +51 -10
  15. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/dispatch.py +51 -2
  16. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/drive.py +50 -0
  17. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/issues.py +56 -1
  18. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/merge.py +18 -1
  19. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/release.py +39 -7
  20. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/status.py +8 -2
  21. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/config.py +340 -4
  22. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/coord-release-window.timer +2 -2
  23. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/coord-web-dist-build.service +2 -2
  24. code_coordinator-0.5.49/coord/deploy/coord-web-dist-build.timer +61 -0
  25. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dispatch.py +37 -0
  26. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/drive.py +142 -7
  27. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/drive_queue.py +206 -12
  28. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/deploy_lane_facts.py +145 -0
  29. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/interactive.py +123 -2
  30. code_coordinator-0.5.49/coord/notifier/__init__.py +32 -0
  31. code_coordinator-0.5.49/coord/notifier/baseline.py +329 -0
  32. code_coordinator-0.5.49/coord/notifier/cli.py +255 -0
  33. code_coordinator-0.5.49/coord/notifier/collect.py +341 -0
  34. code_coordinator-0.5.49/coord/notifier/digest.py +171 -0
  35. code_coordinator-0.5.49/coord/notifier/models.py +185 -0
  36. code_coordinator-0.5.49/coord/notifier/predicate.py +453 -0
  37. code_coordinator-0.5.49/coord/notifier/service.py +252 -0
  38. code_coordinator-0.5.49/coord/notifier/store.py +312 -0
  39. code_coordinator-0.5.49/coord/notifier/transport.py +196 -0
  40. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/notify.py +14 -0
  41. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/reconcile.py +88 -0
  42. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/release_cordon.py +22 -0
  43. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/release_propagate.py +66 -16
  44. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/release_verify.py +42 -0
  45. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/release_window.py +25 -6
  46. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/serve_app.py +49 -1
  47. code_coordinator-0.5.49/coord/spend_ceiling.py +291 -0
  48. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/usage.py +42 -0
  49. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coordinator.example.yml +130 -0
  50. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-release-window.timer +2 -2
  51. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-web-dist-build.service +2 -2
  52. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-web-dist-build.sh +82 -15
  53. code_coordinator-0.5.49/deploy/coord-web-dist-build.timer +61 -0
  54. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-web-rollback.sh +5 -5
  55. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/DRIVE_QUEUE.md +37 -0
  56. code_coordinator-0.5.49/docs/NOTIFIER.md +233 -0
  57. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/TEST_FIRST_BUG_LANE.md +134 -3
  58. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/conftest.py +49 -0
  59. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_acceptance.py +41 -0
  60. code_coordinator-0.5.49/tests/test_agent_idle_restart.py +453 -0
  61. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_update.py +175 -11
  62. code_coordinator-0.5.49/tests/test_bug_intake.py +93 -0
  63. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_drive_queue.py +170 -0
  64. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_issue_create_label.py +56 -0
  65. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_merge.py +101 -3
  66. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_release_propagate.py +137 -0
  67. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_deploy_coord_web_dist.py +103 -4
  68. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_drive.py +380 -2
  69. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_drive_queue.py +370 -2
  70. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_drive_tmux.py +3 -1
  71. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_health_deploy_lane_facts.py +127 -0
  72. code_coordinator-0.5.49/tests/test_interactive_token_attribution.py +463 -0
  73. code_coordinator-0.5.49/tests/test_notifier_baseline.py +201 -0
  74. code_coordinator-0.5.49/tests/test_notifier_cli.py +198 -0
  75. code_coordinator-0.5.49/tests/test_notifier_collect.py +243 -0
  76. code_coordinator-0.5.49/tests/test_notifier_config.py +150 -0
  77. code_coordinator-0.5.49/tests/test_notifier_drive_seam.py +130 -0
  78. code_coordinator-0.5.49/tests/test_notifier_isolation.py +250 -0
  79. code_coordinator-0.5.49/tests/test_notifier_predicate.py +381 -0
  80. code_coordinator-0.5.49/tests/test_notifier_quiet_hours.py +161 -0
  81. code_coordinator-0.5.49/tests/test_notifier_service.py +365 -0
  82. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_release_propagate.py +67 -13
  83. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_release_verify.py +89 -0
  84. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_serve.py +35 -1
  85. code_coordinator-0.5.49/tests/test_spend_ceiling.py +537 -0
  86. code_coordinator-0.5.49/tests/test_spend_ceiling_coordinator.py +315 -0
  87. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_usage.py +145 -0
  88. code_coordinator-0.5.49/tests/test_venv_live_install_2121.py +551 -0
  89. code_coordinator-0.5.47/code_coordinator.egg-info/scm_version.json +0 -8
  90. code_coordinator-0.5.47/coord/agent_update.py +0 -417
  91. code_coordinator-0.5.47/coord/deploy/coord-web-dist-build.timer +0 -36
  92. code_coordinator-0.5.47/deploy/coord-web-dist-build.timer +0 -36
  93. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/.claude/commands/board.md +0 -0
  94. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/.claude/commands/complete-session.md +0 -0
  95. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/.claude/commands/coordinator.md +0 -0
  96. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/.githooks/_lib.sh +0 -0
  97. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/.githooks/post-checkout +0 -0
  98. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/.githooks/post-commit +0 -0
  99. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/.githooks/post-merge +0 -0
  100. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/.github/workflows/auto-release.yml +0 -0
  101. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/.github/workflows/cargo-test.yml +0 -0
  102. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/.github/workflows/publish.yml +0 -0
  103. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/.github/workflows/release-tui.yml +0 -0
  104. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/.github/workflows/test.yml +0 -0
  105. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/.gitignore +0 -0
  106. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/GOAL.md +0 -0
  107. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/LICENSE +0 -0
  108. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/MANIFEST.in +0 -0
  109. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/README.md +0 -0
  110. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/code_coordinator.egg-info/dependency_links.txt +0 -0
  111. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/code_coordinator.egg-info/entry_points.txt +0 -0
  112. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/code_coordinator.egg-info/requires.txt +0 -0
  113. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/code_coordinator.egg-info/top_level.txt +0 -0
  114. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/__init__.py +0 -0
  115. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/_board_mapping.py +0 -0
  116. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/acceptance_drivers.py +0 -0
  117. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/agents/opencode/.gitignore +0 -0
  118. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/agents/opencode/agents/work.md +0 -0
  119. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/agents/opencode/routing.jsonc +0 -0
  120. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/audit.py +0 -0
  121. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/auto_loop.py +0 -0
  122. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/board_bool_guard.py +0 -0
  123. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/board_service.py +0 -0
  124. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/board_wire.py +0 -0
  125. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/brain.py +0 -0
  126. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/branch_model.py +0 -0
  127. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/cargo_cache.py +0 -0
  128. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/ci_github.py +0 -0
  129. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/ci_store.py +0 -0
  130. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/claim.py +0 -0
  131. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/client.py +0 -0
  132. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/__init__.py +0 -0
  133. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/_common.py +0 -0
  134. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/acceptance.py +0 -0
  135. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/audit.py +0 -0
  136. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/chat.py +0 -0
  137. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/dispatch_workers.py +0 -0
  138. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/drive_queue.py +0 -0
  139. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/gate_a.py +0 -0
  140. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/gates.py +0 -0
  141. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/lifecycle.py +0 -0
  142. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/milestone.py +0 -0
  143. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/plan_followup.py +0 -0
  144. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/plans.py +0 -0
  145. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/report.py +0 -0
  146. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/review.py +0 -0
  147. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/scorecard.py +0 -0
  148. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/sessions.py +0 -0
  149. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/setup.py +0 -0
  150. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/terminal.py +0 -0
  151. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/test_gate.py +0 -0
  152. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/commands/tui.py +0 -0
  153. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/comments.py +0 -0
  154. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/conflict_fix.py +0 -0
  155. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dao.py +0 -0
  156. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/__init__.py +0 -0
  157. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/fixture.py +0 -0
  158. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/index.html +0 -0
  159. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/server.py +0 -0
  160. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/terminal.py +0 -0
  161. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/.gitignore +0 -0
  162. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/components.json +0 -0
  163. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/dist/assets/Gallery-da3qNiIw.js +0 -0
  164. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/dist/assets/Terminal-9CEnUXvW.css +0 -0
  165. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/dist/assets/Terminal-skVFCxPU.js +0 -0
  166. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/dist/assets/index-DltfZR5f.js +0 -0
  167. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/dist/assets/index-Dq4kwTdw.css +0 -0
  168. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/dist/assets/workbox-window.prod.es5-BqEJf4Xk.js +0 -0
  169. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/dist/icons/icon-192.png +0 -0
  170. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/dist/icons/icon-512.png +0 -0
  171. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/dist/icons/icon.svg +0 -0
  172. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/dist/index.html +0 -0
  173. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/dist/manifest.webmanifest +0 -0
  174. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/dist/sw.js +0 -0
  175. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/dist/workbox-e4022e15.js +0 -0
  176. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/e2e/available-gates-terminal.spec.ts +0 -0
  177. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/e2e/deep-link.spec.ts +0 -0
  178. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/e2e/fixtureServer.ts +0 -0
  179. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/e2e/live-update-fixture.spec.ts +0 -0
  180. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/e2e/realtime.spec.ts +0 -0
  181. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/e2e/shell.spec.ts +0 -0
  182. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/e2e/smoke.spec.ts +0 -0
  183. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/e2e/terminal.spec.ts +0 -0
  184. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/e2e/theme.spec.ts +0 -0
  185. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/eslint.config.js +0 -0
  186. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/index.html +0 -0
  187. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/node_modules/flatted/python/flatted.py +0 -0
  188. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/package-lock.json +0 -0
  189. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/package.json +0 -0
  190. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/playwright.acceptance.config.ts +0 -0
  191. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/playwright.config.ts +0 -0
  192. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/postcss.config.js +0 -0
  193. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/public/icons/icon-192.png +0 -0
  194. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/public/icons/icon-512.png +0 -0
  195. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/public/icons/icon.svg +0 -0
  196. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/App.tsx +0 -0
  197. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/api/client.ts +0 -0
  198. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/api/generated.ts +0 -0
  199. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ConnectionBadge.tsx +0 -0
  200. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/Detail.tsx +0 -0
  201. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/Gallery.tsx +0 -0
  202. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/Home.tsx +0 -0
  203. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/MobileKeyBar.tsx +0 -0
  204. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/PanelHeader.tsx +0 -0
  205. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/PipelineCard.tsx +0 -0
  206. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/SessionCard.tsx +0 -0
  207. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/SessionDetail.tsx +0 -0
  208. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/SessionsList.tsx +0 -0
  209. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/Terminal.tsx +0 -0
  210. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/__tests__/ConnectionBadge.test.tsx +0 -0
  211. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/__tests__/Detail.test.tsx +0 -0
  212. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/__tests__/Gallery.test.tsx +0 -0
  213. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/__tests__/Home.test.tsx +0 -0
  214. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/__tests__/MobileKeyBar.test.tsx +0 -0
  215. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/__tests__/PipelineCard.test.tsx +0 -0
  216. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/__tests__/SessionCard.test.tsx +0 -0
  217. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/__tests__/Terminal.test.tsx +0 -0
  218. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ui/badge.tsx +0 -0
  219. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ui/button.tsx +0 -0
  220. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ui/card.tsx +0 -0
  221. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ui/dialog.tsx +0 -0
  222. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ui/dropdown-menu.tsx +0 -0
  223. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ui/empty-state.tsx +0 -0
  224. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ui/sheet.tsx +0 -0
  225. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ui/skeleton.tsx +0 -0
  226. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ui/tabs.tsx +0 -0
  227. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ui/theme-provider.tsx +0 -0
  228. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ui/theme-toggle.tsx +0 -0
  229. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ui/toast.tsx +0 -0
  230. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ui/toaster.tsx +0 -0
  231. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ui/tooltip.tsx +0 -0
  232. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/components/ui/use-toast.ts +0 -0
  233. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/index.css +0 -0
  234. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/lib/pipeline.ts +0 -0
  235. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/lib/utils.ts +0 -0
  236. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/main.tsx +0 -0
  237. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/realtime/RealtimeProvider.tsx +0 -0
  238. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/realtime/__tests__/RealtimeProvider.test.tsx +0 -0
  239. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/realtime/__tests__/connection.test.ts +0 -0
  240. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/realtime/connection.ts +0 -0
  241. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/realtime/events.ts +0 -0
  242. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/routes/__tests__/paths.test.ts +0 -0
  243. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/routes/paths.ts +0 -0
  244. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/shell/ActivityRail.tsx +0 -0
  245. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/shell/AppShell.tsx +0 -0
  246. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/shell/ComingSoon.tsx +0 -0
  247. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/shell/EmptyDetail.tsx +0 -0
  248. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/shell/RouteNotFound.tsx +0 -0
  249. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/shell/ShellLayout.tsx +0 -0
  250. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/shell/StatusBar.tsx +0 -0
  251. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/shell/__tests__/ShellLayout.test.tsx +0 -0
  252. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/shell/__tests__/shellState.test.ts +0 -0
  253. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/shell/__tests__/stubViewport.ts +0 -0
  254. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/shell/breakpoints.ts +0 -0
  255. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/shell/railItems.ts +0 -0
  256. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/shell/shellState.ts +0 -0
  257. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/shell/useRegionFocus.ts +0 -0
  258. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/test-setup.ts +0 -0
  259. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/src/vite-env.d.ts +0 -0
  260. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/tailwind.config.js +0 -0
  261. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/tsconfig.json +0 -0
  262. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/tsconfig.node.json +0 -0
  263. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dashboard/webapp/vite.config.ts +0 -0
  264. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/db.py +0 -0
  265. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dead_end.py +0 -0
  266. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/README.md +0 -0
  267. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/coord-agent.service +0 -0
  268. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/coord-db-backup.service +0 -0
  269. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/coord-db-backup.sh +0 -0
  270. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/coord-db-backup.timer +0 -0
  271. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/coord-drive-queue.service +0 -0
  272. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/coord-drive-queue.timer +0 -0
  273. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/coord-notify.service +0 -0
  274. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/coord-notify.timer +0 -0
  275. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/coord-release-propagate.service +0 -0
  276. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/coord-release-propagate.timer +0 -0
  277. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/coord-release-window.service +0 -0
  278. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/coord-serve.service +0 -0
  279. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy/coord-web.service +0 -0
  280. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy_manifest.py +0 -0
  281. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deploy_units.py +0 -0
  282. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/deps.py +0 -0
  283. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/diagnose.py +0 -0
  284. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/dist_name.py +0 -0
  285. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/drive_state.py +0 -0
  286. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/events.py +0 -0
  287. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/failure_class.py +0 -0
  288. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/filelock.py +0 -0
  289. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/fleet_config_health.py +0 -0
  290. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/freshness.py +0 -0
  291. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/gate_a.py +0 -0
  292. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/gate_b.py +0 -0
  293. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/gate_snapshot.py +0 -0
  294. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/gates.py +0 -0
  295. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/github_ops.py +0 -0
  296. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/goal.py +0 -0
  297. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/graph_health.py +0 -0
  298. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/__init__.py +0 -0
  299. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/aggregate.py +0 -0
  300. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/__init__.py +0 -0
  301. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/agent_install.py +0 -0
  302. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/cargo_targets.py +0 -0
  303. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/claude_binary.py +0 -0
  304. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/disk.py +0 -0
  305. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/fleet_board.py +0 -0
  306. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  307. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/fleet_phantom.py +0 -0
  308. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/fleet_unit_drift.py +0 -0
  309. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/graph.py +0 -0
  310. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/plan_usage.py +0 -0
  311. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/repo_state.py +0 -0
  312. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/spawned_coord.py +0 -0
  313. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/timer_active.py +0 -0
  314. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/toolchain.py +0 -0
  315. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/unit_drift.py +0 -0
  316. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/unit_enablement.py +0 -0
  317. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/checks/worktrees.py +0 -0
  318. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/cli.py +0 -0
  319. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/context.py +0 -0
  320. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/fleet_snapshot.py +0 -0
  321. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/models.py +0 -0
  322. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/pypi.py +0 -0
  323. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/registry.py +0 -0
  324. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/render.py +0 -0
  325. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/health/units.py +0 -0
  326. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/hooks.py +0 -0
  327. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/housekeeping.py +0 -0
  328. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/issue_store.py +0 -0
  329. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/liveness_auditor.py +0 -0
  330. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/machine_pause.py +0 -0
  331. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/merge_queue.py +0 -0
  332. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/milestone_chat.py +0 -0
  333. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/milestone_dispatch.py +0 -0
  334. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/milestone_gate.py +0 -0
  335. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/milestone_order.py +0 -0
  336. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/mock_author.py +0 -0
  337. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/models.py +0 -0
  338. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/network.py +0 -0
  339. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/new_issue_chat.py +0 -0
  340. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/openapi.py +0 -0
  341. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/overlap_fence.py +0 -0
  342. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/parentage.py +0 -0
  343. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/parentage_github.py +0 -0
  344. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/pipeline.py +0 -0
  345. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/plan_parser.py +0 -0
  346. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/plans.py +0 -0
  347. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/platform_paths.py +0 -0
  348. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/pr_body_lint.py +0 -0
  349. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/prereqs.py +0 -0
  350. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/progress.py +0 -0
  351. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/providers/__init__.py +0 -0
  352. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/providers/base.py +0 -0
  353. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/providers/claude.py +0 -0
  354. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/providers/claude_pty.py +0 -0
  355. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/providers/opencode.py +0 -0
  356. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/refine_chat.py +0 -0
  357. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/reports.py +0 -0
  358. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/revalidate.py +0 -0
  359. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/review.py +0 -0
  360. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/scorecard.py +0 -0
  361. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/skills/update-issue/SKILL.md +0 -0
  362. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/smoke.py +0 -0
  363. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/split_work.py +0 -0
  364. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/stage_projection.py +0 -0
  365. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/state.py +0 -0
  366. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/test_author.py +0 -0
  367. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/test_chat.py +0 -0
  368. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/test_orchestrator.py +0 -0
  369. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/test_report.py +0 -0
  370. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/tui_release.py +0 -0
  371. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/usage_limits.py +0 -0
  372. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/usage_rollup.py +0 -0
  373. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/coord/worker_events.py +0 -0
  374. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-agent.service +0 -0
  375. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-db-backup.service +0 -0
  376. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-db-backup.sh +0 -0
  377. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-db-backup.timer +0 -0
  378. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-drive-queue.service +0 -0
  379. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-drive-queue.timer +0 -0
  380. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-notify.service +0 -0
  381. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-notify.timer +0 -0
  382. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-release-propagate.service +0 -0
  383. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-release-propagate.timer +0 -0
  384. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-release-window.service +0 -0
  385. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-serve.service +0 -0
  386. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/coord-web.service +0 -0
  387. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/deploy/node-shim.sh +0 -0
  388. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/AGENT_OPERATIONS.md +0 -0
  389. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/ARCHITECTURE.md +0 -0
  390. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/ARCH_SECURITY_GATES.md +0 -0
  391. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/COCKPIT.md +0 -0
  392. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/CONTROL_CENTER.md +0 -0
  393. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/CROSS_PLATFORM.md +0 -0
  394. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/CUSTOMER_PORTAL.md +0 -0
  395. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/EPHEMERAL_WORKERS.md +0 -0
  396. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/FORGE_MIGRATION.md +0 -0
  397. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/GRAPHIFY_SETUP.md +0 -0
  398. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/ISSUE_GUIDANCE.md +0 -0
  399. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/MAC_MINI.md +0 -0
  400. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  401. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/OPENCODE_VERIFICATION.md +0 -0
  402. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/OPERATING_GOTCHAS.md +0 -0
  403. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/ORACLE_LOOP.md +0 -0
  404. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/PHONE_WEBAPP.md +0 -0
  405. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/PIPELINE_V2.md +0 -0
  406. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/PLATFORM_EVOLUTION.md +0 -0
  407. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/SECOND_BACKEND.md +0 -0
  408. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/STORE_SERVICE.md +0 -0
  409. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/WEB_CONTROL_CENTER.md +0 -0
  410. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/mocks/web/README.md +0 -0
  411. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/mocks/web/_tokens.css +0 -0
  412. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/mocks/web/issue-detail.html +0 -0
  413. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/mocks/web/pipeline-narrow.html +0 -0
  414. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/docs/mocks/web/pipeline-wide.html +0 -0
  415. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/graphify-out/.gitignore +0 -0
  416. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/install-agent.sh +0 -0
  417. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/pyproject.toml +0 -0
  418. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/audit_review_verdict_overrides.py +0 -0
  419. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  420. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/azure-workers/build-worker-image.sh +0 -0
  421. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/azure-workers/coordinator-machine.py +0 -0
  422. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/azure-workers/epic-down.sh +0 -0
  423. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/azure-workers/epic-up.sh +0 -0
  424. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/azure-workers/preflight.sh +0 -0
  425. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/azure-workers/provision-worker.sh +0 -0
  426. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  427. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  428. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/azure-workers/verify-github-token.sh +0 -0
  429. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/codegen.py +0 -0
  430. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/coord-test-runner.sh +0 -0
  431. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/drive-batch.sh +0 -0
  432. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/gen_board_fixture.py +0 -0
  433. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/next_release_tag.py +0 -0
  434. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/run_tests_without_gh.sh +0 -0
  435. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/smoke_437_interactive.py +0 -0
  436. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/verify_878_review_capture.py +0 -0
  437. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/verify_release_published.py +0 -0
  438. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/scripts/verify_release_wheel.py +0 -0
  439. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/setup.cfg +0 -0
  440. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/SMOKE_SET.md +0 -0
  441. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/__init__.py +0 -0
  442. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-33/audit_1039.rs +0 -0
  443. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-33/contract.md +0 -0
  444. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-33/manifest.yml +0 -0
  445. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  446. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  447. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  448. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  449. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-37/conftest.py +0 -0
  450. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-37/contract.md +0 -0
  451. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-37/manifest.yml +0 -0
  452. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  453. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  454. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-38/contract.md +0 -0
  455. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-38/manifest.yml +0 -0
  456. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  457. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  458. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  459. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  460. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  461. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  462. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  463. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  464. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  465. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  466. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-51/contract.md +0 -0
  467. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  468. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  469. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-51/manifest.yml +0 -0
  470. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  471. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-51/tsconfig.json +0 -0
  472. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  473. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/board-pipeline-basic.json +0 -0
  474. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  475. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  476. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  477. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/playwright/all_pass.json +0 -0
  478. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  479. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/playwright/mixed_fail.json +0 -0
  480. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  481. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  482. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/playwright/skip.json +0 -0
  483. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/playwright/truncated.json +0 -0
  484. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  485. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  486. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  487. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  488. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  489. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  490. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  491. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  492. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_acceptance_drivers.py +0 -0
  493. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent.py +0 -0
  494. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_api_error.py +0 -0
  495. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_app.py +0 -0
  496. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_branch_base.py +0 -0
  497. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_branch_capture.py +0 -0
  498. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_config_free_1712.py +0 -0
  499. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_deploy_units_endpoint.py +0 -0
  500. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_dirty_worktree.py +0 -0
  501. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_graph_self_heal.py +0 -0
  502. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_health_h3.py +0 -0
  503. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_push_failure.py +0 -0
  504. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_reap.py +0 -0
  505. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_repos_and_pull.py +0 -0
  506. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_restart_services_endpoint.py +0 -0
  507. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_startup_diagnostics.py +0 -0
  508. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_update_bluegreen.py +0 -0
  509. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_usage_limit.py +0 -0
  510. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_agent_zero_commit.py +0 -0
  511. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_approve_reject_plan.py +0 -0
  512. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_approve_usage_gate.py +0 -0
  513. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_assignment_already_recorded_daemon.py +0 -0
  514. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_audit_log.py +0 -0
  515. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_audit_outcome.py +0 -0
  516. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_audit_query.py +0 -0
  517. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_auto_loop.py +0 -0
  518. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_auto_release_publish_2035.py +0 -0
  519. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_base_checkout_restore.py +0 -0
  520. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_board_cap_762.py +0 -0
  521. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_board_fixture.py +0 -0
  522. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_board_read_path.py +0 -0
  523. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_board_service.py +0 -0
  524. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_board_state.py +0 -0
  525. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_board_wire.py +0 -0
  526. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_brain.py +0 -0
  527. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_branch_model.py +0 -0
  528. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_build_worker_image_env_update.py +0 -0
  529. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cargo_cache.py +0 -0
  530. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_ci_acceptance_gate_1950.py +0 -0
  531. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_ci_store.py +0 -0
  532. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_claim.py +0 -0
  533. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_acceptance.py +0 -0
  534. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_assign.py +0 -0
  535. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  536. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_assign_interactive_remote.py +0 -0
  537. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_assign_provider.py +0 -0
  538. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_audit.py +0 -0
  539. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_chat_continue.py +0 -0
  540. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_diagnose_config_provenance.py +0 -0
  541. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_diagnose_graph.py +0 -0
  542. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_doctor.py +0 -0
  543. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_doctor_config_free_1801.py +0 -0
  544. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  545. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_drive.py +0 -0
  546. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_escalate.py +0 -0
  547. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_fix_headless_review.py +0 -0
  548. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_gate_a.py +0 -0
  549. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_install_drift.py +0 -0
  550. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_install_skills.py +0 -0
  551. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_issue_reopen.py +0 -0
  552. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_milestone_assign.py +0 -0
  553. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_milestone_capture.py +0 -0
  554. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_milestone_chat_add_child.py +0 -0
  555. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_milestone_dispatch.py +0 -0
  556. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_milestone_gate_b.py +0 -0
  557. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_milestone_gate_c.py +0 -0
  558. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_milestone_order.py +0 -0
  559. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  560. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_milestone_ship.py +0 -0
  561. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_network.py +0 -0
  562. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_new_issue_chat.py +0 -0
  563. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_plans.py +0 -0
  564. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_pull_artifact.py +0 -0
  565. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_queue.py +0 -0
  566. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_reattach_sessions.py +0 -0
  567. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_refine_board.py +0 -0
  568. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_release_preflight.py +0 -0
  569. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_release_window.py +0 -0
  570. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_scorecard.py +0 -0
  571. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_set_review_findings.py +0 -0
  572. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_status_advisory_terminal.py +0 -0
  573. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_status_merge_queue.py +0 -0
  574. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_status_provider.py +0 -0
  575. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_status_review_finalizing.py +0 -0
  576. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_status_test_failed_tag.py +0 -0
  577. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_status_usage_limit.py +0 -0
  578. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_sync_comments_873.py +0 -0
  579. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_test_plan.py +0 -0
  580. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_track.py +0 -0
  581. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_tui_update.py +0 -0
  582. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cli_wait.py +0 -0
  583. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_client_base_install.py +0 -0
  584. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_comments.py +0 -0
  585. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_completion_summary.py +0 -0
  586. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_config.py +0 -0
  587. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_config_acceptance.py +0 -0
  588. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_config_audit.py +0 -0
  589. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_config_pricing.py +0 -0
  590. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_config_usage_gate.py +0 -0
  591. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_conflict_fix.py +0 -0
  592. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_conflict_fix_semantic.py +0 -0
  593. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_coord_test.py +0 -0
  594. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_coord_test_runner_routing.py +0 -0
  595. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_coord_test_runner_toolchain.py +0 -0
  596. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_coord_web_sse_restart_live.py +0 -0
  597. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_coordinator_machine.py +0 -0
  598. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_cross_platform_imports.py +0 -0
  599. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_dashboard.py +0 -0
  600. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_dashboard_fixture.py +0 -0
  601. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_dashboard_terminal.py +0 -0
  602. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_dashboard_terminal_live.py +0 -0
  603. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_db.py +0 -0
  604. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_dead_end.py +0 -0
  605. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_deploy_coord_db_backup.py +0 -0
  606. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_deploy_coord_web_rollback.py +0 -0
  607. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_deploy_drive_queue_unit.py +0 -0
  608. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_deploy_manifest.py +0 -0
  609. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_deploy_units_lane.py +0 -0
  610. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_deploy_web_unit.py +0 -0
  611. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_deps.py +0 -0
  612. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_diagnose.py +0 -0
  613. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_dispatch.py +0 -0
  614. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_dispatch_target_validation.py +0 -0
  615. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_dist_name.py +0 -0
  616. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_done_housekeeping.py +0 -0
  617. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_drive_state.py +0 -0
  618. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_epic_up_capability_detection.py +0 -0
  619. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  620. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_epic_up_image_provenance.py +0 -0
  621. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_errors.py +0 -0
  622. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_events.py +0 -0
  623. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_failure_class.py +0 -0
  624. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_filelock.py +0 -0
  625. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  626. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_fix_of_force_override.py +0 -0
  627. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_fleet_config_health.py +0 -0
  628. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_fleet_health_probes.py +0 -0
  629. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_fleet_health_snapshot.py +0 -0
  630. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_freshness.py +0 -0
  631. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_gate_a.py +0 -0
  632. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_gate_b.py +0 -0
  633. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_gate_snapshot_staleness.py +0 -0
  634. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_gates.py +0 -0
  635. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_generated_types_fixture.py +0 -0
  636. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_github_ops.py +0 -0
  637. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_goal.py +0 -0
  638. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_graph_health.py +0 -0
  639. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_handoff.py +0 -0
  640. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_health_checks.py +0 -0
  641. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_health_cli.py +0 -0
  642. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_health_cli_graph.py +0 -0
  643. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_health_config.py +0 -0
  644. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_health_context.py +0 -0
  645. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_health_incident_regression.py +0 -0
  646. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_health_pypi.py +0 -0
  647. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_health_registry.py +0 -0
  648. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_health_timer_active.py +0 -0
  649. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_health_toolchain.py +0 -0
  650. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_health_unit_drift.py +0 -0
  651. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_health_unit_enablement.py +0 -0
  652. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_hooks.py +0 -0
  653. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_human_attended_437.py +0 -0
  654. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_init.py +0 -0
  655. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_integration.py +0 -0
  656. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_interactive_briefing_echo.py +0 -0
  657. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_interactive_prefill_state.py +0 -0
  658. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_interactive_session_relaunch.py +0 -0
  659. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_interactive_test_verdict_backstop.py +0 -0
  660. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_interactive_worktree.py +0 -0
  661. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_issue_store_seam.py +0 -0
  662. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_liveness_auditor.py +0 -0
  663. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_liveness_notify.py +0 -0
  664. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_machine_pause.py +0 -0
  665. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_merge_queue.py +0 -0
  666. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_merge_verify.py +0 -0
  667. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_milestone_chat.py +0 -0
  668. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_milestone_dispatch.py +0 -0
  669. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_milestone_gate.py +0 -0
  670. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_milestone_order.py +0 -0
  671. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_milestone_seam.py +0 -0
  672. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_mock_author.py +0 -0
  673. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_model_tiering.py +0 -0
  674. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_models.py +0 -0
  675. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_models_config_labels.py +0 -0
  676. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_needs_attention.py +0 -0
  677. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_network.py +0 -0
  678. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_new_issue_chat.py +0 -0
  679. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_next_release_tag.py +0 -0
  680. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_no_direct_gh_calls.py +0 -0
  681. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_node_shim.py +0 -0
  682. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_notify.py +0 -0
  683. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_notify_drain.py +0 -0
  684. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_openapi.py +0 -0
  685. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_operational_defaults.py +0 -0
  686. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_overlap_fence.py +0 -0
  687. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_packaged_deploy_units.py +0 -0
  688. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_parentage.py +0 -0
  689. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_paste_landed.py +0 -0
  690. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_pipeline.py +0 -0
  691. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_plan_followup_approve_plan_command.py +0 -0
  692. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_plan_followup_pr_command.py +0 -0
  693. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_plan_followup_review_command.py +0 -0
  694. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_plan_only.py +0 -0
  695. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_plan_parser.py +0 -0
  696. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_platform_paths.py +0 -0
  697. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_pr_body_lint.py +0 -0
  698. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_prereqs.py +0 -0
  699. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_production_db_guard.py +0 -0
  700. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_progress.py +0 -0
  701. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_provider_seam.py +0 -0
  702. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_providers.py +0 -0
  703. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_providers_config_labels.py +0 -0
  704. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_providers_pty.py +0 -0
  705. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_quiet_hours.py +0 -0
  706. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_reap_merged_sessions.py +0 -0
  707. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_reap_stale_interactive_tick.py +0 -0
  708. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_reconcile_branch.py +0 -0
  709. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_reconcile_completions.py +0 -0
  710. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_reconcile_merges.py +0 -0
  711. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_reconcile_usage_limit_done.py +0 -0
  712. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_refine_chat.py +0 -0
  713. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_release_cordon_2101.py +0 -0
  714. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_release_unified_1242.py +0 -0
  715. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_release_window.py +0 -0
  716. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_remote_auto_prune.py +0 -0
  717. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_remote_interactive_reaper.py +0 -0
  718. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_report_result_push.py +0 -0
  719. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_reports.py +0 -0
  720. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_retry.py +0 -0
  721. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_retry_advisory_1606.py +0 -0
  722. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_retry_type_1636.py +0 -0
  723. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_revalidate.py +0 -0
  724. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_review.py +0 -0
  725. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_review_end_review_without_verdict.py +0 -0
  726. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_review_parse_failure_diagnostic.py +0 -0
  727. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_review_reaffirm.py +0 -0
  728. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_review_state.py +0 -0
  729. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_review_verdict_backstop.py +0 -0
  730. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_review_verdict_override_audit.py +0 -0
  731. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_review_verdict_relay.py +0 -0
  732. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_review_zero_commits.py +0 -0
  733. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_scoped_review_wiring.py +0 -0
  734. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_scorecard.py +0 -0
  735. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_serve_app_board_trim.py +0 -0
  736. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_session.py +0 -0
  737. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_slice_issue_attribution.py +0 -0
  738. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_smoke.py +0 -0
  739. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_smoke_live_checkout_restore.py +0 -0
  740. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_smoke_workflow.py +0 -0
  741. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_split.py +0 -0
  742. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_split_work.py +0 -0
  743. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_stage_projection.py +0 -0
  744. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_stalled_pipeline.py +0 -0
  745. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_state.py +0 -0
  746. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_state_review_findings_daemon.py +0 -0
  747. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_status_fleet_footer.py +0 -0
  748. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_stop_1567.py +0 -0
  749. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_stuck.py +0 -0
  750. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_terminal_command.py +0 -0
  751. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_test_author.py +0 -0
  752. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_test_chat.py +0 -0
  753. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_test_orchestrator.py +0 -0
  754. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_test_report.py +0 -0
  755. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_test_verdict_parsing.py +0 -0
  756. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_test_verdict_transcript_floor.py +0 -0
  757. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_thin_client_board_audit.py +0 -0
  758. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_thin_client_config_load_1080.py +0 -0
  759. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_thin_client_daemon_routing_906.py +0 -0
  760. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_tmux_host.py +0 -0
  761. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_tmux_session.py +0 -0
  762. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_transcript_floor.py +0 -0
  763. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_usage_limits.py +0 -0
  764. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_usage_rollup.py +0 -0
  765. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_version_single_source.py +0 -0
  766. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_watch.py +0 -0
  767. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_worker_events.py +0 -0
  768. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_worker_image_pin_sync.py +0 -0
  769. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_worker_safety.py +0 -0
  770. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_worktree.py +0 -0
  771. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  772. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/Cargo.lock +0 -0
  773. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/Cargo.toml +0 -0
  774. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/cargo-config-local-quadraui.toml.example +0 -0
  775. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/audit.rs +0 -0
  776. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/chat.rs +0 -0
  777. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/data.rs +0 -0
  778. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/dialogs.rs +0 -0
  779. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/drive.rs +0 -0
  780. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/drive_queue.rs +0 -0
  781. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/escalation.rs +0 -0
  782. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/events.rs +0 -0
  783. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/fixtures.rs +0 -0
  784. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/fleet_health.rs +0 -0
  785. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/fleet_sessions.rs +0 -0
  786. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/fleet_terminals.rs +0 -0
  787. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/format.rs +0 -0
  788. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/milestone_dag.rs +0 -0
  789. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/mod.rs +0 -0
  790. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/msv.rs +0 -0
  791. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/pipeline.rs +0 -0
  792. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/plans.rs +0 -0
  793. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/render.rs +0 -0
  794. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/reports.rs +0 -0
  795. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/sessions.rs +0 -0
  796. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/settings_ui.rs +0 -0
  797. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/sidebar.rs +0 -0
  798. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/terminal.rs +0 -0
  799. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/tests.rs +0 -0
  800. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/types.rs +0 -0
  801. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/app/workspace.rs +0 -0
  802. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/bin/gtk.rs +0 -0
  803. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/commands.rs +0 -0
  804. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/lib.rs +0 -0
  805. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/main.rs +0 -0
  806. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/src/settings.rs +0 -0
  807. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/tests/acceptance.rs +0 -0
  808. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/tests/cli.rs +0 -0
  809. {code_coordinator-0.5.47 → code_coordinator-0.5.49}/tui/tests/fixtures/board_sample.json +0 -0
@@ -0,0 +1,42 @@
1
+ ---
2
+ name: Bug report
3
+ about: >-
4
+ Report broken behaviour for the test-first bug lane (docs/TEST_FIRST_BUG_LANE.md).
5
+ Fill in all four sections — a bug report missing any of them can't be turned
6
+ into a red test.
7
+ title: ''
8
+ labels: bug
9
+ assignees: ''
10
+ ---
11
+
12
+ <!--
13
+ This is the test-first bug lane's intake contract (docs/TEST_FIRST_BUG_LANE.md
14
+ "The intake contract", #1964). All four sections below are required. They are
15
+ what a hand-authored (or agent-assisted) `contract.md` gets derived from — no
16
+ milestone, no UX mock, no Gate-A sign-off required.
17
+
18
+ `coord issue create --expected --actual --repro --evidence` renders this same
19
+ structure from the CLI (coord/bug_intake.py is the single source of truth for
20
+ the four headings — keep this file's headings in sync with it).
21
+ -->
22
+
23
+ ## Expected behaviour
24
+
25
+ <!-- What should happen, in observable terms. -->
26
+
27
+ ## Actual behaviour
28
+
29
+ <!-- What happens instead. -->
30
+
31
+ ## Reproduction
32
+
33
+ <!-- The shortest path to see it: exact steps/commands, starting from a clean checkout. -->
34
+
35
+ ## Evidence
36
+
37
+ <!--
38
+ Screenshot, wireframe, OR a reference implementation that behaves correctly
39
+ (a sibling backend, or a prior release). A reference implementation is the
40
+ highest-value form of evidence — it makes the expectation executable by
41
+ construction ("X should look like Y here" is a complete specification).
42
+ -->
@@ -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.47
3
+ Version: 0.5.49
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.47
3
+ Version: 0.5.49
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
@@ -14,6 +14,7 @@ pyproject.toml
14
14
  .githooks/post-checkout
15
15
  .githooks/post-commit
16
16
  .githooks/post-merge
17
+ .github/ISSUE_TEMPLATE/bug_report.md
17
18
  .github/workflows/auto-release.yml
18
19
  .github/workflows/cargo-test.yml
19
20
  .github/workflows/publish.yml
@@ -41,6 +42,7 @@ coord/board_service.py
41
42
  coord/board_wire.py
42
43
  coord/brain.py
43
44
  coord/branch_model.py
45
+ coord/bug_intake.py
44
46
  coord/cargo_cache.py
45
47
  coord/ci_github.py
46
48
  coord/ci_store.py
@@ -113,6 +115,7 @@ coord/review.py
113
115
  coord/scorecard.py
114
116
  coord/serve_app.py
115
117
  coord/smoke.py
118
+ coord/spend_ceiling.py
116
119
  coord/split_work.py
117
120
  coord/stage_projection.py
118
121
  coord/state.py
@@ -310,6 +313,16 @@ coord/health/checks/toolchain.py
310
313
  coord/health/checks/unit_drift.py
311
314
  coord/health/checks/unit_enablement.py
312
315
  coord/health/checks/worktrees.py
316
+ coord/notifier/__init__.py
317
+ coord/notifier/baseline.py
318
+ coord/notifier/cli.py
319
+ coord/notifier/collect.py
320
+ coord/notifier/digest.py
321
+ coord/notifier/models.py
322
+ coord/notifier/predicate.py
323
+ coord/notifier/service.py
324
+ coord/notifier/store.py
325
+ coord/notifier/transport.py
313
326
  coord/providers/__init__.py
314
327
  coord/providers/base.py
315
328
  coord/providers/claude.py
@@ -349,6 +362,7 @@ docs/GRAPHIFY_SETUP.md
349
362
  docs/ISSUE_GUIDANCE.md
350
363
  docs/MAC_MINI.md
351
364
  docs/MERGE_AUTO_DRAIN_TRUST_BAR.md
365
+ docs/NOTIFIER.md
352
366
  docs/OPENCODE_VERIFICATION.md
353
367
  docs/OPERATING_GOTCHAS.md
354
368
  docs/ORACLE_LOOP.md
@@ -401,6 +415,7 @@ tests/test_agent_deploy_units_endpoint.py
401
415
  tests/test_agent_dirty_worktree.py
402
416
  tests/test_agent_graph_self_heal.py
403
417
  tests/test_agent_health_h3.py
418
+ tests/test_agent_idle_restart.py
404
419
  tests/test_agent_push_failure.py
405
420
  tests/test_agent_reap.py
406
421
  tests/test_agent_repos_and_pull.py
@@ -427,6 +442,7 @@ tests/test_board_state.py
427
442
  tests/test_board_wire.py
428
443
  tests/test_brain.py
429
444
  tests/test_branch_model.py
445
+ tests/test_bug_intake.py
430
446
  tests/test_build_worker_image_env_update.py
431
447
  tests/test_cargo_cache.py
432
448
  tests/test_ci_acceptance_gate_1950.py
@@ -568,6 +584,7 @@ tests/test_interactive_briefing_echo.py
568
584
  tests/test_interactive_prefill_state.py
569
585
  tests/test_interactive_session_relaunch.py
570
586
  tests/test_interactive_test_verdict_backstop.py
587
+ tests/test_interactive_token_attribution.py
571
588
  tests/test_interactive_worktree.py
572
589
  tests/test_issue_store_seam.py
573
590
  tests/test_liveness_auditor.py
@@ -590,6 +607,15 @@ tests/test_new_issue_chat.py
590
607
  tests/test_next_release_tag.py
591
608
  tests/test_no_direct_gh_calls.py
592
609
  tests/test_node_shim.py
610
+ tests/test_notifier_baseline.py
611
+ tests/test_notifier_cli.py
612
+ tests/test_notifier_collect.py
613
+ tests/test_notifier_config.py
614
+ tests/test_notifier_drive_seam.py
615
+ tests/test_notifier_isolation.py
616
+ tests/test_notifier_predicate.py
617
+ tests/test_notifier_quiet_hours.py
618
+ tests/test_notifier_service.py
593
619
  tests/test_notify.py
594
620
  tests/test_notify_drain.py
595
621
  tests/test_openapi.py
@@ -652,6 +678,8 @@ tests/test_slice_issue_attribution.py
652
678
  tests/test_smoke.py
653
679
  tests/test_smoke_live_checkout_restore.py
654
680
  tests/test_smoke_workflow.py
681
+ tests/test_spend_ceiling.py
682
+ tests/test_spend_ceiling_coordinator.py
655
683
  tests/test_split.py
656
684
  tests/test_split_work.py
657
685
  tests/test_stage_projection.py
@@ -677,6 +705,7 @@ tests/test_transcript_floor.py
677
705
  tests/test_usage.py
678
706
  tests/test_usage_limits.py
679
707
  tests/test_usage_rollup.py
708
+ tests/test_venv_live_install_2121.py
680
709
  tests/test_version_single_source.py
681
710
  tests/test_watch.py
682
711
  tests/test_worker_events.py
@@ -7,6 +7,7 @@
7
7
  ".githooks/post-checkout",
8
8
  ".githooks/post-commit",
9
9
  ".githooks/post-merge",
10
+ ".github/ISSUE_TEMPLATE/bug_report.md",
10
11
  ".github/workflows/auto-release.yml",
11
12
  ".github/workflows/cargo-test.yml",
12
13
  ".github/workflows/publish.yml",
@@ -35,6 +36,7 @@
35
36
  "coord/board_wire.py",
36
37
  "coord/brain.py",
37
38
  "coord/branch_model.py",
39
+ "coord/bug_intake.py",
38
40
  "coord/cargo_cache.py",
39
41
  "coord/ci_github.py",
40
42
  "coord/ci_store.py",
@@ -251,6 +253,16 @@
251
253
  "coord/models.py",
252
254
  "coord/network.py",
253
255
  "coord/new_issue_chat.py",
256
+ "coord/notifier/__init__.py",
257
+ "coord/notifier/baseline.py",
258
+ "coord/notifier/cli.py",
259
+ "coord/notifier/collect.py",
260
+ "coord/notifier/digest.py",
261
+ "coord/notifier/models.py",
262
+ "coord/notifier/predicate.py",
263
+ "coord/notifier/service.py",
264
+ "coord/notifier/store.py",
265
+ "coord/notifier/transport.py",
254
266
  "coord/notify.py",
255
267
  "coord/openapi.py",
256
268
  "coord/overlap_fence.py",
@@ -281,6 +293,7 @@
281
293
  "coord/serve_app.py",
282
294
  "coord/skills/update-issue/SKILL.md",
283
295
  "coord/smoke.py",
296
+ "coord/spend_ceiling.py",
284
297
  "coord/split_work.py",
285
298
  "coord/stage_projection.py",
286
299
  "coord/state.py",
@@ -327,6 +340,7 @@
327
340
  "docs/ISSUE_GUIDANCE.md",
328
341
  "docs/MAC_MINI.md",
329
342
  "docs/MERGE_AUTO_DRAIN_TRUST_BAR.md",
343
+ "docs/NOTIFIER.md",
330
344
  "docs/OPENCODE_VERIFICATION.md",
331
345
  "docs/OPERATING_GOTCHAS.md",
332
346
  "docs/ORACLE_LOOP.md",
@@ -431,6 +445,7 @@
431
445
  "tests/test_agent_dirty_worktree.py",
432
446
  "tests/test_agent_graph_self_heal.py",
433
447
  "tests/test_agent_health_h3.py",
448
+ "tests/test_agent_idle_restart.py",
434
449
  "tests/test_agent_push_failure.py",
435
450
  "tests/test_agent_reap.py",
436
451
  "tests/test_agent_repos_and_pull.py",
@@ -457,6 +472,7 @@
457
472
  "tests/test_board_wire.py",
458
473
  "tests/test_brain.py",
459
474
  "tests/test_branch_model.py",
475
+ "tests/test_bug_intake.py",
460
476
  "tests/test_build_worker_image_env_update.py",
461
477
  "tests/test_cargo_cache.py",
462
478
  "tests/test_ci_acceptance_gate_1950.py",
@@ -598,6 +614,7 @@
598
614
  "tests/test_interactive_prefill_state.py",
599
615
  "tests/test_interactive_session_relaunch.py",
600
616
  "tests/test_interactive_test_verdict_backstop.py",
617
+ "tests/test_interactive_token_attribution.py",
601
618
  "tests/test_interactive_worktree.py",
602
619
  "tests/test_issue_store_seam.py",
603
620
  "tests/test_liveness_auditor.py",
@@ -620,6 +637,15 @@
620
637
  "tests/test_next_release_tag.py",
621
638
  "tests/test_no_direct_gh_calls.py",
622
639
  "tests/test_node_shim.py",
640
+ "tests/test_notifier_baseline.py",
641
+ "tests/test_notifier_cli.py",
642
+ "tests/test_notifier_collect.py",
643
+ "tests/test_notifier_config.py",
644
+ "tests/test_notifier_drive_seam.py",
645
+ "tests/test_notifier_isolation.py",
646
+ "tests/test_notifier_predicate.py",
647
+ "tests/test_notifier_quiet_hours.py",
648
+ "tests/test_notifier_service.py",
623
649
  "tests/test_notify.py",
624
650
  "tests/test_notify_drain.py",
625
651
  "tests/test_openapi.py",
@@ -682,6 +708,8 @@
682
708
  "tests/test_smoke.py",
683
709
  "tests/test_smoke_live_checkout_restore.py",
684
710
  "tests/test_smoke_workflow.py",
711
+ "tests/test_spend_ceiling.py",
712
+ "tests/test_spend_ceiling_coordinator.py",
685
713
  "tests/test_split.py",
686
714
  "tests/test_split_work.py",
687
715
  "tests/test_stage_projection.py",
@@ -707,6 +735,7 @@
707
735
  "tests/test_usage.py",
708
736
  "tests/test_usage_limits.py",
709
737
  "tests/test_usage_rollup.py",
738
+ "tests/test_venv_live_install_2121.py",
710
739
  "tests/test_version_single_source.py",
711
740
  "tests/test_watch.py",
712
741
  "tests/test_worker_events.py",
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "0.5.49",
3
+ "distance": 0,
4
+ "node": "g06ce4a930ffe97c992bfbed693615c2504e4d2be",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-08-13"
8
+ }
@@ -53,6 +53,40 @@ def _mocks_dir(milestone_number: int) -> str:
53
53
  return f"{ACCEPTANCE_DIRNAME}/{ms_dirname(milestone_number)}/mocks"
54
54
 
55
55
 
56
+ def issue_dirname(issue_number: int) -> str:
57
+ """The ``issue-NN`` directory name for a single-issue bug-lane contract
58
+ (docs/TEST_FIRST_BUG_LANE.md "The intake contract", #1964) — the bug
59
+ lane's counterpart to :func:`ms_dirname`, with no milestone in the name
60
+ because a bug has none.
61
+
62
+ This is purely a naming convention, not new plumbing: the manifest
63
+ scanner below (:func:`_manifest_paths`) globs ``*/manifest.*`` under
64
+ ``tests/acceptance/`` regardless of what the directory is called, so an
65
+ ``issue-NN/`` slice is discovered, run (``coord acceptance run --issue
66
+ N``), recorded (``coord acceptance record``), and injected into the
67
+ worker's briefing (:func:`oracle_loop_contract_block`) by the exact same
68
+ code path as an ``ms-NN/`` one — see ``TestOracleLoopContractBlock`` in
69
+ ``tests/test_acceptance.py``, which already proves the block is built
70
+ from whatever the owning directory happens to be named. Pinning the name
71
+ here just keeps every bug-lane contract in the same shape.
72
+ """
73
+ return f"issue-{issue_number}"
74
+
75
+
76
+ def bug_contract_path(issue_number: int) -> str:
77
+ """Repo-relative path to *issue_number*'s single-issue bug-lane contract
78
+ (docs/TEST_FIRST_BUG_LANE.md "The intake contract").
79
+
80
+ Unlike :func:`gate_a_contract_path`, nothing gates dispatch on this
81
+ existing — a bug issue has no milestone, so there is no Gate A to block
82
+ on it. It is hand-authored (or agent-assisted) directly from the four
83
+ intake fields (:mod:`coord.bug_intake`); once it — and a
84
+ ``manifest.yml`` alongside it — exist, the issue behaves exactly like an
85
+ authored ``ms-NN`` slice to every downstream command.
86
+ """
87
+ return f"{ACCEPTANCE_DIRNAME}/{issue_dirname(issue_number)}/contract.md"
88
+
89
+
56
90
  # Mock-fixture file extension -> the driver ``kind`` it implies (the SAME
57
91
  # rule each ``AcceptanceDriverConfig.mock`` glob already encodes in
58
92
  # coordinator.yml / docs/ORACLE_LOOP.md: ``"*.screen"`` for ``tui-tuidriver``,
@@ -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