code-coordinator 0.5.293__tar.gz → 0.5.294__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 (891) hide show
  1. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/client.py +56 -0
  5. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/github_throttle.py +162 -32
  6. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/serve_app.py +86 -0
  7. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_github_throttle.py +143 -1
  8. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_serve.py +117 -0
  9. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/.claude/commands/board.md +0 -0
  10. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/.claude/commands/complete-session.md +0 -0
  11. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/.claude/commands/coordinator.md +0 -0
  12. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/.githooks/_lib.sh +0 -0
  13. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/.githooks/post-checkout +0 -0
  14. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/.githooks/post-commit +0 -0
  15. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/.githooks/post-merge +0 -0
  16. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  17. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/.github/coord-ci-acceptance.yml +0 -0
  18. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/.github/workflows/auto-release.yml +0 -0
  19. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/.github/workflows/cargo-test.yml +0 -0
  20. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/.github/workflows/publish.yml +0 -0
  21. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/.github/workflows/test.yml +0 -0
  22. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/.gitignore +0 -0
  23. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/CLAUDE.md +0 -0
  24. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/GOAL.md +0 -0
  25. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/LICENSE +0 -0
  26. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/MANIFEST.in +0 -0
  27. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/README.md +0 -0
  28. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/code_coordinator.egg-info/SOURCES.txt +0 -0
  29. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/code_coordinator.egg-info/dependency_links.txt +0 -0
  30. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/code_coordinator.egg-info/entry_points.txt +0 -0
  31. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/code_coordinator.egg-info/requires.txt +0 -0
  32. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/code_coordinator.egg-info/scm_file_list.json +0 -0
  33. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/code_coordinator.egg-info/top_level.txt +0 -0
  34. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/__init__.py +0 -0
  35. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/_board_mapping.py +0 -0
  36. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/acceptance.py +0 -0
  37. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/acceptance_drivers.py +0 -0
  38. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/agent.py +0 -0
  39. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/agent_app.py +0 -0
  40. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/agent_update.py +0 -0
  41. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/agents/opencode/.gitignore +0 -0
  42. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/agents/opencode/agents/work.md +0 -0
  43. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/agents/opencode/routing.jsonc +0 -0
  44. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/approved_work.py +0 -0
  45. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/audit.py +0 -0
  46. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/auto_loop.py +0 -0
  47. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/block_log.py +0 -0
  48. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/board_schema.py +0 -0
  49. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/board_service.py +0 -0
  50. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/board_wire.py +0 -0
  51. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/brain.py +0 -0
  52. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/branch_model.py +0 -0
  53. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/bug_intake.py +0 -0
  54. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/cargo_cache.py +0 -0
  55. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/ci_fix.py +0 -0
  56. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/ci_github.py +0 -0
  57. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/ci_gitlab.py +0 -0
  58. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/ci_store.py +0 -0
  59. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/claim.py +0 -0
  60. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/cli.py +0 -0
  61. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/__init__.py +0 -0
  62. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/_common.py +0 -0
  63. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/acceptance.py +0 -0
  64. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/agent_ops.py +0 -0
  65. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/audit.py +0 -0
  66. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/chat.py +0 -0
  67. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/dispatch.py +0 -0
  68. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/dispatch_workers.py +0 -0
  69. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/drive.py +0 -0
  70. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/drive_queue.py +0 -0
  71. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/gate_a.py +0 -0
  72. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/gates.py +0 -0
  73. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/issues.py +0 -0
  74. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/lifecycle.py +0 -0
  75. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/machine.py +0 -0
  76. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/merge.py +0 -0
  77. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/milestone.py +0 -0
  78. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/plan_followup.py +0 -0
  79. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/plans.py +0 -0
  80. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/portal.py +0 -0
  81. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/pr.py +0 -0
  82. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/release.py +0 -0
  83. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/repo.py +0 -0
  84. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/report.py +0 -0
  85. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/review.py +0 -0
  86. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/scorecard.py +0 -0
  87. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/sessions.py +0 -0
  88. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/setup.py +0 -0
  89. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/status.py +0 -0
  90. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/store_migrate.py +0 -0
  91. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/terminal.py +0 -0
  92. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/test_gate.py +0 -0
  93. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/commands/tui.py +0 -0
  94. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/comments.py +0 -0
  95. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/config.py +0 -0
  96. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/config_reload.py +0 -0
  97. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/confirm_test.py +0 -0
  98. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/conflict_fix.py +0 -0
  99. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/dao.py +0 -0
  100. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/dashboard/__init__.py +0 -0
  101. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/dashboard/fixture.py +0 -0
  102. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/dashboard/index.html +0 -0
  103. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/dashboard/server.py +0 -0
  104. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/dashboard/terminal.py +0 -0
  105. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/db.py +0 -0
  106. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/dead_end.py +0 -0
  107. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/decomposition_chat.py +0 -0
  108. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/deploy/README.md +0 -0
  109. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/deploy/coord-agent.service +0 -0
  110. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/deploy/coord-db-backup.service +0 -0
  111. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/deploy/coord-db-backup.sh +0 -0
  112. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/deploy/coord-db-backup.timer +0 -0
  113. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/deploy/coord-drive-queue.service +0 -0
  114. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/deploy/coord-drive-queue.timer +0 -0
  115. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/deploy/coord-failure-notify.service +0 -0
  116. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/deploy/coord-fleet-watchdog.service +0 -0
  117. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  118. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/deploy/coord-notify.service +0 -0
  119. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/deploy/coord-notify.timer +0 -0
  120. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/deploy/coord-release-propagate.service +0 -0
  121. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/deploy/coord-release-propagate.timer +0 -0
  122. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/deploy/coord-release-window.service +0 -0
  123. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/deploy/coord-release-window.timer +0 -0
  124. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/deploy/coord-serve.service +0 -0
  125. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/deploy/coord-web-dist-build.service +0 -0
  126. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/deploy/coord-web-dist-build.timer +0 -0
  127. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/deploy/coord-web.service +0 -0
  128. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/deploy_manifest.py +0 -0
  129. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/deploy_units.py +0 -0
  130. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/deprecation_telemetry.py +0 -0
  131. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/deps.py +0 -0
  132. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/diagnose.py +0 -0
  133. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/dispatch.py +0 -0
  134. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/dist_name.py +0 -0
  135. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/drive.py +0 -0
  136. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/drive_queue.py +0 -0
  137. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/drive_state.py +0 -0
  138. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/events.py +0 -0
  139. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/failure_class.py +0 -0
  140. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/filelock.py +0 -0
  141. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/fleet_config_health.py +0 -0
  142. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/forge_availability.py +0 -0
  143. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/freshness.py +0 -0
  144. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/gate_a.py +0 -0
  145. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/gate_b.py +0 -0
  146. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/gate_snapshot.py +0 -0
  147. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/gates.py +0 -0
  148. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/github_ops.py +0 -0
  149. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/goal.py +0 -0
  150. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/graph_health.py +0 -0
  151. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/__init__.py +0 -0
  152. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/aggregate.py +0 -0
  153. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/checks/__init__.py +0 -0
  154. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/checks/agent_install.py +0 -0
  155. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/checks/cargo_targets.py +0 -0
  156. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/checks/claude_binary.py +0 -0
  157. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/checks/coord_web_ci_pin.py +0 -0
  158. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/checks/deploy_lane_facts.py +0 -0
  159. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/checks/disk.py +0 -0
  160. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/checks/fleet_board.py +0 -0
  161. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  162. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/checks/fleet_phantom.py +0 -0
  163. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/checks/fleet_unit_drift.py +0 -0
  164. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/checks/graph.py +0 -0
  165. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/checks/graphify_cli.py +0 -0
  166. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/checks/index_lock.py +0 -0
  167. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/checks/issues_sync_staleness.py +0 -0
  168. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/checks/plan_usage.py +0 -0
  169. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/checks/release_cordon.py +0 -0
  170. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/checks/repo_state.py +0 -0
  171. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/checks/spawned_coord.py +0 -0
  172. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/checks/stalled_pipeline.py +0 -0
  173. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/checks/timer_active.py +0 -0
  174. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/checks/toolchain.py +0 -0
  175. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/checks/unit_drift.py +0 -0
  176. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/checks/unit_enablement.py +0 -0
  177. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/checks/worktrees.py +0 -0
  178. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/cli.py +0 -0
  179. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/context.py +0 -0
  180. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/fleet_snapshot.py +0 -0
  181. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/models.py +0 -0
  182. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/pypi.py +0 -0
  183. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/registry.py +0 -0
  184. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/render.py +0 -0
  185. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/health/units.py +0 -0
  186. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/hooks.py +0 -0
  187. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/housekeeping.py +0 -0
  188. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/interactive.py +0 -0
  189. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/issue_store.py +0 -0
  190. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/issues_sync_status.py +0 -0
  191. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/liveness_auditor.py +0 -0
  192. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/machine_onboard.py +0 -0
  193. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/machine_pause.py +0 -0
  194. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/merge_queue.py +0 -0
  195. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/milestone_chat.py +0 -0
  196. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/milestone_dispatch.py +0 -0
  197. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/milestone_gate.py +0 -0
  198. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/milestone_order.py +0 -0
  199. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/mock_author.py +0 -0
  200. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/models.py +0 -0
  201. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/network.py +0 -0
  202. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/new_issue_chat.py +0 -0
  203. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/notifier/__init__.py +0 -0
  204. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/notifier/baseline.py +0 -0
  205. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/notifier/cli.py +0 -0
  206. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/notifier/collect.py +0 -0
  207. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/notifier/digest.py +0 -0
  208. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/notifier/models.py +0 -0
  209. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/notifier/predicate.py +0 -0
  210. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/notifier/service.py +0 -0
  211. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/notifier/store.py +0 -0
  212. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/notifier/transport.py +0 -0
  213. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/notify.py +0 -0
  214. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/openapi.py +0 -0
  215. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/overlap_fence.py +0 -0
  216. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/overlap_predict.py +0 -0
  217. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/parentage.py +0 -0
  218. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/parentage_github.py +0 -0
  219. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/pipeline.py +0 -0
  220. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/plan_parser.py +0 -0
  221. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/plans.py +0 -0
  222. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/platform_paths.py +0 -0
  223. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/portal_bridge.py +0 -0
  224. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/portal_store.py +0 -0
  225. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/portal_sync.py +0 -0
  226. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/pr_body_lint.py +0 -0
  227. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/prereqs.py +0 -0
  228. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/progress.py +0 -0
  229. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/providers/__init__.py +0 -0
  230. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/providers/base.py +0 -0
  231. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/providers/claude.py +0 -0
  232. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/providers/claude_pty.py +0 -0
  233. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/providers/opencode.py +0 -0
  234. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/queue_diagnose.py +0 -0
  235. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/reconcile.py +0 -0
  236. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/reconcile_tick.py +0 -0
  237. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/refine_chat.py +0 -0
  238. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/release_cordon.py +0 -0
  239. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/release_propagate.py +0 -0
  240. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/release_verify.py +0 -0
  241. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/release_window.py +0 -0
  242. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/repo_edit.py +0 -0
  243. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/repo_onboard.py +0 -0
  244. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/reports.py +0 -0
  245. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/rest_schema.py +0 -0
  246. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/revalidate.py +0 -0
  247. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/review.py +0 -0
  248. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/scorecard.py +0 -0
  249. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/self_health.py +0 -0
  250. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  251. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  252. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  253. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  254. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  255. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/skills/portal-followup/SKILL.md +0 -0
  256. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/skills/release-now/SKILL.md +0 -0
  257. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  258. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  259. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/skills/update-issue/SKILL.md +0 -0
  260. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/smoke.py +0 -0
  261. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/spend_ceiling.py +0 -0
  262. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/split_work.py +0 -0
  263. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/sql.py +0 -0
  264. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/stage_projection.py +0 -0
  265. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/state.py +0 -0
  266. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/store_migrate.py +0 -0
  267. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/test_author.py +0 -0
  268. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/test_chat.py +0 -0
  269. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/test_orchestrator.py +0 -0
  270. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/test_report.py +0 -0
  271. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/tui_release.py +0 -0
  272. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/usage.py +0 -0
  273. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/usage_limits.py +0 -0
  274. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/usage_rollup.py +0 -0
  275. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coord/worker_events.py +0 -0
  276. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/coordinator.example.yml +0 -0
  277. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/deploy/coord-agent.service +0 -0
  278. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/deploy/coord-db-backup.service +0 -0
  279. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/deploy/coord-db-backup.sh +0 -0
  280. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/deploy/coord-db-backup.timer +0 -0
  281. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/deploy/coord-drive-queue.service +0 -0
  282. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/deploy/coord-drive-queue.timer +0 -0
  283. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/deploy/coord-failure-notify.service +0 -0
  284. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/deploy/coord-failure-notify.sh +0 -0
  285. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/deploy/coord-fleet-watchdog.service +0 -0
  286. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/deploy/coord-fleet-watchdog.timer +0 -0
  287. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/deploy/coord-notify.service +0 -0
  288. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/deploy/coord-notify.timer +0 -0
  289. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/deploy/coord-release-propagate.service +0 -0
  290. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/deploy/coord-release-propagate.timer +0 -0
  291. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/deploy/coord-release-window.service +0 -0
  292. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/deploy/coord-release-window.timer +0 -0
  293. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/deploy/coord-serve.service +0 -0
  294. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/deploy/coord-web-dist-build.service +0 -0
  295. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/deploy/coord-web-dist-build.sh +0 -0
  296. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/deploy/coord-web-dist-build.timer +0 -0
  297. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/deploy/coord-web-rollback.sh +0 -0
  298. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/deploy/coord-web.service +0 -0
  299. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/deploy/node-shim.sh +0 -0
  300. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/ADR_COORD_TUI_CI.md +0 -0
  301. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  302. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/ADR_COORD_WEB_CI.md +0 -0
  303. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/ADR_COORD_WEB_DIST.md +0 -0
  304. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/AGENT_OPERATIONS.md +0 -0
  305. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/ARCHITECTURE.md +0 -0
  306. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/ARCH_SECURITY_GATES.md +0 -0
  307. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/COCKPIT.md +0 -0
  308. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/CONTROL_CENTER.md +0 -0
  309. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/COST_DISCIPLINE.md +0 -0
  310. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/CROSS_PLATFORM.md +0 -0
  311. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/CUSTOMER_FACING_APPS.md +0 -0
  312. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/CUSTOMER_PORTAL.md +0 -0
  313. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/DRIVE_QUEUE.md +0 -0
  314. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/EPHEMERAL_WORKERS.md +0 -0
  315. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/FORGE_MIGRATION.md +0 -0
  316. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/GRAPHIFY_SETUP.md +0 -0
  317. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/ISSUE_GUIDANCE.md +0 -0
  318. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/MAC_MINI.md +0 -0
  319. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  320. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/NOTIFIER.md +0 -0
  321. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/OPENCODE_VERIFICATION.md +0 -0
  322. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/OPERATING_GOTCHAS.md +0 -0
  323. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/OPERATOR_GUIDES.md +0 -0
  324. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/ORACLE_LOOP.md +0 -0
  325. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/PHONE_WEBAPP.md +0 -0
  326. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/PIPELINE_V2.md +0 -0
  327. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/PLATFORM_EVOLUTION.md +0 -0
  328. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/SECOND_BACKEND.md +0 -0
  329. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/STORE_SERVICE.md +0 -0
  330. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  331. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/WEB_CONTROL_CENTER.md +0 -0
  332. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/WSL_WINDOWS_WORKER.md +0 -0
  333. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/mocks/web/README.md +0 -0
  334. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/mocks/web/_tokens.css +0 -0
  335. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/mocks/web/issue-detail.html +0 -0
  336. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/mocks/web/pipeline-narrow.html +0 -0
  337. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/docs/mocks/web/pipeline-wide.html +0 -0
  338. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/graphify-out/.gitignore +0 -0
  339. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/install-agent.sh +0 -0
  340. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/pyproject.toml +0 -0
  341. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/scripts/audit_review_verdict_overrides.py +0 -0
  342. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  343. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/scripts/azure-workers/build-worker-image.sh +0 -0
  344. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/scripts/azure-workers/coordinator-machine.py +0 -0
  345. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/scripts/azure-workers/epic-down.sh +0 -0
  346. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/scripts/azure-workers/epic-up.sh +0 -0
  347. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/scripts/azure-workers/preflight.sh +0 -0
  348. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/scripts/azure-workers/provision-worker.sh +0 -0
  349. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  350. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  351. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/scripts/azure-workers/verify-github-token.sh +0 -0
  352. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/scripts/check_gh_argv_containment.py +0 -0
  353. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/scripts/codegen.py +0 -0
  354. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/scripts/coord-test-runner.sh +0 -0
  355. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/scripts/coord-venv-rollback.sh +0 -0
  356. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/scripts/drive-batch.sh +0 -0
  357. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/scripts/fleet_watchdog.py +0 -0
  358. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/scripts/gen_board_fixture.py +0 -0
  359. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/scripts/gen_mock_index.py +0 -0
  360. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/scripts/next_release_tag.py +0 -0
  361. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/scripts/run_tests_in_populated_home.sh +0 -0
  362. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/scripts/run_tests_without_gh.sh +0 -0
  363. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/scripts/smoke_437_interactive.py +0 -0
  364. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/scripts/verify_878_review_capture.py +0 -0
  365. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/scripts/verify_release_published.py +0 -0
  366. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/scripts/verify_release_wheel.py +0 -0
  367. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/setup.cfg +0 -0
  368. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/SMOKE_SET.md +0 -0
  369. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/__init__.py +0 -0
  370. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/acceptance/ms-37/conftest.py +0 -0
  371. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/acceptance/ms-37/contract.md +0 -0
  372. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/acceptance/ms-37/manifest.yml +0 -0
  373. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  374. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  375. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/acceptance/ms-51/contract.md +0 -0
  376. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  377. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  378. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/acceptance/ms-51/manifest.yml +0 -0
  379. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  380. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/acceptance/ms-51/tsconfig.json +0 -0
  381. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  382. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/backends.py +0 -0
  383. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/conftest.py +0 -0
  384. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/fixtures/board-pipeline-basic.json +0 -0
  385. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  386. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  387. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  388. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  389. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/fixtures/playwright/all_pass.json +0 -0
  390. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  391. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/fixtures/playwright/mixed_fail.json +0 -0
  392. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  393. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  394. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/fixtures/playwright/skip.json +0 -0
  395. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/fixtures/playwright/truncated.json +0 -0
  396. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  397. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  398. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  399. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  400. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  401. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  402. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  403. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  404. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_acceptance.py +0 -0
  405. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_acceptance_drivers.py +0 -0
  406. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_agent.py +0 -0
  407. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_agent_api_error.py +0 -0
  408. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_agent_app.py +0 -0
  409. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_agent_branch_base.py +0 -0
  410. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_agent_branch_capture.py +0 -0
  411. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_agent_config_free_1712.py +0 -0
  412. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_agent_deploy_units_endpoint.py +0 -0
  413. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_agent_dirty_worktree.py +0 -0
  414. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  415. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_agent_graph_self_heal.py +0 -0
  416. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_agent_health_h3.py +0 -0
  417. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_agent_idle_restart.py +0 -0
  418. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_agent_push_failure.py +0 -0
  419. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_agent_reap.py +0 -0
  420. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_agent_repos_and_pull.py +0 -0
  421. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_agent_restart_services_endpoint.py +0 -0
  422. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_agent_skills_self_heal.py +0 -0
  423. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_agent_startup_diagnostics.py +0 -0
  424. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_agent_update.py +0 -0
  425. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_agent_update_bluegreen.py +0 -0
  426. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_agent_usage_limit.py +0 -0
  427. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_agent_zero_commit.py +0 -0
  428. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_ambient_home_isolation.py +0 -0
  429. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_approve_dependency_busy_2804.py +0 -0
  430. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_approve_reject_plan.py +0 -0
  431. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_approve_usage_gate.py +0 -0
  432. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_approved_work_2532.py +0 -0
  433. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_assignment_already_recorded_daemon.py +0 -0
  434. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_audit_log.py +0 -0
  435. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_audit_outcome.py +0 -0
  436. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_audit_query.py +0 -0
  437. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_auto_loop.py +0 -0
  438. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_auto_release_publish_2035.py +0 -0
  439. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_backend_selection.py +0 -0
  440. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_base_checkout_restore.py +0 -0
  441. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_block_log.py +0 -0
  442. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_board_cap_762.py +0 -0
  443. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_board_fixture.py +0 -0
  444. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_board_read_path.py +0 -0
  445. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_board_schema.py +0 -0
  446. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_board_service.py +0 -0
  447. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_board_state.py +0 -0
  448. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_board_wire.py +0 -0
  449. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_brain.py +0 -0
  450. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_branch_model.py +0 -0
  451. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_bug_intake.py +0 -0
  452. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_build_worker_image_env_update.py +0 -0
  453. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cargo_cache.py +0 -0
  454. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_check_gh_argv_containment.py +0 -0
  455. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_ci_acceptance_gate_1950.py +0 -0
  456. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_ci_fix.py +0 -0
  457. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_ci_gitlab.py +0 -0
  458. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_ci_parity_2091.py +0 -0
  459. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_ci_store.py +0 -0
  460. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_claim.py +0 -0
  461. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_claude_md_budget.py +0 -0
  462. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_acceptance.py +0 -0
  463. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_assign.py +0 -0
  464. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  465. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_assign_interactive_remote.py +0 -0
  466. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_assign_provider.py +0 -0
  467. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  468. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_audit.py +0 -0
  469. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_chat_continue.py +0 -0
  470. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_decide.py +0 -0
  471. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_diagnose_config_provenance.py +0 -0
  472. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_diagnose_forge_availability.py +0 -0
  473. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_diagnose_graph.py +0 -0
  474. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_diagnose_self.py +0 -0
  475. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_doctor.py +0 -0
  476. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_doctor_config_free_1801.py +0 -0
  477. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  478. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_drive.py +0 -0
  479. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_drive_queue.py +0 -0
  480. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_escalate.py +0 -0
  481. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_fix_headless_review.py +0 -0
  482. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_gate_a.py +0 -0
  483. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_install_drift.py +0 -0
  484. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_install_skills.py +0 -0
  485. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_issue_comment.py +0 -0
  486. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_issue_create_label.py +0 -0
  487. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_issue_reopen.py +0 -0
  488. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_issue_view_list.py +0 -0
  489. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_merge.py +0 -0
  490. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_milestone_assign.py +0 -0
  491. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_milestone_capture.py +0 -0
  492. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_milestone_chat_add_child.py +0 -0
  493. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_milestone_dispatch.py +0 -0
  494. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_milestone_gate_b.py +0 -0
  495. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_milestone_gate_c.py +0 -0
  496. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_milestone_order.py +0 -0
  497. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  498. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_milestone_ship.py +0 -0
  499. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_network.py +0 -0
  500. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_new_issue_chat.py +0 -0
  501. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_plans.py +0 -0
  502. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_portal.py +0 -0
  503. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_pr.py +0 -0
  504. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_pull_artifact.py +0 -0
  505. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_queue.py +0 -0
  506. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_reattach_sessions.py +0 -0
  507. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_refine_board.py +0 -0
  508. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_release_preflight.py +0 -0
  509. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_release_propagate.py +0 -0
  510. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_release_window.py +0 -0
  511. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_repo_2220.py +0 -0
  512. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  513. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_scorecard.py +0 -0
  514. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_set_review_findings.py +0 -0
  515. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_status_advisory_terminal.py +0 -0
  516. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_status_contested_tag.py +0 -0
  517. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_status_merge_queue.py +0 -0
  518. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_status_provider.py +0 -0
  519. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_status_review_finalizing.py +0 -0
  520. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_status_test_failed_tag.py +0 -0
  521. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_status_usage_limit.py +0 -0
  522. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_sync_comments_873.py +0 -0
  523. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_test_plan.py +0 -0
  524. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_track.py +0 -0
  525. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_tui_update.py +0 -0
  526. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cli_wait.py +0 -0
  527. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_client_base_install.py +0 -0
  528. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_client_resource_migration_1946.py +0 -0
  529. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_commands_common.py +0 -0
  530. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_comments.py +0 -0
  531. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_completion_summary.py +0 -0
  532. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_config.py +0 -0
  533. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_config_acceptance.py +0 -0
  534. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_config_audit.py +0 -0
  535. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_config_pricing.py +0 -0
  536. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  537. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_config_usage_gate.py +0 -0
  538. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_confirm_test.py +0 -0
  539. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_conflict_fix.py +0 -0
  540. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_conflict_fix_semantic.py +0 -0
  541. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  542. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_coord_test.py +0 -0
  543. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_coord_test_runner_baseline.py +0 -0
  544. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_coord_test_runner_populated_home.py +0 -0
  545. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_coord_test_runner_routing.py +0 -0
  546. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_coord_test_runner_toolchain.py +0 -0
  547. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_coord_uat.py +0 -0
  548. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_coord_web_sse_restart_live.py +0 -0
  549. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_coordinator_machine.py +0 -0
  550. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_cross_platform_imports.py +0 -0
  551. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_dao.py +0 -0
  552. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_dashboard.py +0 -0
  553. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_dashboard_fixture.py +0 -0
  554. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_dashboard_terminal.py +0 -0
  555. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_dashboard_terminal_live.py +0 -0
  556. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_db.py +0 -0
  557. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_dead_end.py +0 -0
  558. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_decomposition_chat.py +0 -0
  559. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_deploy_coord_db_backup.py +0 -0
  560. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_deploy_coord_web_dist.py +0 -0
  561. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_deploy_coord_web_rollback.py +0 -0
  562. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_deploy_drive_queue_unit.py +0 -0
  563. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_deploy_failure_notify_unit.py +0 -0
  564. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_deploy_manifest.py +0 -0
  565. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_deploy_notify_unit.py +0 -0
  566. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_deploy_units_lane.py +0 -0
  567. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_deploy_web_unit.py +0 -0
  568. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_deprecation_telemetry.py +0 -0
  569. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_deps.py +0 -0
  570. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_diagnose.py +0 -0
  571. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_dispatch.py +0 -0
  572. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_dispatch_target_validation.py +0 -0
  573. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_dist_name.py +0 -0
  574. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_done_housekeeping.py +0 -0
  575. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_drive.py +0 -0
  576. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_drive_queue.py +0 -0
  577. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_drive_queue_blocked_rendering.py +0 -0
  578. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_drive_queue_launch_argv.py +0 -0
  579. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  580. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_drive_queue_roll_pending.py +0 -0
  581. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  582. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_drive_state.py +0 -0
  583. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_drive_tmux.py +0 -0
  584. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_epic_up_capability_detection.py +0 -0
  585. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  586. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_epic_up_image_provenance.py +0 -0
  587. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_errors.py +0 -0
  588. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_events.py +0 -0
  589. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_failure_class.py +0 -0
  590. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_filelock.py +0 -0
  591. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  592. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_fix_of_force_override.py +0 -0
  593. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_fleet_config_health.py +0 -0
  594. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_fleet_health_probes.py +0 -0
  595. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_fleet_health_snapshot.py +0 -0
  596. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_fleet_watchdog.py +0 -0
  597. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_forge_availability.py +0 -0
  598. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_freshness.py +0 -0
  599. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_gate_a.py +0 -0
  600. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_gate_b.py +0 -0
  601. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_gate_snapshot_staleness.py +0 -0
  602. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_gates.py +0 -0
  603. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  604. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_gen_mock_index.py +0 -0
  605. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_generated_rust_fixture.py +0 -0
  606. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_generated_types_fixture.py +0 -0
  607. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_github_ops.py +0 -0
  608. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_goal.py +0 -0
  609. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_graph_health.py +0 -0
  610. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_graph_selfheal_absent_2237.py +0 -0
  611. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_handoff.py +0 -0
  612. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_health_checks.py +0 -0
  613. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_health_cli.py +0 -0
  614. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_health_cli_graph.py +0 -0
  615. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_health_config.py +0 -0
  616. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_health_context.py +0 -0
  617. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_health_coord_web_ci_pin.py +0 -0
  618. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_health_deploy_lane_facts.py +0 -0
  619. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_health_fix.py +0 -0
  620. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_health_incident_regression.py +0 -0
  621. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_health_issues_sync_staleness.py +0 -0
  622. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_health_pypi.py +0 -0
  623. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_health_registry.py +0 -0
  624. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_health_release_cordon_probe.py +0 -0
  625. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_health_timer_active.py +0 -0
  626. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_health_toolchain.py +0 -0
  627. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_health_unit_drift.py +0 -0
  628. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_health_unit_enablement.py +0 -0
  629. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_hooks.py +0 -0
  630. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_human_attended_437.py +0 -0
  631. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_init.py +0 -0
  632. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_install_agent_venv_2911.py +0 -0
  633. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_integration.py +0 -0
  634. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_interactive_briefing_echo.py +0 -0
  635. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_interactive_pane_log_2541.py +0 -0
  636. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_interactive_prefill_state.py +0 -0
  637. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_interactive_session_relaunch.py +0 -0
  638. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_interactive_test_verdict_backstop.py +0 -0
  639. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_interactive_token_attribution.py +0 -0
  640. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_interactive_worktree.py +0 -0
  641. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_issue_store_seam.py +0 -0
  642. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_issues_sync_status.py +0 -0
  643. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_liveness_auditor.py +0 -0
  644. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_liveness_notify.py +0 -0
  645. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_lock_contention_ratchet.py +0 -0
  646. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_machine_onboard.py +0 -0
  647. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_machine_pause.py +0 -0
  648. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_merge_queue.py +0 -0
  649. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_merge_verify.py +0 -0
  650. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_milestone_chat.py +0 -0
  651. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_milestone_dispatch.py +0 -0
  652. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_milestone_gate.py +0 -0
  653. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_milestone_order.py +0 -0
  654. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_milestone_seam.py +0 -0
  655. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_mock_author.py +0 -0
  656. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_model_tiering.py +0 -0
  657. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_models.py +0 -0
  658. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_models_config_labels.py +0 -0
  659. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_needs_attention.py +0 -0
  660. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_network.py +0 -0
  661. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_new_issue_chat.py +0 -0
  662. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_next_release_tag.py +0 -0
  663. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_node_shim.py +0 -0
  664. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_notifier_baseline.py +0 -0
  665. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_notifier_cli.py +0 -0
  666. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_notifier_collect.py +0 -0
  667. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_notifier_config.py +0 -0
  668. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_notifier_drive_seam.py +0 -0
  669. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_notifier_isolation.py +0 -0
  670. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_notifier_predicate.py +0 -0
  671. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_notifier_quiet_hours.py +0 -0
  672. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_notifier_service.py +0 -0
  673. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_notify.py +0 -0
  674. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_notify_drain.py +0 -0
  675. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_openapi.py +0 -0
  676. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_operational_defaults.py +0 -0
  677. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_overlap_fence.py +0 -0
  678. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_overlap_predict.py +0 -0
  679. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_packaged_deploy_units.py +0 -0
  680. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_parentage.py +0 -0
  681. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_paste_landed.py +0 -0
  682. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  683. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_pipeline.py +0 -0
  684. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_plan_followup_approve_plan_command.py +0 -0
  685. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_plan_followup_pr_command.py +0 -0
  686. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_plan_followup_review_command.py +0 -0
  687. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_plan_only.py +0 -0
  688. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_plan_parser.py +0 -0
  689. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_platform_paths.py +0 -0
  690. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_portal_bridge.py +0 -0
  691. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_portal_config.py +0 -0
  692. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_portal_store.py +0 -0
  693. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_portal_sync.py +0 -0
  694. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_pr_body_lint.py +0 -0
  695. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_prereqs.py +0 -0
  696. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_production_db_guard.py +0 -0
  697. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_progress.py +0 -0
  698. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_provider_seam.py +0 -0
  699. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_providers.py +0 -0
  700. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_providers_config_labels.py +0 -0
  701. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_providers_pty.py +0 -0
  702. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_quiet_hours.py +0 -0
  703. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_quiet_hours_store_2146.py +0 -0
  704. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_reap_merged_sessions.py +0 -0
  705. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_reap_stale_interactive_tick.py +0 -0
  706. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_reconcile.py +0 -0
  707. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_reconcile_branch.py +0 -0
  708. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_reconcile_completions.py +0 -0
  709. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  710. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_reconcile_merges.py +0 -0
  711. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_reconcile_no_agent_record.py +0 -0
  712. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_reconcile_tick.py +0 -0
  713. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_reconcile_usage_limit_done.py +0 -0
  714. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_refine_chat.py +0 -0
  715. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_release_cordon_2101.py +0 -0
  716. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  717. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_release_cordon_deadlock_2240.py +0 -0
  718. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_release_cordon_stuck_2490.py +0 -0
  719. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_release_propagate.py +0 -0
  720. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_release_propagate_threshold.py +0 -0
  721. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_release_roll_between_legs_2854.py +0 -0
  722. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_release_roll_window_handoff.py +0 -0
  723. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_release_unified_1242.py +0 -0
  724. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_release_verify.py +0 -0
  725. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_release_window.py +0 -0
  726. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_remote_auto_prune.py +0 -0
  727. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_remote_interactive_reaper.py +0 -0
  728. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_repo_add.py +0 -0
  729. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_repo_edit_2220.py +0 -0
  730. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_repo_graph_fleet_2237.py +0 -0
  731. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_repo_onboard_2220.py +0 -0
  732. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_report_result_push.py +0 -0
  733. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_reports.py +0 -0
  734. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_retry.py +0 -0
  735. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_retry_advisory_1606.py +0 -0
  736. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_retry_type_1636.py +0 -0
  737. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_revalidate.py +0 -0
  738. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_review.py +0 -0
  739. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_review_end_review_without_verdict.py +0 -0
  740. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_review_parse_failure_diagnostic.py +0 -0
  741. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_review_reaffirm.py +0 -0
  742. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_review_state.py +0 -0
  743. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_review_verdict_backstop.py +0 -0
  744. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_review_verdict_override_audit.py +0 -0
  745. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_review_verdict_relay.py +0 -0
  746. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_review_zero_commits.py +0 -0
  747. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_scoped_review_wiring.py +0 -0
  748. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_scorecard.py +0 -0
  749. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_self_health.py +0 -0
  750. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_serve_app_board_trim.py +0 -0
  751. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_serve_rest_routes.py +0 -0
  752. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_session.py +0 -0
  753. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_slice_issue_attribution.py +0 -0
  754. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_smoke.py +0 -0
  755. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_smoke_live_checkout_restore.py +0 -0
  756. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_smoke_workflow.py +0 -0
  757. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_spend_ceiling.py +0 -0
  758. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_spend_ceiling_coordinator.py +0 -0
  759. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_split.py +0 -0
  760. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_split_work.py +0 -0
  761. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_sql_dialect.py +0 -0
  762. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_sqlite_connect_ratchet.py +0 -0
  763. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_stage_projection.py +0 -0
  764. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_stale_busy_reviewer_697.py +0 -0
  765. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_stalled_pipeline.py +0 -0
  766. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_state.py +0 -0
  767. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_state_review_findings_daemon.py +0 -0
  768. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_status_fleet_footer.py +0 -0
  769. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_stop_1567.py +0 -0
  770. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_store_contract.py +0 -0
  771. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_store_migrate.py +0 -0
  772. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_stuck.py +0 -0
  773. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  774. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_terminal_command.py +0 -0
  775. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_test_author.py +0 -0
  776. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_test_chat.py +0 -0
  777. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_test_orchestrator.py +0 -0
  778. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_test_report.py +0 -0
  779. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_test_verdict_parsing.py +0 -0
  780. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_test_verdict_transcript_floor.py +0 -0
  781. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_text_io_encoding_audit.py +0 -0
  782. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_thin_client_board_audit.py +0 -0
  783. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_thin_client_config_load_1080.py +0 -0
  784. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_thin_client_daemon_routing_906.py +0 -0
  785. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_tmux_host.py +0 -0
  786. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_tmux_session.py +0 -0
  787. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_transcript_floor.py +0 -0
  788. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_usage.py +0 -0
  789. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_usage_limits.py +0 -0
  790. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_usage_rollup.py +0 -0
  791. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_venv_live_install_2121.py +0 -0
  792. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_version_single_source.py +0 -0
  793. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_watch.py +0 -0
  794. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  795. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_worker_env_venv_isolation.py +0 -0
  796. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_worker_events.py +0 -0
  797. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_worker_image_pin_sync.py +0 -0
  798. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_worker_safety.py +0 -0
  799. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_worker_test_scoping.py +0 -0
  800. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_worktree.py +0 -0
  801. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  802. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/test_write_parity.py +0 -0
  803. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tests/write_parity.py +0 -0
  804. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/.github/workflows/release-tui.yml +0 -0
  805. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/Cargo.lock +0 -0
  806. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/Cargo.toml +0 -0
  807. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/cargo-config-local-quadraui.toml.example +0 -0
  808. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/app/approved.rs +0 -0
  809. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/app/audit.rs +0 -0
  810. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/app/chat.rs +0 -0
  811. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/app/data.rs +0 -0
  812. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/app/dialogs.rs +0 -0
  813. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/app/doc_tabs.rs +0 -0
  814. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/app/drive.rs +0 -0
  815. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/app/drive_queue.rs +0 -0
  816. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/app/escalation.rs +0 -0
  817. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/app/events.rs +0 -0
  818. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/app/fixtures.rs +0 -0
  819. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/app/fleet_health.rs +0 -0
  820. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/app/fleet_sessions.rs +0 -0
  821. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/app/fleet_terminals.rs +0 -0
  822. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/app/format.rs +0 -0
  823. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/app/milestone_dag.rs +0 -0
  824. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/app/mod.rs +0 -0
  825. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/app/msv.rs +0 -0
  826. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/app/pipeline.rs +0 -0
  827. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/app/plans.rs +0 -0
  828. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/app/render.rs +0 -0
  829. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/app/reports.rs +0 -0
  830. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/app/sessions.rs +0 -0
  831. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/app/settings_ui.rs +0 -0
  832. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/app/sidebar.rs +0 -0
  833. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/app/terminal.rs +0 -0
  834. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/app/tests.rs +0 -0
  835. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/app/types/generated.rs +0 -0
  836. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/app/types.rs +0 -0
  837. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/app/workspace.rs +0 -0
  838. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/bin/gtk.rs +0 -0
  839. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/commands.rs +0 -0
  840. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/lib.rs +0 -0
  841. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/main.rs +0 -0
  842. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/src/settings.rs +0 -0
  843. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-33/audit_1039.rs +0 -0
  844. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-33/contract.md +0 -0
  845. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-33/manifest.yml +0 -0
  846. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-33/mocks/audit-panel-detail.screen +0 -0
  847. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-33/mocks/audit-panel-empty.screen +0 -0
  848. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-33/mocks/audit-panel-filters.screen +0 -0
  849. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-33/mocks/audit-panel-populated.screen +0 -0
  850. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-38/contract.md +0 -0
  851. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-38/manifest.yml +0 -0
  852. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-38/mocks/plans-base.screen +0 -0
  853. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-38/mocks/plans-detail-pane.screen +0 -0
  854. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-38/mocks/plans-help-overlay.screen +0 -0
  855. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-38/mocks/plans-palette.screen +0 -0
  856. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-epic.screen +0 -0
  857. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-header.screen +0 -0
  858. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-38/mocks/plans-rightclick-stub.screen +0 -0
  859. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-38/plans_detail_1122.rs +0 -0
  860. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-38/plans_help_1124.rs +0 -0
  861. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-38/plans_rightclick_1123.rs +0 -0
  862. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-65/board_split_2288.rs +0 -0
  863. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-65/board_tabs_2282.rs +0 -0
  864. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-65/board_tabs_close_2283.rs +0 -0
  865. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-65/contract.md +0 -0
  866. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-65/detail_substate_2285.rs +0 -0
  867. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-65/manifest.yml +0 -0
  868. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-65/mocks/board-baseline-no-tabs.screen +0 -0
  869. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-65/mocks/board-pinned-3-tabs.screen +0 -0
  870. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-65/mocks/board-preview-tab.screen +0 -0
  871. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-65/mocks/board-split-side-by-side.screen +0 -0
  872. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-65/mocks/board-tab-context-menu.screen +0 -0
  873. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-65/mocks/board-tabs-help-overlay.screen +0 -0
  874. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-65/mocks/board-tabs-overflow.screen +0 -0
  875. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-65/mocks/pipeline-tabs-independent.screen +0 -0
  876. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-65/pipeline_tabs_2284.rs +0 -0
  877. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-65/tabs_discoverability_2287.rs +0 -0
  878. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-65/tabs_persistence_2286.rs +0 -0
  879. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-67/approved_items_2532.rs +0 -0
  880. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-67/contract.md +0 -0
  881. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-67/manifest.d/2533.yml +0 -0
  882. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-67/manifest.yml +0 -0
  883. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-67/mocks/approved-items-chat-opened.screen +0 -0
  884. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-67/mocks/approved-items-context-menu.screen +0 -0
  885. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-67/mocks/approved-items-detail.screen +0 -0
  886. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-67/mocks/approved-items-empty.screen +0 -0
  887. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-67/mocks/approved-items-populated.screen +0 -0
  888. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance/ms-67/pull_decomposition_2533.rs +0 -0
  889. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/acceptance.rs +0 -0
  890. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/cli.rs +0 -0
  891. {code_coordinator-0.5.293 → code_coordinator-0.5.294}/tui/tests/fixtures/board_sample.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.293
