code-coordinator 0.5.521__tar.gz → 0.5.522__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 (910) hide show
  1. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/PKG-INFO +1 -1
  2. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/code_coordinator.egg-info/PKG-INFO +1 -1
  3. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/code_coordinator.egg-info/scm_version.json +2 -2
  4. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/drive_queue.py +62 -5
  5. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/drive_queue.py +85 -5
  6. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/notify.py +69 -2
  7. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_drive_queue.py +120 -1
  8. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_stalled_pipeline.py +132 -0
  9. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/.claude/commands/board.md +0 -0
  10. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/.claude/commands/complete-session.md +0 -0
  11. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/.claude/commands/coordinator.md +0 -0
  12. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/.githooks/_lib.sh +0 -0
  13. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/.githooks/post-checkout +0 -0
  14. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/.githooks/post-commit +0 -0
  15. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/.githooks/post-merge +0 -0
  16. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  17. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/.github/coord-ci-acceptance.yml +0 -0
  18. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/.github/workflows/auto-release.yml +0 -0
  19. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/.github/workflows/publish.yml +0 -0
  20. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/.github/workflows/test.yml +0 -0
  21. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/.gitignore +0 -0
  22. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/CLAUDE.md +0 -0
  23. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/GOAL.md +0 -0
  24. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/LICENSE +0 -0
  25. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/MANIFEST.in +0 -0
  26. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/README.md +0 -0
  27. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/code_coordinator.egg-info/SOURCES.txt +0 -0
  28. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/code_coordinator.egg-info/dependency_links.txt +0 -0
  29. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/code_coordinator.egg-info/entry_points.txt +0 -0
  30. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/code_coordinator.egg-info/requires.txt +0 -0
  31. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/code_coordinator.egg-info/scm_file_list.json +0 -0
  32. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/code_coordinator.egg-info/top_level.txt +0 -0
  33. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/__init__.py +0 -0
  34. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/_board_mapping.py +0 -0
  35. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/acceptance.py +0 -0
  36. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/acceptance_drivers.py +0 -0
  37. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/agent.py +0 -0
  38. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/agent_app.py +0 -0
  39. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/agent_update.py +0 -0
  40. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/agents/opencode/.gitignore +0 -0
  41. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/agents/opencode/agents/work.md +0 -0
  42. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/agents/opencode/routing.jsonc +0 -0
  43. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/approved_work.py +0 -0
  44. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/audit.py +0 -0
  45. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/auto_loop.py +0 -0
  46. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/backup.py +0 -0
  47. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/block_log.py +0 -0
  48. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/board_schema.py +0 -0
  49. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/board_service.py +0 -0
  50. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/board_wire.py +0 -0
  51. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/brain.py +0 -0
  52. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/branch_model.py +0 -0
  53. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/bug_intake.py +0 -0
  54. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/cargo_cache.py +0 -0
  55. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/ci_fix.py +0 -0
  56. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/ci_github.py +0 -0
  57. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/ci_gitlab.py +0 -0
  58. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/ci_store.py +0 -0
  59. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/claim.py +0 -0
  60. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/claude_setup_token.py +0 -0
  61. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/cli.py +0 -0
  62. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/client.py +0 -0
  63. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/codegen.py +0 -0
  64. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/__init__.py +0 -0
  65. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/_common.py +0 -0
  66. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/acceptance.py +0 -0
  67. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/agent_ops.py +0 -0
  68. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/audit.py +0 -0
  69. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/backup.py +0 -0
  70. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/chat.py +0 -0
  71. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/ci.py +0 -0
  72. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/codegen.py +0 -0
  73. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/dispatch.py +0 -0
  74. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/dispatch_workers.py +0 -0
  75. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/dr.py +0 -0
  76. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/drive.py +0 -0
  77. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/gate_a.py +0 -0
  78. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/gates.py +0 -0
  79. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/issues.py +0 -0
  80. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/lifecycle.py +0 -0
  81. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/machine.py +0 -0
  82. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/merge.py +0 -0
  83. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/milestone.py +0 -0
  84. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/plan_followup.py +0 -0
  85. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/plans.py +0 -0
  86. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/portal.py +0 -0
  87. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/pr.py +0 -0
  88. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/release.py +0 -0
  89. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/repo.py +0 -0
  90. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/report.py +0 -0
  91. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/review.py +0 -0
  92. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/scorecard.py +0 -0
  93. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/sessions.py +0 -0
  94. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/setup.py +0 -0
  95. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/status.py +0 -0
  96. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/store_migrate.py +0 -0
  97. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/terminal.py +0 -0
  98. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/test_gate.py +0 -0
  99. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/commands/tui.py +0 -0
  100. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/comments.py +0 -0
  101. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/config.py +0 -0
  102. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/config_reload.py +0 -0
  103. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/confirm_test.py +0 -0
  104. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/conflict_fix.py +0 -0
  105. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/dao.py +0 -0
  106. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/dashboard/__init__.py +0 -0
  107. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/dashboard/fixture.py +0 -0
  108. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/dashboard/index.html +0 -0
  109. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/dashboard/server.py +0 -0
  110. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/dashboard/terminal.py +0 -0
  111. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/db.py +0 -0
  112. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/dead_end.py +0 -0
  113. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/decomposition_chat.py +0 -0
  114. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/deploy/README.md +0 -0
  115. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/deploy/coord-agent.service +0 -0
  116. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/deploy/coord-backup.service +0 -0
  117. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/deploy/coord-backup.timer +0 -0
  118. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/deploy/coord-db-backup.service +0 -0
  119. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/deploy/coord-db-backup.sh +0 -0
  120. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/deploy/coord-db-backup.timer +0 -0
  121. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/deploy/coord-dr-verify.service +0 -0
  122. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/deploy/coord-dr-verify.timer +0 -0
  123. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/deploy/coord-drive-queue.service +0 -0
  124. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/deploy/coord-drive-queue.timer +0 -0
  125. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/deploy/coord-failure-notify.service +0 -0
  126. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/deploy/coord-fleet-watchdog.service +0 -0
  127. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/deploy/coord-fleet-watchdog.timer +0 -0
  128. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/deploy/coord-notify.service +0 -0
  129. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/deploy/coord-notify.timer +0 -0
  130. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/deploy/coord-release-propagate.service +0 -0
  131. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/deploy/coord-release-propagate.timer +0 -0
  132. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/deploy/coord-release-window.service +0 -0
  133. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/deploy/coord-release-window.timer +0 -0
  134. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/deploy/coord-serve.service +0 -0
  135. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/deploy/coord-web-dist-build.service +0 -0
  136. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/deploy/coord-web-dist-build.timer +0 -0
  137. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/deploy/coord-web.service +0 -0
  138. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/deploy_manifest.py +0 -0
  139. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/deploy_units.py +0 -0
  140. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/deprecation_telemetry.py +0 -0
  141. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/deps.py +0 -0
  142. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/diagnose.py +0 -0
  143. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/dispatch.py +0 -0
  144. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/dispatch_liveness.py +0 -0
  145. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/dist_name.py +0 -0
  146. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/dr_promote.py +0 -0
  147. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/dr_verify.py +0 -0
  148. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/drive.py +0 -0
  149. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/drive_sessions_snapshot.py +0 -0
  150. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/drive_state.py +0 -0
  151. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/events.py +0 -0
  152. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/failure_class.py +0 -0
  153. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/failure_classifier.py +0 -0
  154. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/filelock.py +0 -0
  155. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/fleet_config_health.py +0 -0
  156. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/forge_availability.py +0 -0
  157. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/freshness.py +0 -0
  158. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/gate_a.py +0 -0
  159. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/gate_b.py +0 -0
  160. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/gate_snapshot.py +0 -0
  161. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/gates.py +0 -0
  162. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/gen_board_fixture.py +0 -0
  163. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/github_ops.py +0 -0
  164. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/github_throttle.py +0 -0
  165. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/goal.py +0 -0
  166. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/graph_health.py +0 -0
  167. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/__init__.py +0 -0
  168. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/aggregate.py +0 -0
  169. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/checks/__init__.py +0 -0
  170. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/checks/_ci_pin.py +0 -0
  171. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/checks/agent_install.py +0 -0
  172. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/checks/cargo_targets.py +0 -0
  173. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/checks/claude_binary.py +0 -0
  174. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/checks/config_drift.py +0 -0
  175. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/checks/coord_tui_ci_pin.py +0 -0
  176. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/checks/coord_web_ci_pin.py +0 -0
  177. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/checks/deploy_lane_facts.py +0 -0
  178. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/checks/disk.py +0 -0
  179. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/checks/fleet_board.py +0 -0
  180. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/checks/fleet_deploy_lanes.py +0 -0
  181. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/checks/fleet_phantom.py +0 -0
  182. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/checks/fleet_unit_drift.py +0 -0
  183. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/checks/graph.py +0 -0
  184. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/checks/graphify_cli.py +0 -0
  185. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/checks/index_lock.py +0 -0
  186. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/checks/issues_sync_staleness.py +0 -0
  187. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/checks/local_machine_identity.py +0 -0
  188. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/checks/plan_usage.py +0 -0
  189. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/checks/pr_churn.py +0 -0
  190. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/checks/release_cordon.py +0 -0
  191. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/checks/repo_state.py +0 -0
  192. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/checks/spawned_coord.py +0 -0
  193. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/checks/stalled_pipeline.py +0 -0
  194. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/checks/timer_active.py +0 -0
  195. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/checks/toolchain.py +0 -0
  196. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/checks/unit_drift.py +0 -0
  197. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/checks/unit_enablement.py +0 -0
  198. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/checks/wedged_drive_queue.py +0 -0
  199. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/checks/worktrees.py +0 -0
  200. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/cli.py +0 -0
  201. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/context.py +0 -0
  202. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/fleet_snapshot.py +0 -0
  203. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/models.py +0 -0
  204. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/pypi.py +0 -0
  205. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/registry.py +0 -0
  206. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/render.py +0 -0
  207. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/health/units.py +0 -0
  208. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/hooks.py +0 -0
  209. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/housekeeping.py +0 -0
  210. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/interactive.py +0 -0
  211. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/invariant_alarms.py +0 -0
  212. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/issue_store.py +0 -0
  213. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/issues_sync_status.py +0 -0
  214. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/liveness_auditor.py +0 -0
  215. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/machine_fault.py +0 -0
  216. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/machine_metrics.py +0 -0
  217. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/machine_onboard.py +0 -0
  218. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/machine_pause.py +0 -0
  219. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/machine_stats.py +0 -0
  220. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/merge_queue.py +0 -0
  221. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/milestone_chat.py +0 -0
  222. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/milestone_dispatch.py +0 -0
  223. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/milestone_gate.py +0 -0
  224. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/milestone_order.py +0 -0
  225. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/mock_author.py +0 -0
  226. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/models.py +0 -0
  227. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/network.py +0 -0
  228. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/new_issue_chat.py +0 -0
  229. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/notifier/__init__.py +0 -0
  230. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/notifier/baseline.py +0 -0
  231. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/notifier/cli.py +0 -0
  232. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/notifier/collect.py +0 -0
  233. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/notifier/digest.py +0 -0
  234. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/notifier/models.py +0 -0
  235. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/notifier/predicate.py +0 -0
  236. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/notifier/service.py +0 -0
  237. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/notifier/store.py +0 -0
  238. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/notifier/transport.py +0 -0
  239. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/openapi.py +0 -0
  240. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/overlap_fence.py +0 -0
  241. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/overlap_predict.py +0 -0
  242. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/parentage.py +0 -0
  243. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/parentage_github.py +0 -0
  244. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/pipeline.py +0 -0
  245. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/plan_parser.py +0 -0
  246. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/plans.py +0 -0
  247. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/platform_paths.py +0 -0
  248. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/portal_bridge.py +0 -0
  249. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/portal_store.py +0 -0
  250. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/portal_sync.py +0 -0
  251. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/pr_body_lint.py +0 -0
  252. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/prereqs.py +0 -0
  253. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/progress.py +0 -0
  254. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/providers/__init__.py +0 -0
  255. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/providers/base.py +0 -0
  256. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/providers/claude.py +0 -0
  257. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/providers/claude_pty.py +0 -0
  258. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/providers/opencode.py +0 -0
  259. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/queue_diagnose.py +0 -0
  260. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/reconcile.py +0 -0
  261. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/reconcile_tick.py +0 -0
  262. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/refine_chat.py +0 -0
  263. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/release_cordon.py +0 -0
  264. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/release_propagate.py +0 -0
  265. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/release_verify.py +0 -0
  266. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/release_window.py +0 -0
  267. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/repo_dormancy.py +0 -0
  268. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/repo_edit.py +0 -0
  269. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/repo_onboard.py +0 -0
  270. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/reports.py +0 -0
  271. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/rest_schema.py +0 -0
  272. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/restart_cmd.py +0 -0
  273. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/revalidate.py +0 -0
  274. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/review.py +0 -0
  275. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/scorecard.py +0 -0
  276. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/self_health.py +0 -0
  277. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/serve_app.py +0 -0
  278. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/skills/coord-dispatch-verbs/SKILL.md +0 -0
  279. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/skills/drive-queue-preflight/SKILL.md +0 -0
  280. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/skills/fleet-restart-safety/SKILL.md +0 -0
  281. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/skills/merge-stuck-triage/SKILL.md +0 -0
  282. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/skills/pipeline-limbo-triage/SKILL.md +0 -0
  283. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/skills/portal-followup/SKILL.md +0 -0
  284. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/skills/release-now/SKILL.md +0 -0
  285. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/skills/review-verdict-recovery/SKILL.md +0 -0
  286. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/skills/tui-quadraui-workflow/SKILL.md +0 -0
  287. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/skills/update-issue/SKILL.md +0 -0
  288. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/smoke.py +0 -0
  289. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/spend_ceiling.py +0 -0
  290. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/split_work.py +0 -0
  291. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/sql.py +0 -0
  292. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/stage_projection.py +0 -0
  293. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/state.py +0 -0
  294. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/store_migrate.py +0 -0
  295. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/store_parity.py +0 -0
  296. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/templates/deploy-cloudflare.node.yml +0 -0
  297. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/test_author.py +0 -0
  298. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/test_chat.py +0 -0
  299. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/test_orchestrator.py +0 -0
  300. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/test_report.py +0 -0
  301. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/tui_release.py +0 -0
  302. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/uat_checks.py +0 -0
  303. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/usage.py +0 -0
  304. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/usage_limits.py +0 -0
  305. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/usage_rollup.py +0 -0
  306. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coord/worker_events.py +0 -0
  307. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/coordinator.example.yml +0 -0
  308. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/deploy/coord-agent.service +0 -0
  309. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/deploy/coord-backup.service +0 -0
  310. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/deploy/coord-backup.timer +0 -0
  311. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/deploy/coord-db-backup.service +0 -0
  312. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/deploy/coord-db-backup.sh +0 -0
  313. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/deploy/coord-db-backup.timer +0 -0
  314. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/deploy/coord-dr-verify.service +0 -0
  315. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/deploy/coord-dr-verify.timer +0 -0
  316. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/deploy/coord-drive-queue.service +0 -0
  317. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/deploy/coord-drive-queue.timer +0 -0
  318. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/deploy/coord-failure-notify.service +0 -0
  319. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/deploy/coord-failure-notify.sh +0 -0
  320. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/deploy/coord-fleet-watchdog.service +0 -0
  321. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/deploy/coord-fleet-watchdog.timer +0 -0
  322. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/deploy/coord-notify.service +0 -0
  323. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/deploy/coord-notify.timer +0 -0
  324. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/deploy/coord-release-propagate.service +0 -0
  325. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/deploy/coord-release-propagate.timer +0 -0
  326. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/deploy/coord-release-window.service +0 -0
  327. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/deploy/coord-release-window.timer +0 -0
  328. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/deploy/coord-serve.service +0 -0
  329. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/deploy/coord-web-dist-build.service +0 -0
  330. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/deploy/coord-web-dist-build.sh +0 -0
  331. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/deploy/coord-web-dist-build.timer +0 -0
  332. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/deploy/coord-web-rollback.sh +0 -0
  333. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/deploy/coord-web.service +0 -0
  334. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/deploy/node-shim.sh +0 -0
  335. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/ADR_COORD_TUI_CI.md +0 -0
  336. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/ADR_COORD_WEB_ACCEPTANCE_SUITE.md +0 -0
  337. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/ADR_COORD_WEB_CI.md +0 -0
  338. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/ADR_COORD_WEB_DIST.md +0 -0
  339. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/ADR_PY_RUST_MIRRORS.md +0 -0
  340. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/AGENT_OPERATIONS.md +0 -0
  341. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/ARCHITECTURE.md +0 -0
  342. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/ARCH_SECURITY_GATES.md +0 -0
  343. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/COCKPIT.md +0 -0
  344. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/CONTROL_CENTER.md +0 -0
  345. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/COST_DISCIPLINE.md +0 -0
  346. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/CROSS_PLATFORM.md +0 -0
  347. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/CUSTOMER_FACING_APPS.md +0 -0
  348. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/CUSTOMER_PORTAL.md +0 -0
  349. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/DATA_STORE_SELECTION.md +0 -0
  350. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/DISASTER_RECOVERY.md +0 -0
  351. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/DRIVE_QUEUE.md +0 -0
  352. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/EPHEMERAL_WORKERS.md +0 -0
  353. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/FORGE_MIGRATION.md +0 -0
  354. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/GRAPHIFY_SETUP.md +0 -0
  355. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/ISSUE_GUIDANCE.md +0 -0
  356. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/MAC_MINI.md +0 -0
  357. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/MERGE_AUTO_DRAIN_TRUST_BAR.md +0 -0
  358. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/NOTIFIER.md +0 -0
  359. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/OPENCODE_VERIFICATION.md +0 -0
  360. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/OPERATING_GOTCHAS.md +0 -0
  361. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/OPERATOR_GUIDES.md +0 -0
  362. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/ORACLE_LOOP.md +0 -0
  363. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/PHONE_WEBAPP.md +0 -0
  364. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/PIPELINE_V2.md +0 -0
  365. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/PLATFORM_EVOLUTION.md +0 -0
  366. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/SECOND_BACKEND.md +0 -0
  367. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/STORE_SERVICE.md +0 -0
  368. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/TEST_FIRST_BUG_LANE.md +0 -0
  369. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/WEB_CONTROL_CENTER.md +0 -0
  370. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/WSL_WINDOWS_WORKER.md +0 -0
  371. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/mocks/web/README.md +0 -0
  372. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/mocks/web/_tokens.css +0 -0
  373. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/mocks/web/issue-detail.html +0 -0
  374. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/mocks/web/pipeline-narrow.html +0 -0
  375. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/docs/mocks/web/pipeline-wide.html +0 -0
  376. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/graphify-out/.gitignore +0 -0
  377. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/install-agent.sh +0 -0
  378. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/pyproject.toml +0 -0
  379. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/audit_review_verdict_overrides.py +0 -0
  380. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/azure-workers/bootstrap-shared.sh +0 -0
  381. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/azure-workers/build-worker-image.sh +0 -0
  382. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/azure-workers/coordinator-machine.py +0 -0
  383. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/azure-workers/dr-down.sh +0 -0
  384. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/azure-workers/dr-up.sh +0 -0
  385. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/azure-workers/epic-down.sh +0 -0
  386. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/azure-workers/epic-up.sh +0 -0
  387. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/azure-workers/preflight.sh +0 -0
  388. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/azure-workers/provision-server.sh +0 -0
  389. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/azure-workers/provision-worker.sh +0 -0
  390. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/azure-workers/scrub-and-generalize.sh +0 -0
  391. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/azure-workers/tailnet-acl.hujson +0 -0
  392. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/azure-workers/throwaway-vm.sh +0 -0
  393. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/azure-workers/verify-github-token.sh +0 -0
  394. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/check_gh_argv_containment.py +0 -0
  395. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/codegen.py +0 -0
  396. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/coord-test-runner.sh +0 -0
  397. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/coord-tui-scaffold/.github/coord-ci-acceptance.yml +0 -0
  398. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/coord-tui-scaffold/.github/workflows/cargo-test.yml +0 -0
  399. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/coord-tui-scaffold/.github/workflows/codegen-drift.yml +0 -0
  400. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/coord-tui-scaffold/CLAUDE.md +0 -0
  401. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/coord-venv-rollback.sh +0 -0
  402. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/drive-batch.sh +0 -0
  403. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/extract-coord-tui.sh +0 -0
  404. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/fleet_watchdog.py +0 -0
  405. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/gen_board_fixture.py +0 -0
  406. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/gen_mock_index.py +0 -0
  407. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/lib/provision-core.sh +0 -0
  408. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/next_release_tag.py +0 -0
  409. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/provision-machine.sh +0 -0
  410. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/run_tests_in_populated_home.sh +0 -0
  411. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/run_tests_without_gh.sh +0 -0
  412. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/setup-macmini.sh +0 -0
  413. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/smoke_437_interactive.py +0 -0
  414. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/verify-provision-noble.sh +0 -0
  415. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/verify_878_review_capture.py +0 -0
  416. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/verify_release_published.py +0 -0
  417. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/scripts/verify_release_wheel.py +0 -0
  418. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/setup.cfg +0 -0
  419. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/SMOKE_SET.md +0 -0
  420. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/__init__.py +0 -0
  421. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/acceptance/ms-37/conftest.py +0 -0
  422. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/acceptance/ms-37/contract.md +0 -0
  423. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/acceptance/ms-37/manifest.yml +0 -0
  424. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/acceptance/ms-37/test_usage_cli_1115.py +0 -0
  425. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/acceptance/ms-37/test_usage_core_1118.py +0 -0
  426. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/acceptance/ms-51/contract.md +0 -0
  427. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/acceptance/ms-51/home-active-extended.spec.ts +0 -0
  428. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/acceptance/ms-51/home-active.spec.ts +0 -0
  429. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/acceptance/ms-51/manifest.yml +0 -0
  430. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/acceptance/ms-51/mocks/home-active.html +0 -0
  431. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/acceptance/ms-51/tsconfig.json +0 -0
  432. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/acceptance/ms-example/mocks/home-active.html +0 -0
  433. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/backends.py +0 -0
  434. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/conftest.py +0 -0
  435. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/fixtures/board-pipeline-basic.json +0 -0
  436. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/fixtures/board-pipeline-terminal-gates.json +0 -0
  437. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/fixtures/opencode_run_failure_sample.jsonl +0 -0
  438. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/fixtures/opencode_run_length_sample.jsonl +0 -0
  439. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/fixtures/opencode_run_sample.jsonl +0 -0
  440. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/fixtures/playwright/all_pass.json +0 -0
  441. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/fixtures/playwright/global_setup_crash.json +0 -0
  442. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/fixtures/playwright/mixed_fail.json +0 -0
  443. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/fixtures/playwright/retry_then_pass.json +0 -0
  444. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/fixtures/playwright/retry_then_pass.junit.xml +0 -0
  445. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/fixtures/playwright/skip.json +0 -0
  446. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/fixtures/playwright/truncated.json +0 -0
  447. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/fixtures/test_report/cargo_compile_error.txt +0 -0
  448. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/fixtures/test_report/cargo_multi_target_failures.txt +0 -0
  449. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/fixtures/test_report/cargo_no_parseable_failures.txt +0 -0
  450. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/fixtures/test_report/pytest_collection_error.txt +0 -0
  451. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/fixtures/test_report/pytest_error_string_in_body.txt +0 -0
  452. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/fixtures/test_report/pytest_internal_error.txt +0 -0
  453. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/fixtures/test_report/pytest_mixed_failures.txt +0 -0
  454. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/fixtures/test_report/pytest_no_parseable_failures.txt +0 -0
  455. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_acceptance.py +0 -0
  456. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_acceptance_drivers.py +0 -0
  457. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_agent.py +0 -0
  458. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_agent_api_error.py +0 -0
  459. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_agent_app.py +0 -0
  460. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_agent_branch_base.py +0 -0
  461. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_agent_branch_capture.py +0 -0
  462. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_agent_config_free_1712.py +0 -0
  463. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_agent_deploy_units_endpoint.py +0 -0
  464. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_agent_dirty_worktree.py +0 -0
  465. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_agent_drive_queue_reconcile_2373.py +0 -0
  466. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_agent_graph_self_heal.py +0 -0
  467. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_agent_health_h3.py +0 -0
  468. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_agent_idle_restart.py +0 -0
  469. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_agent_push_failure.py +0 -0
  470. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_agent_reap.py +0 -0
  471. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_agent_repos_and_pull.py +0 -0
  472. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_agent_restart_services_endpoint.py +0 -0
  473. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_agent_skills_self_heal.py +0 -0
  474. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_agent_startup_diagnostics.py +0 -0
  475. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_agent_update.py +0 -0
  476. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_agent_update_bluegreen.py +0 -0
  477. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_agent_usage_limit.py +0 -0
  478. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_agent_zero_commit.py +0 -0
  479. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_ambient_home_isolation.py +0 -0
  480. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_approve_capability_reroute_3241.py +0 -0
  481. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_approve_dependency_busy_2804.py +0 -0
  482. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_approve_reject_plan.py +0 -0
  483. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_approve_usage_gate.py +0 -0
  484. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_approved_work_2532.py +0 -0
  485. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_approved_work_2996.py +0 -0
  486. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_assignment_already_recorded_daemon.py +0 -0
  487. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_audit_log.py +0 -0
  488. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_audit_outcome.py +0 -0
  489. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_audit_query.py +0 -0
  490. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_auto_loop.py +0 -0
  491. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_auto_release_publish_2035.py +0 -0
  492. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_backend_selection.py +0 -0
  493. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_backup.py +0 -0
  494. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_base_checkout_restore.py +0 -0
  495. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_block_log.py +0 -0
  496. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_board_cap_762.py +0 -0
  497. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_board_fixture.py +0 -0
  498. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_board_read_path.py +0 -0
  499. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_board_schema.py +0 -0
  500. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_board_service.py +0 -0
  501. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_board_state.py +0 -0
  502. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_board_wire.py +0 -0
  503. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_brain.py +0 -0
  504. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_branch_model.py +0 -0
  505. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_bug_intake.py +0 -0
  506. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_build_worker_image_env_update.py +0 -0
  507. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cargo_cache.py +0 -0
  508. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_check_gh_argv_containment.py +0 -0
  509. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_ci_acceptance_gate_1950.py +0 -0
  510. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_ci_fix.py +0 -0
  511. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_ci_github.py +0 -0
  512. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_ci_gitlab.py +0 -0
  513. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_ci_parity_2091.py +0 -0
  514. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_ci_store.py +0 -0
  515. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_claim.py +0 -0
  516. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_claude_md_budget.py +0 -0
  517. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_claude_setup_token.py +0 -0
  518. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_acceptance.py +0 -0
  519. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_assign.py +0 -0
  520. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_assign_interactive_oracle_gate.py +0 -0
  521. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_assign_interactive_remote.py +0 -0
  522. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_assign_provider.py +0 -0
  523. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_assign_repo_drift_2219.py +0 -0
  524. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_audit.py +0 -0
  525. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_chat_continue.py +0 -0
  526. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_ci.py +0 -0
  527. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_codegen.py +0 -0
  528. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_decide.py +0 -0
  529. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_diagnose_capability_rules.py +0 -0
  530. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_diagnose_config_provenance.py +0 -0
  531. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_diagnose_forge_availability.py +0 -0
  532. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_diagnose_graph.py +0 -0
  533. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_diagnose_self.py +0 -0
  534. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_diagnose_test_coverage.py +0 -0
  535. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_doctor.py +0 -0
  536. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_doctor_config_free_1801.py +0 -0
  537. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_doctor_config_mismatch_1712.py +0 -0
  538. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_doctor_store_backend_3084.py +0 -0
  539. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_drive.py +0 -0
  540. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_drive_queue.py +0 -0
  541. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_escalate.py +0 -0
  542. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_fix_headless_review.py +0 -0
  543. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_gate_a.py +0 -0
  544. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_install_drift.py +0 -0
  545. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_install_skills.py +0 -0
  546. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_issue_comment.py +0 -0
  547. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_issue_create_label.py +0 -0
  548. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_issue_reopen.py +0 -0
  549. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_issue_view_list.py +0 -0
  550. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_issues.py +0 -0
  551. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_merge.py +0 -0
  552. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_milestone_assign.py +0 -0
  553. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_milestone_capture.py +0 -0
  554. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_milestone_chat_add_child.py +0 -0
  555. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_milestone_dispatch.py +0 -0
  556. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_milestone_gate_b.py +0 -0
  557. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_milestone_gate_c.py +0 -0
  558. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_milestone_order.py +0 -0
  559. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_milestone_remove_and_issue_close.py +0 -0
  560. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_milestone_ship.py +0 -0
  561. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_network.py +0 -0
  562. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_new_issue_chat.py +0 -0
  563. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_plans.py +0 -0
  564. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_portal.py +0 -0
  565. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_pr.py +0 -0
  566. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_pull_artifact.py +0 -0
  567. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_queue.py +0 -0
  568. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_reattach_sessions.py +0 -0
  569. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_refine_board.py +0 -0
  570. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_release_preflight.py +0 -0
  571. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_release_propagate.py +0 -0
  572. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_release_window.py +0 -0
  573. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_repo_2220.py +0 -0
  574. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_review_test_author_tracking_epic_2639.py +0 -0
  575. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_scorecard.py +0 -0
  576. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_serve_store_backend_3084.py +0 -0
  577. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_set_review_findings.py +0 -0
  578. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_status_advisory_terminal.py +0 -0
  579. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_status_contested_tag.py +0 -0
  580. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_status_invariant_alarms.py +0 -0
  581. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_status_machine_fault.py +0 -0
  582. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_status_merge_queue.py +0 -0
  583. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_status_provider.py +0 -0
  584. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_status_retried_3340.py +0 -0
  585. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_status_review_finalizing.py +0 -0
  586. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_status_supervisor_3366.py +0 -0
  587. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_status_test_failed_tag.py +0 -0
  588. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_status_usage_limit.py +0 -0
  589. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_sync_comments_873.py +0 -0
  590. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_test_plan.py +0 -0
  591. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_track.py +0 -0
  592. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_tui_update.py +0 -0
  593. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cli_wait.py +0 -0
  594. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_client.py +0 -0
  595. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_client_base_install.py +0 -0
  596. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_client_config_cache_atomic_3052.py +0 -0
  597. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_client_resource_migration_1946.py +0 -0
  598. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_commands_common.py +0 -0
  599. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_comments.py +0 -0
  600. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_completion_summary.py +0 -0
  601. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_config.py +0 -0
  602. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_config_acceptance.py +0 -0
  603. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_config_audit.py +0 -0
  604. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_config_drift_check.py +0 -0
  605. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_config_effective.py +0 -0
  606. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_config_pricing.py +0 -0
  607. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_config_snapshot_noncanonical_2208.py +0 -0
  608. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_config_usage_gate.py +0 -0
  609. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_confirm_test.py +0 -0
  610. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_conflict_fix.py +0 -0
  611. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_conflict_fix_semantic.py +0 -0
  612. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_coord_log_daemon_fallback_2547.py +0 -0
  613. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_coord_test.py +0 -0
  614. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_coord_test_runner_acceptance_toolchain_2936.py +0 -0
  615. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_coord_test_runner_baseline.py +0 -0
  616. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_coord_test_runner_populated_home.py +0 -0
  617. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_coord_test_runner_routing.py +0 -0
  618. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_coord_test_runner_toolchain.py +0 -0
  619. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_coord_uat.py +0 -0
  620. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_coord_web_sse_restart_live.py +0 -0
  621. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_coordinator_machine.py +0 -0
  622. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_cross_platform_imports.py +0 -0
  623. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_dao.py +0 -0
  624. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_dashboard.py +0 -0
  625. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_dashboard_api.py +0 -0
  626. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_dashboard_fixture.py +0 -0
  627. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_dashboard_server.py +0 -0
  628. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_dashboard_terminal.py +0 -0
  629. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_dashboard_terminal_live.py +0 -0
  630. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_db.py +0 -0
  631. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_dead_end.py +0 -0
  632. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_decomposition_chat.py +0 -0
  633. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_deploy_coord_db_backup.py +0 -0
  634. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_deploy_coord_web_dist.py +0 -0
  635. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_deploy_coord_web_rollback.py +0 -0
  636. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_deploy_db_backup_unit.py +0 -0
  637. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_deploy_drive_queue_unit.py +0 -0
  638. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_deploy_failure_notify_unit.py +0 -0
  639. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_deploy_manifest.py +0 -0
  640. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_deploy_notify_unit.py +0 -0
  641. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_deploy_units_lane.py +0 -0
  642. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_deploy_web_unit.py +0 -0
  643. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_deprecation_telemetry.py +0 -0
  644. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_deps.py +0 -0
  645. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_diagnose.py +0 -0
  646. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_dispatch.py +0 -0
  647. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_dispatch_liveness.py +0 -0
  648. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_dispatch_target_validation.py +0 -0
  649. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_dispatch_workers.py +0 -0
  650. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_dist_name.py +0 -0
  651. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_done_housekeeping.py +0 -0
  652. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_dr_azure_scripts.py +0 -0
  653. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_dr_promote.py +0 -0
  654. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_dr_verify.py +0 -0
  655. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_drive.py +0 -0
  656. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_drive_machine_fault.py +0 -0
  657. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_drive_queue_blocked_rendering.py +0 -0
  658. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_drive_queue_launch_argv.py +0 -0
  659. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_drive_queue_max_parallel_config.py +0 -0
  660. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_drive_queue_max_parallel_per_repo_config.py +0 -0
  661. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_drive_queue_roll_pending.py +0 -0
  662. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_drive_queue_self_cordon_escalation.py +0 -0
  663. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_drive_sessions_snapshot.py +0 -0
  664. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_drive_state.py +0 -0
  665. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_drive_tmux.py +0 -0
  666. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_epic_up_capability_detection.py +0 -0
  667. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_epic_up_down_symlinked_config_1887.py +0 -0
  668. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_epic_up_image_provenance.py +0 -0
  669. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_errors.py +0 -0
  670. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_events.py +0 -0
  671. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_failure_class.py +0 -0
  672. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_failure_classifier.py +0 -0
  673. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_filelock.py +0 -0
  674. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_finalize_interactive_exit_test_verdict.py +0 -0
  675. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_fix_escalation_classifier.py +0 -0
  676. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_fix_of_force_override.py +0 -0
  677. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_fleet_config_health.py +0 -0
  678. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_fleet_health_probes.py +0 -0
  679. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_fleet_health_snapshot.py +0 -0
  680. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_fleet_watchdog.py +0 -0
  681. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_forge_availability.py +0 -0
  682. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_freshness.py +0 -0
  683. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_gate_a.py +0 -0
  684. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_gate_b.py +0 -0
  685. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_gate_snapshot_staleness.py +0 -0
  686. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_gates.py +0 -0
  687. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_gather_fleet_tmux_sessions.py +0 -0
  688. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_gen_mock_index.py +0 -0
  689. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_generated_rust_fixture.py +0 -0
  690. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_generated_rust_requests.py +0 -0
  691. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_generated_types_fixture.py +0 -0
  692. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_github_ops.py +0 -0
  693. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_github_throttle.py +0 -0
  694. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_goal.py +0 -0
  695. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_graph_health.py +0 -0
  696. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_graph_selfheal_absent_2237.py +0 -0
  697. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_handoff.py +0 -0
  698. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_health_checks.py +0 -0
  699. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_health_cli.py +0 -0
  700. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_health_cli_graph.py +0 -0
  701. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_health_config.py +0 -0
  702. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_health_context.py +0 -0
  703. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_health_coord_tui_ci_pin.py +0 -0
  704. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_health_coord_web_ci_pin.py +0 -0
  705. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_health_deploy_lane_facts.py +0 -0
  706. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_health_fix.py +0 -0
  707. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_health_incident_regression.py +0 -0
  708. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_health_issues_sync_staleness.py +0 -0
  709. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_health_pr_churn.py +0 -0
  710. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_health_pypi.py +0 -0
  711. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_health_registry.py +0 -0
  712. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_health_release_cordon_probe.py +0 -0
  713. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_health_timer_active.py +0 -0
  714. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_health_toolchain.py +0 -0
  715. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_health_unit_drift.py +0 -0
  716. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_health_unit_enablement.py +0 -0
  717. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_health_wedged_drive_queue.py +0 -0
  718. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_hooks.py +0 -0
  719. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_housekeeping.py +0 -0
  720. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_human_attended_437.py +0 -0
  721. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_init.py +0 -0
  722. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_install_agent_venv_2911.py +0 -0
  723. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_integration.py +0 -0
  724. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_interactive.py +0 -0
  725. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_interactive_briefing_echo.py +0 -0
  726. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_interactive_pane_log_2541.py +0 -0
  727. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_interactive_prefill_state.py +0 -0
  728. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_interactive_session_relaunch.py +0 -0
  729. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_interactive_test_verdict_backstop.py +0 -0
  730. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_interactive_token_attribution.py +0 -0
  731. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_interactive_worktree.py +0 -0
  732. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_invariant_alarms.py +0 -0
  733. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_issue_store_seam.py +0 -0
  734. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_issues_sync_status.py +0 -0
  735. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_liveness_auditor.py +0 -0
  736. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_liveness_notify.py +0 -0
  737. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_lock_contention_ratchet.py +0 -0
  738. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_machine_fault.py +0 -0
  739. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_machine_metrics.py +0 -0
  740. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_machine_onboard.py +0 -0
  741. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_machine_pause.py +0 -0
  742. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_machine_stats.py +0 -0
  743. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_merge_queue.py +0 -0
  744. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_merge_verify.py +0 -0
  745. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_milestone_chat.py +0 -0
  746. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_milestone_dispatch.py +0 -0
  747. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_milestone_gate.py +0 -0
  748. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_milestone_order.py +0 -0
  749. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_milestone_seam.py +0 -0
  750. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_mock_author.py +0 -0
  751. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_model_tiering.py +0 -0
  752. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_models.py +0 -0
  753. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_models_config_labels.py +0 -0
  754. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_needs_attention.py +0 -0
  755. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_network.py +0 -0
  756. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_new_issue_chat.py +0 -0
  757. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_next_release_tag.py +0 -0
  758. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_node_shim.py +0 -0
  759. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_notifier_baseline.py +0 -0
  760. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_notifier_cli.py +0 -0
  761. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_notifier_collect.py +0 -0
  762. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_notifier_config.py +0 -0
  763. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_notifier_drive_seam.py +0 -0
  764. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_notifier_isolation.py +0 -0
  765. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_notifier_predicate.py +0 -0
  766. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_notifier_quiet_hours.py +0 -0
  767. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_notifier_service.py +0 -0
  768. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_notify.py +0 -0
  769. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_notify_drain.py +0 -0
  770. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_openapi.py +0 -0
  771. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_operational_defaults.py +0 -0
  772. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_overlap_fence.py +0 -0
  773. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_overlap_predict.py +0 -0
  774. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_packaged_deploy_units.py +0 -0
  775. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_parentage.py +0 -0
  776. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_paste_landed.py +0 -0
  777. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_phantom_heal_venv_independence_2570.py +0 -0
  778. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_pipeline.py +0 -0
  779. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_plan_followup_approve_plan_command.py +0 -0
  780. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_plan_followup_pr_command.py +0 -0
  781. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_plan_followup_review_command.py +0 -0
  782. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_plan_only.py +0 -0
  783. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_plan_parser.py +0 -0
  784. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_platform_paths.py +0 -0
  785. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_portal_bridge.py +0 -0
  786. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_portal_config.py +0 -0
  787. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_portal_store.py +0 -0
  788. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_portal_sync.py +0 -0
  789. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_pr_body_lint.py +0 -0
  790. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_prereqs.py +0 -0
  791. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_production_db_guard.py +0 -0
  792. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_progress.py +0 -0
  793. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_provider_seam.py +0 -0
  794. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_providers.py +0 -0
  795. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_providers_config_labels.py +0 -0
  796. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_providers_pty.py +0 -0
  797. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_provision_core.py +0 -0
  798. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_provision_machine.py +0 -0
  799. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_py_rust_mirror_inventory.py +0 -0
  800. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_quiet_hours.py +0 -0
  801. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_quiet_hours_store_2146.py +0 -0
  802. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_reap_merged_sessions.py +0 -0
  803. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_reap_stale_interactive_tick.py +0 -0
  804. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_reconcile.py +0 -0
  805. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_reconcile_branch.py +0 -0
  806. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_reconcile_completions.py +0 -0
  807. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_reconcile_late_agent_reports_2547.py +0 -0
  808. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_reconcile_merges.py +0 -0
  809. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_reconcile_no_agent_record.py +0 -0
  810. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_reconcile_tick.py +0 -0
  811. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_reconcile_usage_limit_done.py +0 -0
  812. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_refine_chat.py +0 -0
  813. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_release_cordon_2101.py +0 -0
  814. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_release_cordon_daemon_leads_2176.py +0 -0
  815. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_release_cordon_deadlock_2240.py +0 -0
  816. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_release_cordon_drain_stall_3336.py +0 -0
  817. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_release_cordon_stuck_2490.py +0 -0
  818. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_release_propagate.py +0 -0
  819. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_release_propagate_threshold.py +0 -0
  820. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_release_roll_between_legs_2854.py +0 -0
  821. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_release_roll_window_handoff.py +0 -0
  822. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_release_unified_1242.py +0 -0
  823. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_release_verify.py +0 -0
  824. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_release_window.py +0 -0
  825. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_remote_auto_prune.py +0 -0
  826. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_remote_interactive_reaper.py +0 -0
  827. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_repo_add.py +0 -0
  828. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_repo_dormancy.py +0 -0
  829. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_repo_edit_2220.py +0 -0
  830. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_repo_graph_fleet_2237.py +0 -0
  831. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_repo_max_parallel_3423.py +0 -0
  832. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_repo_onboard_2220.py +0 -0
  833. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_report_result_push.py +0 -0
  834. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_reports.py +0 -0
  835. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_restart_cmd.py +0 -0
  836. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_retry.py +0 -0
  837. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_retry_advisory_1606.py +0 -0
  838. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_retry_escalation_classify_3360.py +0 -0
  839. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_retry_type_1636.py +0 -0
  840. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_revalidate.py +0 -0
  841. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_review.py +0 -0
  842. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_review_end_review_without_verdict.py +0 -0
  843. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_review_parse_failure_diagnostic.py +0 -0
  844. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_review_reaffirm.py +0 -0
  845. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_review_state.py +0 -0
  846. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_review_verdict_backstop.py +0 -0
  847. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_review_verdict_override_audit.py +0 -0
  848. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_review_verdict_relay.py +0 -0
  849. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_review_zero_commits.py +0 -0
  850. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_scoped_review_wiring.py +0 -0
  851. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_scorecard.py +0 -0
  852. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_self_health.py +0 -0
  853. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_serve.py +0 -0
  854. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_serve_app.py +0 -0
  855. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_serve_app_board_trim.py +0 -0
  856. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_serve_rest_routes.py +0 -0
  857. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_session.py +0 -0
  858. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_slice_issue_attribution.py +0 -0
  859. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_smoke.py +0 -0
  860. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_smoke_fanout_manifest_3333.py +0 -0
  861. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_smoke_live_checkout_restore.py +0 -0
  862. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_smoke_workflow.py +0 -0
  863. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_spend_ceiling.py +0 -0
  864. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_spend_ceiling_coordinator.py +0 -0
  865. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_split.py +0 -0
  866. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_split_work.py +0 -0
  867. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_sql_dialect.py +0 -0
  868. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_sqlite_connect_ratchet.py +0 -0
  869. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_stage_projection.py +0 -0
  870. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_stale_busy_reviewer_697.py +0 -0
  871. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_state.py +0 -0
  872. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_state_review_findings_daemon.py +0 -0
  873. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_status_fleet_footer.py +0 -0
  874. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_stop_1567.py +0 -0
  875. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_store_contract.py +0 -0
  876. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_store_migrate.py +0 -0
  877. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_stuck.py +0 -0
  878. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_stuck_test_state_watchdog_2803.py +0 -0
  879. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_terminal_command.py +0 -0
  880. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_test_author.py +0 -0
  881. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_test_chat.py +0 -0
  882. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_test_orchestrator.py +0 -0
  883. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_test_report.py +0 -0
  884. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_test_verdict_parsing.py +0 -0
  885. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_test_verdict_transcript_floor.py +0 -0
  886. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_text_io_encoding_audit.py +0 -0
  887. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_thin_client_board_audit.py +0 -0
  888. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_thin_client_config_load_1080.py +0 -0
  889. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_thin_client_daemon_routing_906.py +0 -0
  890. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_throwaway_vm.py +0 -0
  891. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_tmux_host.py +0 -0
  892. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_tmux_session.py +0 -0
  893. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_transcript_floor.py +0 -0
  894. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_uat_checks.py +0 -0
  895. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_usage.py +0 -0
  896. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_usage_limits.py +0 -0
  897. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_usage_rollup.py +0 -0
  898. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_venv_live_install_2121.py +0 -0
  899. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_version_single_source.py +0 -0
  900. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_watch.py +0 -0
  901. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_windows_job_is_a_real_gate_2000.py +0 -0
  902. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_worker_env_venv_isolation.py +0 -0
  903. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_worker_events.py +0 -0
  904. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_worker_image_pin_sync.py +0 -0
  905. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_worker_safety.py +0 -0
  906. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_worker_test_scoping.py +0 -0
  907. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_worktree.py +0 -0
  908. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_worktree_rmtree_chokepoint.py +0 -0
  909. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/tests/test_write_parity.py +0 -0
  910. {code_coordinator-0.5.521 → code_coordinator-0.5.522}/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.521
