code-coordinator 0.5.569__tar.gz → 0.5.570__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 (932) hide show
  1. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/drive_queue.py +111 -9
  5. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/drive_queue.py +56 -23
  6. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_drive_queue.py +107 -0
  7. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_drive.py +16 -0
  8. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_drive_queue.py +181 -0
  9. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/.claude/commands/board.md +0 -0
  10. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/.claude/commands/complete-session.md +0 -0
  11. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/.claude/commands/coordinator.md +0 -0
  12. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/.githooks/_lib.sh +0 -0
  13. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/.githooks/post-checkout +0 -0
  14. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/.githooks/post-commit +0 -0
  15. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/.githooks/post-merge +0 -0
  16. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  17. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/.github/coord-ci-acceptance.yml +0 -0
  18. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/.github/workflows/auto-release.yml +0 -0
  19. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/.github/workflows/publish.yml +0 -0
  20. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/.github/workflows/test.yml +0 -0
  21. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/.gitignore +0 -0
  22. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/CLAUDE.md +0 -0
  23. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/GOAL.md +0 -0
  24. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/LICENSE +0 -0
  25. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/MANIFEST.in +0 -0
  26. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/README.md +0 -0
  27. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/code_coordinator.egg-info/SOURCES.txt +0 -0
  28. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/code_coordinator.egg-info/dependency_links.txt +0 -0
  29. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/code_coordinator.egg-info/entry_points.txt +0 -0
  30. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/code_coordinator.egg-info/requires.txt +0 -0
  31. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/code_coordinator.egg-info/scm_file_list.json +0 -0
  32. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/code_coordinator.egg-info/top_level.txt +0 -0
  33. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/__init__.py +0 -0
  34. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/_board_mapping.py +0 -0
  35. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/acceptance.py +0 -0
  36. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/acceptance_drivers.py +0 -0
  37. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/agent.py +0 -0
  38. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/agent_app.py +0 -0
  39. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/agent_update.py +0 -0
  40. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/agents/opencode/.gitignore +0 -0
  41. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/agents/opencode/agents/work.md +0 -0
  42. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/agents/opencode/routing.jsonc +0 -0
  43. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/approved_work.py +0 -0
  44. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/audit.py +0 -0
  45. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/auto_loop.py +0 -0
  46. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/backup.py +0 -0
  47. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/block_log.py +0 -0
  48. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/board_schema.py +0 -0
  49. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/board_service.py +0 -0
  50. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/board_wire.py +0 -0
  51. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/brain.py +0 -0
  52. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/branch_model.py +0 -0
  53. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/bug_intake.py +0 -0
  54. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/bugbash.py +0 -0
  55. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/cargo_cache.py +0 -0
  56. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/ci_fix.py +0 -0
  57. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/ci_github.py +0 -0
  58. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/ci_gitlab.py +0 -0
  59. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/ci_store.py +0 -0
  60. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/claim.py +0 -0
  61. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/claude_setup_token.py +0 -0
  62. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/cli.py +0 -0
  63. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/client.py +0 -0
  64. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/codegen.py +0 -0
  65. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/__init__.py +0 -0
  66. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/_common.py +0 -0
  67. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/acceptance.py +0 -0
  68. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/agent_ops.py +0 -0
  69. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/audit.py +0 -0
  70. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/backup.py +0 -0
  71. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/bugbash.py +0 -0
  72. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/chat.py +0 -0
  73. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/ci.py +0 -0
  74. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/codegen.py +0 -0
  75. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/dispatch.py +0 -0
  76. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/dispatch_workers.py +0 -0
  77. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/dr.py +0 -0
  78. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/drive.py +0 -0
  79. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/gate_a.py +0 -0
  80. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/gates.py +0 -0
  81. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/issues.py +0 -0
  82. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/lifecycle.py +0 -0
  83. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/machine.py +0 -0
  84. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/merge.py +0 -0
  85. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/milestone.py +0 -0
  86. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/plan_followup.py +0 -0
  87. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/plans.py +0 -0
  88. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/portal.py +0 -0
  89. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/pr.py +0 -0
  90. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/release.py +0 -0
  91. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/repo.py +0 -0
  92. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/report.py +0 -0
  93. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/review.py +0 -0
  94. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/scorecard.py +0 -0
  95. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/sessions.py +0 -0
  96. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/setup.py +0 -0
  97. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/status.py +0 -0
  98. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/store_migrate.py +0 -0
  99. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/terminal.py +0 -0
  100. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/test_gate.py +0 -0
  101. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/commands/tui.py +0 -0
  102. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/comments.py +0 -0
  103. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/config.py +0 -0
  104. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/config_reload.py +0 -0
  105. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/confirm_test.py +0 -0
  106. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/conflict_fix.py +0 -0
  107. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/dao.py +0 -0
  108. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/dashboard/__init__.py +0 -0
  109. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/dashboard/fixture.py +0 -0
  110. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/dashboard/index.html +0 -0
  111. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/dashboard/reports.html +0 -0
  112. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/dashboard/server.py +0 -0
  113. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/dashboard/terminal.py +0 -0
  114. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/db.py +0 -0
  115. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/dead_end.py +0 -0
  116. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/decomposition_chat.py +0 -0
  117. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/deploy/README.md +0 -0
  118. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/deploy/coord-agent.service +0 -0
  119. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/deploy/coord-backup.service +0 -0
  120. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/deploy/coord-backup.timer +0 -0
  121. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/deploy/coord-db-backup.service +0 -0
  122. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/deploy/coord-db-backup.sh +0 -0
  123. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/deploy/coord-db-backup.timer +0 -0
  124. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/deploy/coord-dr-verify.service +0 -0
  125. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/deploy/coord-dr-verify.timer +0 -0
  126. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/deploy/coord-drive-queue.service +0 -0
  127. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/deploy/coord-drive-queue.timer +0 -0
  128. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/deploy/coord-failure-notify.service +0 -0
  129. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/deploy/coord-fleet-watchdog.service +0 -0
  130. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  131. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/deploy/coord-notify.service +0 -0
  132. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/deploy/coord-notify.timer +0 -0
  133. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/deploy/coord-release-propagate.service +0 -0
  134. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/deploy/coord-release-propagate.timer +0 -0
  135. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/deploy/coord-release-window.service +0 -0
  136. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/deploy/coord-release-window.timer +0 -0
  137. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/deploy/coord-serve.service +0 -0
  138. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/deploy/coord-web-dist-build.service +0 -0
  139. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/deploy/coord-web-dist-build.timer +0 -0
  140. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/deploy/coord-web.service +0 -0
  141. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/deploy_manifest.py +0 -0
  142. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/deploy_units.py +0 -0
  143. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/deprecation_telemetry.py +0 -0
  144. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/deps.py +0 -0
  145. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/diagnose.py +0 -0
  146. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/dispatch.py +0 -0
  147. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/dispatch_liveness.py +0 -0
  148. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/dist_name.py +0 -0
  149. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/dr_promote.py +0 -0
  150. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/dr_verify.py +0 -0
  151. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/drive.py +0 -0
  152. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/drive_sessions_snapshot.py +0 -0
  153. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/drive_state.py +0 -0
  154. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/events.py +0 -0
  155. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/failure_class.py +0 -0
  156. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/failure_classifier.py +0 -0
  157. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/filelock.py +0 -0
  158. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/fleet_config_health.py +0 -0
  159. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/forge_availability.py +0 -0
  160. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/freshness.py +0 -0
  161. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/gate_a.py +0 -0
  162. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/gate_b.py +0 -0
  163. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/gate_snapshot.py +0 -0
  164. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/gates.py +0 -0
  165. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/gen_board_fixture.py +0 -0
  166. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/github_ops.py +0 -0
  167. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/github_throttle.py +0 -0
  168. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/goal.py +0 -0
  169. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/graph_health.py +0 -0
  170. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/gtk_native_driver.py +0 -0
  171. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/__init__.py +0 -0
  172. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/aggregate.py +0 -0
  173. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/checks/__init__.py +0 -0
  174. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/checks/_ci_pin.py +0 -0
  175. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/checks/agent_install.py +0 -0
  176. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/checks/cargo_targets.py +0 -0
  177. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/checks/claude_binary.py +0 -0
  178. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/checks/config_drift.py +0 -0
  179. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  180. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/checks/coord_web_ci_pin.py +0 -0
  181. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/checks/deploy_lane_facts.py +0 -0
  182. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/checks/disk.py +0 -0
  183. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/checks/fleet_board.py +0 -0
  184. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  185. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/checks/fleet_phantom.py +0 -0
  186. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/checks/fleet_unit_drift.py +0 -0
  187. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/checks/graph.py +0 -0
  188. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/checks/graphify_cli.py +0 -0
  189. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/checks/index_lock.py +0 -0
  190. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/checks/issues_sync_staleness.py +0 -0
  191. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/checks/local_machine_identity.py +0 -0
  192. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/checks/plan_usage.py +0 -0
  193. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/checks/pr_churn.py +0 -0
  194. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/checks/release_cordon.py +0 -0
  195. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/checks/repo_state.py +0 -0
  196. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/checks/spawned_coord.py +0 -0
  197. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/checks/stalled_pipeline.py +0 -0
  198. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/checks/timer_active.py +0 -0
  199. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/checks/toolchain.py +0 -0
  200. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/checks/unit_drift.py +0 -0
  201. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/checks/unit_enablement.py +0 -0
  202. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/checks/wedged_drive_queue.py +0 -0
  203. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/checks/worktrees.py +0 -0
  204. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/cli.py +0 -0
  205. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/context.py +0 -0
  206. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/fleet_snapshot.py +0 -0
  207. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/models.py +0 -0
  208. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/pypi.py +0 -0
  209. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/registry.py +0 -0
  210. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/render.py +0 -0
  211. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/health/units.py +0 -0
  212. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/hooks.py +0 -0
  213. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/housekeeping.py +0 -0
  214. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/interactive.py +0 -0
  215. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/invariant_alarms.py +0 -0
  216. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/issue_store.py +0 -0
  217. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/issues_sync_status.py +0 -0
  218. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/liveness_auditor.py +0 -0
  219. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/mac_native_driver.py +0 -0
  220. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/machine_fault.py +0 -0
  221. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/machine_metrics.py +0 -0
  222. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/machine_onboard.py +0 -0
  223. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/machine_pause.py +0 -0
  224. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/machine_stats.py +0 -0
  225. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/merge_queue.py +0 -0
  226. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/milestone_chat.py +0 -0
  227. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/milestone_dispatch.py +0 -0
  228. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/milestone_gate.py +0 -0
  229. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/milestone_order.py +0 -0
  230. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/mock_author.py +0 -0
  231. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/models.py +0 -0
  232. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/network.py +0 -0
  233. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/new_issue_chat.py +0 -0
  234. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/notifier/__init__.py +0 -0
  235. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/notifier/baseline.py +0 -0
  236. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/notifier/cli.py +0 -0
  237. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/notifier/collect.py +0 -0
  238. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/notifier/digest.py +0 -0
  239. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/notifier/models.py +0 -0
  240. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/notifier/predicate.py +0 -0
  241. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/notifier/service.py +0 -0
  242. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/notifier/store.py +0 -0
  243. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/notifier/transport.py +0 -0
  244. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/notify.py +0 -0
  245. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/openapi.py +0 -0
  246. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/overlap_fence.py +0 -0
  247. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/overlap_predict.py +0 -0
  248. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/parentage.py +0 -0
  249. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/parentage_github.py +0 -0
  250. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/pipeline.py +0 -0
  251. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/plan_parser.py +0 -0
  252. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/plans.py +0 -0
  253. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/platform_paths.py +0 -0
  254. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/portal_bridge.py +0 -0
  255. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/portal_store.py +0 -0
  256. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/portal_sync.py +0 -0
  257. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/pr_body_lint.py +0 -0
  258. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/prereqs.py +0 -0
  259. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/progress.py +0 -0
  260. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/providers/__init__.py +0 -0
  261. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/providers/base.py +0 -0
  262. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/providers/claude.py +0 -0
  263. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/providers/claude_pty.py +0 -0
  264. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/providers/opencode.py +0 -0
  265. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/queue_diagnose.py +0 -0
  266. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/reconcile.py +0 -0
  267. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/reconcile_tick.py +0 -0
  268. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/refine_chat.py +0 -0
  269. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/release_cordon.py +0 -0
  270. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/release_gate.py +0 -0
  271. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/release_propagate.py +0 -0
  272. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/release_verify.py +0 -0
  273. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/release_window.py +0 -0
  274. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/repo_dormancy.py +0 -0
  275. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/repo_edit.py +0 -0
  276. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/repo_onboard.py +0 -0
  277. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/reports.py +0 -0
  278. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/rest_schema.py +0 -0
  279. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/restart_cmd.py +0 -0
  280. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/revalidate.py +0 -0
  281. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/review.py +0 -0
  282. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/scorecard.py +0 -0
  283. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/self_health.py +0 -0
  284. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/serve_app.py +0 -0
  285. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  286. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  287. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  288. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  289. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  290. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/skills/portal-followup/SKILL.md +0 -0
  291. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/skills/release-now/SKILL.md +0 -0
  292. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  293. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  294. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/skills/update-issue/SKILL.md +0 -0
  295. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/smoke.py +0 -0
  296. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/smoke_tags.py +0 -0
  297. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/spend_ceiling.py +0 -0
  298. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/split_work.py +0 -0
  299. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/sql.py +0 -0
  300. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/stage_projection.py +0 -0
  301. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/state.py +0 -0
  302. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/store_migrate.py +0 -0
  303. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/store_parity.py +0 -0
  304. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/templates/deploy-cloudflare.node.yml +0 -0
  305. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/test_author.py +0 -0
  306. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/test_chat.py +0 -0
  307. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/test_orchestrator.py +0 -0
  308. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/test_report.py +0 -0
  309. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/tui_pty_driver.py +0 -0
  310. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/tui_release.py +0 -0
  311. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/uat_checks.py +0 -0
  312. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/usage.py +0 -0
  313. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/usage_limits.py +0 -0
  314. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/usage_rollup.py +0 -0
  315. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/win_native_bridge.py +0 -0
  316. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/win_native_driver.py +0 -0
  317. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coord/worker_events.py +0 -0
  318. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/coordinator.example.yml +0 -0
  319. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/deploy/coord-agent.service +0 -0
  320. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/deploy/coord-backup.service +0 -0
  321. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/deploy/coord-backup.timer +0 -0
  322. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/deploy/coord-db-backup.service +0 -0
  323. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/deploy/coord-db-backup.sh +0 -0
  324. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/deploy/coord-db-backup.timer +0 -0
  325. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/deploy/coord-dr-verify.service +0 -0
  326. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/deploy/coord-dr-verify.timer +0 -0
  327. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/deploy/coord-drive-queue.service +0 -0
  328. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/deploy/coord-drive-queue.timer +0 -0
  329. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/deploy/coord-failure-notify.service +0 -0
  330. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/deploy/coord-failure-notify.sh +0 -0
  331. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/deploy/coord-fleet-watchdog.service +0 -0
  332. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/deploy/coord-fleet-watchdog.timer +0 -0
  333. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/deploy/coord-notify.service +0 -0
  334. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/deploy/coord-notify.timer +0 -0
  335. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/deploy/coord-release-propagate.service +0 -0
  336. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/deploy/coord-release-propagate.timer +0 -0
  337. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/deploy/coord-release-window.service +0 -0
  338. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/deploy/coord-release-window.timer +0 -0
  339. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/deploy/coord-serve.service +0 -0
  340. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/deploy/coord-web-dist-build.service +0 -0
  341. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/deploy/coord-web-dist-build.sh +0 -0
  342. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/deploy/coord-web-dist-build.timer +0 -0
  343. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/deploy/coord-web-rollback.sh +0 -0
  344. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/deploy/coord-web.service +0 -0
  345. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/deploy/node-shim.sh +0 -0
  346. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/ADR_COORD_TUI_CI.md +0 -0
  347. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  348. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/ADR_COORD_WEB_CI.md +0 -0
  349. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/ADR_COORD_WEB_DIST.md +0 -0
  350. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  351. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/AGENT_OPERATIONS.md +0 -0
  352. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/ARCHITECTURE.md +0 -0
  353. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/ARCH_SECURITY_GATES.md +0 -0
  354. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/COCKPIT.md +0 -0
  355. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/CONTROL_CENTER.md +0 -0
  356. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/COST_DISCIPLINE.md +0 -0
  357. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/CROSS_PLATFORM.md +0 -0
  358. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/CUSTOMER_FACING_APPS.md +0 -0
  359. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/CUSTOMER_PORTAL.md +0 -0
  360. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/DATA_STORE_SELECTION.md +0 -0
  361. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/DISASTER_RECOVERY.md +0 -0
  362. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/DRIVE_QUEUE.md +0 -0
  363. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/EPHEMERAL_WORKERS.md +0 -0
  364. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/FORGE_MIGRATION.md +0 -0
  365. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/GRAPHIFY_SETUP.md +0 -0
  366. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/ISSUE_GUIDANCE.md +0 -0
  367. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/MAC_MINI.md +0 -0
  368. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  369. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/NOTIFIER.md +0 -0
  370. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/OPENCODE_VERIFICATION.md +0 -0
  371. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/OPERATING_GOTCHAS.md +0 -0
  372. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/OPERATOR_GUIDES.md +0 -0
  373. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/ORACLE_LOOP.md +0 -0
  374. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/PHONE_WEBAPP.md +0 -0
  375. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/PIPELINE_V2.md +0 -0
  376. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/PLATFORM_EVOLUTION.md +0 -0
  377. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/SECOND_BACKEND.md +0 -0
  378. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/STORE_SERVICE.md +0 -0
  379. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  380. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/WEB_CONTROL_CENTER.md +0 -0
  381. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/WSL_WINDOWS_WORKER.md +0 -0
  382. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/mocks/web/README.md +0 -0
  383. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/mocks/web/_tokens.css +0 -0
  384. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/mocks/web/issue-detail.html +0 -0
  385. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/mocks/web/pipeline-narrow.html +0 -0
  386. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/docs/mocks/web/pipeline-wide.html +0 -0
  387. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/graphify-out/.gitignore +0 -0
  388. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/install-agent.sh +0 -0
  389. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/pyproject.toml +0 -0
  390. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/audit_review_verdict_overrides.py +0 -0
  391. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  392. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/azure-workers/build-worker-image.sh +0 -0
  393. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/azure-workers/coordinator-machine.py +0 -0
  394. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/azure-workers/dr-down.sh +0 -0
  395. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/azure-workers/dr-up.sh +0 -0
  396. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/azure-workers/epic-down.sh +0 -0
  397. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/azure-workers/epic-up.sh +0 -0
  398. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/azure-workers/preflight.sh +0 -0
  399. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/azure-workers/provision-server.sh +0 -0
  400. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/azure-workers/provision-worker.sh +0 -0
  401. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  402. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  403. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/azure-workers/throwaway-vm.sh +0 -0
  404. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/azure-workers/verify-github-token.sh +0 -0
  405. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/check_gh_argv_containment.py +0 -0
  406. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/codegen.py +0 -0
  407. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/coord-test-runner.sh +0 -0
  408. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  409. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  410. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  411. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  412. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/coord-venv-rollback.sh +0 -0
  413. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/drive-batch.sh +0 -0
  414. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/extract-coord-tui.sh +0 -0
  415. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/fleet_watchdog.py +0 -0
  416. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/gen_board_fixture.py +0 -0
  417. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/gen_mock_index.py +0 -0
  418. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/lib/provision-core.sh +0 -0
  419. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/next_release_tag.py +0 -0
  420. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/provision-machine.sh +0 -0
  421. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/run_tests_in_populated_home.sh +0 -0
  422. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/run_tests_without_gh.sh +0 -0
  423. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/setup-macmini.sh +0 -0
  424. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/smoke_437_interactive.py +0 -0
  425. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/verify-provision-noble.sh +0 -0
  426. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/verify_878_review_capture.py +0 -0
  427. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/verify_release_published.py +0 -0
  428. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/scripts/verify_release_wheel.py +0 -0
  429. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/setup.cfg +0 -0
  430. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/SMOKE_SET.md +0 -0
  431. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/__init__.py +0 -0
  432. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/acceptance/ms-37/conftest.py +0 -0
  433. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/acceptance/ms-37/contract.md +0 -0
  434. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/acceptance/ms-37/manifest.yml +0 -0
  435. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  436. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  437. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/acceptance/ms-51/contract.md +0 -0
  438. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  439. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  440. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/acceptance/ms-51/manifest.yml +0 -0
  441. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  442. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/acceptance/ms-51/tsconfig.json +0 -0
  443. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  444. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/backends.py +0 -0
  445. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/conftest.py +0 -0
  446. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/fixtures/board-pipeline-basic.json +0 -0
  447. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  448. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  449. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  450. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  451. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/fixtures/playwright/all_pass.json +0 -0
  452. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  453. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/fixtures/playwright/mixed_fail.json +0 -0
  454. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  455. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  456. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/fixtures/playwright/skip.json +0 -0
  457. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/fixtures/playwright/truncated.json +0 -0
  458. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  459. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  460. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  461. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  462. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/fixtures/test_report/pytest_error_log_record.txt +0 -0
  463. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  464. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  465. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  466. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  467. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_acceptance.py +0 -0
  468. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_acceptance_drivers.py +0 -0
  469. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_agent.py +0 -0
  470. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_agent_api_error.py +0 -0
  471. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_agent_app.py +0 -0
  472. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_agent_branch_base.py +0 -0
  473. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_agent_branch_capture.py +0 -0
  474. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_agent_config_free_1712.py +0 -0
  475. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_agent_deploy_units_endpoint.py +0 -0
  476. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_agent_dirty_worktree.py +0 -0
  477. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  478. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_agent_graph_self_heal.py +0 -0
  479. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_agent_health_h3.py +0 -0
  480. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_agent_idle_restart.py +0 -0
  481. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_agent_push_failure.py +0 -0
  482. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_agent_reap.py +0 -0
  483. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_agent_repos_and_pull.py +0 -0
  484. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_agent_restart_services_endpoint.py +0 -0
  485. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_agent_skills_self_heal.py +0 -0
  486. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_agent_startup_diagnostics.py +0 -0
  487. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_agent_update.py +0 -0
  488. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_agent_update_bluegreen.py +0 -0
  489. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_agent_usage_limit.py +0 -0
  490. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_agent_zero_commit.py +0 -0
  491. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_ambient_home_isolation.py +0 -0
  492. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_approve_capability_reroute_3241.py +0 -0
  493. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_approve_dependency_busy_2804.py +0 -0
  494. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_approve_reject_plan.py +0 -0
  495. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_approve_usage_gate.py +0 -0
  496. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_approved_work_2532.py +0 -0
  497. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_approved_work_2996.py +0 -0
  498. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_assignment_already_recorded_daemon.py +0 -0
  499. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_audit_log.py +0 -0
  500. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_audit_outcome.py +0 -0
  501. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_audit_query.py +0 -0
  502. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_auto_loop.py +0 -0
  503. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_auto_release_publish_2035.py +0 -0
  504. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_backend_selection.py +0 -0
  505. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_backup.py +0 -0
  506. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_base_checkout_restore.py +0 -0
  507. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_block_log.py +0 -0
  508. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_board_cap_762.py +0 -0
  509. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_board_fixture.py +0 -0
  510. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_board_read_path.py +0 -0
  511. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_board_schema.py +0 -0
  512. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_board_service.py +0 -0
  513. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_board_state.py +0 -0
  514. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_board_wire.py +0 -0
  515. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_brain.py +0 -0
  516. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_branch_model.py +0 -0
  517. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_bug_intake.py +0 -0
  518. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_bugbash.py +0 -0
  519. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_build_worker_image_env_update.py +0 -0
  520. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cargo_cache.py +0 -0
  521. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_check_gh_argv_containment.py +0 -0
  522. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_ci_acceptance_gate_1950.py +0 -0
  523. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_ci_fix.py +0 -0
  524. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_ci_github.py +0 -0
  525. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_ci_gitlab.py +0 -0
  526. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_ci_parity_2091.py +0 -0
  527. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_ci_store.py +0 -0
  528. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_claim.py +0 -0
  529. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_claude_md_budget.py +0 -0
  530. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_claude_setup_token.py +0 -0
  531. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_acceptance.py +0 -0
  532. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_assign.py +0 -0
  533. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  534. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_assign_interactive_remote.py +0 -0
  535. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_assign_provider.py +0 -0
  536. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  537. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_audit.py +0 -0
  538. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_chat_continue.py +0 -0
  539. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_ci.py +0 -0
  540. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_codegen.py +0 -0
  541. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_decide.py +0 -0
  542. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_diagnose_capability_rules.py +0 -0
  543. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_diagnose_config_provenance.py +0 -0
  544. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_diagnose_forge_availability.py +0 -0
  545. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_diagnose_graph.py +0 -0
  546. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_diagnose_self.py +0 -0
  547. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_diagnose_test_coverage.py +0 -0
  548. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_doctor.py +0 -0
  549. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_doctor_config_free_1801.py +0 -0
  550. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  551. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_doctor_store_backend_3084.py +0 -0
  552. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_drive.py +0 -0
  553. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_escalate.py +0 -0
  554. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_fix_headless_review.py +0 -0
  555. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_gate_a.py +0 -0
  556. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_install_drift.py +0 -0
  557. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_install_skills.py +0 -0
  558. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_issue_comment.py +0 -0
  559. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_issue_create_label.py +0 -0
  560. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_issue_reopen.py +0 -0
  561. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_issue_view_list.py +0 -0
  562. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_issues.py +0 -0
  563. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_merge.py +0 -0
  564. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_milestone_assign.py +0 -0
  565. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_milestone_capture.py +0 -0
  566. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_milestone_chat_add_child.py +0 -0
  567. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_milestone_dispatch.py +0 -0
  568. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_milestone_gate_b.py +0 -0
  569. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_milestone_gate_c.py +0 -0
  570. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_milestone_order.py +0 -0
  571. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  572. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_milestone_ship.py +0 -0
  573. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_network.py +0 -0
  574. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_new_issue_chat.py +0 -0
  575. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_plans.py +0 -0
  576. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_portal.py +0 -0
  577. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_pr.py +0 -0
  578. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_pull_artifact.py +0 -0
  579. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_queue.py +0 -0
  580. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_reattach_sessions.py +0 -0
  581. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_refine_board.py +0 -0
  582. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_release_preflight.py +0 -0
  583. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_release_propagate.py +0 -0
  584. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_release_window.py +0 -0
  585. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_repo_2220.py +0 -0
  586. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  587. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_scorecard.py +0 -0
  588. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_serve_store_backend_3084.py +0 -0
  589. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_set_review_findings.py +0 -0
  590. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_status_advisory_terminal.py +0 -0
  591. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_status_contested_tag.py +0 -0
  592. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_status_invariant_alarms.py +0 -0
  593. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_status_machine_fault.py +0 -0
  594. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_status_merge_queue.py +0 -0
  595. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_status_provider.py +0 -0
  596. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_status_retried_3340.py +0 -0
  597. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_status_review_finalizing.py +0 -0
  598. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_status_supervisor_3366.py +0 -0
  599. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_status_test_failed_tag.py +0 -0
  600. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_status_usage_limit.py +0 -0
  601. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_sync_comments_873.py +0 -0
  602. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_test_plan.py +0 -0
  603. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_track.py +0 -0
  604. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_tui_update.py +0 -0
  605. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cli_wait.py +0 -0
  606. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_client.py +0 -0
  607. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_client_base_install.py +0 -0
  608. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_client_config_cache_atomic_3052.py +0 -0
  609. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_client_resource_migration_1946.py +0 -0
  610. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_commands_common.py +0 -0
  611. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_comments.py +0 -0
  612. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_completion_summary.py +0 -0
  613. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_config.py +0 -0
  614. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_config_acceptance.py +0 -0
  615. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_config_audit.py +0 -0
  616. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_config_drift_check.py +0 -0
  617. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_config_effective.py +0 -0
  618. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_config_pricing.py +0 -0
  619. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  620. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_config_usage_gate.py +0 -0
  621. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_confirm_test.py +0 -0
  622. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_conflict_fix.py +0 -0
  623. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_conflict_fix_semantic.py +0 -0
  624. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  625. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_coord_test.py +0 -0
  626. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  627. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_coord_test_runner_baseline.py +0 -0
  628. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_coord_test_runner_populated_home.py +0 -0
  629. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_coord_test_runner_routing.py +0 -0
  630. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_coord_test_runner_toolchain.py +0 -0
  631. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_coord_uat.py +0 -0
  632. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_coord_web_sse_restart_live.py +0 -0
  633. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_coordinator_machine.py +0 -0
  634. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_cross_platform_imports.py +0 -0
  635. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_dao.py +0 -0
  636. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_dashboard.py +0 -0
  637. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_dashboard_api.py +0 -0
  638. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_dashboard_fixture.py +0 -0
  639. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_dashboard_reports.py +0 -0
  640. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_dashboard_server.py +0 -0
  641. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_dashboard_terminal.py +0 -0
  642. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_dashboard_terminal_live.py +0 -0
  643. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_db.py +0 -0
  644. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_dead_end.py +0 -0
  645. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_decomposition_chat.py +0 -0
  646. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_deploy_coord_db_backup.py +0 -0
  647. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_deploy_coord_web_dist.py +0 -0
  648. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_deploy_coord_web_rollback.py +0 -0
  649. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_deploy_db_backup_unit.py +0 -0
  650. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_deploy_drive_queue_unit.py +0 -0
  651. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_deploy_failure_notify_unit.py +0 -0
  652. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_deploy_manifest.py +0 -0
  653. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_deploy_notify_unit.py +0 -0
  654. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_deploy_units_lane.py +0 -0
  655. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_deploy_web_unit.py +0 -0
  656. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_deprecation_telemetry.py +0 -0
  657. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_deps.py +0 -0
  658. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_diagnose.py +0 -0
  659. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_dispatch.py +0 -0
  660. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_dispatch_liveness.py +0 -0
  661. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_dispatch_target_validation.py +0 -0
  662. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_dispatch_workers.py +0 -0
  663. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_dist_name.py +0 -0
  664. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_done_housekeeping.py +0 -0
  665. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_dr_azure_scripts.py +0 -0
  666. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_dr_promote.py +0 -0
  667. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_dr_verify.py +0 -0
  668. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_drive_machine_fault.py +0 -0
  669. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_drive_queue_blocked_rendering.py +0 -0
  670. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_drive_queue_launch_argv.py +0 -0
  671. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_drive_queue_max_parallel_config.py +0 -0
  672. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  673. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_drive_queue_roll_pending.py +0 -0
  674. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  675. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_drive_sessions_snapshot.py +0 -0
  676. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_drive_state.py +0 -0
  677. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_drive_tmux.py +0 -0
  678. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_epic_up_capability_detection.py +0 -0
  679. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  680. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_epic_up_image_provenance.py +0 -0
  681. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_errors.py +0 -0
  682. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_events.py +0 -0
  683. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_failure_class.py +0 -0
  684. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_failure_classifier.py +0 -0
  685. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_filelock.py +0 -0
  686. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  687. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_fix_escalation_classifier.py +0 -0
  688. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_fix_of_force_override.py +0 -0
  689. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_fleet_config_health.py +0 -0
  690. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_fleet_health_probes.py +0 -0
  691. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_fleet_health_snapshot.py +0 -0
  692. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_fleet_watchdog.py +0 -0
  693. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_forge_availability.py +0 -0
  694. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_freshness.py +0 -0
  695. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_gate_a.py +0 -0
  696. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_gate_b.py +0 -0
  697. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_gate_snapshot_staleness.py +0 -0
  698. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_gates.py +0 -0
  699. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  700. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_gen_mock_index.py +0 -0
  701. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_generated_rust_fixture.py +0 -0
  702. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_generated_rust_requests.py +0 -0
  703. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_generated_types_fixture.py +0 -0
  704. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_github_ops.py +0 -0
  705. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_github_throttle.py +0 -0
  706. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_goal.py +0 -0
  707. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_graph_health.py +0 -0
  708. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_graph_selfheal_absent_2237.py +0 -0
  709. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_gtk_native_driver.py +0 -0
  710. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_handoff.py +0 -0
  711. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_health_checks.py +0 -0
  712. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_health_cli.py +0 -0
  713. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_health_cli_graph.py +0 -0
  714. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_health_config.py +0 -0
  715. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_health_context.py +0 -0
  716. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_health_coord_tui_ci_pin.py +0 -0
  717. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_health_coord_web_ci_pin.py +0 -0
  718. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_health_deploy_lane_facts.py +0 -0
  719. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_health_fix.py +0 -0
  720. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_health_incident_regression.py +0 -0
  721. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_health_issues_sync_staleness.py +0 -0
  722. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_health_pr_churn.py +0 -0
  723. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_health_pypi.py +0 -0
  724. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_health_registry.py +0 -0
  725. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_health_release_cordon_probe.py +0 -0
  726. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_health_timer_active.py +0 -0
  727. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_health_toolchain.py +0 -0
  728. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_health_unit_drift.py +0 -0
  729. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_health_unit_enablement.py +0 -0
  730. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_health_wedged_drive_queue.py +0 -0
  731. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_hooks.py +0 -0
  732. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_housekeeping.py +0 -0
  733. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_human_attended_437.py +0 -0
  734. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_init.py +0 -0
  735. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_install_agent_capabilities_3515.py +0 -0
  736. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_install_agent_venv_2911.py +0 -0
  737. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_install_agent_wsl_bridge_3515.py +0 -0
  738. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_integration.py +0 -0
  739. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_interactive.py +0 -0
  740. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_interactive_briefing_echo.py +0 -0
  741. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_interactive_pane_log_2541.py +0 -0
  742. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_interactive_prefill_state.py +0 -0
  743. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_interactive_session_relaunch.py +0 -0
  744. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_interactive_test_verdict_backstop.py +0 -0
  745. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_interactive_token_attribution.py +0 -0
  746. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_interactive_worktree.py +0 -0
  747. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_invariant_alarms.py +0 -0
  748. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_issue_store_seam.py +0 -0
  749. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_issues_sync_status.py +0 -0
  750. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_liveness_auditor.py +0 -0
  751. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_liveness_notify.py +0 -0
  752. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_lock_contention_ratchet.py +0 -0
  753. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_mac_native_driver.py +0 -0
  754. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_machine_fault.py +0 -0
  755. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_machine_metrics.py +0 -0
  756. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_machine_onboard.py +0 -0
  757. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_machine_pause.py +0 -0
  758. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_machine_stats.py +0 -0
  759. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_merge_queue.py +0 -0
  760. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_merge_verify.py +0 -0
  761. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_milestone_chat.py +0 -0
  762. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_milestone_dispatch.py +0 -0
  763. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_milestone_gate.py +0 -0
  764. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_milestone_order.py +0 -0
  765. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_milestone_seam.py +0 -0
  766. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_mock_author.py +0 -0
  767. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_model_tiering.py +0 -0
  768. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_models.py +0 -0
  769. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_models_config_labels.py +0 -0
  770. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_needs_attention.py +0 -0
  771. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_network.py +0 -0
  772. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_new_issue_chat.py +0 -0
  773. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_next_release_tag.py +0 -0
  774. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_node_shim.py +0 -0
  775. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_notifier_baseline.py +0 -0
  776. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_notifier_cli.py +0 -0
  777. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_notifier_collect.py +0 -0
  778. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_notifier_config.py +0 -0
  779. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_notifier_drive_seam.py +0 -0
  780. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_notifier_isolation.py +0 -0
  781. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_notifier_predicate.py +0 -0
  782. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_notifier_quiet_hours.py +0 -0
  783. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_notifier_service.py +0 -0
  784. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_notify.py +0 -0
  785. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_notify_drain.py +0 -0
  786. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_openapi.py +0 -0
  787. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_operational_defaults.py +0 -0
  788. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_overlap_fence.py +0 -0
  789. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_overlap_predict.py +0 -0
  790. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_packaged_deploy_units.py +0 -0
  791. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_parentage.py +0 -0
  792. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_paste_landed.py +0 -0
  793. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  794. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_pipeline.py +0 -0
  795. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_plan_followup_approve_plan_command.py +0 -0
  796. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_plan_followup_pr_command.py +0 -0
  797. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_plan_followup_review_command.py +0 -0
  798. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_plan_only.py +0 -0
  799. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_plan_parser.py +0 -0
  800. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_platform_paths.py +0 -0
  801. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_portal_bridge.py +0 -0
  802. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_portal_config.py +0 -0
  803. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_portal_store.py +0 -0
  804. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_portal_sync.py +0 -0
  805. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_pr_body_lint.py +0 -0
  806. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_prereqs.py +0 -0
  807. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_production_db_guard.py +0 -0
  808. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_progress.py +0 -0
  809. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_provider_seam.py +0 -0
  810. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_providers.py +0 -0
  811. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_providers_config_labels.py +0 -0
  812. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_providers_pty.py +0 -0
  813. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_provision_core.py +0 -0
  814. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_provision_machine.py +0 -0
  815. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_py_rust_mirror_inventory.py +0 -0
  816. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_quiet_hours.py +0 -0
  817. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_quiet_hours_store_2146.py +0 -0
  818. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_reap_merged_sessions.py +0 -0
  819. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_reap_stale_interactive_tick.py +0 -0
  820. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_reconcile.py +0 -0
  821. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_reconcile_branch.py +0 -0
  822. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_reconcile_completions.py +0 -0
  823. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  824. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_reconcile_merges.py +0 -0
  825. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_reconcile_no_agent_record.py +0 -0
  826. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_reconcile_tick.py +0 -0
  827. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_reconcile_usage_limit_done.py +0 -0
  828. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_refine_chat.py +0 -0
  829. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_release_cordon_2101.py +0 -0
  830. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  831. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_release_cordon_deadlock_2240.py +0 -0
  832. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_release_cordon_drain_stall_3336.py +0 -0
  833. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_release_cordon_stuck_2490.py +0 -0
  834. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_release_gate.py +0 -0
  835. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_release_propagate.py +0 -0
  836. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_release_propagate_threshold.py +0 -0
  837. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_release_roll_between_legs_2854.py +0 -0
  838. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_release_roll_window_handoff.py +0 -0
  839. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_release_unified_1242.py +0 -0
  840. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_release_verify.py +0 -0
  841. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_release_window.py +0 -0
  842. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_remote_auto_prune.py +0 -0
  843. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_remote_interactive_reaper.py +0 -0
  844. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_repo_add.py +0 -0
  845. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_repo_dormancy.py +0 -0
  846. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_repo_edit_2220.py +0 -0
  847. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_repo_graph_fleet_2237.py +0 -0
  848. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_repo_max_parallel_3423.py +0 -0
  849. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_repo_onboard_2220.py +0 -0
  850. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_report_public_export.py +0 -0
  851. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_report_result_push.py +0 -0
  852. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_reports.py +0 -0
  853. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_restart_cmd.py +0 -0
  854. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_retry.py +0 -0
  855. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_retry_advisory_1606.py +0 -0
  856. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_retry_escalation_classify_3360.py +0 -0
  857. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_retry_type_1636.py +0 -0
  858. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_revalidate.py +0 -0
  859. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_review.py +0 -0
  860. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_review_end_review_without_verdict.py +0 -0
  861. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_review_parse_failure_diagnostic.py +0 -0
  862. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_review_reaffirm.py +0 -0
  863. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_review_state.py +0 -0
  864. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_review_verdict_backstop.py +0 -0
  865. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_review_verdict_override_audit.py +0 -0
  866. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_review_verdict_relay.py +0 -0
  867. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_review_zero_commits.py +0 -0
  868. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_scoped_review_wiring.py +0 -0
  869. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_scorecard.py +0 -0
  870. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_self_health.py +0 -0
  871. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_serve.py +0 -0
  872. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_serve_app.py +0 -0
  873. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_serve_app_board_trim.py +0 -0
  874. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_serve_rest_routes.py +0 -0
  875. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_session.py +0 -0
  876. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_slice_issue_attribution.py +0 -0
  877. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_smoke.py +0 -0
  878. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_smoke_fanout_manifest_3333.py +0 -0
  879. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_smoke_live_checkout_restore.py +0 -0
  880. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_smoke_workflow.py +0 -0
  881. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_spend_ceiling.py +0 -0
  882. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_spend_ceiling_coordinator.py +0 -0
  883. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_split.py +0 -0
  884. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_split_work.py +0 -0
  885. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_sql_dialect.py +0 -0
  886. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_sqlite_connect_ratchet.py +0 -0
  887. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_stage_projection.py +0 -0
  888. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_stale_busy_reviewer_697.py +0 -0
  889. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_stalled_pipeline.py +0 -0
  890. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_state.py +0 -0
  891. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_state_review_findings_daemon.py +0 -0
  892. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_status_fleet_footer.py +0 -0
  893. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_stop_1567.py +0 -0
  894. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_store_contract.py +0 -0
  895. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_store_migrate.py +0 -0
  896. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_stuck.py +0 -0
  897. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  898. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_terminal_command.py +0 -0
  899. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_test_author.py +0 -0
  900. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_test_chat.py +0 -0
  901. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_test_orchestrator.py +0 -0
  902. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_test_report.py +0 -0
  903. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_test_verdict_parsing.py +0 -0
  904. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_test_verdict_transcript_floor.py +0 -0
  905. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_text_io_encoding_audit.py +0 -0
  906. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_thin_client_board_audit.py +0 -0
  907. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_thin_client_config_load_1080.py +0 -0
  908. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_thin_client_daemon_routing_906.py +0 -0
  909. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_throwaway_vm.py +0 -0
  910. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_tmux_host.py +0 -0
  911. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_tmux_session.py +0 -0
  912. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_transcript_floor.py +0 -0
  913. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_tui_pty_driver.py +0 -0
  914. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_uat_checks.py +0 -0
  915. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_usage.py +0 -0
  916. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_usage_limits.py +0 -0
  917. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_usage_rollup.py +0 -0
  918. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_venv_live_install_2121.py +0 -0
  919. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_version_single_source.py +0 -0
  920. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_watch.py +0 -0
  921. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_win_native_bridge.py +0 -0
  922. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_win_native_driver.py +0 -0
  923. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  924. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_worker_env_venv_isolation.py +0 -0
  925. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_worker_events.py +0 -0
  926. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_worker_image_pin_sync.py +0 -0
  927. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_worker_safety.py +0 -0
  928. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_worker_test_scoping.py +0 -0
  929. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_worktree.py +0 -0
  930. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  931. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/test_write_parity.py +0 -0
  932. {code_coordinator-0.5.569 → code_coordinator-0.5.570}/tests/write_parity.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-coordinator
3
- Version: 0.5.569
3
+ Version: 0.5.570
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.569
3
+ Version: 0.5.570
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.569",
2
+ "tag": "0.5.570",
3
3
  "distance": 0,
4
- "node": "g5c759420fc3645ac55648f65ba5bfddf7ceae8f2",
4
+ "node": "g29bd794d5c1bbedb62f22cdd0bef36e1a1cddd33",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-10-03"
@@ -485,6 +485,7 @@ def drive_queue_add(
485
485
  # kind is happening on that path. Merging (or fixing forward) a
486
486
  # discovered PR is deliberately left to the operator — see
487
487
  # `existing_pr_relaunch_remedy`'s own docstring.
488
+ existing_pr_resume_note = ""
488
489
  if previous is None or previous.state in STUCK_QUEUE_STATES:
489
490
  existing_match = _existing_pr_match(config_path, repo, issue)
490
491
  existing_remedy = existing_pr_relaunch_remedy(repo, issue, existing_match)
@@ -494,6 +495,24 @@ def drive_queue_add(
494
495
  f"{existing_remedy['what_happens']} Run instead: "
495
496
  f"{existing_remedy['command_or_action']}"
496
497
  )
498
+ # #3539: `existing_remedy is None` with a real *existing_match* is
499
+ # ambiguous on its own — "no PR found, start fresh" and "PR found,
500
+ # green, but still missing a gate — resume on it" both return
501
+ # `None` from `existing_pr_relaunch_remedy` (see its docstring).
502
+ # Say which one happened: silently queuing a resume with no echo
503
+ # at all would read identically to a fresh `add` and hide the exact
504
+ # trap #3539 reports (an operator with no way to tell this add is
505
+ # about to drive the SAME branch, not a new one).
506
+ if existing_match is not None and existing_match.missing_gates:
507
+ gates_list = " and ".join(existing_match.missing_gates)
508
+ existing_pr_resume_note = (
509
+ f"\nresuming on existing PR #{existing_match.number} "
510
+ f"({existing_match.branch}) — CI is green but {gates_list} "
511
+ f"{'gate is' if len(existing_match.missing_gates) == 1 else 'gates are'} "
512
+ "not yet recorded; this add will dispatch only the missing "
513
+ f"stage(s) on that branch, never a new Work leg (coord "
514
+ f"gates {repo} {issue} shows the live detail)."
515
+ )
497
516
 
498
517
  # #2247: predicted file overlap ORDERS, never refuses. Anything that goes
499
518
  # wrong in here (unreadable body, unreachable board, a failed compare)
@@ -645,6 +664,7 @@ def drive_queue_add(
645
664
  click.echo(
646
665
  f"queued {entry_key(repo, issue)}{pinned}{suffix}{gate}{fix_rounds_note}"
647
666
  f"{no_acceptance_note}{scope_downgrade_warning}{overlap_note}"
667
+ f"{existing_pr_resume_note}"
648
668
  )
649
669
 
650
670
  # #2339: say out loud when this add cannot possibly accomplish anything —
@@ -951,15 +971,32 @@ def _existing_pr_match(
951
971
  answer than `coord.merge_queue.plan()`'s own `PLAN_READY` verdict — it
952
972
  reads raw `failed_checks`/`in_flight_checks` only and does not account
953
973
  for `merge_queue._ci_checks_are_stale` (a green check that silently
954
- outlived a base move), review state, or any other merge gate. The
955
- issue's own design accepted either condition ("all green OR `coord merge
956
- --plan` reads READY"), and `coord merge --only` re-runs its own full gate
957
- check before actually merging either way, so the worst case from the gap
958
- is a confusing round trip (recommended here, still BLOCKED there), never
959
- an incorrect merge. Wiring the fuller verdict in would need this call
960
- site to assemble `plan()`'s board/GhOps/smoke-verdict inputs for a
961
- single PR lookup — a bigger, riskier change than this fix-round's scope;
962
- left as a known gap rather than attempted half-wired.
974
+ outlived a base move). The issue's own design accepted either condition
975
+ ("all green OR `coord merge --plan` reads READY"), and `coord merge
976
+ --only` re-runs its own full gate check before actually merging either
977
+ way, so the worst case from the gap is a confusing round trip
978
+ (recommended here, still BLOCKED there), never an incorrect merge.
979
+ Wiring the fuller verdict in would need this call site to assemble
980
+ `plan()`'s board/GhOps/smoke-verdict inputs for a single PR lookup — a
981
+ bigger, riskier change than this fix-round's scope; left as a known gap
982
+ rather than attempted half-wired.
983
+
984
+ `missing_gates` (#3539), unlike `all_green`, DOES reuse the real gate
985
+ decision — `coord.gates.build_gate_report`, the exact function `coord
986
+ gates` prints and that wraps `coord.merge_queue`'s own
987
+ `requires_review`/`scan_approved_reviews`/`requires_smoke`/
988
+ `evaluate_smoke_verdict` — rather than a second guess, closing the
989
+ quadraui#1109 gap: a PR can be all-green on CI while `coord gates`
990
+ still reports `review`/`test` BLOCKED, and the #2377 guard's old
991
+ "merge it" advice for an all-green PR was then impossible (`coord merge
992
+ --only` itself refused with `enqueue blocked by review gate`). Only
993
+ computed when `all_green` — a red PR's gate state is moot, the caller
994
+ refuses on CI alone either way. Fails open toward "missing" (NEVER
995
+ toward "satisfied"): an unreadable board/config, or a PR whose work
996
+ chain `build_gate_report` can't resolve a decision for, reports every
997
+ gate as still missing rather than claiming a merge is ready when a live
998
+ `coord merge --only` might still refuse it (#2096: unconfirmed success
999
+ is a defect).
963
1000
  """
964
1001
  coordinates = _repo_coordinates(config_path, repo)
965
1002
  if coordinates is None:
@@ -990,14 +1027,64 @@ def _existing_pr_match(
990
1027
  # reported", which `all_green` below already reads as not-green.
991
1028
  checks = []
992
1029
  all_green = bool(checks) and not failed_checks(checks) and not in_flight_checks(checks)
1030
+ missing_gates = _missing_required_gates(config_path, repo, issue) if all_green else ()
993
1031
  return ExistingPrMatch(
994
1032
  number=number,
995
1033
  branch=str(pr.get("headRefName") or ""),
996
1034
  url=str(pr.get("url") or ""),
997
1035
  all_green=all_green,
1036
+ missing_gates=missing_gates,
998
1037
  )
999
1038
 
1000
1039
 
1040
+ def _missing_required_gates(config_path: Path, repo: str, issue: int) -> tuple[str, ...]:
1041
+ """#3539: which of ``("review", "test")`` are still required-but-not-ok
1042
+ for *repo*#*issue*, per `coord.gates.build_gate_report` — the SAME
1043
+ review/test decision `coord gates` prints and `coord merge` itself
1044
+ gates on (#2096: one question, one answer; never a second, driftable
1045
+ guess at "is this PR actually ready").
1046
+
1047
+ Fails open toward "missing", never toward "satisfied": any read failure
1048
+ (unreadable config, no board, an exception inside `build_gate_report`
1049
+ itself) or a report with no resolved decisions at all (no work-like
1050
+ assignment `build_gate_report` could select a winner from) reports
1051
+ BOTH gates missing. A false "missing" here costs one operator-visible
1052
+ resume note on an add that may turn out to be a no-op once the real
1053
+ gates are read live again a moment later; a false "satisfied" would
1054
+ reproduce the exact #3539 incident — advising ``coord merge --only``
1055
+ over a PR a live merge attempt still refuses.
1056
+
1057
+ The board comes from ``coord.board_service.read_board()``, NOT
1058
+ ``coord.state.build_board()`` (#615/#906): `coord drive-queue add` has
1059
+ no whole-command daemon reroute, so a thin client reading the local DB
1060
+ here would see an empty board, resolve no decisions, and fail open to
1061
+ "both gates missing" on every add — technically safe, uselessly noisy.
1062
+ `read_board()` is the one place the local-vs-daemon decision is made
1063
+ (GET /board on a thin client, the local DB otherwise), which is also
1064
+ why no entry is needed in `tests/test_thin_client_board_audit.py`'s
1065
+ ``COMMANDS_ALLOWLIST``: there is no direct local-board call site to
1066
+ allowlist.
1067
+ """
1068
+ try:
1069
+ from coord import github_ops # noqa: PLC0415
1070
+ from coord.board_service import read_board # noqa: PLC0415
1071
+ from coord.commands._common import _load_config # noqa: PLC0415
1072
+ from coord.gates import build_gate_report # noqa: PLC0415
1073
+
1074
+ cfg = _load_config(config_path)
1075
+ board = read_board()
1076
+ report = build_gate_report(board, cfg, repo, issue, gh_ops=github_ops)
1077
+ except (Exception, SystemExit): # noqa: BLE001 — fail-open to "missing"
1078
+ return ("review", "test")
1079
+ by_gate = {d.gate: d for d in report.decisions}
1080
+ missing = []
1081
+ for gate in ("review", "test"):
1082
+ decision = by_gate.get(gate)
1083
+ if decision is None or (decision.required and not decision.ok):
1084
+ missing.append(gate)
1085
+ return tuple(missing)
1086
+
1087
+
1001
1088
  def _predict_overlap(
1002
1089
  config_path: Path, repo: str, issue: int, existing_entries: list[QueueEntry],
1003
1090
  ) -> tuple[Prediction, str, str]:
@@ -6433,6 +6520,17 @@ def _blocked_escalation_command(
6433
6520
  behaviour) purely so every OTHER existing caller/test of this function
6434
6521
  that has no config to hand keeps working unchanged; the real `tick`
6435
6522
  call sites below always pass their own.
6523
+
6524
+ #3539: `existing_pr_relaunch_remedy` returning ``None`` is no longer
6525
+ proof that *match* itself is ``None`` — a green PR with Test and/or
6526
+ Review never recorded ALSO returns ``None`` (see that function's own
6527
+ docstring), on purpose, so a plain `add` can resume on it. That case
6528
+ still HAS a PR and HAS been dispatched, so it must not fall through to
6529
+ `_requeue_command`'s blind ``remove && add`` either — remove would
6530
+ discard a completed, green work cycle for no reason. Propose the plain
6531
+ `add` (no `remove` first) instead; `_requeue_command` stays reserved for
6532
+ the one case its own docstring names: *match* itself is ``None``,
6533
+ i.e. nothing was ever dispatched for this row at all.
6436
6534
  """
6437
6535
  if is_merge_gate_block_reason(reason):
6438
6536
  parsed = parse_key(key)
@@ -6446,6 +6544,10 @@ def _blocked_escalation_command(
6446
6544
  remedy = existing_pr_relaunch_remedy(repo, issue, match)
6447
6545
  if remedy is not None:
6448
6546
  return remedy["command_or_action"]
6547
+ if match is not None:
6548
+ # #3539: green PR, gate(s) not yet recorded — resume via a
6549
+ # plain `add`, never the blind `remove && add` requeue below.
6550
+ return f"coord drive-queue add {repo} {issue}"
6449
6551
  return _requeue_command(entry, key)
6450
6552
 
6451
6553
 
@@ -4315,51 +4315,84 @@ class ExistingPrMatch:
4315
4315
  built it — :func:`coord.commands.drive_queue._existing_pr_match`, the
4316
4316
  one place that owns the `gh pr list` + checks read this module stays
4317
4317
  pure of.
4318
+
4319
+ *missing_gates* (#3539) is the subset of ``("review", "test")`` that
4320
+ `coord.gates.build_gate_report` — the SAME read `coord gates`/`coord
4321
+ merge` themselves use, never a second guess (#2096: one question, one
4322
+ answer) — reports as still required-but-not-ok for this PR's work
4323
+ chain. Empty by default so every pre-#3539 construction of this
4324
+ dataclass (every existing test that only ever set *all_green*) keeps
4325
+ reading as "fully gated" — i.e. byte-identical old behaviour — without
4326
+ being touched.
4318
4327
  """
4319
4328
 
4320
4329
  number: int
4321
4330
  branch: str
4322
4331
  url: str
4323
4332
  all_green: bool
4333
+ missing_gates: tuple[str, ...] = ()
4324
4334
 
4325
4335
 
4326
4336
  def existing_pr_relaunch_remedy(
4327
4337
  repo: str, issue: int, match: "ExistingPrMatch | None"
4328
4338
  ) -> dict[str, str] | None:
4329
- """#2377: the option (and `drive-queue add` refusal message) *match*
4330
- recommends INSTEAD OF a blind ``remove && add`` relaunch — or ``None``
4331
- when *match* is ``None`` (today's only behaviour unchanged: no PR on the
4332
- conventional branch name(s), start fresh).
4333
-
4334
- Two shapes, both refusing the relaunch — a red/stale-checks PR is NOT a
4335
- green light to requeue either: something else may already be mid-fixing
4336
- that branch, and a fresh drive launched on top of it is exactly the "at
4337
- best wasted work, at worst clobbering it mid-flight" risk #2377 opens
4338
- with. Merging a discovered PR is deliberately NOT done here — surfacing
4339
- it (or refusing the relaunch) is enough; merging stays a `coord merge`
4340
- decision.
4339
+ """#2377/#3539: the option (and `drive-queue add` refusal message)
4340
+ *match* recommends INSTEAD OF a blind ``remove && add`` relaunch — or
4341
+ ``None`` when *match* is ``None`` (no PR on the conventional branch
4342
+ name(s), start fresh) OR when *match* is green but still carries
4343
+ unrecorded gates (#3539 — see below): both ``None`` shapes mean "let
4344
+ this `add` proceed", not "nothing was found".
4345
+
4346
+ Three shapes:
4347
+
4348
+ * **red / stale checks** — refuse; something else may already be
4349
+ mid-fixing that branch, and a fresh drive launched on top of it is
4350
+ exactly the "at best wasted work, at worst clobbering it mid-flight"
4351
+ risk #2377 opens with.
4352
+ * **green, but Test and/or Review never recorded** (#3539 — the
4353
+ quadraui#1109/PR#1253 incident: CI all green, yet `coord gates`
4354
+ showed both `review` and `test` BLOCKED, and the ``merge it instead``
4355
+ advice below was impossible — `coord merge --only` itself refused
4356
+ with ``enqueue blocked by review gate``). Refusing here would strand
4357
+ the entry with no way to ever collect the missing verdicts. Returning
4358
+ ``None`` lets the `add` proceed and the queue's own drive resume on
4359
+ the EXISTING branch — `decide()` only ever dispatches a fresh Work
4360
+ leg when ``state.work_aid`` is unset (see `coord/drive.py`), which it
4361
+ is not here, so this can only ever run the missing stage(s) (Test
4362
+ dispatch, Review dispatch) forward to merge, never restart Work.
4363
+ * **green and every gate already satisfied** — truly done: refuse and
4364
+ point at ``coord merge --only`` instead of relaunching a fresh drive
4365
+ over it. Merging is deliberately NOT done here — surfacing it (or
4366
+ refusing the relaunch) is enough; merging stays a `coord merge`
4367
+ decision.
4341
4368
  """
4342
4369
  if match is None:
4343
4370
  return None
4344
4371
  key = entry_key(repo, issue)
4345
- if match.all_green:
4372
+ if not match.all_green:
4346
4373
  return {
4347
- "label": "Merge existing PR",
4348
- "command_or_action": f"coord merge --only {key}",
4374
+ "label": "Inspect existing PR",
4375
+ "command_or_action": merge_plan_inspect_command(repo),
4349
4376
  "what_happens": (
4350
- f"PR #{match.number} ({match.branch}) already carries this "
4351
- "work with every check green — merge it instead of "
4377
+ f"PR #{match.number} ({match.branch}) already exists for "
4378
+ "this entry, but its checks are not all green — fix it "
4379
+ "forward (or confirm by hand it is truly dead) before "
4352
4380
  "relaunching a fresh drive over it."
4353
4381
  ),
4354
4382
  }
4383
+ if match.missing_gates:
4384
+ # #3539: deliberately no refusal dict — see the docstring's second
4385
+ # shape. Returning `None` here is the whole fix: it lets `add`
4386
+ # proceed instead of stranding the entry on an impossible "merge
4387
+ # it" when `coord merge --only` would itself refuse.
4388
+ return None
4355
4389
  return {
4356
- "label": "Inspect existing PR",
4357
- "command_or_action": merge_plan_inspect_command(repo),
4390
+ "label": "Merge existing PR",
4391
+ "command_or_action": f"coord merge --only {key}",
4358
4392
  "what_happens": (
4359
- f"PR #{match.number} ({match.branch}) already exists for this "
4360
- "entry, but its checks are not all green — fix it forward (or "
4361
- "confirm by hand it is truly dead) before relaunching a fresh "
4362
- "drive over it."
4393
+ f"PR #{match.number} ({match.branch}) already carries this "
4394
+ "work with every check green — merge it instead of "
4395
+ "relaunching a fresh drive over it."
4363
4396
  ),
4364
4397
  }
4365
4398
 
@@ -921,6 +921,76 @@ def test_add_still_refuses_a_requeue_over_an_already_blocked_entry_with_a_green_
921
921
  assert f"coord merge --only {REPO}#1753" in result.output
922
922
 
923
923
 
924
+ def test_add_accepts_a_requeue_over_a_blocked_entry_with_a_green_pr_missing_gates(
925
+ cli, seed, monkeypatch
926
+ ):
927
+ """#3539's actual end-to-end fix, driven through the real CLI: the exact
928
+ shape `test_add_still_refuses_a_requeue_over_an_already_blocked_entry_
929
+ with_a_green_pr` above pins as a REFUSAL (a `blocked` entry with a green
930
+ matching PR) must now instead be ACCEPTED when that PR's Test and/or
931
+ Review were never recorded — the quadraui#1109/PR#1253 incident: CI
932
+ green, `coord gates` showing both BLOCKED, and the old 'merge it
933
+ instead' advice impossible (`coord merge --only` itself refused). The
934
+ `add` must succeed and print the new resume note naming the PR and the
935
+ still-missing gate(s), never the #2377 refusal exception."""
936
+ from coord.drive_queue import ExistingPrMatch
937
+
938
+ seed(issues={1753: "open"})
939
+ cli("add", REPO, "1753")
940
+ state._update_drive_queue_entry_local(REPO, 1753, state=STATE_BLOCKED)
941
+
942
+ monkeypatch.setattr(
943
+ "coord.commands.drive_queue._existing_pr_match",
944
+ lambda config_path, repo, issue: ExistingPrMatch(
945
+ number=4242,
946
+ branch="issue-1753-some-fix",
947
+ url="https://github.com/example/claude-coordinator/pull/4242",
948
+ all_green=True,
949
+ missing_gates=("review", "test"),
950
+ ),
951
+ )
952
+
953
+ result = cli("add", REPO, "1753", "--max-fix-rounds", "3")
954
+
955
+ assert result.exit_code == 0, result.output
956
+ assert "4242" in result.output
957
+ assert "resuming on existing PR #4242" in result.output
958
+ assert "review and test" in result.output
959
+ assert "gates are not yet recorded" in result.output
960
+ assert f"coord gates {REPO} 1753" in result.output
961
+ # Accepted, not refused — never the #2377 merge-it exception text.
962
+ assert f"coord merge --only {REPO}#1753" not in result.output
963
+ assert queued(1753) is not None
964
+
965
+
966
+ def test_add_resume_note_names_a_single_missing_gate_in_the_singular(
967
+ cli, seed, monkeypatch
968
+ ):
969
+ """Same accept path, but only ONE gate missing — the note's wording must
970
+ track the singular/plural split (`existing_pr_resume_note`'s own
971
+ ``'gate is' if len(...) == 1 else 'gates are'`` branch)."""
972
+ from coord.drive_queue import ExistingPrMatch
973
+
974
+ seed(issues={1753: "open"})
975
+
976
+ monkeypatch.setattr(
977
+ "coord.commands.drive_queue._existing_pr_match",
978
+ lambda config_path, repo, issue: ExistingPrMatch(
979
+ number=4242,
980
+ branch="issue-1753-some-fix",
981
+ url="https://github.com/example/claude-coordinator/pull/4242",
982
+ all_green=True,
983
+ missing_gates=("test",),
984
+ ),
985
+ )
986
+
987
+ result = cli("add", REPO, "1753")
988
+
989
+ assert result.exit_code == 0, result.output
990
+ assert "resuming on existing PR #4242" in result.output
991
+ assert "test gate is not yet recorded" in result.output
992
+
993
+
924
994
  def test_blocked_escalation_command_proposes_merge_over_requeue_when_pr_is_green(
925
995
  monkeypatch, config_file,
926
996
  ):
@@ -986,6 +1056,43 @@ def test_blocked_escalation_command_still_requeues_when_no_pr_matches(
986
1056
  )
987
1057
 
988
1058
 
1059
+ def test_blocked_escalation_command_proposes_a_plain_add_when_pr_is_green_but_ungated(
1060
+ monkeypatch, config_file,
1061
+ ):
1062
+ """#3539's non-blocking follow-up: a green PR whose gates were never
1063
+ recorded makes `existing_pr_relaunch_remedy` return `None` for a REASON
1064
+ other than 'no PR matched' (see that function's own docstring). This
1065
+ call site must not conflate the two `None` shapes and fall through to
1066
+ `_requeue_command`'s blind `remove && add` — that would discard a
1067
+ completed, green work cycle for nothing. It must propose a plain `add`
1068
+ (no `remove` first) instead, same as the #3539 `drive-queue add` fix
1069
+ itself resumes on."""
1070
+ from coord.commands.drive_queue import _blocked_escalation_command
1071
+ from coord.drive_queue import ExistingPrMatch, entry_key
1072
+
1073
+ monkeypatch.setattr(
1074
+ "coord.commands.drive_queue._existing_pr_match",
1075
+ lambda config_path, repo, issue: ExistingPrMatch(
1076
+ number=1253,
1077
+ branch="issue-1109-fix",
1078
+ url="https://github.com/example/quadraui/pull/1253",
1079
+ all_green=True,
1080
+ missing_gates=("review", "test"),
1081
+ ),
1082
+ )
1083
+ reason = (
1084
+ "work adv-1 exited ADVISORY with no commits on its branch "
1085
+ "(3/3 attempts) — nothing was pushed, so there is nothing to test, "
1086
+ "review, or merge, and retrying has not produced a different outcome."
1087
+ )
1088
+ key = entry_key(OTHER_REPO, 1109)
1089
+
1090
+ command = _blocked_escalation_command(None, key, reason, config_path=config_file)
1091
+
1092
+ assert command == f"coord drive-queue add {OTHER_REPO} 1109"
1093
+ assert "remove" not in command
1094
+
1095
+
989
1096
  def test_a_declared_file_is_checked_against_a_live_branchs_real_diff(
990
1097
  cli, declare, seed, branch_diff,
991
1098
  ):
@@ -2977,6 +2977,22 @@ def test_no_test_verdict_yet_waits_for_coord_to_dispatch_the_stage():
2977
2977
  assert action.command == ()
2978
2978
 
2979
2979
 
2980
+ def test_resuming_on_an_existing_pr_with_no_test_or_review_recorded_never_redispatches_work():
2981
+ """#3539: the exact quadraui#1109/PR#1253 shape, pinned at `decide()`
2982
+ itself — a `coord drive-queue add` the #2377/#3539 guard now ACCEPTS
2983
+ (CI green, but neither Test nor Review ever recorded) resumes by
2984
+ launching `coord drive` on this same (repo, issue) again. The guard's
2985
+ whole premise that this can only ever run the missing stage(s) forward,
2986
+ never restart Work, rests on `decide()` branching on `state.work_aid`
2987
+ alone (see its own `if not state.work_aid:` dispatch-work arm) — this
2988
+ pins that: a `work_aid`-bearing, branch-bearing, `done` state with BOTH
2989
+ gates unrecorded must wait for the Test stage, never re-dispatch Work."""
2990
+ action = step(done_work(work_test_state=""))
2991
+ assert action.kind == WAIT
2992
+ assert action.command == ()
2993
+ assert not action.label.startswith("WORK:")
2994
+
2995
+
2980
2996
  def test_skip_test_records_the_verdict_through_the_test_cli():
2981
2997
  """The CLI, never record_test_verdict() — see #1384."""
2982
2998
  action = step(done_work(), DriveOptions(machine="precision", skip_test=True))
@@ -15,6 +15,8 @@ most attention here are the ones that caused real incidents:
15
15
 
16
16
  from __future__ import annotations
17
17
 
18
+ from pathlib import Path
19
+
18
20
  import pytest
19
21
 
20
22
  from coord.drive_queue import (
@@ -7514,6 +7516,185 @@ def test_existing_pr_relaunch_remedy_refuses_the_relaunch_even_when_red():
7514
7516
  assert remedy["command_or_action"] == merge_plan_inspect_command(REPO)
7515
7517
 
7516
7518
 
7519
+ # ── #3539: green PR, but Test and/or Review never recorded ─────────────────
7520
+ #
7521
+ # The live incident: quadraui#1109 (PR #1253) had its Test stage dead-end on
7522
+ # an unrelated capability-probe failure, a `coord fix` worker then repaired
7523
+ # the PR's only red CI job, and once every check went green the #2377 guard
7524
+ # refused the re-add with "merge it instead" — but `coord gates` showed BOTH
7525
+ # `review` and `test` BLOCKED, and `coord merge --only` itself refused with
7526
+ # "enqueue blocked by review gate". The guard must tell these two "green"
7527
+ # shapes apart.
7528
+
7529
+
7530
+ def test_existing_pr_relaunch_remedy_recommends_merging_a_fully_gated_green_pr():
7531
+ """Unchanged #2377 behaviour, now spelled out explicitly for the shape
7532
+ `missing_gates` is empty on: every required gate already satisfied —
7533
+ still refuse, still "merge it"."""
7534
+ match = ExistingPrMatch(
7535
+ number=1253, branch="issue-1109-fix",
7536
+ url="https://github.com/example/quadraui/pull/1253",
7537
+ all_green=True,
7538
+ missing_gates=(),
7539
+ )
7540
+ remedy = existing_pr_relaunch_remedy("quadraui", 1109, match)
7541
+ assert remedy is not None
7542
+ assert remedy["command_or_action"] == "coord merge --only quadraui#1109"
7543
+ assert "1253" in remedy["what_happens"]
7544
+
7545
+
7546
+ def test_existing_pr_relaunch_remedy_accepts_a_green_pr_missing_both_gates():
7547
+ """#3539's actual fix: CI green, but review AND test were never
7548
+ recorded — `None` (accept the `add`, resume on the existing branch),
7549
+ never the impossible "merge it" advice."""
7550
+ match = ExistingPrMatch(
7551
+ number=1253, branch="issue-1109-fix",
7552
+ url="https://github.com/example/quadraui/pull/1253",
7553
+ all_green=True,
7554
+ missing_gates=("review", "test"),
7555
+ )
7556
+ assert existing_pr_relaunch_remedy("quadraui", 1109, match) is None
7557
+
7558
+
7559
+ def test_existing_pr_relaunch_remedy_accepts_a_green_pr_missing_one_gate():
7560
+ """Same fix, the partial shape — only ONE gate missing (e.g. review
7561
+ approved, test never dispatched) is still "accept", not "merge it"."""
7562
+ match = ExistingPrMatch(
7563
+ number=1253, branch="issue-1109-fix",
7564
+ url="https://github.com/example/quadraui/pull/1253",
7565
+ all_green=True,
7566
+ missing_gates=("test",),
7567
+ )
7568
+ assert existing_pr_relaunch_remedy("quadraui", 1109, match) is None
7569
+
7570
+
7571
+ def test_existing_pr_relaunch_remedy_still_refuses_fix_forward_when_red_with_missing_gates():
7572
+ """A red PR is refused on CI alone, same as before #3539 — missing
7573
+ gates are moot (and, realistically, implied) when checks are not even
7574
+ green yet. `missing_gates` is populated here to prove the red-check
7575
+ branch is checked FIRST and never looks at it."""
7576
+ match = ExistingPrMatch(
7577
+ number=1253, branch="issue-1109-fix",
7578
+ url="https://github.com/example/quadraui/pull/1253",
7579
+ all_green=False,
7580
+ missing_gates=("review", "test"),
7581
+ )
7582
+ remedy = existing_pr_relaunch_remedy("quadraui", 1109, match)
7583
+ assert remedy is not None
7584
+ assert "coord merge --only" not in remedy["command_or_action"]
7585
+ assert remedy["command_or_action"] == merge_plan_inspect_command("quadraui")
7586
+
7587
+
7588
+ # ── #3539: `_missing_required_gates` — the live read `_existing_pr_match`
7589
+ # feeds `missing_gates` from, pinned directly since it is the one place
7590
+ # that reuses `coord.gates.build_gate_report` (#2096: one question, one
7591
+ # answer) rather than a second, driftable guess at gate state. ───────────
7592
+
7593
+
7594
+ def test_missing_required_gates_reports_only_the_unsatisfied_gate(monkeypatch):
7595
+ from coord.commands.drive_queue import _missing_required_gates
7596
+ from coord.gates import GateDecision, GateReport
7597
+
7598
+ report = GateReport(repo_name="quadraui", issue_number=1109)
7599
+ report.decisions = [
7600
+ GateDecision(gate="review", required=True, ok=False, reason="review required but not approved"),
7601
+ GateDecision(gate="test", required=True, ok=True),
7602
+ ]
7603
+ monkeypatch.setattr("coord.gates.build_gate_report", lambda *a, **k: report)
7604
+ monkeypatch.setattr("coord.commands._common._load_config", lambda *a, **k: object())
7605
+ monkeypatch.setattr("coord.board_service.read_board", lambda *a, **k: object())
7606
+
7607
+ assert _missing_required_gates(Path("/dev/null"), "quadraui", 1109) == ("review",)
7608
+
7609
+
7610
+ def test_missing_required_gates_empty_when_both_satisfied(monkeypatch):
7611
+ from coord.commands.drive_queue import _missing_required_gates
7612
+ from coord.gates import GateDecision, GateReport
7613
+
7614
+ report = GateReport(repo_name="quadraui", issue_number=1109)
7615
+ report.decisions = [
7616
+ GateDecision(gate="review", required=True, ok=True),
7617
+ GateDecision(gate="test", required=False, ok=True),
7618
+ ]
7619
+ monkeypatch.setattr("coord.gates.build_gate_report", lambda *a, **k: report)
7620
+ monkeypatch.setattr("coord.commands._common._load_config", lambda *a, **k: object())
7621
+ monkeypatch.setattr("coord.board_service.read_board", lambda *a, **k: object())
7622
+
7623
+ assert _missing_required_gates(Path("/dev/null"), "quadraui", 1109) == ()
7624
+
7625
+
7626
+ def test_missing_required_gates_fails_open_to_missing_on_a_read_error(monkeypatch):
7627
+ """#2096: a read that cannot confirm the gate is satisfied must never
7628
+ report it as satisfied — an exception anywhere in the live read (here:
7629
+ `build_gate_report` itself blowing up) reports BOTH gates missing, the
7630
+ safe default, never `()`."""
7631
+ from coord.commands.drive_queue import _missing_required_gates
7632
+
7633
+ def _boom(*a, **k):
7634
+ raise RuntimeError("gh unreachable")
7635
+
7636
+ monkeypatch.setattr("coord.gates.build_gate_report", _boom)
7637
+ monkeypatch.setattr("coord.commands._common._load_config", lambda *a, **k: object())
7638
+ monkeypatch.setattr("coord.board_service.read_board", lambda *a, **k: object())
7639
+
7640
+ assert _missing_required_gates(Path("/dev/null"), "quadraui", 1109) == ("review", "test")
7641
+
7642
+
7643
+ def test_missing_required_gates_fails_open_when_no_decision_could_be_resolved(monkeypatch):
7644
+ """A report with no resolved decisions at all (e.g. no work-like
7645
+ assignment `build_gate_report` could select a winner from) is "unknown",
7646
+ never "satisfied" — same fail-open default as a hard read error."""
7647
+ from coord.commands.drive_queue import _missing_required_gates
7648
+ from coord.gates import GateReport
7649
+
7650
+ report = GateReport(repo_name="quadraui", issue_number=1109)
7651
+ report.notes = ["no assignments found on the board for quadraui#1109"]
7652
+ monkeypatch.setattr("coord.gates.build_gate_report", lambda *a, **k: report)
7653
+ monkeypatch.setattr("coord.commands._common._load_config", lambda *a, **k: object())
7654
+ monkeypatch.setattr("coord.board_service.read_board", lambda *a, **k: object())
7655
+
7656
+ assert _missing_required_gates(Path("/dev/null"), "quadraui", 1109) == ("review", "test")
7657
+
7658
+
7659
+ def test_missing_required_gates_reads_the_board_through_the_daemon_aware_seam(monkeypatch):
7660
+ """#615/#906: `coord drive-queue add` has no whole-command daemon
7661
+ reroute, so this gate read must go through
7662
+ `coord.board_service.read_board()` (GET /board on a thin client) and
7663
+ never `coord.state.build_board()` directly — a thin client reading the
7664
+ local DB would see an empty board and fail open to "both gates missing"
7665
+ on every add. Pinned by making the local read EXPLODE: a regression back
7666
+ to `build_board()` is swallowed by the fail-open `except` and shows up
7667
+ here as ("review", "test") instead of the real ().
7668
+ """
7669
+ from coord.commands.drive_queue import _missing_required_gates
7670
+ from coord.gates import GateDecision, GateReport
7671
+
7672
+ sentinel_board = object()
7673
+ seen: list[object] = []
7674
+
7675
+ report = GateReport(repo_name="quadraui", issue_number=1109)
7676
+ report.decisions = [
7677
+ GateDecision(gate="review", required=True, ok=True),
7678
+ GateDecision(gate="test", required=True, ok=True),
7679
+ ]
7680
+
7681
+ def _build_gate_report(board, *a, **k):
7682
+ seen.append(board)
7683
+ return report
7684
+
7685
+ def _local_board_is_forbidden(*a, **k):
7686
+ raise AssertionError("read the local board instead of board_service.read_board()")
7687
+
7688
+ monkeypatch.setattr("coord.gates.build_gate_report", _build_gate_report)
7689
+ monkeypatch.setattr("coord.commands._common._load_config", lambda *a, **k: object())
7690
+ monkeypatch.setattr("coord.board_service.read_board", lambda *a, **k: sentinel_board)
7691
+ monkeypatch.setattr("coord.state.build_board", _local_board_is_forbidden)
7692
+ monkeypatch.setattr("coord.state.load_board", _local_board_is_forbidden)
7693
+
7694
+ assert _missing_required_gates(Path("/dev/null"), "quadraui", 1109) == ()
7695
+ assert seen == [sentinel_board]
7696
+
7697
+
7517
7698
  class TestDriveQueueListReadDistinguishesFailureFromEmpty:
7518
7699
  """#2992: `coord drive-queue list` must not report a daemon it could
7519
7700
  not read as "the queue is empty" — those are two different facts and