3
+ Version: 0.5.294
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.293
3
+ Version: 0.5.294
4
4
  Summary: Coordinate Claude Code workers across multiple machines and repos.
5
5
  Author-email: John Donaghy <johnfdonaghy@gmail.com>
6
6
  License-Expression: LicenseRef-FSL-1.1-MIT
@@ -1,7 +1,7 @@
1
1
  {
2
- "tag": "0.5.293",
2
+ "tag": "0.5.294",
3
3
  "distance": 0,
4
- "node": "g80ec18827638d21151ef2fd58d9374377758ba0b",
4
+ "node": "gad3ed43a4b2310f6ef6968a7676f11e2deaca61f",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-08-29"
@@ -474,6 +474,62 @@ def post_pause(
474
474
  return post_record(svc, "/pause", {"machine": machine, "action": action}, timeout=timeout)
475
475
 
476
476
 
477
+ def fetch_github_backoff(
478
+ svc: ServiceConfig, *, timeout: float = _DEFAULT_TIMEOUT
479
+ ) -> dict | None:
480
+ """GET /github-backoff → the daemon's shared GitHub rate-limit backoff
481
+ state, or ``None`` when there isn't an active one (#2934).
482
+
483
+ The read side of the fleet-wide half of #2809: a 403 recorded by ANY
484
+ machine's `coord.github_throttle.record()` lands here, so every other
485
+ machine's next `coord.github_throttle.consult()` — the seam every `gh`
486
+ call funnels through — sees it before making its own call, rather than
487
+ only ever learning about its own host's hits. Raises ``httpx.HTTPError``
488
+ on transport/HTTP failure — `coord.github_throttle.consult()` catches
489
+ that itself and falls back to the local per-host file (this module stays
490
+ strict, same posture as `fetch_paused_machines`, so a caller that DOES
491
+ want to distinguish "confirmed none" from "couldn't ask" still can).
492
+
493
+ Returns the raw ``{until, reason, status, request_id, retry_after_s,
494
+ recorded_at}`` mapping (or ``None``) rather than a `Backoff` — parsing
495
+ that shape is `coord.github_throttle`'s job, the same division client.py
496
+ keeps for `fetch_cordons`/`fetch_quiet_hours` above.
497
+ """
498
+ resp = httpx.get(f"{svc.url}/github-backoff", headers=_headers(svc), timeout=timeout)
499
+ resp.raise_for_status()
500
+ data = resp.json()
501
+ backoff = data.get("backoff") if isinstance(data, dict) else None
502
+ return dict(backoff) if isinstance(backoff, dict) else None
503
+
504
+
505
+ def post_github_backoff(
506
+ svc: ServiceConfig,
507
+ *,
508
+ reason: str,
509
+ status: int | None,
510
+ request_id: str | None,
511
+ retry_after_s: float | None,
512
+ timeout: float = _WRITE_TIMEOUT,
513
+ ) -> dict:
514
+ """POST /github-backoff {reason, status, request_id, retry_after_s} —
515
+ publish a rate-limit hit to the daemon's shared backoff state (#2934).
516
+
517
+ Raises ``httpx.HTTPError`` on transport/HTTP failure —
518
+ `coord.github_throttle.record()` catches that itself and falls back to
519
+ writing this host's own local file, the same fail-soft posture the
520
+ module's docstring requires of every public function here: a caller
521
+ that just got a 403 must never fail a *second* way because publishing it
522
+ fleet-wide didn't work.
523
+ """
524
+ payload = {
525
+ "reason": reason,
526
+ "status": status,
527
+ "request_id": request_id,
528
+ "retry_after_s": retry_after_s,
529
+ }
530
+ return post_record(svc, "/github-backoff", payload, timeout=timeout)
531
+
532
+
477
533
  def fetch_remote_config(svc: ServiceConfig, *, timeout: float = _DEFAULT_TIMEOUT) -> Path:
478
534
  """GET /config, cache it to ``~/.coord/coordinator.remote.yml``, return the path.
479
535
 
@@ -1,4 +1,4 @@
1
- """Shared, per-machine GitHub request backoff state (#2809).
1
+ """Shared, fleet-wide GitHub request backoff state (#2809, #2934).
2
2
 
3
3
  **The problem.** GitHub's *secondary* (abuse-detection) rate limiter fires on
4
4
  request *rate and concurrency*, not cumulative volume — it does not show up
@@ -29,20 +29,39 @@ only decays when request volume drops), and every wait applies jitter so
29
29
  pollers that all observed the same 403 don't all wake up and retry in
30
30
  lockstep.
31
31
 
32
- **Scope: per-machine, not per-fleet.** The fleet spans multiple machines
33
- sharing one GitHub token/user, so a *complete* fix routes this through the
34
- board daemon (the one process every machine already talks to — see
35
- ``coord.machine_pause`` for the daemon-aware pattern this module deliberately
36
- does NOT yet follow). That is a larger, separable change; this module closes
37
- the same-host half of #2809 (the incident's own two concrete examples —
38
- ``claude-coordinator#2782``/``#2802`` — were polling from the same host) and
39
- leaves cross-machine coordination as a documented follow-up rather than
40
- silently claiming to solve it.
32
+ **Scope: fleet-wide, not just per-machine (#2934).** GitHub's secondary
33
+ limiter is keyed on the *user*, not the host — #2809's own captured 403 reads
34
+ ``API rate limit exceeded for user ID 3506413`` — so four individually
35
+ well-behaved machines sharing one token still sum to a rate that trips it,
36
+ each backing off in isolation while the other three keep calling. That is
37
+ exactly the synchronized-poll pattern that keeps a secondary limit tripped
38
+ instead of letting it decay, and it is why the two full days after #2809
39
+ alone went live (36, 48 trips) read at or above its own pre-fix baseline
40
+ (15, 43, 30).
41
+
42
+ :func:`record` and :func:`consult` — the two functions :func:`coord.
43
+ github_ops._gh` actually calls — now route through the board daemon (the one
44
+ process every machine already talks to) when one is configured, following
45
+ the daemon-aware pattern ``coord.machine_pause`` established: a hit recorded
46
+ on one host is published once to the daemon's local file, and every other
47
+ host's very next ``consult()`` sees it over that same HTTP seam, rather than
48
+ each host only ever learning about its own 403s. :func:`local_record` /
49
+ :func:`local_consult` (and :func:`current` / :func:`clear`, which stay
50
+ local-only — nothing outside tests reads them) are the original same-host
51
+ primitives from #2809, now the fallback :func:`record`/:func:`consult` use
52
+ whenever no board service is configured (solo use, or the daemon's own
53
+ in-process calls — it has no ``board_service`` configured for itself, so its
54
+ own ``gh`` calls read/write the very file its ``/github-backoff`` endpoint
55
+ serves, with no extra hop) **and** whenever the daemon IS configured but
56
+ unreachable: a transport failure on either the read or the write side
57
+ degrades to the per-host file rather than to "no damping" or a raised
58
+ exception — see both functions' docstrings.
41
59
 
42
60
  **Best-effort, unconditionally.** Every public function here can fail (a
43
- missing/unwritable state dir, a corrupt file) without ever raising into or
44
- delaying a caller beyond the bound it already asked for — damping must never
45
- become a new way to break `gh` access, only a way to reduce it.
61
+ missing/unwritable state dir, a corrupt file, an unreachable daemon) without
62
+ ever raising into or delaying a caller beyond the bound it already asked
63
+ for — damping must never become a new way to break `gh` access, only a way
64
+ to reduce it.
46
65
  """
47
66
 
48
67
  from __future__ import annotations
@@ -127,6 +146,26 @@ def _jitter(seconds: float) -> float:
127
146
  return max(0.0, seconds + random.uniform(-spread, spread))
128
147
 
129
148
 
149
+ def _backoff_from_mapping(data: dict) -> Backoff | None:
150
+ """Parse one ``{until, reason, status, request_id, retry_after_s,
151
+ recorded_at}`` mapping into a :class:`Backoff`, or ``None`` if it isn't
152
+ one — shared by :func:`_read` (the on-disk JSON) and :func:`consult`
153
+ (the daemon's ``GET /github-backoff`` JSON body), so the two shapes can
154
+ never quietly drift apart.
155
+ """
156
+ until = data.get("until")
157
+ if not isinstance(until, (int, float)):
158
+ return None
159
+ return Backoff(
160
+ until=float(until),
161
+ reason=data.get("reason") or "rate_limit",
162
+ status=data.get("status"),
163
+ request_id=data.get("request_id"),
164
+ retry_after_s=data.get("retry_after_s"),
165
+ recorded_at=float(data.get("recorded_at") or 0.0),
166
+ )
167
+
168
+
130
169
  def _read(path: Path | None = None) -> Backoff | None:
131
170
  path = path if path is not None else _state_path()
132
171
  try:
@@ -139,17 +178,17 @@ def _read(path: Path | None = None) -> Backoff | None:
139
178
  return None
140
179
  if not isinstance(data, dict):
141
180
  return None
142
- until = data.get("until")
143
- if not isinstance(until, (int, float)):
144
- return None
145
- return Backoff(
146
- until=float(until),
147
- reason=data.get("reason") or "rate_limit",
148
- status=data.get("status"),
149
- request_id=data.get("request_id"),
150
- retry_after_s=data.get("retry_after_s"),
151
- recorded_at=float(data.get("recorded_at") or 0.0),
152
- )
181
+ return _backoff_from_mapping(data)
182
+
183
+
184
+ def _resolve_service(): # -> coord.client.ServiceConfig | None
185
+ """Same seam ``coord.machine_pause._resolve_service`` uses: ``None`` for
186
+ solo/local use and for the daemon's own in-process calls (it never
187
+ configures a board service for itself), a ``ServiceConfig`` for a thin
188
+ client."""
189
+ from coord.board_service import resolve # noqa: PLC0415
190
+
191
+ return resolve()
153
192
 
154
193
 
155
194
  def record(
@@ -160,7 +199,54 @@ def record(
160
199
  retry_after_s: float | None,
161
200
  now: float | None = None,
162
201
  ) -> None:
163
- """Record a rate-limit hit as the shared backoff-until timestamp.
202
+ """Record a rate-limit hit as the shared, fleet-wide backoff-until
203
+ timestamp (#2934).
204
+
205
+ Daemon-first: when a board service is configured, POSTs the hit to the
206
+ daemon's ``/github-backoff`` endpoint (:func:`coord.client.
207
+ post_github_backoff`), which records it into *that host's* local file —
208
+ the same file every other machine's next :func:`consult` reads. Falls
209
+ back to :func:`local_record` — this host's own file — both when no board
210
+ service is configured (solo use, or the daemon's own in-process calls)
211
+ and when one is configured but the POST fails for any reason (network,
212
+ timeout, an older daemon with no ``/github-backoff`` route): a caller who
213
+ just got a 403 must never fail a *second* way, over the network, because
214
+ publishing it fleet-wide didn't work. ``now`` is only honoured on the
215
+ local fallback path — the daemon's own clock governs its file.
216
+ """
217
+ svc = _resolve_service()
218
+ if svc is not None:
219
+ try:
220
+ from coord.client import post_github_backoff # noqa: PLC0415
221
+
222
+ post_github_backoff(
223
+ svc, reason=reason, status=status, request_id=request_id,
224
+ retry_after_s=retry_after_s,
225
+ )
226
+ return
227
+ except Exception as exc: # noqa: BLE001 -- fall back to the local file
228
+ _log.debug("github_throttle: daemon record failed, falling back to local: %s", exc)
229
+ local_record(
230
+ reason=reason, status=status, request_id=request_id,
231
+ retry_after_s=retry_after_s, now=now,
232
+ )
233
+
234
+
235
+ def local_record(
236
+ *,
237
+ reason: str,
238
+ status: int | None,
239
+ request_id: str | None,
240
+ retry_after_s: float | None,
241
+ now: float | None = None,
242
+ ) -> None:
243
+ """Record a rate-limit hit into THIS HOST's own backoff file (#2809).
244
+
245
+ The same-host primitive :func:`record` above falls back to when no
246
+ board service is configured or the daemon is unreachable — see its
247
+ docstring. Also what the daemon's own ``POST /github-backoff`` handler
248
+ calls, since that endpoint runs *inside* the daemon and this file IS the
249
+ shared state a fleet-wide caller is asking to read.
164
250
 
165
251
  Best-effort (never raises): a caller who just got a 403 must never fail
166
252
  a *second* way because bookkeeping about the first one broke.
@@ -233,8 +319,30 @@ def clear() -> None:
233
319
  pass
234
320
 
235
321
 
322
+ def _consult_from(b: Backoff | None, *, now: float) -> tuple[float, Backoff | None]:
323
+ """Shared sleep/skip computation for both :func:`local_consult` (reading
324
+ the on-disk *b*) and :func:`consult` (reading a daemon-fetched *b*) — one
325
+ place decides the jitter and the :data:`MAX_PRECALL_SLEEP_S` cap,
326
+ regardless of where *b* came from."""
327
+ if b is None:
328
+ return 0.0, None
329
+ remaining = b.until - now
330
+ return _jitter(min(remaining, MAX_PRECALL_SLEEP_S)), b
331
+
332
+
236
333
  def consult(*, now: float | None = None) -> tuple[float, Backoff | None]:
237
- """``(sleep_s, backoff)`` for a caller about to issue a `gh` call.
334
+ """``(sleep_s, backoff)`` for a caller about to issue a `gh` call
335
+ (#2934: fleet-wide).
336
+
337
+ Daemon-first: when a board service is configured, GETs the shared
338
+ backoff from the daemon's ``/github-backoff`` endpoint
339
+ (:func:`coord.client.fetch_github_backoff`) — so a 403 recorded by
340
+ *another* machine's :func:`record` is honoured here, on this machine's
341
+ very next call, without this host having tripped anything itself. Falls
342
+ back to :func:`local_consult` — this host's own file — both when no
343
+ board service is configured (solo use, or the daemon's own in-process
344
+ calls) and when one is configured but the GET fails for any reason:
345
+ never raises, never silently drops damping to zero.
238
346
 
239
347
  ``backoff`` is the active :class:`Backoff`, or ``None`` when there isn't
240
348
  one (``sleep_s`` is then always ``0.0``). ``sleep_s`` is the jittered
@@ -245,11 +353,33 @@ def consult(*, now: float | None = None) -> tuple[float, Backoff | None]:
245
353
  docstring.
246
354
 
247
355
  Never calls `time.sleep` itself, so this stays a pure, cheaply-testable
248
- read — the actual wait/skip decision belongs to the caller.
356
+ read — the actual wait/skip decision belongs to the caller. The daemon
357
+ round trip is the one exception to "cheap": a caller on the hot path of
358
+ every `gh` invocation pays one small HTTP GET per call when a board
359
+ service is configured, same cost class as every other daemon-routed read
360
+ in this package.
249
361
  """
250
362
  now = now if now is not None else time.time()
251
- b = current(now=now)
252
- if b is None:
253
- return 0.0, None
254
- remaining = b.until - now
255
- return _jitter(min(remaining, MAX_PRECALL_SLEEP_S)), b
363
+ svc = _resolve_service()
364
+ if svc is not None:
365
+ try:
366
+ from coord.client import fetch_github_backoff # noqa: PLC0415
367
+
368
+ raw = fetch_github_backoff(svc)
369
+ except Exception as exc: # noqa: BLE001 -- fall back to the local file
370
+ _log.debug("github_throttle: daemon consult failed, falling back to local: %s", exc)
371
+ else:
372
+ b = _backoff_from_mapping(raw) if isinstance(raw, dict) else None
373
+ return _consult_from(b, now=now)
374
+ return local_consult(now=now)
375
+
376
+
377
+ def local_consult(*, now: float | None = None) -> tuple[float, Backoff | None]:
378
+ """``(sleep_s, backoff)`` from THIS HOST's own backoff file (#2809).
379
+
380
+ The same-host primitive :func:`consult` above falls back to when no
381
+ board service is configured or the daemon is unreachable — see its
382
+ docstring for the shape of the return value.
383
+ """
384
+ now = now if now is not None else time.time()
385
+ return _consult_from(current(now=now), now=now)
@@ -4510,6 +4510,49 @@ def openapi_spec() -> dict:
4510
4510
  },
4511
4511
  },
4512
4512
  },
4513
+ "/github-backoff": {
4514
+ "get": {
4515
+ "summary": (
4516
+ "#2934: the daemon's own view of the shared GitHub "
4517
+ "secondary-rate-limit backoff — the state every "
4518
+ "machine's `coord.github_throttle.consult()` reads "
4519
+ "before its next `gh` call, fleet-wide rather than "
4520
+ "per-host."
4521
+ ),
4522
+ "responses": {
4523
+ "200": {"description": "OK"},
4524
+ },
4525
+ },
4526
+ "post": {
4527
+ "summary": (
4528
+ "#2934: record a rate-limit hit into the daemon's "
4529
+ "shared backoff store, so every OTHER machine's next "
4530
+ "`gh` call honours it too, not just the host that "
4531
+ "observed the 403."
4532
+ ),
4533
+ "requestBody": {
4534
+ "required": True,
4535
+ "content": {
4536
+ "application/json": {
4537
+ "schema": {
4538
+ "type": "object",
4539
+ "properties": {
4540
+ "reason": {"type": "string"},
4541
+ "status": {"type": "integer", "nullable": True},
4542
+ "request_id": {"type": "string", "nullable": True},
4543
+ "retry_after_s": {"type": "number", "nullable": True},
4544
+ },
4545
+ "required": ["reason"],
4546
+ }
4547
+ }
4548
+ },
4549
+ },
4550
+ "responses": {
4551
+ "200": {"description": "OK"},
4552
+ "400": {"description": "Missing field: reason"},
4553
+ },
4554
+ },
4555
+ },
4513
4556
  "/issue-comments": {
4514
4557
  "get": {
4515
4558
  "summary": "#873: read an issue's captured comments (oldest-first) from the durable mirror",
@@ -7730,6 +7773,47 @@ def build_app(store: CoordStore, config: Config, *, token: str | None = None) ->
7730
7773
  else:
7731
7774
  return JSONResponse({"error": f"unknown action: {action!r}"}, status_code=400)
7732
7775
 
7776
+ async def get_github_backoff(request: Request) -> Response: # noqa: ARG001
7777
+ # #2934: the daemon's own view of the shared GitHub rate-limit
7778
+ # backoff — ALWAYS the local-only file (coord.github_throttle.
7779
+ # current()), never routed back out over HTTP, for the same reason
7780
+ # get_pause() above never routes: this endpoint runs *inside* the
7781
+ # daemon, the one host whose file a fleet-wide `consult()` call is
7782
+ # actually asking about, and whose own `gh` calls already read that
7783
+ # exact file directly with no HTTP round trip of their own.
7784
+ from coord.github_throttle import current # noqa: PLC0415
7785
+
7786
+ b = current()
7787
+ return JSONResponse({"backoff": b._asdict() if b is not None else None})
7788
+
7789
+ async def post_github_backoff(request: Request) -> Response:
7790
+ # #2934: record a rate-limit hit into the daemon's shared backoff
7791
+ # file — the fleet-wide half of #2809. See get_github_backoff()
7792
+ # above for why this always uses the local-only writer: one host
7793
+ # publishes the hit once, here, and every OTHER host's next
7794
+ # `consult()` GETs it back via get_github_backoff() above.
7795
+ from coord.github_throttle import current, local_record # noqa: PLC0415
7796
+
7797
+ body = await _read_json(request)
7798
+ if body is None:
7799
+ return JSONResponse({"error": "invalid JSON body"}, status_code=400)
7800
+ reason = body.get("reason")
7801
+ if not reason or not isinstance(reason, str):
7802
+ return JSONResponse({"error": "missing field: reason"}, status_code=400)
7803
+ status = body.get("status")
7804
+ request_id = body.get("request_id")
7805
+ retry_after_s = body.get("retry_after_s")
7806
+ local_record(
7807
+ reason=reason,
7808
+ status=status if isinstance(status, int) else None,
7809
+ request_id=request_id if isinstance(request_id, str) else None,
7810
+ retry_after_s=(
7811
+ float(retry_after_s) if isinstance(retry_after_s, (int, float)) else None
7812
+ ),
7813
+ )
7814
+ b = current()
7815
+ return JSONResponse({"backoff": b._asdict() if b is not None else None})
7816
+
7733
7817
  async def get_issue_comments(request: Request) -> Response:
7734
7818
  # #873: read an issue's captured comments (oldest-first) from the
7735
7819
  # durable mirror.
@@ -9668,6 +9752,8 @@ def build_app(store: CoordStore, config: Config, *, token: str | None = None) ->
9668
9752
  Route("/drive-queue", post_drive_queue, methods=["POST"]),
9669
9753
  Route("/pause", get_pause, methods=["GET"]),
9670
9754
  Route("/pause", post_pause, methods=["POST"]),
9755
+ Route("/github-backoff", get_github_backoff, methods=["GET"]),
9756
+ Route("/github-backoff", post_github_backoff, methods=["POST"]),
9671
9757
  Route("/issue-comments", get_issue_comments, methods=["GET"]),
9672
9758
  Route("/issue-comments", post_issue_comments, methods=["POST"]),
9673
9759
  Route("/merge", post_merge, methods=["POST"]),
@@ -1,5 +1,5 @@
1
1
  """Tests for coord.github_throttle (#2809: the shared per-machine GitHub
2
- rate-limit backoff state).
2
+ rate-limit backoff state; #2934: made fleet-wide via the board daemon).
3
3
 
4
4
  Scope: the module is a small, best-effort, file-backed signal — record a
5
5
  hit, consult it before the next call, never shrink an active window, never
@@ -7,14 +7,27 @@ raise into a caller regardless of what the on-disk state looks like. The
7
7
  `tests/conftest.py` autouse `_no_real_github_backoff_store` fixture already
8
8
  redirects every test's `$COORD_GITHUB_BACKOFF_STATE` to a private tmp file,
9
9
  so these tests never touch the operator's real `~/.coord/github_backoff.json`.
10
+
11
+ Every test above `TestDaemonRouting` runs with no board service configured
12
+ (the default), so `record()`/`consult()` exercise exactly the same local-file
13
+ code path their pre-#2934 counterparts — `local_record()`/`local_consult()` —
14
+ always did; #2934 only added a daemon-first branch in front of it.
15
+ `TestDaemonRouting` below is the unit-level coverage for THAT branch (mocking
16
+ `coord.board_service.resolve()` and the `coord.client` transport functions,
17
+ same pattern as `tests/test_machine_pause.py`'s `_remote()` helper); the full
18
+ cross-process round trip through a real daemon app — one host's `record()`
19
+ observed by another host's `consult()` — is covered separately in
20
+ `tests/test_serve.py::test_github_backoff_recorded_on_one_host_is_honoured_by_another`.
10
21
  """
11
22
 
12
23
  from __future__ import annotations
13
24
 
14
25
  import json
15
26
 
27
+ import httpx
16
28
  import pytest
17
29
 
30
+ from coord import client as coord_client
18
31
  from coord import github_throttle
19
32
 
20
33
 
@@ -186,3 +199,132 @@ class TestStatePathOverride:
186
199
  assert data["request_id"] == "req-1"
187
200
  assert data["retry_after_s"] == 42.0
188
201
  assert data["until"] == pytest.approx(542.0)
202
+
203
+
204
+ # ── #2934: daemon-aware routing ─────────────────────────────────────────────
205
+ #
206
+ # `record()`/`consult()` route through the board daemon when one is
207
+ # configured (thin client), following the same daemon-aware pattern
208
+ # `coord.machine_pause` established for pause/quiet-hours/cordons. These
209
+ # tests cover the unit-level routing decision in isolation — see the module
210
+ # docstring for where the real cross-process round trip lives.
211
+
212
+
213
+ def _remote(monkeypatch, url: str = "http://daemon:7435") -> None:
214
+ """Make `coord.board_service.resolve()` (and therefore github_throttle's
215
+ daemon-aware functions) act as a thin client pointed at *url* — same
216
+ helper `tests/test_machine_pause.py` uses for the identical seam."""
217
+ monkeypatch.setattr(
218
+ coord_client, "resolve_board_service",
219
+ lambda *a, **k: coord_client.ServiceConfig(url=url),
220
+ )
221
+
222
+
223
+ class TestDaemonRouting:
224
+ def test_record_posts_to_the_daemon_instead_of_the_local_file(
225
+ self, monkeypatch, tmp_path
226
+ ) -> None:
227
+ _remote(monkeypatch)
228
+ posted = {}
229
+
230
+ def _fake_post(svc, **kwargs):
231
+ posted["url"] = svc.url
232
+ posted.update(kwargs)
233
+ return {"backoff": None}
234
+
235
+ monkeypatch.setattr(coord_client, "post_github_backoff", _fake_post)
236
+
237
+ github_throttle.record(
238
+ reason="secondary_rate_limit", status=403,
239
+ request_id="req-1", retry_after_s=120.0,
240
+ )
241
+ assert posted == {
242
+ "url": "http://daemon:7435",
243
+ "reason": "secondary_rate_limit", "status": 403,
244
+ "request_id": "req-1", "retry_after_s": 120.0,
245
+ }
246
+ # Never fell through to the local file.
247
+ assert github_throttle.current() is None
248
+
249
+ def test_record_falls_back_to_the_local_file_when_the_daemon_is_unreachable(
250
+ self, monkeypatch
251
+ ) -> None:
252
+ _remote(monkeypatch)
253
+
254
+ def _raise(*_a, **_k):
255
+ raise httpx.ConnectError("refused")
256
+
257
+ monkeypatch.setattr(coord_client, "post_github_backoff", _raise)
258
+
259
+ # Must not raise -- record() is unconditionally best-effort, daemon
260
+ # routing included (module docstring: "damping must never become a
261
+ # new way to break `gh` access").
262
+ github_throttle.record(
263
+ reason="secondary_rate_limit", status=403,
264
+ request_id=None, retry_after_s=90.0, now=1000.0,
265
+ )
266
+ b = github_throttle.current(now=1000.0)
267
+ assert b is not None
268
+ assert b.until == pytest.approx(1090.0)
269
+
270
+ def test_consult_asks_the_daemon_when_remote(self, monkeypatch) -> None:
271
+ _remote(monkeypatch)
272
+ monkeypatch.setattr(
273
+ coord_client, "fetch_github_backoff",
274
+ lambda svc, **k: {
275
+ "until": 1120.0, "reason": "secondary_rate_limit", "status": 403,
276
+ "request_id": "remote-hit", "retry_after_s": 120.0, "recorded_at": 1000.0,
277
+ },
278
+ )
279
+ sleep_s, backoff = github_throttle.consult(now=1002.0)
280
+ assert backoff is not None
281
+ assert backoff.request_id == "remote-hit"
282
+ # 118s remaining, capped at MAX_PRECALL_SLEEP_S +/- jitter.
283
+ assert sleep_s <= github_throttle.MAX_PRECALL_SLEEP_S * 1.25
284
+ # Never touched the local file to answer this.
285
+ assert github_throttle.current() is None
286
+
287
+ def test_consult_reports_no_backoff_when_the_daemon_has_none(self, monkeypatch) -> None:
288
+ _remote(monkeypatch)
289
+ monkeypatch.setattr(coord_client, "fetch_github_backoff", lambda svc, **k: None)
290
+ sleep_s, backoff = github_throttle.consult(now=1000.0)
291
+ assert sleep_s == 0.0
292
+ assert backoff is None
293
+
294
+ def test_consult_falls_back_to_the_local_file_when_the_daemon_is_unreachable(
295
+ self, monkeypatch
296
+ ) -> None:
297
+ """The other three hosts must still honour their OWN last-known
298
+ local state when the shared daemon can't be reached -- never 'no
299
+ damping' just because the network blipped."""
300
+ _remote(monkeypatch)
301
+
302
+ def _raise(*_a, **_k):
303
+ raise httpx.ConnectError("refused")
304
+
305
+ monkeypatch.setattr(coord_client, "fetch_github_backoff", _raise)
306
+
307
+ # Seed the LOCAL file directly (bypassing record(), which would also
308
+ # try the daemon) to isolate consult()'s own fallback.
309
+ github_throttle.local_record(
310
+ reason="secondary_rate_limit", status=403,
311
+ request_id=None, retry_after_s=60.0, now=1000.0,
312
+ )
313
+ sleep_s, backoff = github_throttle.consult(now=1002.0)
314
+ assert backoff is not None
315
+ assert backoff.until == pytest.approx(1060.0)
316
+
317
+ def test_consult_treats_a_malformed_daemon_response_as_no_backoff(
318
+ self, monkeypatch
319
+ ) -> None:
320
+ """A successful GET carrying junk (not an exception) reads as 'no
321
+ backoff' -- same fail-open posture `_read()` already has for a
322
+ corrupt local file -- rather than falling back to the local file,
323
+ which the daemon DID successfully answer for."""
324
+ _remote(monkeypatch)
325
+ monkeypatch.setattr(
326
+ coord_client, "fetch_github_backoff", lambda svc, **k: {"not": "a backoff"},
327
+ )
328
+ sleep_s, backoff = github_throttle.consult(now=1000.0)
329
+ assert sleep_s == 0.0
330
+ assert backoff is None