3
+ Version: 0.5.522
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.521
3
+ Version: 0.5.522
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.521",
2
+ "tag": "0.5.522",
3
3
  "distance": 0,
4
- "node": "g1d59afeac7d0d003c9bbecd7b2711c6ebe8adaf8",
4
+ "node": "g3d51cf0a782a606306c6175a5b2271d2d93ea2d4",
5
5
  "dirty": false,
6
6
  "branch": "HEAD",
7
7
  "node_date": "2026-09-27"
@@ -35,7 +35,7 @@ import socket
35
35
  import subprocess
36
36
  import time
37
37
  from pathlib import Path
38
- from typing import TYPE_CHECKING, Any, Mapping, Sequence
38
+ from typing import TYPE_CHECKING, Any, Iterable, Mapping, Sequence
39
39
 
40
40
  import click
41
41
 
@@ -88,6 +88,7 @@ from coord.drive_queue import (
88
88
  fired_holds,
89
89
  flag_shadows_config_warning,
90
90
  is_dispatch_failure_reason,
91
+ is_fix_round_ceiling_blocked,
91
92
  is_merge_gate_block_reason,
92
93
  is_permanent_block_reason,
93
94
  is_pre_dispatch_block_reason,
@@ -1386,10 +1387,10 @@ _BLOCKED_AFTER_NOTE = (
1386
1387
  # ships doesn't have to go read the issue to learn their remove+add might be
1387
1388
  # about to race an automatic resume.
1388
1389
  _BLOCKED_GATE_NOTE = (
1389
- "note: a re-evaluable blocked cause (i.e. not a #1844/#2019 permanent "
1390
- "refusal) IS re-checked against the merge gate automatically (#2230) — "
1391
- "see `resumes=` above if this row has already self-resumed and "
1392
- "re-blocked"
1390
+ "note: a re-evaluable blocked cause (i.e. not a #1844/#2019/#2972 "
1391
+ "permanent refusal) IS re-checked against the merge gate automatically "
1392
+ "(#2230) — see `resumes=` above if this row has already self-resumed "
1393
+ "and re-blocked"
1393
1394
  )
1394
1395
 
1395
1396
  # #2589: `_BLOCKED_GATE_NOTE` above is flatly wrong for a row whose cause is
@@ -5576,6 +5577,34 @@ def _record_checks_stale_escalation(entry: "QueuedMerge", *, reason: str) -> Non
5576
5577
  click.echo(f" (could not record the checks_stale escalation: {exc})")
5577
5578
 
5578
5579
 
5580
+ def _fix_round_ceiling_blocked_keys(
5581
+ queue_entries: Iterable[QueueEntry],
5582
+ ) -> set[tuple[str, int]]:
5583
+ """#3454: ``(repo, issue)`` keys whose drive-queue row has already given
5584
+ up on the #2972 fix-round ceiling — a block means stop: nothing this
5585
+ module auto-dispatches should fire again for one of these until an
5586
+ operator runs ``coord drive-queue remove`` + ``add``.
5587
+
5588
+ Delegates the actual predicate to :func:`coord.drive_queue.
5589
+ is_fix_round_ceiling_blocked` — the #3454 review's "one question, one
5590
+ answer" fix: ``coord.notify``'s stalled-pipeline sweep (a second,
5591
+ independent ``dispatch_conflict_fix`` caller) asks this SAME function
5592
+ per-row rather than re-deriving the ``state == blocked AND
5593
+ is_fix_round_ceiling_reason`` check here a second time.
5594
+
5595
+ Pure, over an already-fetched entry list, so
5596
+ ``_run_auto_revalidate_checks_stale``'s use of it (skip a
5597
+ stale-rebase conflict-fix candidate whose OWN entry gave up this way) is
5598
+ testable without mocking the live board/ci_store/conflict_fix stack that
5599
+ function otherwise needs.
5600
+ """
5601
+ return {
5602
+ (e.repo, e.issue)
5603
+ for e in queue_entries
5604
+ if is_fix_round_ceiling_blocked(e.state, e.last_reason)
5605
+ }
5606
+
5607
+
5579
5608
  def _run_auto_revalidate_checks_stale(config_path: Path | None) -> None:
5580
5609
  """#2535: unattended remedy for merge-queue entries blocked SOLELY on
5581
5610
  stale CI checks against an already-approved review — closing the gap
@@ -5720,6 +5749,7 @@ def _run_auto_revalidate_checks_stale(config_path: Path | None) -> None:
5720
5749
  from coord.state import ( # noqa: PLC0415
5721
5750
  dismiss_drive_escalation,
5722
5751
  list_drive_escalations,
5752
+ list_drive_queue,
5723
5753
  load_board as _load_board,
5724
5754
  )
5725
5755
 
@@ -5743,6 +5773,33 @@ def _run_auto_revalidate_checks_stale(config_path: Path | None) -> None:
5743
5773
  return
5744
5774
  items = _mq.load_queue()
5745
5775
  candidates = _mq.ci_revalidation_candidates(items, board, cfg, ci_store, _gh_ops)
5776
+ # #3454: an entry whose drive-queue row already gave up on the #2972
5777
+ # fix-round ceiling is PARKED — a block means stop, not "the driver
5778
+ # stopped but the pipeline is still live" (quadraui#1077: a
5779
+ # stale-rebase conflict-fix from THIS mechanism fired 6h07m after the
5780
+ # ceiling block, one of the paid legs the block's own "giving up"
5781
+ # wording told the operator would not happen). Filtered out of
5782
+ # `candidates` itself, not just the dispatch loop below, so the
5783
+ # escalation-cleanup pass right above also treats a newly-parked
5784
+ # entry as no-longer-live and dismisses any open `checks_stale`
5785
+ # escalation for it — the ceiling block's own reason is the one
5786
+ # surface an operator needs, not a second "needs a human" this
5787
+ # mechanism would otherwise keep alive for a row that already has
5788
+ # one. `is_fix_round_ceiling_blocked` (not the broader
5789
+ # `is_permanent_block_reason`) so a #1844/#2019 permanent block —
5790
+ # neither of which this mechanism has ever been asked to change —
5791
+ # keeps its pre-#3454 behaviour exactly. `coord.notify`'s stalled-
5792
+ # pipeline sweep — the THIRD, independent `dispatch_conflict_fix`
5793
+ # caller the #3454 review found unfiltered — now calls this exact
5794
+ # same predicate per-row rather than a separately-derived check.
5795
+ ceiling_blocked_keys = _fix_round_ceiling_blocked_keys(
5796
+ entries_from_rows(list_drive_queue())
5797
+ )
5798
+ candidates = [
5799
+ c
5800
+ for c in candidates
5801
+ if (c.repo_name, c.issue_number) not in ceiling_blocked_keys
5802
+ ]
5746
5803
  except Exception: # noqa: BLE001 — best-effort, see docstring
5747
5804
  return
5748
5805
 
@@ -160,9 +160,10 @@ def dispatch_type_for_labels(issue_labels: Iterable[str] | None) -> str:
160
160
  #
161
161
  # #2230 qualifies "terminal" for `blocked` specifically: it still means "no
162
162
  # `coord drive` launches from this row again on its own" and "stays in the
163
- # table for history" for a PERMANENT cause (#1844/#2019) or one the sweep has
164
- # no evidence about. It no longer means "nothing ever writes to this row
165
- # again" — a `blocked` entry whose cause was a re-evaluable gate reading may
163
+ # table for history" for a PERMANENT cause (#1844/#2019/#2972 — see
164
+ # `_PERMANENT_BLOCK_MARKERS`) or one the sweep has no evidence about. It no
165
+ # longer means "nothing ever writes to this row again" — a `blocked` entry
166
+ # whose cause was a re-evaluable gate reading may
166
167
  # be moved straight back to `waiting` by `plan_tick`'s own reconcile pass,
167
168
  # with no operator action, the moment that reading clears. See
168
169
  # `is_permanent_block_reason` and `_reconcile_blocked` below for exactly
@@ -282,7 +283,74 @@ PARK_STALE_SECONDS = 45 * 60.0
282
283
  # clear (see `_reconcile_blocked` and the `live_blocked_gate` parameter of
283
284
  # `plan_tick`). No evidence either way leaves the entry exactly as untouched
284
285
  # as it was before this feature existed.
285
- _PERMANENT_BLOCK_MARKERS: tuple[str, ...] = ("(#1844)", "(#2019)")
286
+ #
287
+ # #3454: `(#2972)` joined this tuple after quadraui#1077 (2026-09-27) showed
288
+ # the gap a THIRD marker was needed for — a #2972 fix-round-ceiling give-up
289
+ # is not like #309's ordinary `exhausted`: relaunching cannot produce more
290
+ # budget no matter how the merge gate reads, so treating it as merely
291
+ # "unlucky, re-check later" let #2230's own sweep silently resume it back to
292
+ # `waiting` (attempts reset to 0!) the moment the gate cleared — handing the
293
+ # exact fresh budget the ceiling exists to deny, from inside the mechanism
294
+ # built to respect it. Marking it permanent here closes that specific hole:
295
+ # `_reconcile_blocked` returns `None` for it unconditionally, same as
296
+ # #1844/#2019, and only an operator's `coord drive-queue remove` + `add`
297
+ # (a fresh row) ever gives this entry another attempt. This
298
+ # does NOT stop the row from being noticed if the issue lands anyway
299
+ # out-of-band — `plan_tick`'s own step-1b `facts.landed` check (#2055/#3368)
300
+ # runs unconditionally for every `blocked` entry regardless of this marker,
301
+ # exactly as it always has; what stops is only the AUTOMATIC relaunch/
302
+ # merge-only paths #2230 gates. See :func:`is_fix_round_ceiling_reason` for
303
+ # the narrower predicate `coord.commands.drive_queue` uses to also stop its
304
+ # OWN independent auto-dispatch (the stale-rebase conflict-fix revalidation)
305
+ # from re-firing against a row that has already given up this way.
306
+ _PERMANENT_BLOCK_MARKERS: tuple[str, ...] = ("(#1844)", "(#2019)", "(#2972)")
307
+
308
+
309
+ def is_fix_round_ceiling_reason(reason: str | None) -> bool:
310
+ """#3454: does *reason* name the #2972 fix-round-ceiling give-up — the
311
+ ``_reconcile_running`` "giving up rather than relaunching with a fresh
312
+ budget" branch, below?
313
+
314
+ Marker-based, same convention as :func:`is_permanent_block_reason` (whose
315
+ ``_PERMANENT_BLOCK_MARKERS`` this reuses the same ``(#2972)`` text for):
316
+ the branch that writes this reason stamps the marker unconditionally, so
317
+ a substring check is exact, not a heuristic guess. A dedicated predicate
318
+ rather than reusing ``is_permanent_block_reason`` directly because a
319
+ caller outside this module (``coord.commands.drive_queue``'s stale-rebase
320
+ auto-revalidation, #3454) wants to ask SPECIFICALLY "did this entry give
321
+ up on the fix-round ceiling", not the broader "is this blocked for any
322
+ permanent reason" — conflating the two would silently widen that other
323
+ caller's behaviour to #1844/#2019 rows too, which nothing in #3454 asked
324
+ for and nothing has verified is safe.
325
+ """
326
+ if not reason:
327
+ return False
328
+ return "(#2972)" in reason
329
+
330
+
331
+ def is_fix_round_ceiling_blocked(state: str | None, last_reason: str | None) -> bool:
332
+ """#3454 review: the ONE predicate every auto-dispatcher must consult
333
+ before firing against a (repo, issue) — "has this row's drive-queue
334
+ entry already given up on the #2972 fix-round ceiling".
335
+
336
+ The review that opened this function found TWO independent
337
+ ``dispatch_conflict_fix`` callers deciding this question with different
338
+ logic: ``coord.commands.drive_queue``'s stale-rebase auto-revalidation
339
+ checked it, ``coord.notify``'s stalled-pipeline sweep (a third,
340
+ pre-existing caller of the same worker) did not — so a
341
+ ``(#2972)``-blocked entry could still receive a brand-new conflict-fix
342
+ leg via the second path, entirely unaffected by the first fix. Both now
343
+ call this one function instead of each re-deriving "blocked AND
344
+ :func:`is_fix_round_ceiling_reason`" — the "one question, one answer"
345
+ rule this module already applies elsewhere (#2096/#2085).
346
+
347
+ ``state`` must be the LIVE state (:data:`STATE_BLOCKED`, not merely "the
348
+ reason string looks like a ceiling give-up") — a row that has since been
349
+ removed/re-added by an operator (the documented remedy) has a fresh
350
+ ``last_reason`` from a NEW life, but a stale caller that only checked the
351
+ reason string could still misfire against the archived one.
352
+ """
353
+ return state == STATE_BLOCKED and is_fix_round_ceiling_reason(last_reason)
286
354
 
287
355
 
288
356
  def is_permanent_block_reason(text: str | None) -> bool:
@@ -5112,13 +5180,25 @@ def _reconcile_running(
5112
5180
  # ran.
5113
5181
  budget = total_fix_round_budget(entry, fix_round_config_default)
5114
5182
  if remaining_fix_rounds(entry, facts, fix_round_config_default) <= 0:
5183
+ # #3454: this block now DOES mean "stop" — see
5184
+ # `_PERMANENT_BLOCK_MARKERS`'s `(#2972)` entry and
5185
+ # `is_fix_round_ceiling_reason` above for the mechanics. Say so
5186
+ # explicitly rather than leaving an operator to infer it: quadraui#1077
5187
+ # showed a bare "giving up" read as "nothing more will happen or be
5188
+ # spent" while the fleet kept dispatching paid legs against the same
5189
+ # branch for hours.
5115
5190
  reason = (
5116
5191
  f"fix-round ceiling reached across relaunches (#2972): "
5117
5192
  f"{facts.work_leg_count} work leg(s) already run against a "
5118
5193
  f"budget of {budget} (1 work dispatch + "
5119
5194
  f"{effective_max_fix_rounds(entry, fix_round_config_default)} fix "
5120
5195
  f"round(s)) — giving up rather than relaunching with a fresh "
5121
- f"budget{dispatch_note}"
5196
+ f"budget{dispatch_note}. Stopped (#3454): no further relaunch, "
5197
+ f"gate-clear resume, or auto-dispatched stale-rebase conflict-fix "
5198
+ f"(from any of this fleet's independent dispatchers) will fire "
5199
+ f"for this entry — `coord drive-queue remove {entry.repo} "
5200
+ f"{entry.issue}` + `add` (a fresh row) is the only way to give "
5201
+ f"it another attempt."
5122
5202
  )
5123
5203
  return (
5124
5204
  Reconcile(entry.key, "exhausted", reason, occupies=False),
@@ -1069,6 +1069,14 @@ class StalledDispatchAction:
1069
1069
  (#602).
1070
1070
  - ``"skipped_human_required"`` — the conflict-fix retry cap was already
1071
1071
  hit; surfacing to a human, not auto-retrying.
1072
+ - ``"skipped_fix_round_ceiling_blocked"`` (#3454) — ``merge_conflict_
1073
+ unresolved`` or ``merge_gate_checks_stale`` on a (repo, issue) whose
1074
+ drive-queue row already gave up on the #2972 fix-round ceiling (see
1075
+ :func:`coord.drive_queue.is_fix_round_ceiling_blocked`) — a block
1076
+ means stop, so this sweep leaves it parked exactly like ``coord.
1077
+ commands.drive_queue``'s stale-rebase auto-revalidation already does,
1078
+ rather than handing it a third independent path to a fresh
1079
+ conflict-fix leg (quadraui#1077).
1072
1080
  - ``"skipped_sealed_conflict"`` (#2537, narrowed by #2555) —
1073
1081
  ``merge_conflict_unresolved`` on a
1074
1082
  :data:`coord.models.SEALED_PATH_AUTHOR_TYPES` row whose conflict was
@@ -1138,6 +1146,35 @@ def _stalled_row_has_live_session(board: "Board", work: "Assignment") -> bool:
1138
1146
  return False
1139
1147
 
1140
1148
 
1149
+ def _fix_round_ceiling_blocked_for_work(work: "Assignment") -> bool:
1150
+ """#3454 review: true when *work*'s (repo, issue) has a drive-queue row
1151
+ that has already given up on the #2972 fix-round ceiling.
1152
+
1153
+ This module's ``merge_conflict_unresolved`` and ``merge_gate_checks_
1154
+ stale`` arms are a THIRD, independent caller of :func:`coord.
1155
+ conflict_fix.dispatch_conflict_fix` — the review found them unfiltered
1156
+ while ``coord.commands.drive_queue``'s stale-rebase auto-revalidation
1157
+ (the second caller) already skipped a ceiling-blocked candidate,
1158
+ letting quadraui#1077's "giving up" block get a brand-new conflict-fix
1159
+ leg anyway via THIS path 6h07m later. Both callers now ask the exact
1160
+ same question — :func:`coord.drive_queue.is_fix_round_ceiling_blocked`
1161
+ — rather than each re-deriving it (#2096's "one question, one answer").
1162
+
1163
+ A drive-queue row is optional infrastructure (an issue can be worked
1164
+ with no ``coord drive-queue add`` at all), so "no row for this (repo,
1165
+ issue)" reads as "nothing to block on" — ``False`` — same as it always
1166
+ implicitly has for every OTHER stalled-pipeline reason.
1167
+ """
1168
+ from coord.drive_queue import QueueEntry, is_fix_round_ceiling_blocked # noqa: PLC0415
1169
+ from coord.state import get_drive_queue_entry # noqa: PLC0415
1170
+
1171
+ row = get_drive_queue_entry(work.repo_name, work.issue_number)
1172
+ if row is None:
1173
+ return False
1174
+ dq_entry = QueueEntry.from_row(row)
1175
+ return is_fix_round_ceiling_blocked(dq_entry.state, dq_entry.last_reason)
1176
+
1177
+
1141
1178
  def _conflict_confined_to_sealed_paths(
1142
1179
  entry: "QueuedMerge", config: Config,
1143
1180
  ) -> list[str] | None:
@@ -1230,7 +1267,11 @@ def dispatch_stalled_pipeline_action(
1230
1267
  the same bulk gate-checked enqueue the daemon passive tick already
1231
1268
  runs on every interval.
1232
1269
  - ``merge_conflict_unresolved`` → :func:`coord.conflict_fix.dispatch_conflict_fix`,
1233
- the #1474 ``_dispatch_conflict_fixes`` path — UNLESS (#2537) *work* is a
1270
+ the #1474 ``_dispatch_conflict_fixes`` path — UNLESS (#3454) the
1271
+ (repo, issue)'s drive-queue row already gave up on the #2972
1272
+ fix-round ceiling (:func:`_fix_round_ceiling_blocked_for_work`),
1273
+ which returns ``"skipped_fix_round_ceiling_blocked"`` instead, or
1274
+ (#2537) *work* is a
1234
1275
  :data:`coord.models.SEALED_PATH_AUTHOR_TYPES` row AND the conflict can
1235
1276
  be confirmed (via :func:`_conflict_confined_to_sealed_paths`, a
1236
1277
  compare-API-only check) to be confined to the repo's sealed
@@ -1257,7 +1298,9 @@ def dispatch_stalled_pipeline_action(
1257
1298
  ``merge_conflict_unresolved`` dispatches, briefed for a PURE,
1258
1299
  content-preserving rebase (no conflict expected) rather than the
1259
1300
  ordinary conflict-resolution briefing. Guarded by the same
1260
- :func:`coord.conflict_fix.has_prior_conflict_fix` retry cap.
1301
+ :func:`coord.conflict_fix.has_prior_conflict_fix` retry cap, and
1302
+ (#3454) the same fix-round-ceiling park as ``merge_conflict_
1303
+ unresolved`` above.
1261
1304
 
1262
1305
  Never re-entrant across ticks: the caller only reaches this after
1263
1306
  :func:`detect_stalled_pipeline` has already filtered out any row whose
@@ -1598,6 +1641,18 @@ def dispatch_stalled_pipeline_action(
1598
1641
  return StalledDispatchAction(
1599
1642
  kind="no_action", detail="merge queue entry no longer found",
1600
1643
  )
1644
+ # #3454: a #2972 fix-round-ceiling give-up parks the row — no further
1645
+ # auto-dispatched conflict-fix for it from ANY caller, this sweep
1646
+ # included. See `_fix_round_ceiling_blocked_for_work`'s docstring.
1647
+ if _fix_round_ceiling_blocked_for_work(work):
1648
+ return StalledDispatchAction(
1649
+ kind="skipped_fix_round_ceiling_blocked",
1650
+ detail=(
1651
+ "drive-queue row already gave up on the #2972 fix-round "
1652
+ "ceiling (#3454) — parked; needs `coord drive-queue "
1653
+ "remove` + `add`, not another auto-dispatched conflict-fix"
1654
+ ),
1655
+ )
1601
1656
  if has_prior_conflict_fix(
1602
1657
  board, entry.assignment_id, current_error=entry.error,
1603
1658
  ):
@@ -1697,6 +1752,18 @@ def dispatch_stalled_pipeline_action(
1697
1752
  return StalledDispatchAction(
1698
1753
  kind="no_action", detail="merge queue entry no longer found",
1699
1754
  )
1755
+ # #3454: same park as the `merge_conflict_unresolved` arm above — a
1756
+ # #2972 fix-round-ceiling give-up means stop, including the stale-
1757
+ # rebase conflict-fix this arm dispatches.
1758
+ if _fix_round_ceiling_blocked_for_work(work):
1759
+ return StalledDispatchAction(
1760
+ kind="skipped_fix_round_ceiling_blocked",
1761
+ detail=(
1762
+ "drive-queue row already gave up on the #2972 fix-round "
1763
+ "ceiling (#3454) — parked; needs `coord drive-queue "
1764
+ "remove` + `add`, not another auto-dispatched conflict-fix"
1765
+ ),
1766
+ )
1700
1767
  if has_prior_conflict_fix(
1701
1768
  board, entry.assignment_id, current_error=entry.error,
1702
1769
  ):
@@ -4355,6 +4355,78 @@ def test_a_dead_end_blocked_entry_is_never_resumed():
4355
4355
  assert plan.launch is None
4356
4356
 
4357
4357
 
4358
+ def test_a_fix_round_ceiling_blocked_entry_is_never_resumed():
4359
+ """#3454: same posture as the #1844/#2019 permanent blocks above — a
4360
+ #2972 fix-round-ceiling give-up must not auto-resume just because the
4361
+ merge gate reads clear again. Before this fix, `_reconcile_blocked`
4362
+ treated this reason as an ordinary re-checkable `exhausted` (#309's
4363
+ shape) and would have relaunched with `attempts` reset to 0 — handing
4364
+ the entry a fresh work-leg budget the ceiling exists to deny, exactly
4365
+ the quadraui#625 silent-reset bug #2972 itself closed for the ordinary
4366
+ retry path. Contrast with
4367
+ test_a_blocked_entry_whose_live_gate_reads_clear_resumes_with_attempts_reset,
4368
+ where an entry blocked for an ordinary reason DOES resume on identical
4369
+ gate evidence."""
4370
+ entries = [
4371
+ _blocked_entry(
4372
+ 1077,
4373
+ position=1,
4374
+ last_reason=(
4375
+ "fix-round ceiling reached across relaunches (#2972): 3 "
4376
+ "work leg(s) already run against a budget of 3 (1 work "
4377
+ "dispatch + 2 fix round(s)) — giving up rather than "
4378
+ "relaunching with a fresh budget. Stopped (#3454): no "
4379
+ "further relaunch, gate-clear resume, or auto-dispatched "
4380
+ "stale-rebase conflict-fix (from any of this fleet's "
4381
+ "independent dispatchers) will fire for this entry — "
4382
+ "`coord drive-queue remove claude-coordinator 1077` + "
4383
+ "`add` (a fresh row) is the only way to give it another "
4384
+ "attempt."
4385
+ ),
4386
+ )
4387
+ ]
4388
+ key = entry_key(REPO, 1077)
4389
+ plan = plan_tick(
4390
+ entries,
4391
+ board(),
4392
+ capacity=1,
4393
+ live_blocked_gate={key: False}, # gate reads clear
4394
+ merge_only_ready={key: True}, # even Merge-only-ready must not fire
4395
+ )
4396
+ assert plan.reconciles == ()
4397
+ assert plan.blocked == ()
4398
+ assert plan.merge_only == ()
4399
+ assert plan.launch is None
4400
+
4401
+
4402
+ def test_fix_round_ceiling_blocked_keys_finds_only_2972_blocked_rows():
4403
+ """#3454: `coord.commands.drive_queue._fix_round_ceiling_blocked_keys` —
4404
+ the filter `_run_auto_revalidate_checks_stale` uses so it never
4405
+ re-dispatches a stale-rebase conflict-fix for an entry that already gave
4406
+ up on the ceiling (quadraui#1077: this mechanism fired one 6h07m after
4407
+ the block). A `waiting`/`running` row and a `blocked` row for an
4408
+ UNRELATED (#1844) reason must both be left out — only a genuinely
4409
+ #2972-blocked row counts."""
4410
+ from coord.commands.drive_queue import _fix_round_ceiling_blocked_keys
4411
+
4412
+ ceiling_reason = (
4413
+ "fix-round ceiling reached across relaunches (#2972): 3 work "
4414
+ "leg(s) already run against a budget of 3 — giving up"
4415
+ )
4416
+ entries = [
4417
+ entry(1077, state=STATE_BLOCKED, last_reason=ceiling_reason),
4418
+ entry(
4419
+ 70,
4420
+ state=STATE_BLOCKED,
4421
+ last_reason=(
4422
+ "... (#1844); blocking without spending an attempt"
4423
+ ),
4424
+ ),
4425
+ entry(309, state=STATE_WAITING, last_reason=""),
4426
+ ]
4427
+ assert _fix_round_ceiling_blocked_keys(entries) == {(REPO, 1077)}
4428
+
4429
+
4358
4430
  def test_a_blocked_entry_that_has_hit_the_resume_ceiling_stays_blocked_and_says_so():
4359
4431
  """#2230's churn bound: an entry already resumed MAX_BLOCKED_RESUMES times
4360
4432
  must not oscillate forever — it stays `blocked`, but `last_reason` is
@@ -5194,11 +5266,17 @@ def test_a_parked_entry_with_review_still_pending_falls_through_to_the_ordinary_
5194
5266
  assert plan.launch is not None and plan.launch.issue == 2350
5195
5267
 
5196
5268
 
5197
- def test_is_permanent_block_reason_recognises_both_markers_and_nothing_else():
5269
+ def test_is_permanent_block_reason_recognises_all_three_markers_and_nothing_else():
5198
5270
  from coord.drive_queue import is_permanent_block_reason
5199
5271
 
5200
5272
  assert is_permanent_block_reason("... (#1844); blocking without spending an attempt")
5201
5273
  assert is_permanent_block_reason("... (#2019); blocking without spending an attempt")
5274
+ # #3454: the #2972 fix-round ceiling joined the permanent set — see
5275
+ # test_a_fix_round_ceiling_block_never_auto_resumes below for why.
5276
+ assert is_permanent_block_reason(
5277
+ "fix-round ceiling reached across relaunches (#2972): 3 work leg(s) "
5278
+ "already run against a budget of 3 — giving up"
5279
+ )
5202
5280
  assert not is_permanent_block_reason(
5203
5281
  "drive session died without landing the work 2/2 times — giving up"
5204
5282
  )
@@ -5206,6 +5284,47 @@ def test_is_permanent_block_reason_recognises_both_markers_and_nothing_else():
5206
5284
  assert not is_permanent_block_reason(None)
5207
5285
 
5208
5286
 
5287
+ def test_is_fix_round_ceiling_reason_matches_only_the_2972_marker():
5288
+ """#3454: the narrower predicate `coord.commands.drive_queue` uses to
5289
+ also stop its OWN independent stale-rebase auto-dispatch — must not
5290
+ fire for the OTHER two permanent-block markers, or that other call site
5291
+ would silently widen to #1844/#2019 rows too."""
5292
+ from coord.drive_queue import is_fix_round_ceiling_reason
5293
+
5294
+ assert is_fix_round_ceiling_reason(
5295
+ "fix-round ceiling reached across relaunches (#2972): giving up"
5296
+ )
5297
+ assert not is_fix_round_ceiling_reason(
5298
+ "... (#1844); blocking without spending an attempt"
5299
+ )
5300
+ assert not is_fix_round_ceiling_reason(
5301
+ "... (#2019); blocking without spending an attempt"
5302
+ )
5303
+ assert not is_fix_round_ceiling_reason(
5304
+ "drive session died without landing the work 2/2 times — giving up"
5305
+ )
5306
+ assert not is_fix_round_ceiling_reason("")
5307
+ assert not is_fix_round_ceiling_reason(None)
5308
+
5309
+
5310
+ def test_is_fix_round_ceiling_blocked_requires_both_state_and_reason():
5311
+ """#3454 review: `is_fix_round_ceiling_blocked` is the ONE predicate
5312
+ `coord.commands.drive_queue` (via `_fix_round_ceiling_blocked_keys`) AND
5313
+ `coord.notify` (via `_fix_round_ceiling_blocked_for_work`) now both
5314
+ call — must require the LIVE `blocked` state, not just a reason string
5315
+ that merely mentions #2972 (e.g. a stale/archived one from a row an
5316
+ operator already removed and re-added)."""
5317
+ from coord.drive_queue import STATE_BLOCKED, STATE_WAITING, is_fix_round_ceiling_blocked
5318
+
5319
+ ceiling_reason = "fix-round ceiling reached across relaunches (#2972): giving up"
5320
+ assert is_fix_round_ceiling_blocked(STATE_BLOCKED, ceiling_reason)
5321
+ assert not is_fix_round_ceiling_blocked(STATE_WAITING, ceiling_reason)
5322
+ assert not is_fix_round_ceiling_blocked(
5323
+ STATE_BLOCKED, "... (#1844); blocking without spending an attempt"
5324
+ )
5325
+ assert not is_fix_round_ceiling_blocked(STATE_BLOCKED, None)
5326
+
5327
+
5209
5328
  def test_a_genuinely_dead_drive_without_ci_pending_still_retries_normally():
5210
5329
  """No regression: without `merge_ci_pending`, a dead drive takes the
5211
5330
  EXACT pre-#1891 path — this is byte-for-byte
@@ -1595,6 +1595,138 @@ class TestDispatchPerReason:
1595
1595
  _, call_kwargs = stub.call_args
1596
1596
  assert call_kwargs["stale_rebase"] is True
1597
1597
 
1598
+ def test_merge_conflict_unresolved_skips_a_fix_round_ceiling_blocked_row(
1599
+ self, config: Config, monkeypatch
1600
+ ) -> None:
1601
+ """#3454 review: `coord.notify` is a THIRD, independent
1602
+ `dispatch_conflict_fix` caller the review found unfiltered — a
1603
+ (repo, issue) whose drive-queue row already gave up on the #2972
1604
+ fix-round ceiling must not get a brand-new conflict-fix leg from
1605
+ THIS sweep either, exactly like `coord.commands.drive_queue`'s
1606
+ stale-rebase auto-revalidation already refuses it."""
1607
+ config.pipeline.auto_dispatch_stalled = True
1608
+ board = _board(
1609
+ _work("work-1", test_state="passed"),
1610
+ _review("work-1", aid="review-1", review_verdict="approve"),
1611
+ )
1612
+ queued = [QueuedMerge(
1613
+ assignment_id="work-1", repo_name="vimcode", repo_github="acme/vimcode",
1614
+ branch="issue-602-fix", target_branch="main", issue_number=602,
1615
+ issue_title="t", state=CONFLICT, error="could not be rebased onto main",
1616
+ )]
1617
+ detection, work = notify_mod.detect_stalled_pipeline(
1618
+ config, board=board, merge_queue_items=queued
1619
+ )[0]
1620
+ assert detection.reason == "merge_conflict_unresolved"
1621
+
1622
+ monkeypatch.setattr("coord.merge_queue.load_queue", lambda: queued)
1623
+ monkeypatch.setattr(
1624
+ state_mod,
1625
+ "get_drive_queue_entry",
1626
+ lambda repo_name, issue_number: {
1627
+ "repo_name": repo_name,
1628
+ "issue_number": issue_number,
1629
+ "state": "blocked",
1630
+ "last_reason": (
1631
+ "fix-round ceiling reached across relaunches (#2972): "
1632
+ "3 work leg(s) already run against a budget of 3 — "
1633
+ "giving up rather than relaunching with a fresh budget"
1634
+ ),
1635
+ },
1636
+ )
1637
+ stub = MagicMock()
1638
+ monkeypatch.setattr("coord.conflict_fix.dispatch_conflict_fix", stub)
1639
+
1640
+ action = notify_mod.dispatch_stalled_pipeline_action(detection, work, board, config)
1641
+
1642
+ assert action.kind == "skipped_fix_round_ceiling_blocked"
1643
+ assert "#2972" in action.detail
1644
+ stub.assert_not_called()
1645
+
1646
+ def test_merge_gate_checks_stale_skips_a_fix_round_ceiling_blocked_row(
1647
+ self, config: Config, monkeypatch
1648
+ ) -> None:
1649
+ """Same #3454 gate on the `merge_gate_checks_stale` arm — the
1650
+ review named both `coord.notify` call sites."""
1651
+ config.pipeline.auto_dispatch_stalled = True
1652
+ board = _board(
1653
+ _work("work-1", test_state="passed"),
1654
+ _review("work-1", aid="review-1", review_verdict="approve"),
1655
+ )
1656
+ queued = [QueuedMerge(
1657
+ assignment_id="work-1", repo_name="vimcode", repo_github="acme/vimcode",
1658
+ branch="issue-951-fix", target_branch="develop", issue_number=951,
1659
+ issue_title="t", state=PENDING,
1660
+ error=f"{CI_STALE_PREFIX} checks predate the current base",
1661
+ )]
1662
+ detection, work = notify_mod.detect_stalled_pipeline(
1663
+ config, board=board, merge_queue_items=queued
1664
+ )[0]
1665
+ assert detection.reason == "merge_gate_checks_stale"
1666
+
1667
+ monkeypatch.setattr("coord.merge_queue.load_queue", lambda: queued)
1668
+ monkeypatch.setattr(
1669
+ state_mod,
1670
+ "get_drive_queue_entry",
1671
+ lambda repo_name, issue_number: {
1672
+ "repo_name": repo_name,
1673
+ "issue_number": issue_number,
1674
+ "state": "blocked",
1675
+ "last_reason": (
1676
+ "fix-round ceiling reached across relaunches (#2972): "
1677
+ "3 work leg(s) already run against a budget of 3 — "
1678
+ "giving up rather than relaunching with a fresh budget"
1679
+ ),
1680
+ },
1681
+ )
1682
+ stub = MagicMock()
1683
+ monkeypatch.setattr("coord.conflict_fix.dispatch_conflict_fix", stub)
1684
+
1685
+ action = notify_mod.dispatch_stalled_pipeline_action(detection, work, board, config)
1686
+
1687
+ assert action.kind == "skipped_fix_round_ceiling_blocked"
1688
+ assert "#2972" in action.detail
1689
+ stub.assert_not_called()
1690
+
1691
+ def test_merge_conflict_unresolved_still_dispatches_when_no_drive_queue_row(
1692
+ self, config: Config, monkeypatch
1693
+ ) -> None:
1694
+ """No drive-queue row at all for this (repo, issue) (an issue can be
1695
+ worked with no `coord drive-queue add`) must read as "nothing to
1696
+ block on", same as before #3454 — not silently swallow every
1697
+ conflict-fix dispatch that has no queue entry."""
1698
+ config.pipeline.auto_dispatch_stalled = True
1699
+ board = _board(
1700
+ _work("work-1", test_state="passed"),
1701
+ _review("work-1", aid="review-1", review_verdict="approve"),
1702
+ )
1703
+ queued = [QueuedMerge(
1704
+ assignment_id="work-1", repo_name="vimcode", repo_github="acme/vimcode",
1705
+ branch="issue-602-fix", target_branch="main", issue_number=602,
1706
+ issue_title="t", state=CONFLICT, error="could not be rebased onto main",
1707
+ )]
1708
+ detection, work = notify_mod.detect_stalled_pipeline(
1709
+ config, board=board, merge_queue_items=queued
1710
+ )[0]
1711
+ assert detection.reason == "merge_conflict_unresolved"
1712
+
1713
+ fix_assignment = Assignment(
1714
+ machine_name="mac-mini", repo_name="vimcode", issue_number=602,
1715
+ issue_title="[conflict-fix] t", assignment_id="cf-1", status="pending",
1716
+ type="conflict-fix",
1717
+ )
1718
+ stub = MagicMock(return_value=fix_assignment)
1719
+ monkeypatch.setattr("coord.conflict_fix.dispatch_conflict_fix", stub)
1720
+ monkeypatch.setattr("coord.merge_queue.load_queue", lambda: queued)
1721
+ monkeypatch.setattr(
1722
+ state_mod, "get_drive_queue_entry", lambda repo_name, issue_number: None,
1723
+ )
1724
+
1725
+ action = notify_mod.dispatch_stalled_pipeline_action(detection, work, board, config)
1726
+
1727
+ assert action.kind == "conflict_fix_dispatched"
1728
+ stub.assert_called_once()
1729
+
1598
1730
  def test_conflict_fix_decline_reports_the_real_reason(
1599
1731
  self, config: Config, monkeypatch
1600
1732
  ) -> None: